rObert: ja ik wou eigenlijk alleen zeggen dat Xindice maar niets is, maar ik vond het wel belangrijk om uit te leggen waarom - tis beetje uitgelopen

.
drm: 'op de gulden middenweg' - ja en nee. Soms duurt het langer om met xpath queries iets te doen dan gewoon met SQL (ik denk trouwens dat SQL altijd al korter is maar minder maintainable). Ze zijn gelukkig te cachen (read: HashMap

). Je hebt gelijk als je zegt dat het ons in feite geen bal meer kon schelen hoe en waar het nou werd opgeslagen - iets waar cocoon meer problemen mee had dan client-side. Door bestaande techieken (OJB/Xindice/JxPath/etc) te gebruiken duurde het veel langer dan het allemaal moest. ook JBDC heeft ons dagen kopzorgen gekost omdat ie soms wel erg raar deed (TimeStamps, UTF, etc) gelukkig waren did problemen op dat layer en die werden dus gefixed (niet altijd mooi

- Java kent blijkbaar geen 'correcte' BST timezone) maar zonder maar een regel in de xml description te veranderen want we (nou ik was de push achter dit systeem) dachten top -> down. Daardoor kon de dude die de forms samenstelde (sommige moesten niet alles tonen en hadden extra validation-rules) rustig verder omdat ik had gezegd: zo gaat het werken en zo is de xml. werken met een OO approach (en gemixed met xpath die (leuk voor ons eigenlijk een soort van scripting-taal is) kan HEEL snel werken. helaas moesten we voor elk echt Mapped object ook een corresponding Java Class hebben (aangezien OJB dit nodig had) maar dit was eigenlijk nog een sublayer die we gebruikten. Ook de client-side UI is volledig beschreven in XML (zo dat je het kon designen terwijl ie aan het runnen is). Het samenvoegen - so to speak - duurde een dag. En we hebben met het systeem (xml side) geen problemen gehad alleen met JDBC (nou ja meer met mySQL layer).
een paar voorbeeld xmls
defineren van een datatype... alle properties zijn op elk moment voor elk 'object' (ie ding die van dt image is hier) overridable. In feite is het dus een soort van template. Doet me het meest denken aan Scripting Talen zoals ECMA...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <data-type id="image" viewer="image-editor">
<extends data-type="string" />
<add-rule rule="file-filters-rule">
<filter name="Graphics For WWW Use (.jpg, .gif, .png)">
<allow-extension id="jpg" name="JPeg File (.jpg)" />
<allow-extension id="gif" name="Gif File (.gif)" />
<allow-extension id="png" name="Portable Network Graphics File (.png)" />
</filter>
</add-rule>
<add-rule max="1000000" rule="file-size" />
<set-property id="remote-path" value="{$global:resourcesPATH}/user/content/" />
<set-property id="remote-url" value="{$global:resourcesURL}/user/content/" />
</data-type> |
deze beschrijft hoe je een bepaald object kan bekijken/manipuleren. Laat ook ziet dat dit ook in feite een template is die dus voor eender welke conforme 'classe' kan werken. Ook params, global vars etc worden allemaal geparst. de Actions zijn meestal default actions (naargelang het object) maar voor elke object (nou ja interface is al genoeg) gaat het systeem de best passende zoeken. In dit geval is het object mapped over 3 tables. In dit geval zijn er geen subforms (m:n) maar ook dit word natuurlijk ondersteunt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| <tabular-view data-object="Appointment" id="appointments">
<action mode="new" name="handle"/>
<action name="{$parameter:mode}Cancel"/>
<list-view subtitle="Appointments Requested By People" title="{$modeLabel()} Appointments">
<fields>
<field mode="new" order-by="desc" ref="/interaction/createDateTime"/>
<field condition=">={$global:currentDateTime}"
format="dd/MM/yyyy HH:mm" mode="new" ref="/datetime"/>
<field condition=">={$global:currentDateTime}"
format="dd/MM/yyyy HH:mm" mode="my" order-by="asc" ref="/datetime"/>
<field format="dd/MM/yyyy HH:mm" ref="/cancelledDatetime"/>
<field label="Student">
<field ref="/interaction/user/firstname"/>
<field value=" "/>
<field ref="/interaction/user/surname"/>
</field>
<!--new-->
<field condition="=0" mode="new"
ref="/interaction/handlerId" visible="false"/>
<!--my-->
<field mode="my" ref="/rescheduleState"/>
<field condition="={$global:userId}" mode="my"
ref="/interaction/handlerId" visible="false"/>
</fields>
</list-view>
<form-view
subtitle="Accept/Reject Or Reschedule This Appointment" title="{$modeLabel()} Appointment">
<action name="{$parameter:mode}Reschedule"/>
<fields>
<field ref="/datetime"/>
</fields>
</form-view>
</tabular-view> |
en een klein stukje ui (we gebruiken ongeveer 30 ui - templates voor alle dialogs, er is dus ook 0% swing voor de maker

. Hier zijn ook wat last minute extra attributes bij voor server-side.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <panel id="content" layout="border">
<tabs id="allTabs">
<tab label="Incoming" layout="border">
<splits id="Test AGain">
<split layout="border">
<list-editor id="newList" width="40%">
<item data-type="ojb-tabular" icon="images/appointment.gif"
label="Appointments" mode="new" tabular-view="appointments" />
<item data-type="ojb-tabular" icon="images/question.gif"
label="Questions" mode="new" tabular-view="questions" />
</list-editor>
</split>
<split layout="border">
<data-viewer id="newViewer" layout="border" width="60%" />
<!-- connect data and logic for ui -->
<connect-data input="newViewer" output="newList" />
<connect-event input="newList" output="newViewer" />
</split>
</splits>
</tab>
</panel> |
hmm weer een veel te lange post...
[
Voor 13% gewijzigd door
hobbit_be op 08-07-2003 02:08
]