From 62f7881380daffa06e82b106b19bfbbfe6e24d85 Mon Sep 17 00:00:00 2001 From: willemc Date: Sat, 13 Sep 2008 17:04:49 +0200 Subject: [PATCH] [svn r342] WIP2 --- doc/README.txt | 282 ++++++++++++++- lib/idcanet-x4o-bin.jar | Bin 81305 -> 108048 bytes src/META-INF/fieldtype-lang.eld | 18 + src/META-INF/fieldtype-namespaces.xml | 8 + .../{vasc-fields.xml => fieldtypes.xml} | 43 ++- .../vasc/backends/ldap/LdapVascBackend.java | 2 + .../ldap/SimpleLdapConnectionProvider.java | 6 - .../vasc/core/AbstractVascEntryFieldType.java | 168 +++++++++ src/com/idcanet/vasc/core/VascController.java | 54 +++ src/com/idcanet/vasc/core/VascEntry.java | 95 +---- .../vasc/core/VascEntryController.java | 4 + .../idcanet/vasc/core/VascEntryFieldType.java | 4 +- .../core/VascEntryFieldTypeController.java | 42 +++ ...VascEntryFieldTypeControllerResolver.java} | 4 +- ...ontroller.java => VascEntryFinalizer.java} | 8 +- .../idcanet/vasc/core/VascFrontendData.java | 100 ++++++ .../idcanet/vasc/core/VascFrontendHelper.java | 4 - .../frontends/swing/SwingVascFrontend.java | 120 ++++--- .../vasc/frontends/swt/SwtVascFrontend.java | 1 + .../vasc/impl/DefaultVascController.java | 87 +++++ .../idcanet/vasc/impl/DefaultVascEntry.java | 202 +++-------- .../vasc/impl/DefaultVascFrontendData.java | 156 +++++++++ ...er.java => DefaultVascFrontendHelper.java} | 331 ++++++++++-------- .../vasc/impl/actions/AddRowAction.java | 2 +- .../impl/actions/CSVExportGlobalAction.java | 4 +- .../vasc/impl/actions/DeleteRowAction.java | 2 +- .../vasc/impl/actions/EditRowAction.java | 2 +- .../impl/actions/RefreshDataGlobalAction.java | 2 +- .../impl/actions/XMLExportGlobalAction.java | 4 +- .../impl/type/DefaultVascEntryFieldType.java | 39 +++ .../vasc/impl/type/FieldTypeParser.java | 72 ++++ .../vasc/validators/VascStringLength.java | 13 + .../validators/VascStringLengthValidator.java | 43 ++- tests/META-INF/logging.properties | 2 +- tests/com/idcanet/vasc/FieldTypesTest.java | 64 ++++ tests/com/idcanet/vasc/SwingTest.java | 18 +- .../idcanet/vasc/TestModelVascDataSource.java | 3 +- tests/com/idcanet/vasc/TestTable.java | 33 +- tests/com/idcanet/vasc/models/TestModel.java | 12 +- tests/resources/vasc/tables.xml | 19 +- 40 files changed, 1559 insertions(+), 514 deletions(-) create mode 100644 src/META-INF/fieldtype-lang.eld create mode 100644 src/META-INF/fieldtype-namespaces.xml rename src/META-INF/{vasc-fields.xml => fieldtypes.xml} (91%) create mode 100644 src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java create mode 100644 src/com/idcanet/vasc/core/VascController.java create mode 100644 src/com/idcanet/vasc/core/VascEntryFieldTypeController.java rename src/com/idcanet/vasc/core/{VascFrontendControllerResolver.java => VascEntryFieldTypeControllerResolver.java} (92%) rename src/com/idcanet/vasc/core/{VascFrontendController.java => VascEntryFinalizer.java} (90%) create mode 100644 src/com/idcanet/vasc/core/VascFrontendData.java create mode 100644 src/com/idcanet/vasc/impl/DefaultVascController.java create mode 100644 src/com/idcanet/vasc/impl/DefaultVascFrontendData.java rename src/com/idcanet/vasc/impl/{DefaultVascTableController.java => DefaultVascFrontendHelper.java} (60%) create mode 100644 src/com/idcanet/vasc/impl/type/DefaultVascEntryFieldType.java create mode 100644 src/com/idcanet/vasc/impl/type/FieldTypeParser.java create mode 100644 tests/com/idcanet/vasc/FieldTypesTest.java diff --git a/doc/README.txt b/doc/README.txt index 4baa8cb..2f636af 100644 --- a/doc/README.txt +++ b/doc/README.txt @@ -10,9 +10,289 @@ Down load http://www.ehecht.com/eclipse_ve/ve.html (lin_mac version) Unzip and move the plug ins and features into the plug in and features directory of eclipse. - Swing will run by default. +-- XyReasscan ? + +zie tables statline.cbs.nl voor bs asielverzoeken nl + + ---- Object tree: +3 layers + +- Data Backend + - JPA or Hibernate + - Meta Query + - LDAP + # List via geparametered xql query + # Save + # Merge + # Delete + # Create ? + FilteringDataSource + PagingDataSource + FilteringPagingDataSource + Ordering + Parameter + +- Data Source Controller + - Data Access Controller + # User ACL on data items/columns + # Create new entry hooks + +- Table Controller + - User Settings + + +- Data Frontends + - Extjs + - Swing + - WS + - SWT via SwingWT + - JSF (met utr plugin) + + + +- default view field +- Admin fields and order +- Admin field groups -> 'collapse +- List filters auto by type +- search fields + +verbose_name_plural +The plural name for the object: +verbose_name_plural = "stories" +If this isn’t given, Django will use verbose_name + "s" + + +- plural +- ordering +- order_with_respect_to + +# admin +- date_hierarchy +- fields = ( + (None, { + 'fields': ('url', 'title', 'content', 'sites') + }), + ('Advanced options', { + 'classes': 'collapse', + 'fields' : ('enable_comments', 'registration_required', 'template_name') + 'description' : 'sdf' + }), + ) +- JS +- list_display_links +- list_filter = BooleanField, DateField, DateTimeField or ForeignKey. +- list_per_page +- ordering def +- save_as +- search_fields + +@Entity +@VascAdmin(list=true,edit=true,create=true,delete=false) +public class BlogPost { + + @VascPrimaryKey + @VascName(key="generic.id.name") + @VascDescription(key="generic.id.name") + @VascHelpId(key="generic.id.help") + @VascImage(key="generid.id.image"); + Integer id; + + @Column(columnName="title") + @VascDisplayName + @VascUserRoles(list="(floormanager&sitemanager)|admin" editViewOnly="floormanager" edit="sitemanager|admin") + String title; + + @VascEditorType(type="slugField") + String slug; + + @VascChoices() + @VascDefaultValue(key="") + String tags; + + @VascRegex(regex="<(.*)>" key="generic.regex.html.tagsNotAllowed") + String content; + + @VascEditorType(type="floatField" hints="max_digits=3,decimal_places=2") + @VascFieldOptions + @VascColumnWidth(width=130) + Float price; + + @VascModelReference + @VascDefaultValue + @VascObjectNotNull + BlogStatus blogStatus; + + @VascEditorType(type="dateField" hints="auto_now=true,auto_now_add=true") + @VascDefaultValue(key="new_date") + @VascUserRoles(list="admin") + Date createdDate + + @VascEventChannel(channel="BlogPost.modifiedDate" create=true) + Date modifiedDate + + @VascDateFuture + Date publicedDate +} + + + +$it['ldap']['user']="uid=admin-sudo,ou=services,dc=m4n,dc=nl"; +$it['ldap']['pass']="adminSudo"; +$it['ldap']['baseDN']="ou=sudoers,dc=m4n,dc=nl"; +$it['ldap']['key']="cn"; + +$it['columns'][0]['name']="Edit"; +$it['columns'][0]['columnType']="edit"; +$it['columns'][1]['name']="Delete"; +$it['columns'][1]['columnType']="delete"; +$it['columns'][2]['name']="User"; +$it['columns'][2]['attr']="cn"; +$it['columns'][3]['name']="Description"; +$it['columns'][3]['attr']="description"; +$it['columns'][4]['name']="sudoCommand"; +$it['columns'][4]['attr']="sudocommand"; +$it['columns'][4]['columnType']="list"; +$it['columns'][5]['name']="sudoHost"; +$it['columns'][5]['attr']="sudohost"; +$it['columns'][5]['columnType']="list"; +$it['columns'][6]['name']="sudoUser"; +$it['columns'][6]['attr']="sudouser"; +$it['columns'][6]['columnType']="list"; + +$it['list']['filter']="(&(objectClass=sudoRole))"; +$it['list']['columns']="0,2,6,4,5,1"; +$it['delete']['filter']="cn=%s"; + +$it['edit']['filter']="(cn=%s)"; +$it['edit']['create_dn_key']="cn=%s"; +$it['edit']['columns_edit']="2,3,4,5,6"; +$it['edit']['columns_edit_readonly']="2"; +$it['edit']['columns_create']="2,3,4,5,6"; +$it['edit']['map']['objectclass'][]="sudoRole"; +$it['edit']['map']['objectclass'][]="top"; +$it['edit']['map']['cn']="\$key"; +$it['edit']['map']['description']="\$formData['description']"; + + + vasc + + admin=true + backend=extjs + path=/js/extjs/* + + + vasc + /vasc/* + + + +DefaultVascController r = new D..(); + +r.set + + +EmployeeDataSource dataSource = new EmployeeDataSource(); +dataSource.setJdbcTemplate(new JdbcTemplate(employeeDataSource())); + FilteringPaginator filteringPaginator = new FilteringPaginator(dataSource, EmployeeReportObject.class); + JsfCrudAdapter adapter = new JsfCrudAdapter(filteringPaginator, (CrudController)empCrud().getController()){ + public Serializable getEntity() { + Object object = ((Row)getModel().getRowData()).getObject(); + EmployeeReportObject employeeReportObject = (EmployeeReportObject) object; + Employee employee = new Employee(); + employee.setId(employeeReportObject.getId()); + return employee; + } + }; + + return adapter; + + + +EVt; + + + + + + + + + + + + + + + + + +Table def: + + + + + + +@SuppressWarnings({ "unchecked", "serial" }) +@Bean(scope = DefaultScopes.SESSION) +public JsfCrudAdapter empRecordCrud() { + EmployeeDataSource dataSource = new EmployeeDataSource(); + dataSource.setJdbcTemplate(new JdbcTemplate(employeeDataSource())); + FilteringPaginator filteringPaginator = new FilteringPaginator(dataSource, EmployeeReportObject.class); + JsfCrudAdapter adapter = new JsfCrudAdapter(filteringPaginator, (CrudController)empCrud().getController()){ + public Serializable getEntity() { + Object object = ((Row)getModel().getRowData()).getObject(); + EmployeeReportObject employeeReportObject = (EmployeeReportObject) object; + Employee employee = new Employee(); + employee.setId(employeeReportObject.getId()); + return employee; + } + }; + + return adapter; +} + + + + + + + + + + + + + + + + + + + diff --git a/lib/idcanet-x4o-bin.jar b/lib/idcanet-x4o-bin.jar index 1a5c7aa3834bd4672e18a0517a21312195282662..bb27fcbd104a6033e2a23a00b305adca033eb0a8 100644 GIT binary patch delta 80240 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%0AOVd4u^g!si62XkF(cvBSPYR*yL6 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 delta 54693 zcmZ6yW0WSrwk=w=ZQHhO+qUhm_*Iv?Y;~7y+cvxGF57y&&wXd?`(FOYm6@^D$QZF^ z24>FqIR%yZ4uPa14-Nqb@}Hx>nT#h9i5jBsKbAKdf)~V$J8_ig|JYM1)c@T7kK_M) zLP|E0m;>%Ob}L0WIV|`pllE?b^k8>KuMAdz#xculpR+c?bx}#FOZWZE`y`lPir5Dc}?ubxkrt9n(u%V7Dtu0b7 zKVYv8U{36BAcjZ}Dh@dFAA*?!Fu<6VzL;L1ioKf=Woj{VJ~J33+RLW`>b7gX7^;l~ z1uk}0?qL5nF)$!p{~Al7{tsFsC_H{vk*dTrtj~{Yf+$ zN)LiqJ?`T3qnV3zY4R70j|d9w5=!rgN2RBL$JT=upXn|;=$~85L$j$IP;0Y;UFh5g z|L&k!3v&RG1jz$^Kya<90~Q?l-IzolDJiQw3*U)CIjdw%=&Fs3^GTKHDYkRucqM{d zR4<~hi`K{{32l^!Go{vSXaSx(buW$kC=!F`67@*#k%3e_M)SZQmSVlwmwLZ6d5%HU zzj_-BX^teb4592>611vV*1Pb_(b^Db@2JH#5V18&VmCAV;5&W5W8dfHE1 zORo2E?EmJK9oLil738&78w>=58S+1Q1p!f%)DUHqRgz-%uypre@^N$s)X;bS!-5f{ z6g1p_X3rEJ!zWQjwIa9CQ4G*yw+-|_t8HWR!oZi)zuoc9fd@~+q}|_~^%f%b4{Fwj zUu%$ar!;4K5C>B@uGqa}r4nAmzfLk>+;?lKOOeg>O#0$|7nf;8!e-+DFcA9!~(Xme-dg( zm`vSK{59gT2WaR4xj)8|h~pg3({W0pXNs;7b4n!zm0e|^%3t+lU7CzOvB^-Ng5Us1 zvf{;k&g0PY8ICh^V_J!pa5eO;q?__&?{g0^i-93>gWU(kq06x5i1Y_7#<9p3a>&bR zsj4>$lGPn$S#zyv-~*&k?qws3lYp}Bkqo-pCygCth`C2;RtmwU{EJOTP_bZAkMO@# z<%+r#>`OJ9_9)}aQGWQAN4@EfNo~0t_A<7-Q~8kzX~l}w3|TR{e$d7nlv}4<+*IuX zSI7;!I0@bni&@n=s2#V$W*2%R&-JgR8$SGm!(zDoo8DVa1pqwRZR`*8>dfO=nW=OI zuQB6ka7F}Adpzyi^i7BY$Rr01!AV*=h&0ihJU3l=lpXfJ{xI6P{ra8k@4WS^(K80= zoC{C+*L>4Po9SUBaXe{$t1&^r2Bi4gTYVl$9ir<2-p~_--o-nThF@U*z-d3hO$1?6 z9q`C&C=+v4g~qUC&p(Na0}1Ln`1GJ0x7_;=Q>ml(2TIP)XKro&?fhN#V)Lw$KO%8b z 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 diff --git a/src/META-INF/fieldtype-lang.eld b/src/META-INF/fieldtype-lang.eld new file mode 100644 index 0000000..235da1e --- /dev/null +++ b/src/META-INF/fieldtype-lang.eld @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/META-INF/fieldtype-namespaces.xml b/src/META-INF/fieldtype-namespaces.xml new file mode 100644 index 0000000..e81ccd1 --- /dev/null +++ b/src/META-INF/fieldtype-namespaces.xml @@ -0,0 +1,8 @@ + + + + + Vasc namespace for the fieldtype language + + META-INF/fieldtype-lang.eld + \ No newline at end of file diff --git a/src/META-INF/vasc-fields.xml b/src/META-INF/fieldtypes.xml similarity index 91% rename from src/META-INF/vasc-fields.xml rename to src/META-INF/fieldtypes.xml index adc9931..ae2469a 100644 --- a/src/META-INF/vasc-fields.xml +++ b/src/META-INF/fieldtypes.xml @@ -1,15 +1,17 @@ - + - - - - - - - - + + + + + + + - +--> + - + + + + + + \ No newline at end of file diff --git a/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java b/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java index 8370b51..144123f 100644 --- a/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java +++ b/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java @@ -115,6 +115,7 @@ public class LdapVascBackend extends AbstractVascBackend { /** * @see com.idcanet.vasc.core.entry.VascEntryFieldValue#getValue(com.idcanet.vasc.core.VascEntryField, java.lang.Object) */ + @SuppressWarnings("unchecked") public Object getValue(VascEntryField field, Object record) throws ElementParameterException,ElementParameterNotFoundException { Map map = (Map)record; return map.get(field.getBackendName()); @@ -123,6 +124,7 @@ public class LdapVascBackend extends AbstractVascBackend { /** * @see com.idcanet.vasc.core.entry.VascEntryFieldValue#setValue(com.idcanet.vasc.core.VascEntryField, java.lang.Object, java.lang.Object) */ + @SuppressWarnings("unchecked") public void setValue(VascEntryField field, Object record,Object value) throws ElementParameterException,ElementParameterNotFoundException { Map map = (Map)record; map.put(field.getBackendName(), value); diff --git a/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java b/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java index bade087..b353a88 100644 --- a/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java +++ b/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java @@ -26,11 +26,7 @@ package com.idcanet.vasc.backends.ldap; -import java.security.Security; - import com.novell.ldap.LDAPConnection; -import com.novell.ldap.LDAPJSSESecureSocketFactory; -import com.novell.ldap.LDAPSocketFactory; /** * @@ -45,7 +41,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { private int ldapVersion = LDAPConnection.LDAP_V3; private String bindUser = null; private String bindPass = null; - /** * @see com.idcanet.vasc.backends.ldap.LdapConnectionProvider#getLdapConnection() @@ -71,7 +66,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { } } - /** * @return the ldapHost */ diff --git a/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java b/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java new file mode 100644 index 0000000..c36a7a6 --- /dev/null +++ b/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java @@ -0,0 +1,168 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.idcanet.vasc.core.ui.VascUIComponent; +import com.idcanet.vasc.validators.VascValidator; + +/** + * + * @author Willem Cazander + * @version 1.0 Aug 2, 2007 + */ +abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { + + private String id = null; + private Class autoFieldClass = null; + private ObjectConverter objectConverter = null; + private VascUIComponent vascUIComponent = null; + private List vascValidators = null; + private Map properties = null; + private String parentEntryFieldTypeName = null; + + public AbstractVascEntryFieldType() { + vascValidators = new ArrayList(4); + properties = new HashMap(); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#addVascValidator(com.idcanet.vasc.validators.VascValidator) + */ + public void addVascValidator(VascValidator vascValidator) { + vascValidators.add(vascValidator); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getAutoFieldClass() + */ + public Class getAutoFieldClass() { + return autoFieldClass; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getId() + */ + public String getId() { + return id; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getObjectConverter() + */ + public ObjectConverter getObjectConverter() { + return objectConverter; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getParentEntryFieldTypeName() + */ + public String getParentEntryFieldTypeName() { + return parentEntryFieldTypeName; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getProperty(java.lang.String) + */ + public String getProperty(String name) { + return properties.get(name); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getPropertyNames() + */ + public List getPropertyNames() { + return new ArrayList(properties.keySet()); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getVascUIComponent() + */ + public VascUIComponent getVascUIComponent() { + return vascUIComponent; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#getVascValidators() + */ + public List getVascValidators() { + return vascValidators; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#removeVascValidator(com.idcanet.vasc.validators.VascValidator) + */ + public void removeVascValidator(VascValidator vascValidator) { + vascValidators.remove(vascValidator); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setAutoFieldClass(java.lang.Class) + */ + public void setAutoFieldClass(Class autoFieldClass) { + this.autoFieldClass=autoFieldClass; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setId(java.lang.String) + */ + public void setId(String id) { + this.id=id; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setObjectConverter(com.idcanet.vasc.core.VascEntryFieldType.ObjectConverter) + */ + public void setObjectConverter(ObjectConverter objectConverter) { + this.objectConverter=objectConverter; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setParentEntryFieldTypeName(java.lang.String) + */ + public void setParentEntryFieldTypeName(String parentEntryFieldTypeName) { + this.parentEntryFieldTypeName=parentEntryFieldTypeName; + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setProperty(java.lang.String, java.lang.String) + */ + public void setProperty(String name, String value) { + properties.put(name, value); + } + + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#setVascUIComponent(com.idcanet.vasc.core.ui.VascUIComponent) + */ + public void setVascUIComponent(VascUIComponent vascUIComponent) { + this.vascUIComponent=vascUIComponent; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascController.java b/src/com/idcanet/vasc/core/VascController.java new file mode 100644 index 0000000..f413eeb --- /dev/null +++ b/src/com/idcanet/vasc/core/VascController.java @@ -0,0 +1,54 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.core; + + +/** + * Resolvs all the resolvers. + * + * @author Willem Cazander + * @version 1.0 Sep 11, 2008 + */ +public interface VascController { + + /** + * @return Returns the VascBackendControllerResolver + */ + public VascBackendControllerResolver getVascBackendControllerResolver(); + + /** + * + * @return Returns the VascEntryControllerResolver + */ + public VascEntryControllerResolver getVascEntryControllerResolver(); + + /** + * + * @return Returns the VascEntryFieldControllerResolver + */ + public VascEntryFieldTypeControllerResolver getVascEntryFieldTypeControllerResolver(); +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascEntry.java b/src/com/idcanet/vasc/core/VascEntry.java index 8e3d0b3..dd8372e 100644 --- a/src/com/idcanet/vasc/core/VascEntry.java +++ b/src/com/idcanet/vasc/core/VascEntry.java @@ -31,7 +31,6 @@ import java.util.List; import com.idcanet.vasc.core.actions.ColumnVascAction; import com.idcanet.vasc.core.actions.GlobalVascAction; import com.idcanet.vasc.core.actions.RowVascAction; -import com.idcanet.vasc.core.entry.VascEntryResourceResolver; /** * @@ -45,7 +44,7 @@ import com.idcanet.vasc.core.entry.VascEntryResourceResolver; * @author Willem Cazander * @version 1.0 Mar 21, 2007 */ -public interface VascEntry { +public interface VascEntry extends Cloneable { /** * @return the id @@ -130,22 +129,22 @@ public interface VascEntry { /** * @return the primaryKeyField */ - public String getPrimaryKeyField(); + public String getPrimaryKeyFieldId(); /** * @param primaryKeyField the primaryKeyField to set */ - public void setPrimaryKeyField(String primaryKeyField); + public void setPrimaryKeyFieldId(String primaryKeyField); /** * @return the displayNameField */ - public String getDisplayNameField(); + public String getDisplayNameFieldId(); /** * @param displayNameField the displayNameField to set */ - public void setDisplayNameField(String displayNameField); + public void setDisplayNameFieldId(String displayNameField); /** * @return the vascAdmimList @@ -203,85 +202,10 @@ public interface VascEntry { public void removeVascEntryField(VascEntryField vascField); /** - * @return the entryDataList + * @return the vascField */ - public List getEntryDataList(); - - /** - * @param entryDataList the entryDataList to set - */ - public void setEntryDataList(List entryDataList); - - /** - * @return the entryDataObject - */ - public Object getEntryDataObject(); - - /** - * @param entryDataObject the entryDataObject to set - */ - public void setEntryDataObject(Object entryDataObject); - - /** - * @return the vascBackend - */ - public VascBackend getVascBackend(); - - /** - * @param vascBackend the vascBackend to set - */ - public void setVascBackend(VascBackend vascBackend); - - /** - * @return the vascFrontend - */ - public VascFrontend getVascFrontend(); - - /** - * @param vascFrontend the vascFrontend to set - */ - public void setVascFrontend(VascFrontend vascFrontend); - - /** - * @return the vascBackendController - */ - public VascBackendController getVascBackendController(); - - /** - * @param vascBackendController the vascBackendController to set - */ - public void setVascBackendController(VascBackendController vascBackendController); - - /** - * @return the vascEntryController - */ - public VascEntryController getVascEntryController(); - - /** - * @param vascEntryController the vascEntryController to set - */ - public void setVascEntryController(VascEntryController vascEntryController); - - /** - * @return the vascFrontendController - */ - public VascFrontendController getVascFrontendController(); - - /** - * @param vascFrontendController the vascFrontendController to set - */ - public void setVascFrontendController(VascFrontendController vascFrontendController); - - /** - * @return the vascEntryResourceResolver - */ - public VascEntryResourceResolver getVascEntryResourceResolver(); - - /** - * @param vascEntryResourceResolver the vascEntryResourceResolver to set - */ - public void setVascEntryResourceResolver(VascEntryResourceResolver vascEntryResourceResolver); - + public VascEntryField getVascEntryFieldById(String id); + /** * @return the rowActions */ @@ -360,4 +284,7 @@ public interface VascEntry { public Object getEntryParameter(String key); public void setEntryParameter(String key,Object value); public List getEntryParameterKeys(); + + public VascFrontendData getVascFrontendData(); + public void setVascFrontendData(VascFrontendData vascFrontendData); } diff --git a/src/com/idcanet/vasc/core/VascEntryController.java b/src/com/idcanet/vasc/core/VascEntryController.java index 1da70b8..4017c12 100644 --- a/src/com/idcanet/vasc/core/VascEntryController.java +++ b/src/com/idcanet/vasc/core/VascEntryController.java @@ -26,6 +26,8 @@ package com.idcanet.vasc.core; +import java.util.List; + /** * @@ -35,4 +37,6 @@ package com.idcanet.vasc.core; public interface VascEntryController { public VascEntry getVascEntry(String name); + + public List getVascEntryNames(); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascEntryFieldType.java b/src/com/idcanet/vasc/core/VascEntryFieldType.java index db33d7d..0c6c609 100644 --- a/src/com/idcanet/vasc/core/VascEntryFieldType.java +++ b/src/com/idcanet/vasc/core/VascEntryFieldType.java @@ -39,8 +39,8 @@ import com.idcanet.vasc.validators.VascValidator; */ public interface VascEntryFieldType { - public String getName(); - public void setName(String name); + public String getId(); + public void setId(String id); public Class getAutoFieldClass(); public void setAutoFieldClass(Class classObject); diff --git a/src/com/idcanet/vasc/core/VascEntryFieldTypeController.java b/src/com/idcanet/vasc/core/VascEntryFieldTypeController.java new file mode 100644 index 0000000..fc91e5b --- /dev/null +++ b/src/com/idcanet/vasc/core/VascEntryFieldTypeController.java @@ -0,0 +1,42 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.core; + +import java.util.List; + + +/** + * + * @author Willem Cazander + * @version 1.0 Sep 4, 2008 + */ +public interface VascEntryFieldTypeController { + + public VascEntryFieldType getVascEntryFieldType(String name); + + public List getVascEntryFieldTypeNames(); +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascFrontendControllerResolver.java b/src/com/idcanet/vasc/core/VascEntryFieldTypeControllerResolver.java similarity index 92% rename from src/com/idcanet/vasc/core/VascFrontendControllerResolver.java rename to src/com/idcanet/vasc/core/VascEntryFieldTypeControllerResolver.java index 89bf347..9be26ee 100644 --- a/src/com/idcanet/vasc/core/VascFrontendControllerResolver.java +++ b/src/com/idcanet/vasc/core/VascEntryFieldTypeControllerResolver.java @@ -32,7 +32,7 @@ package com.idcanet.vasc.core; * @author Willem Cazander * @version 1.0 Sep 4, 2008 */ -public interface VascFrontendControllerResolver { +public interface VascEntryFieldTypeControllerResolver { - public VascFrontendController getVascFrontendController(); + public VascEntryFieldTypeController getVascEntryFieldTypeController(); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascFrontendController.java b/src/com/idcanet/vasc/core/VascEntryFinalizer.java similarity index 90% rename from src/com/idcanet/vasc/core/VascFrontendController.java rename to src/com/idcanet/vasc/core/VascEntryFinalizer.java index 3887684..f2e856b 100644 --- a/src/com/idcanet/vasc/core/VascFrontendController.java +++ b/src/com/idcanet/vasc/core/VascEntryFinalizer.java @@ -30,11 +30,9 @@ package com.idcanet.vasc.core; /** * * @author Willem Cazander - * @version 1.0 Sep 4, 2008 + * @version 1.0 Sep 9, 2008 */ -public interface VascFrontendController { +public interface VascEntryFinalizer { - public VascFrontend getVascFrontend(String name); - - public VascFrontendHelper getVascFrontendHelper(); + public void finalizeVascEntry(VascEntry table) throws Exception; } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascFrontendData.java b/src/com/idcanet/vasc/core/VascFrontendData.java new file mode 100644 index 0000000..cf633e7 --- /dev/null +++ b/src/com/idcanet/vasc/core/VascFrontendData.java @@ -0,0 +1,100 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.core; + +import java.util.List; + +import com.idcanet.vasc.core.entry.VascEntryResourceResolver; + + +/** + * + * @author Willem Cazander + * @version 1.0 Mar 21, 2007 + */ +public interface VascFrontendData { + + /** + * @return the vascBackend + */ + public VascBackend getVascBackend(); + + /** + * @param vascBackend the vascBackend to set + */ + public void setVascBackend(VascBackend vascBackend); + + /** + * @return the entryDataList + */ + public List getEntryDataList(); + + /** + * @param entryDataList the entryDataList to set + */ + public void setEntryDataList(List entryDataList); + + /** + * @return the entryDataObject + */ + public Object getEntryDataObject(); + + /** + * @param entryDataObject the entryDataObject to set + */ + public void setEntryDataObject(Object entryDataObject); + + /** + * @return the vascFrontend + */ + public VascFrontend getVascFrontend(); + + /** + * @param vascFrontend the vascFrontend to set + */ + public void setVascFrontend(VascFrontend vascFrontend); + + /** + * @return the VascFrontendHelper + */ + public VascFrontendHelper getVascFrontendHelper(); + + /** + * @param vascFrontendHelper The VascFrontendHelper to set. + */ + public void setVascFrontendHelper(VascFrontendHelper vascFrontendHelper); + + /** + * @return the vascEntryResourceResolver + */ + public VascEntryResourceResolver getVascEntryResourceResolver(); + + /** + * @param vascEntryResourceResolver the vascEntryResourceResolver to set + */ + public void setVascEntryResourceResolver(VascEntryResourceResolver vascEntryResourceResolver); +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascFrontendHelper.java b/src/com/idcanet/vasc/core/VascFrontendHelper.java index efff7a6..abcea90 100644 --- a/src/com/idcanet/vasc/core/VascFrontendHelper.java +++ b/src/com/idcanet/vasc/core/VascFrontendHelper.java @@ -36,10 +36,6 @@ import com.idcanet.vasc.core.entry.VascEntryEventListener; */ public interface VascFrontendHelper { - public void finalizeVascEntry(VascEntry table) throws Exception; - - public void finalizeVascEntryFields(VascEntry table) throws Exception; - public Integer getTotalColumnsWidth(VascEntry table); public void refreshData(VascEntry table) throws Exception; diff --git a/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java b/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java index b353425..14379c1 100644 --- a/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java +++ b/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java @@ -106,16 +106,14 @@ public class SwingVascFrontend implements VascFrontend { public void initEntry(VascEntry entry) throws Exception { - if (entry.getVascFrontend()==null) { - entry.setVascFrontend(this); + if (entry.getVascFrontendData().getVascFrontend()==null) { + entry.getVascFrontendData().setVascFrontend(this); } else { - if (entry.getVascFrontend()!=this) { + if (entry.getVascFrontendData().getVascFrontend()!=this) { throw new IllegalArgumentException("VascEntry has already a differtent VascViewRenderer attected"); } } - entry.getVascFrontendController().getVascFrontendHelper().finalizeVascEntry(entry); - entry.getVascFrontendController().getVascFrontendHelper().finalizeVascEntryFields(entry); - entry.getVascFrontendController().getVascFrontendHelper().refreshData(entry); + entry.getVascFrontendData().getVascFrontendHelper().refreshData(entry); /* entry.putUIComponent(VascTextField.class, SwingTextField.class); entry.putUIComponent(VascList.class, SwingList.class); @@ -129,7 +127,7 @@ public class SwingVascFrontend implements VascFrontend { public ImageIcon getImageIcon(String imageResource) { /// TODO hack beter - String key = entry.getVascEntryResourceResolver().getTextValue(imageResource); + String key = entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(imageResource); //logger.fine("KEY======================="+key); if (key.indexOf("META-INF")>0 | key.indexOf("resource")>0) { @@ -149,10 +147,13 @@ public class SwingVascFrontend implements VascFrontend { - rowBean = entry.getVascFrontendController().getVascFrontendHelper().initEditObject(entry, rowBean); + rowBean = entry.getVascFrontendData().getVascFrontendHelper().initEditObject(entry, rowBean); String beanValue = rowBean.toString(); - if (entry.getDisplayNameField()!=null) { - Object vv = entry.getUIIdentifierVascEntryColomn().getVascColumnValue().getValue(entry.getUIIdentifierVascEntryColomn(), rowBean); + if (entry.getDisplayNameFieldId()!=null) { + + VascEntryField v = entry.getVascEntryFieldById(entry.getDisplayNameFieldId()); + + Object vv = v.getVascEntryFieldValue().getValue(v, rowBean); if (vv==null) { beanValue=""; } else { @@ -162,27 +163,28 @@ public class SwingVascFrontend implements VascFrontend { beanValue=beanValue.substring(0, 30); } } - SwingEditDialog dialog = new SwingEditDialog(parent,entry,rowBean,entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.edit.title"),entry.getVascTextValue().getTextValue("vasc.dialog.edit.message",beanValue)); + SwingEditDialog dialog = new SwingEditDialog(parent,entry,rowBean,entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.edit.title"),entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.edit.message",beanValue)); Object result = dialog.openDialog(); logger.finest("OPEN closed : "+result); if(result==null) { return; } - entry.getVascFrontendController().getVascFrontendHelper().mergeObject(entry, result); + entry.getVascFrontendData().getVascFrontendHelper().mergeObject(entry, result); } public void renderDelete(Object rowBean) throws Exception { String beanValue = rowBean.toString(); - if (entry.getUIIdentifierVascEntryColomn()!=null) { - beanValue = ""+entry.getUIIdentifierVascEntryColomn().getVascColumnValue().getValue(entry.getUIIdentifierVascEntryColomn(), rowBean); + if (entry.getDisplayNameFieldId()!=null) { + VascEntryField v = entry.getVascEntryFieldById(entry.getDisplayNameFieldId()); + beanValue = ""+v.getVascEntryFieldValue().getValue(v, rowBean); if (beanValue.length()>30) { beanValue=beanValue.substring(0, 30); } } int response = JOptionPane.showOptionDialog( parent // Center in window. - , entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.delete.message",beanValue) // Message - , entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.delete.title") // Title in titlebar + , entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.delete.message",beanValue) // Message + , entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.delete.title") // Title in titlebar , JOptionPane.YES_NO_OPTION // Option type , JOptionPane.PLAIN_MESSAGE // messageType , null // Icon (none) @@ -190,10 +192,10 @@ public class SwingVascFrontend implements VascFrontend { , null // Default button's label ); if (response==JOptionPane.YES_OPTION) { - entry.getVascBackend().delete(rowBean); - entry.getEntryDataList().remove(rowBean); - entry.setEntryDataObject(null); - entry.getVascFrontendController().getVascFrontendHelper().fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, rowBean); + entry.getVascFrontendData().getVascBackend().delete(rowBean); + entry.getVascFrontendData().getEntryDataList().remove(rowBean); + entry.getVascFrontendData().setEntryDataObject(null); + //entry.getVascFrontendController().getVascFrontendHelper().fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, rowBean); } } @@ -210,7 +212,7 @@ public class SwingVascFrontend implements VascFrontend { this.headerText = headerText; this.bean = bean; - setTitle(entry.getVascEntryResourceResolver().getTextValue(title)); + setTitle(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(title)); setModal(true); JPanel pane = new JPanel(); @@ -250,7 +252,7 @@ public class SwingVascFrontend implements VascFrontend { public void createHeader(JPanel header) { JLabel l = new JLabel(); - l.setText(entry.getVascEntryResourceResolver().getTextValue(headerText)); + l.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(headerText)); l.setFont(new Font(null,Font.BOLD, 14)); //l.setToolTipText(entry.getVascTextValue().getTextValue(headerText)); header.add(l); @@ -260,7 +262,7 @@ public class SwingVascFrontend implements VascFrontend { body.setLayout(new SpringLayout()); int column = 0; for(VascEntryField c:entry.getVascEntryFields()) { - entry.getVascFrontendController().getVascFrontendHelper().initEditObjectColumn(c, bean); + entry.getVascFrontendData().getVascFrontendHelper().initEditObjectColumn(c, bean); if (c.isEdit()==false) { continue; } @@ -269,16 +271,16 @@ public class SwingVascFrontend implements VascFrontend { JLabel l = new JLabel(); l.setHorizontalAlignment(JLabel.TRAILING); - l.setText(entry.getVascEntryResourceResolver().getTextValue(c.getName())); + l.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(c.getName())); if(c.getDescription()!=null) { - l.setToolTipText(entry.getVascEntryResourceResolver().getTextValue(c.getDescription())); + l.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(c.getDescription())); } body.add(l); if (c.isEditReadOnly()==true) { JLabel valueLabel = new JLabel(); valueLabel.setText(""+c.getVascEntryFieldValue().getValue(c, bean)); - c.setColumnEditor(valueLabel); + //c.setColumnEditor(valueLabel); body.add(valueLabel); continue; } @@ -286,7 +288,7 @@ public class SwingVascFrontend implements VascFrontend { if(c.getVascEntryFieldType().getVascUIComponent()==null) { JLabel valueLabel = new JLabel(); valueLabel.setText(""+c.getVascEntryFieldValue().getValue(c, bean)); - c.setColumnEditor(valueLabel); + //c.setColumnEditor(valueLabel); body.add(valueLabel); } else { VascUIComponent comp = c.getVascEntryFieldType().getVascUIComponent(); @@ -294,7 +296,7 @@ public class SwingVascFrontend implements VascFrontend { model.setValue(c.getVascEntryFieldValue().getValue(c, bean)); model.addListener(new VascColumnValueModelListener(c,bean)); comp.createComponent(entry, model, body); - c.setColumnEditor(comp); + //c.setColumnEditor(comp); } } //JComponent, rows, cols, initX, initY ,xPad, yPad @@ -305,11 +307,11 @@ public class SwingVascFrontend implements VascFrontend { JButton saveButton = new JButton(); saveButton.setIcon(getImageIcon("vasc.dialog.save.image")); - saveButton.setText(entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.save.name")); - saveButton.setToolTipText(entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.save.tooltip")); + saveButton.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.save.name")); + saveButton.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.save.tooltip")); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { - if(entry.getVascFrontendController().getVascFrontendHelper().setUIComponentsBeanErrors(entry, bean)) { + if(entry.getVascFrontendData().getVascFrontendHelper().setUIComponentsBeanErrors(entry, bean)) { return; } result = bean; @@ -320,8 +322,8 @@ public class SwingVascFrontend implements VascFrontend { JButton cancelButton = new JButton(); cancelButton.setIcon(getImageIcon("vasc.dialog.cancel.image")); - cancelButton.setText(entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.cancel.name")); - cancelButton.setToolTipText(entry.getVascEntryResourceResolver().getTextValue("vasc.dialog.cancel.tooltip")); + cancelButton.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.cancel.name")); + cancelButton.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue("vasc.dialog.cancel.tooltip")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { result = null; @@ -361,7 +363,7 @@ public class SwingVascFrontend implements VascFrontend { try { exporter.doExport(out, entry); } catch (Exception e) { - entry.getVascFrontendController().getVascFrontendHelper().handleException(e, entry); + entry.getVascFrontendData().getVascFrontendHelper().handleException(e, entry); } finally { if (out!=null) { out.close(); @@ -410,17 +412,17 @@ public class SwingVascFrontend implements VascFrontend { // TODO: hack images working l.setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(getClass().getResource(entry.getHeaderImage())).getScaledInstance(32, 32, Image.SCALE_SMOOTH))); if (entry.getHeaderDescription()!=null) { - l.setToolTipText(entry.getVascEntryResourceResolver().getTextValue(entry.getHeaderDescription())); + l.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(entry.getHeaderDescription())); } header.add(l,BorderLayout.WEST); } if(entry.getHeaderName()!=null) { - JLabel l = new JLabel(entry.getVascEntryResourceResolver().getTextValue(entry.getHeaderName())); + JLabel l = new JLabel(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(entry.getHeaderName())); l.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); l.setFont(new Font(null,Font.BOLD, 18)); if (entry.getHeaderDescription()!=null) { - l.setToolTipText(entry.getVascEntryResourceResolver().getTextValue(entry.getHeaderDescription())); + l.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(entry.getHeaderDescription())); } header.add(l,BorderLayout.CENTER); } @@ -429,8 +431,8 @@ public class SwingVascFrontend implements VascFrontend { //top.setBackground(Color.BLUE); for (GlobalVascAction action:entry.getGlobalActions()) { JButton but = new JButton(); - but.setText(entry.getVascEntryResourceResolver().getTextValue(action.getName())); - but.setToolTipText(entry.getVascEntryResourceResolver().getTextValue(action.getToolTip())); + but.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(action.getName())); + but.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(action.getToolTip())); but.addActionListener(new GlobalActionListener(action)); but.setIcon(getImageIcon(action.getImage())); top.add(but); @@ -481,7 +483,11 @@ public class SwingVascFrontend implements VascFrontend { continue; } TableColumn t = new TableColumn(); - t.setPreferredWidth(c.getSizeList()); + if (c.getSizeList()!=null) { + t.setPreferredWidth(c.getSizeList()); + } else { + t.setPreferredWidth(200); + } t.setHeaderValue(c); t.setHeaderRenderer(renderer); t.setModelIndex(counter); @@ -493,15 +499,15 @@ public class SwingVascFrontend implements VascFrontend { table.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2) { - Object o = entry.getEntryDataObject(); + Object o = entry.getVascFrontendData().getEntryDataObject(); if (o==null) { return; } try { // TODO: fix this - entry.getVascFrontend().renderEdit(o); + entry.getVascFrontendData().getVascFrontend().renderEdit(o); } catch (Exception ee) { - entry.getVascFrontendController().getVascFrontendHelper().handleException(ee, entry); + entry.getVascFrontendData().getVascFrontendHelper().handleException(ee, entry); } } } @@ -524,10 +530,10 @@ public class SwingVascFrontend implements VascFrontend { if (rowIndex!=-1) { // temp; gets index by sorter rowIndex = tableSorter.modelIndex(rowIndex); - Object data = entry.getEntryDataList().get(rowIndex); - entry.setEntryDataObject(data); + Object data = entry.getVascFrontendData().getEntryDataList().get(rowIndex); + entry.getVascFrontendData().setEntryDataObject(data); } else { - entry.setEntryDataObject(null); + entry.getVascFrontendData().setEntryDataObject(null); } } } @@ -535,8 +541,8 @@ public class SwingVascFrontend implements VascFrontend { private static final long serialVersionUID = 10L; public Component getentryCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) { VascEntryField c = (VascEntryField)value; - setText(c.getVascEntry().getVascEntryResourceResolver().getTextValue(c.getName())); - setToolTipText(c.getVascEntry().getVascEntryResourceResolver().getTextValue(c.getDescription())); + setText(c.getVascEntry().getVascFrontendData().getVascEntryResourceResolver().getTextValue(c.getName())); + setToolTipText(c.getVascEntry().getVascFrontendData().getVascEntryResourceResolver().getTextValue(c.getDescription())); if(c.getImage()!=null) { setIcon(getImageIcon(c.getImage())); @@ -563,8 +569,8 @@ public class SwingVascFrontend implements VascFrontend { JPanel panel = new JPanel(); for(RowVascAction action:entry.getRowActions()) { JButton but = new JButton(); - but.setText(entry.getVascEntryResourceResolver().getTextValue(action.getName())); - but.setToolTipText(entry.getVascEntryResourceResolver().getTextValue(action.getToolTip())); + but.setText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(action.getName())); + but.setToolTipText(entry.getVascFrontendData().getVascEntryResourceResolver().getTextValue(action.getToolTip())); but.setIcon(getImageIcon(action.getImage())); but.addActionListener(new RowActionListener(action)); panel.add(but); @@ -585,9 +591,9 @@ public class SwingVascFrontend implements VascFrontend { public void actionPerformed(ActionEvent event) { logger.fine("Row Action"); try { - action.doRowAction(entry, entry.getEntryDataObject()); + action.doRowAction(entry, entry.getVascFrontendData().getEntryDataObject()); } catch (Exception e) { - entry.getVascFrontendController().getVascFrontendHelper().handleException(e, entry); + entry.getVascFrontendData().getVascFrontendHelper().handleException(e, entry); } } } @@ -605,12 +611,12 @@ public class SwingVascFrontend implements VascFrontend { try { action.doGlobalAction(entry); } catch (Exception e) { - entry.getVascFrontendController().getVascFrontendHelper().handleException(e, entry); + entry.getVascFrontendData().getVascFrontendHelper().handleException(e, entry); } } } - class VascColumnModel extends AbstractTableModel implements VascEventListener { + class VascColumnModel extends AbstractTableModel { //implements VascEventListener { private static final long serialVersionUID = 10L; public void vascEvent(VascEventType e,Object o) { @@ -637,17 +643,17 @@ public class SwingVascFrontend implements VascFrontend { * @see javax.swing.entry.entryModel#getRowCount() */ public int getRowCount() { - if (entry.getEntryDataList()==null) { + if (entry.getVascFrontendData().getEntryDataList()==null) { return 0; } - return entry.getEntryDataList().size(); + return entry.getVascFrontendData().getEntryDataList().size(); } /** * @see javax.swing.entry.entryModel#getValueAt(int, int) */ public Object getValueAt(int rowIndex, int columnIndex) { - Object bean = entry.getEntryDataList().get(rowIndex); + Object bean = entry.getVascFrontendData().getEntryDataList().get(rowIndex); logger.finer("Rending column; "+columnIndex+" bean: "+bean); // TODO: this is slowing.... diff --git a/src/com/idcanet/vasc/frontends/swt/SwtVascFrontend.java b/src/com/idcanet/vasc/frontends/swt/SwtVascFrontend.java index 8f82bcf..d3f0713 100644 --- a/src/com/idcanet/vasc/frontends/swt/SwtVascFrontend.java +++ b/src/com/idcanet/vasc/frontends/swt/SwtVascFrontend.java @@ -65,6 +65,7 @@ import org.eclipse.swt.widgets.ToolItem; import com.idcanet.fff.SwingImageHelper; import com.idcanet.vasc.core.VascEntry; +import com.idcanet.vasc.core.VascFrontend; import com.idcanet.vasc.core.actions.GlobalVascAction; import com.idcanet.vasc.core.actions.RowVascAction; diff --git a/src/com/idcanet/vasc/impl/DefaultVascController.java b/src/com/idcanet/vasc/impl/DefaultVascController.java new file mode 100644 index 0000000..92f5508 --- /dev/null +++ b/src/com/idcanet/vasc/impl/DefaultVascController.java @@ -0,0 +1,87 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.impl; + +import com.idcanet.vasc.core.VascBackendControllerResolver; +import com.idcanet.vasc.core.VascController; +import com.idcanet.vasc.core.VascEntryControllerResolver; +import com.idcanet.vasc.core.VascEntryFieldTypeControllerResolver; + +/** + * + * + * @author Willem Cazander + * @version 1.0 Sep 11, 2008 + */ +public class DefaultVascController implements VascController { + + private VascBackendControllerResolver vascBackendControllerResolver = null; + private VascEntryControllerResolver vascEntryControllerResolver = null; + private VascEntryFieldTypeControllerResolver vascEntryFieldTypeControllerResolver = null; + + /** + * @return the vascBackendControllerResolver + */ + public VascBackendControllerResolver getVascBackendControllerResolver() { + return vascBackendControllerResolver; + } + + /** + * @param vascBackendControllerResolver the vascBackendControllerResolver to set + */ + public void setVascBackendControllerResolver(VascBackendControllerResolver vascBackendControllerResolver) { + this.vascBackendControllerResolver = vascBackendControllerResolver; + } + + /** + * @return the vascEntryControllerResolver + */ + public VascEntryControllerResolver getVascEntryControllerResolver() { + return vascEntryControllerResolver; + } + + /** + * @param vascEntryControllerResolver the vascEntryControllerResolver to set + */ + public void setVascEntryControllerResolver(VascEntryControllerResolver vascEntryControllerResolver) { + this.vascEntryControllerResolver = vascEntryControllerResolver; + } + + /** + * @return the vascEntryFieldControllerResolver + */ + public VascEntryFieldTypeControllerResolver getVascEntryFieldTypeControllerResolver() { + return vascEntryFieldTypeControllerResolver; + } + + /** + * @param vascEntryFieldControllerResolver the vascEntryFieldControllerResolver to set + */ + public void setVascEntryFieldTypeControllerResolver(VascEntryFieldTypeControllerResolver vascEntryFieldTypeControllerResolver) { + this.vascEntryFieldTypeControllerResolver = vascEntryFieldTypeControllerResolver; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/DefaultVascEntry.java b/src/com/idcanet/vasc/impl/DefaultVascEntry.java index 472b75e..b014c1b 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascEntry.java +++ b/src/com/idcanet/vasc/impl/DefaultVascEntry.java @@ -31,22 +31,17 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.idcanet.vasc.core.VascBackend; -import com.idcanet.vasc.core.VascBackendController; import com.idcanet.vasc.core.VascEntry; -import com.idcanet.vasc.core.VascEntryController; import com.idcanet.vasc.core.VascEntryField; import com.idcanet.vasc.core.VascEntryFieldSet; -import com.idcanet.vasc.core.VascFrontend; -import com.idcanet.vasc.core.VascFrontendController; +import com.idcanet.vasc.core.VascFrontendData; import com.idcanet.vasc.core.VascLinkEntry; import com.idcanet.vasc.core.actions.ColumnVascAction; import com.idcanet.vasc.core.actions.GlobalVascAction; import com.idcanet.vasc.core.actions.RowVascAction; -import com.idcanet.vasc.core.entry.VascEntryResourceResolver; - /** + * VascEntry * * @author Willem Cazander * @version 1.0 Mar 21, 2007 @@ -64,8 +59,8 @@ public class DefaultVascEntry implements VascEntry { private String headerImage = null; private String headerDescription = null; - private String primaryKeyField = null; - private String displayNameField = null; + private String primaryKeyFieldId = null; + private String displayNameFieldId = null; private boolean vascAdmimList = true; private boolean vascAdmimEdit = true; @@ -73,15 +68,6 @@ public class DefaultVascEntry implements VascEntry { private boolean vascAdmimDelete = true; private List vascFields = null; - private List entryDataList = null; - private Object entryDataObject = null; - private VascBackend vascBackend = null; - private VascFrontend vascFrontend = null; - - private VascBackendController vascBackendController = null; - private VascEntryController vascEntryController = null; - private VascFrontendController vascFrontendController = null; - private VascEntryResourceResolver vascEntryResourceResolver = null; private List rowActions = null; private List columnActions = null; @@ -91,10 +77,13 @@ public class DefaultVascEntry implements VascEntry { private List vascLinkEntries = null; private Map entryParameters = null; + private VascFrontendData vascFrontendData = null; + /** + * Te constructor + */ public DefaultVascEntry() { - vascFields = new ArrayList(10); - entryDataList = new ArrayList(0); + vascFields = new ArrayList(10); rowActions = new ArrayList(10); columnActions = new ArrayList(10); @@ -105,7 +94,17 @@ public class DefaultVascEntry implements VascEntry { entryParameters = new HashMap(); } - + /** + * @see java.lang.Object#clone() + */ + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + + + /** * @return the id */ @@ -219,31 +218,31 @@ public class DefaultVascEntry implements VascEntry { } /** - * @return the primaryKeyField + * @return the primaryKeyFieldId */ - public String getPrimaryKeyField() { - return primaryKeyField; + public String getPrimaryKeyFieldId() { + return primaryKeyFieldId; } /** - * @param primaryKeyField the primaryKeyField to set + * @param primaryKeyFieldId the primaryKeyFieldId to set */ - public void setPrimaryKeyField(String primaryKeyField) { - this.primaryKeyField = primaryKeyField; + public void setPrimaryKeyFieldId(String primaryKeyFieldId) { + this.primaryKeyFieldId = primaryKeyFieldId; } /** - * @return the displayNameField + * @return the displayNameFieldId */ - public String getDisplayNameField() { - return displayNameField; + public String getDisplayNameFieldId() { + return displayNameFieldId; } /** - * @param displayNameField the displayNameField to set + * @param displayNameFieldId the displayNameFieldId to set */ - public void setDisplayNameField(String displayNameField) { - this.displayNameField = displayNameField; + public void setDisplayNameFieldId(String displayNameFieldId) { + this.displayNameFieldId = displayNameFieldId; } /** @@ -324,117 +323,17 @@ public class DefaultVascEntry implements VascEntry { } /** - * @return the entryDataList + * @see com.idcanet.vasc.core.VascEntry#getVascEntryFieldById(java.lang.String) */ - public List getEntryDataList() { - return entryDataList; + public VascEntryField getVascEntryFieldById(String id) { + for (VascEntryField v:vascFields) { + if (v.getId().equals(id)) { + return v; + } + } + throw new IllegalArgumentException("Id not found as field"); } - - /** - * @param entryDataList the entryDataList to set - */ - public void setEntryDataList(List entryDataList) { - this.entryDataList = entryDataList; - } - - /** - * @return the entryDataObject - */ - public Object getEntryDataObject() { - return entryDataObject; - } - - /** - * @param entryDataObject the entryDataObject to set - */ - public void setEntryDataObject(Object entryDataObject) { - this.entryDataObject = entryDataObject; - } - - /** - * @return the vascBackend - */ - public VascBackend getVascBackend() { - return vascBackend; - } - - /** - * @param vascBackend the vascBackend to set - */ - public void setVascBackend(VascBackend vascBackend) { - this.vascBackend = vascBackend; - } - - /** - * @return the vascFrontend - */ - public VascFrontend getVascFrontend() { - return vascFrontend; - } - - /** - * @param vascFrontend the vascFrontend to set - */ - public void setVascFrontend(VascFrontend vascFrontend) { - this.vascFrontend = vascFrontend; - } - - /** - * @return the vascBackendController - */ - public VascBackendController getVascBackendController() { - return vascBackendController; - } - - /** - * @param vascBackendController the vascBackendController to set - */ - public void setVascBackendController(VascBackendController vascBackendController) { - this.vascBackendController = vascBackendController; - } - - /** - * @return the vascEntryController - */ - public VascEntryController getVascEntryController() { - return vascEntryController; - } - - /** - * @param vascEntryController the vascEntryController to set - */ - public void setVascEntryController(VascEntryController vascEntryController) { - this.vascEntryController = vascEntryController; - } - - /** - * @return the vascFrontendController - */ - public VascFrontendController getVascFrontendController() { - return vascFrontendController; - } - - /** - * @param vascFrontendController the vascFrontendController to set - */ - public void setVascFrontendController(VascFrontendController vascFrontendController) { - this.vascFrontendController = vascFrontendController; - } - - /** - * @return the vascEntryResourceResolver - */ - public VascEntryResourceResolver getVascEntryResourceResolver() { - return vascEntryResourceResolver; - } - - /** - * @param vascEntryResourceResolver the vascEntryResourceResolver to set - */ - public void setVascEntryResourceResolver(VascEntryResourceResolver vascEntryResourceResolver) { - this.vascEntryResourceResolver = vascEntryResourceResolver; - } - + /** * @return the rowActions */ @@ -540,7 +439,6 @@ public class DefaultVascEntry implements VascEntry { vascLinkEntries.remove(vascLinkEntry); } - /** * @see com.idcanet.vasc.core.VascEntry#getEntryParameter(java.lang.String) */ @@ -548,7 +446,6 @@ public class DefaultVascEntry implements VascEntry { return entryParameters.get(key); } - /** * @see com.idcanet.vasc.core.VascEntry#getEntryParameterKeys() */ @@ -556,13 +453,24 @@ public class DefaultVascEntry implements VascEntry { return new ArrayList(entryParameters.keySet()); } - /** * @see com.idcanet.vasc.core.VascEntry#setEntryParameter(java.lang.String, java.lang.Object) */ public void setEntryParameter(String key, Object value) { entryParameters.put(key, value); } - - + + /** + * @return the vascFrontendData + */ + public VascFrontendData getVascFrontendData() { + return vascFrontendData; + } + + /** + * @param vascFrontendData the vascFrontendData to set + */ + public void setVascFrontendData(VascFrontendData vascFrontendData) { + this.vascFrontendData = vascFrontendData; + } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java b/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java new file mode 100644 index 0000000..5cef5f5 --- /dev/null +++ b/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java @@ -0,0 +1,156 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.idcanet.vasc.core.VascBackend; +import com.idcanet.vasc.core.VascEntryFinalizer; +import com.idcanet.vasc.core.VascFrontend; +import com.idcanet.vasc.core.VascFrontendData; +import com.idcanet.vasc.core.VascFrontendHelper; +import com.idcanet.vasc.core.entry.VascEntryResourceResolver; + + +/** + * + * @author Willem Cazander + * @version 1.0 Mar 21, 2007 + */ +public class DefaultVascFrontendData implements VascFrontendData { + + private VascBackend vascBackend = null; + private List entryDataList = null; + private Object entryDataObject = null; + private VascFrontend vascFrontend = null; + private VascEntryFinalizer vascEntryFinalizer = null; + private VascFrontendHelper vascFrontendHelper = null; + private VascEntryResourceResolver vascEntryResourceResolver = null; + + public DefaultVascFrontendData() { + entryDataList = new ArrayList(0); + } + + /** + * @return the vascBackend + */ + public VascBackend getVascBackend() { + return vascBackend; + } + + /** + * @param vascBackend the vascBackend to set + */ + public void setVascBackend(VascBackend vascBackend) { + this.vascBackend = vascBackend; + } + + /** + * @return the entryDataList + */ + public List getEntryDataList() { + return entryDataList; + } + + /** + * @param entryDataList the entryDataList to set + */ + public void setEntryDataList(List entryDataList) { + this.entryDataList = entryDataList; + } + + /** + * @return the entryDataObject + */ + public Object getEntryDataObject() { + return entryDataObject; + } + + /** + * @param entryDataObject the entryDataObject to set + */ + public void setEntryDataObject(Object entryDataObject) { + this.entryDataObject = entryDataObject; + } + + /** + * @return the vascFrontend + */ + public VascFrontend getVascFrontend() { + return vascFrontend; + } + + /** + * @param vascFrontend the vascFrontend to set + */ + public void setVascFrontend(VascFrontend vascFrontend) { + this.vascFrontend = vascFrontend; + } + + /** + * @see com.idcanet.vasc.core.VascBackendData#getVascEntryFinalizer() + */ + public VascEntryFinalizer getVascEntryFinalizer() { + return vascEntryFinalizer; + } + + /** + * @see com.idcanet.vasc.core.VascBackendData#setVascEntryFinalizer(com.idcanet.vasc.core.VascEntryFinalizer) + */ + public void setVascEntryFinalizer(VascEntryFinalizer vascEntryFinalizer) { + this.vascEntryFinalizer=vascEntryFinalizer; + } + + /** + * @return the vascFrontendHelper + */ + public VascFrontendHelper getVascFrontendHelper() { + return vascFrontendHelper; + } + + /** + * @param vascFrontendHelper the vascFrontendHelper to set + */ + public void setVascFrontendHelper(VascFrontendHelper vascFrontendHelper) { + this.vascFrontendHelper = vascFrontendHelper; + } + + /** + * @return the vascEntryResourceResolver + */ + public VascEntryResourceResolver getVascEntryResourceResolver() { + return vascEntryResourceResolver; + } + + /** + * @param vascEntryResourceResolver the vascEntryResourceResolver to set + */ + public void setVascEntryResourceResolver(VascEntryResourceResolver vascEntryResourceResolver) { + this.vascEntryResourceResolver = vascEntryResourceResolver; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/DefaultVascTableController.java b/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java similarity index 60% rename from src/com/idcanet/vasc/impl/DefaultVascTableController.java rename to src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java index f72ed71..26ffe2b 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascTableController.java +++ b/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java @@ -36,37 +36,204 @@ import org.hibernate.validator.ClassValidator; import org.hibernate.validator.InvalidValue; import com.idcanet.vasc.annotations.VascAnnotationParser; -import com.idcanet.vasc.core.VascEventListener; -import com.idcanet.vasc.core.VascExceptionListener; -import com.idcanet.vasc.core.VascTable; -import com.idcanet.vasc.core.VascTableController; -import com.idcanet.vasc.core.column.VascAnnotationTableColumn; -import com.idcanet.vasc.core.column.VascTableColumn; -import com.idcanet.vasc.core.ui.VascDate; -import com.idcanet.vasc.core.ui.VascTextField; -import com.idcanet.vasc.core.ui.VascToggle; -import com.idcanet.vasc.impl.column.BeanPropertyVascColumnValue; +import com.idcanet.vasc.core.VascEntry; +import com.idcanet.vasc.core.VascEntryField; +import com.idcanet.vasc.core.VascFrontendHelper; +import com.idcanet.vasc.core.entry.VascEntryEventListener; +import com.idcanet.vasc.core.entry.VascEntryEventListener.VascEventType; + /** * * @author Willem Cazander * @version 1.0 Apr 28, 2007 */ -public class DefaultVascTableController implements VascTableController { +public class DefaultVascFrontendHelper implements VascFrontendHelper { private Logger logger = null; - private List eventListeners = null; - private List exceptionListeners = null; + //private List eventListeners = null; + //private List exceptionListeners = null; - public DefaultVascTableController() { - logger = Logger.getLogger(DefaultVascTableController.class.getName()); - eventListeners = new ArrayList(2); - exceptionListeners = new ArrayList(2); + public DefaultVascFrontendHelper() { + logger = Logger.getLogger(DefaultVascFrontendHelper.class.getName()); + //eventListeners = new ArrayList(2); + //exceptionListeners = new ArrayList(2); } - + /** - * @see com.idcanet.vasc.core.VascTableController#finalizeVascColumns(com.idcanet.vasc.core.VascTable) + * @see com.idcanet.vasc.core.VascFrontendHelper#addEventListener(com.idcanet.vasc.core.entry.VascEntryEventListener) */ + public void addEventListener(VascEntryEventListener e) { + // TODO Auto-generated method stub + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#addExceptionListener(com.idcanet.vasc.core.entry.VascEntryEventListener) + */ + public void addExceptionListener(VascEntryEventListener listener) { + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#fireVascEvent(com.idcanet.vasc.core.entry.VascEntryEventListener.VascEventType, java.lang.Object) + */ + public void fireVascEvent(VascEventType type, Object data) { + + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#getTotalColumnsWidth(com.idcanet.vasc.core.VascEntry) + */ + public Integer getTotalColumnsWidth(VascEntry entry) { + int result = 0; + for(VascEntryField c:entry.getVascEntryFields()) { + if(c.getSizeList()==null) { + Logger.getLogger(VascEntry.class.getName()).finer("Column no size: "+c.getName()); + } else { + result+=c.getSizeList(); + } + } + return result; + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#handleException(java.lang.Exception, com.idcanet.vasc.core.VascEntry) + */ + public void handleException(Exception e, VascEntry table) { + + e.printStackTrace(); + + /* + if (exceptionListeners.isEmpty()) { + Logger.getLogger(DefaultVascTableController.class.getName()).log(Level.WARNING,e.getMessage(),e); + return; + } + for(VascExceptionListener ee:exceptionListeners) { + try { + ee.handleException(e, table); + } catch (Exception eee) { + Logger.getLogger(DefaultVascTableController.class.getName()).log(Level.WARNING,"Error in ExceptionListener: "+eee.getMessage(),eee); + } + } + */ + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#initEditObject(com.idcanet.vasc.core.VascEntry, java.lang.Object) + */ + public Object initEditObject(VascEntry entry, Object object) throws Exception { + if (object!=null) { + return object; + } + object = entry.getVascFrontendData().getVascBackend().provideVascEntryRecordCreator(entry).newRecord(entry); + //fireVascEvent(VascEventListener.VascEventType.BEAN_INIT, object); + return object; + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#initEditObjectColumn(com.idcanet.vasc.core.VascEntryField, java.lang.Object) + */ + public void initEditObjectColumn(VascEntryField field, Object bean) throws Exception { + Object value = field.getVascEntryFieldValue().getValue(field, bean); + if(value==null & field.getDefaultValue()!=null) { + try { + logger.finer("Setting default value for: "+field.getName()+" def: "+field.getDefaultValue()); + field.getVascEntryFieldValue().setValue(field, bean, field.getDefaultValue()); + } catch (Exception e) { + logger.log(Level.WARNING,"Error in setting default value: '"+field.getDefaultValue()+"' error: "+e.getMessage(),e); + } + } + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#mergeObject(com.idcanet.vasc.core.VascEntry, java.lang.Object) + */ + public Object mergeObject(VascEntry entry, Object object) { + Object result = null; + try { + object = entry.getVascFrontendData().getVascBackend().merge(object); + //fireVascEvent(VascEventListener.VascEventType.BEAN_MERGE,object); + // todo: make faster + // add to table at position old old object + // then remove old object + // send refresh + + refreshData(entry); + } catch (Exception e) { + handleException(e, entry); + } + return result; + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#refreshData(com.idcanet.vasc.core.VascEntry) + */ + public void refreshData(VascEntry entry) throws Exception { + entry.getVascFrontendData().setEntryDataObject(null); + entry.getVascFrontendData().setEntryDataList(entry.getVascFrontendData().getVascBackend().execute()); + //fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, null); + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#removeEventListener(com.idcanet.vasc.core.entry.VascEntryEventListener) + */ + public void removeEventListener(VascEntryEventListener e) { + // TODO Auto-generated method stub + + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#removeExceptionListener(com.idcanet.vasc.core.entry.VascEntryEventListener) + */ + public void removeExceptionListener(VascEntryEventListener listener) { + // TODO Auto-generated method stub + + } + + /** + * @see com.idcanet.vasc.core.VascFrontendHelper#setUIComponentsBeanErrors(com.idcanet.vasc.core.VascEntry, java.lang.Object) + */ + public boolean setUIComponentsBeanErrors(VascEntry entry, Object bean) { + boolean error = false; + if(bean==null) { + logger.finest("No bean to check."); + return true; // nothing to check + } + + ClassValidator val = new ClassValidator(bean.getClass()); + InvalidValue[] ival = val.getInvalidValues(bean); + logger.fine("Got invaliled value: "+ival.length); + + for(VascEntryField col:entry.getVascEntryFields()) { + /* + if(col.getVascUIComponent()==null) { + continue; // we only DISPLAY user input errors !! + } + if (col instanceof VascAnnotationTableColumn) { + VascAnnotationTableColumn column = (VascAnnotationTableColumn)col; + + InvalidValue iv = findInvalidValueByProperty(ival,column.getBeanProperty()); + if(iv==null) { + column.getVascUIComponent().setErrorText(null); + continue; // no error on this property + } + error = true; + column.getVascUIComponent().setErrorText(iv.getMessage()); + } + */ + } + logger.finest("Checked for errors: "+error); + return error; + } + private InvalidValue findInvalidValueByProperty(InvalidValue[] ival,String property) { + for(InvalidValue iv:ival) { + if(iv.getPropertyName().equals(property)) { + return iv; + } + } + return null; + } + + /* public void finalizeVascColumns(VascTable table) throws Exception { VascAnnotationParser vap = new VascAnnotationParser(); @@ -116,76 +283,7 @@ public class DefaultVascTableController implements VascTableController { } } - /** - * @see com.idcanet.vasc.core.VascTableController#finalizeVascTable(com.idcanet.vasc.core.VascTable) - */ - public void finalizeVascTable(VascTable table) throws Exception { - } - /** - * @see com.idcanet.vasc.core.VascTableController#getTotalColumnsWidth(com.idcanet.vasc.core.VascTable) - */ - public Integer getTotalColumnsWidth(VascTable table) { - int result = 0; - for(VascTableColumn c:table.getTableColumns()) { - if(c.getWidth()==null) { - Logger.getLogger(VascTable.class.getName()).finer("Column no size: "+c.getName()); - } else { - result+=c.getWidth(); - } - } - return result; - } - - - - /** - * @see com.idcanet.vasc.core.VascTableController#initEditObject(com.idcanet.vasc.core.VascTable, java.lang.Object) - */ - public Object initEditObject(VascTable table, Object object) throws Exception { - if (object!=null) { - return object; - } - object = table.getVascRecordCreator().newRecord(table); - fireVascEvent(VascEventListener.VascEventType.BEAN_INIT, object); - return object; - } - - public void initEditObjectColumn(VascTableColumn c,Object bean) throws Exception { - Object value = c.getVascColumnValue().getValue(c, bean); - if(value==null & c.getDefaultValue()!=null) { - try { - logger.finer("Setting default value for: "+c.getName()+" def: "+c.getDefaultValue()); - c.getVascColumnValue().setValue(c, bean, c.getDefaultValue()); - } catch (Exception e) { - logger.log(Level.WARNING,"Error in setting default value: '"+c.getDefaultValue()+"' error: "+e.getMessage(),e); - } - } - } - - /** - * @see com.idcanet.vasc.core.VascTableController#refreshData() - */ - public void refreshData(VascTable table) throws Exception { - table.setSelectedObject(null); - table.setTableData(table.getVascDataSource().execute()); - fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, null); - } - - public void handleException(Exception e,VascTable table) { - if (exceptionListeners.isEmpty()) { - Logger.getLogger(DefaultVascTableController.class.getName()).log(Level.WARNING,e.getMessage(),e); - return; - } - for(VascExceptionListener ee:exceptionListeners) { - try { - ee.handleException(e, table); - } catch (Exception eee) { - Logger.getLogger(DefaultVascTableController.class.getName()).log(Level.WARNING,"Error in ExceptionListener: "+eee.getMessage(),eee); - } - } - } - public void addEventListener(VascEventListener e) { eventListeners.add(e); } @@ -199,46 +297,7 @@ public class DefaultVascTableController implements VascTableController { } } - @SuppressWarnings("unchecked") - public boolean setUIComponentsBeanErrors(VascTable table,Object bean) { - boolean error = false; - if(bean==null) { - logger.finest("No bean to check."); - return true; // nothing to check - } - - ClassValidator val = new ClassValidator(bean.getClass()); - InvalidValue[] ival = val.getInvalidValues(bean); - logger.fine("Got invaliled value: "+ival.length); - for(VascTableColumn col:table.getTableColumns()) { - if(col.getVascUIComponent()==null) { - continue; // we only DISPLAY user input errors !! - } - if (col instanceof VascAnnotationTableColumn) { - VascAnnotationTableColumn column = (VascAnnotationTableColumn)col; - - InvalidValue iv = findInvalidValueByProperty(ival,column.getBeanProperty()); - if(iv==null) { - column.getVascUIComponent().setErrorText(null); - continue; // no error on this property - } - error = true; - column.getVascUIComponent().setErrorText(iv.getMessage()); - } - } - logger.finest("Checked for errors: "+error); - return error; - } - private InvalidValue findInvalidValueByProperty(InvalidValue[] ival,String property) { - for(InvalidValue iv:ival) { - if(iv.getPropertyName().equals(property)) { - return iv; - } - } - return null; - } - public void addExceptionListener(VascExceptionListener listener) { exceptionListeners.add(listener); } @@ -246,21 +305,5 @@ public class DefaultVascTableController implements VascTableController { public void removeExceptionListener(VascExceptionListener listener) { exceptionListeners.remove(listener); } - - public Object mergeObject(VascTable table,Object object) { - Object result = null; - try { - object = table.getVascDataSource().merge(object); - fireVascEvent(VascEventListener.VascEventType.BEAN_MERGE,object); - // todo: make faster - // add to table at position old old object - // then remove old object - // send refresh - - table.getVascTableController().refreshData(table); - } catch (Exception e) { - handleException(e, table); - } - return result; - } + */ } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/actions/AddRowAction.java b/src/com/idcanet/vasc/impl/actions/AddRowAction.java index 613c029..7798e26 100644 --- a/src/com/idcanet/vasc/impl/actions/AddRowAction.java +++ b/src/com/idcanet/vasc/impl/actions/AddRowAction.java @@ -44,6 +44,6 @@ public class AddRowAction extends AbstractVascAction implements RowVascAction { } public void doRowAction(VascEntry enty,Object rowObject) throws Exception { - enty.getVascFrontend().renderEdit(null); + enty.getVascFrontendData().getVascFrontend().renderEdit(null); } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/actions/CSVExportGlobalAction.java b/src/com/idcanet/vasc/impl/actions/CSVExportGlobalAction.java index 14901b5..8ed2cd7 100644 --- a/src/com/idcanet/vasc/impl/actions/CSVExportGlobalAction.java +++ b/src/com/idcanet/vasc/impl/actions/CSVExportGlobalAction.java @@ -49,7 +49,7 @@ public class CSVExportGlobalAction extends AbstractVascAction implements GlobalV } public void doGlobalAction(VascEntry entry) throws Exception { - entry.getVascFrontend().renderExport(this); + entry.getVascFrontendData().getVascFrontend().renderExport(this); } public void doExport(OutputStream out,VascEntry entry) throws Exception { @@ -59,7 +59,7 @@ public class CSVExportGlobalAction extends AbstractVascAction implements GlobalV p.write(c.getName()+"\t"); } p.write("\n"); - for (Object o:entry.getEntryDataList()) { + for (Object o:entry.getVascFrontendData().getEntryDataList()) { for (VascEntryField c:entry.getVascEntryFields()) { p.write(c.getVascEntryFieldValue().getValue(c, o)+"\t"); } diff --git a/src/com/idcanet/vasc/impl/actions/DeleteRowAction.java b/src/com/idcanet/vasc/impl/actions/DeleteRowAction.java index 5734e1d..9518584 100644 --- a/src/com/idcanet/vasc/impl/actions/DeleteRowAction.java +++ b/src/com/idcanet/vasc/impl/actions/DeleteRowAction.java @@ -47,6 +47,6 @@ public class DeleteRowAction extends AbstractVascAction implements RowVascAction if (rowObject==null) { return; } - entry.getVascFrontend().renderDelete(rowObject); + entry.getVascFrontendData().getVascFrontend().renderDelete(rowObject); } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/actions/EditRowAction.java b/src/com/idcanet/vasc/impl/actions/EditRowAction.java index eafab35..b643870 100644 --- a/src/com/idcanet/vasc/impl/actions/EditRowAction.java +++ b/src/com/idcanet/vasc/impl/actions/EditRowAction.java @@ -48,6 +48,6 @@ public class EditRowAction extends AbstractVascAction implements RowVascAction { if (rowObject==null) { return; } - entry.getVascFrontend().renderEdit(rowObject); + entry.getVascFrontendData().getVascFrontend().renderEdit(rowObject); } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/actions/RefreshDataGlobalAction.java b/src/com/idcanet/vasc/impl/actions/RefreshDataGlobalAction.java index e7390a9..ba20974 100644 --- a/src/com/idcanet/vasc/impl/actions/RefreshDataGlobalAction.java +++ b/src/com/idcanet/vasc/impl/actions/RefreshDataGlobalAction.java @@ -45,6 +45,6 @@ public class RefreshDataGlobalAction extends AbstractVascAction implements Globa public void doGlobalAction(VascEntry entry) throws Exception { - entry.get.refreshData(table); // this wil also fire the event + entry.getVascFrontendData().getVascFrontendHelper().refreshData(entry); // this wil also fire the event } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/actions/XMLExportGlobalAction.java b/src/com/idcanet/vasc/impl/actions/XMLExportGlobalAction.java index 599c5c7..3ff0bec 100644 --- a/src/com/idcanet/vasc/impl/actions/XMLExportGlobalAction.java +++ b/src/com/idcanet/vasc/impl/actions/XMLExportGlobalAction.java @@ -49,14 +49,14 @@ public class XMLExportGlobalAction extends AbstractVascAction implements GlobalV } public void doGlobalAction(VascEntry entry) throws Exception { - entry.getVascFrontend().renderExport(this); + entry.getVascFrontendData().getVascFrontend().renderExport(this); } public void doExport(OutputStream out,VascEntry entry) throws Exception { PrintWriter p = new PrintWriter(out); p.write("\n"); p.write("\n"); - for (Object o:entry.getEntryDataList()) { + for (Object o:entry.getVascFrontendData().getEntryDataList()) { for (VascEntryField c:entry.getVascEntryFields()) { p.write(""); p.write(""+c.getVascEntryFieldValue().getValue(c, o)); diff --git a/src/com/idcanet/vasc/impl/type/DefaultVascEntryFieldType.java b/src/com/idcanet/vasc/impl/type/DefaultVascEntryFieldType.java new file mode 100644 index 0000000..831d482 --- /dev/null +++ b/src/com/idcanet/vasc/impl/type/DefaultVascEntryFieldType.java @@ -0,0 +1,39 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.impl.type; + + +import com.idcanet.vasc.core.AbstractVascEntryFieldType; + +/** + * + * @author Willem Cazander + * @version 1.0 Sep 8, 2008 + */ +public class DefaultVascEntryFieldType extends AbstractVascEntryFieldType { + +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/type/FieldTypeParser.java b/src/com/idcanet/vasc/impl/type/FieldTypeParser.java new file mode 100644 index 0000000..044ee88 --- /dev/null +++ b/src/com/idcanet/vasc/impl/type/FieldTypeParser.java @@ -0,0 +1,72 @@ +/* + * Copyright 2004-2007 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc.impl.type; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.ParserConfigurationException; + +import org.xml.sax.SAXException; + +import com.idcanet.vasc.core.VascEntryFieldType; +import com.idcanet.x4o.core.X4OParser; +import com.idcanet.x4o.element.Element; + +/** + * + * + * @author Willem Cazander + * @version 1.0 Sep 11, 2008 + */ +public class FieldTypeParser extends X4OParser { + + static public final String FIELD_TYPE_LANGUAGE = "fieldtype"; + + /** + * + * @param language + * @throws Exception + */ + public FieldTypeParser() throws Exception { + super(FIELD_TYPE_LANGUAGE); + } + + public void parseVascFieldTypes() throws IOException, SecurityException, NullPointerException, ParserConfigurationException, SAXException { + parseResource("META-INF/fieldtypes.xml"); + } + + public List getTypes() { + List result = new ArrayList(4); + for (Element e:getElementContext().getRootElements()) { + VascEntryFieldType a = (VascEntryFieldType)e.getElementObject(); + result.add(a); + } + return result; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/validators/VascStringLength.java b/src/com/idcanet/vasc/validators/VascStringLength.java index bb2b1e3..6e4ea55 100644 --- a/src/com/idcanet/vasc/validators/VascStringLength.java +++ b/src/com/idcanet/vasc/validators/VascStringLength.java @@ -53,4 +53,17 @@ public @interface VascStringLength { * @return */ int max() default 0; + + static BB bb = new BB() { + public VascValidator getValidator(VascStringLength ano) { + VascStringLengthValidator v = new VascStringLengthValidator(); + v.setMinLenght(ano.min()); + v.setMaxLenght(ano.max()); + return v; + } + }; +} + +interface BB { + public VascValidator getValidator(VascStringLength ano); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/validators/VascStringLengthValidator.java b/src/com/idcanet/vasc/validators/VascStringLengthValidator.java index 3a16c7f..18bca4b 100644 --- a/src/com/idcanet/vasc/validators/VascStringLengthValidator.java +++ b/src/com/idcanet/vasc/validators/VascStringLengthValidator.java @@ -33,11 +33,50 @@ package com.idcanet.vasc.validators; * @version 1.0 Sep 5, 2008 */ public class VascStringLengthValidator implements VascValidator { - + + private Integer minLenght = null; + private Integer maxLenght = null; + /** * @see com.idcanet.vasc.validators.VascValidator#isObjectValid(java.lang.Object) */ public boolean isObjectValid(Object object) throws VascValidatorException { - return false; + String result = (String)object; + + if (getMinLenght()!=null && result.length()getMaxLenght()) { + return false; + } + return true; + } + + /** + * @return the minLenght + */ + public Integer getMinLenght() { + return minLenght; + } + + /** + * @param minLenght the minLenght to set + */ + public void setMinLenght(Integer minLenght) { + this.minLenght = minLenght; + } + + /** + * @return the maxLenght + */ + public Integer getMaxLenght() { + return maxLenght; + } + + /** + * @param maxLenght the maxLenght to set + */ + public void setMaxLenght(Integer maxLenght) { + this.maxLenght = maxLenght; } } \ No newline at end of file diff --git a/tests/META-INF/logging.properties b/tests/META-INF/logging.properties index 74fa94a..2d94ca8 100644 --- a/tests/META-INF/logging.properties +++ b/tests/META-INF/logging.properties @@ -10,7 +10,7 @@ handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = ALL # Set the default logging level for the root logger -.level = ALL +.level = FINE com.idcanet.x4o = ALL diff --git a/tests/com/idcanet/vasc/FieldTypesTest.java b/tests/com/idcanet/vasc/FieldTypesTest.java new file mode 100644 index 0000000..884c8c8 --- /dev/null +++ b/tests/com/idcanet/vasc/FieldTypesTest.java @@ -0,0 +1,64 @@ +/* + * Copyright 2004-2006 IDCA. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and + * the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions + * and the following disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the authors and + * should not be interpreted as representing official policies, either expressed or implied, of IDCA. + */ + +package com.idcanet.vasc; + +import java.io.InputStream; +import java.util.logging.LogManager; + +import com.idcanet.vasc.core.VascEntryFieldType; +import com.idcanet.vasc.impl.type.FieldTypeParser; + +import junit.framework.TestCase; + +/** + * Tests a simple x4o xml language. + * + * @author Willem Cazander + * @version 1.0 Jul 24, 2006 + */ +public class FieldTypesTest extends TestCase { + + public void setUp() throws Exception { + // enable all logs + InputStream loggingProperties = this.getClass().getResourceAsStream("/META-INF/logging.properties"); + LogManager.getLogManager().readConfiguration( loggingProperties ); + loggingProperties.close(); + } + + public void tearDown() throws Exception { + } + + public void testParse() throws Exception { + FieldTypeParser p = new FieldTypeParser(); + p.parseVascFieldTypes(); + + System.out.println("Got types;"); + for (VascEntryFieldType t:p.getTypes()) { + System.out.println("t= "+t.getId()); + } + } +} \ No newline at end of file diff --git a/tests/com/idcanet/vasc/SwingTest.java b/tests/com/idcanet/vasc/SwingTest.java index 95607c3..5df6d2e 100644 --- a/tests/com/idcanet/vasc/SwingTest.java +++ b/tests/com/idcanet/vasc/SwingTest.java @@ -33,6 +33,7 @@ import javax.swing.JFrame; import javax.swing.JPanel; import com.idcanet.vasc.core.VascEntry; +import com.idcanet.vasc.frontends.swing.SwingVascFrontend; import junit.framework.TestCase; @@ -53,16 +54,7 @@ public class SwingTest extends TestCase { public void tearDown() throws Exception { } - - /* - - - default view field - - Admin fields and order - - Admin field groups -> 'collapse - - List filters auto by type - - search fields - - */ + public void testAll() throws Exception { JFrame.setDefaultLookAndFeelDecorated(false); @@ -73,15 +65,15 @@ public class SwingTest extends TestCase { frame.setLocationRelativeTo(null); // get table - VascTable table = TestTable.getVascTable(); + VascEntry entry = TestTable.getVascTable(); // define redering JPanel panel = new JPanel(); - SwingVascViewRenderer render = new SwingVascViewRenderer(panel); + SwingVascFrontend render = new SwingVascFrontend(panel); frame.add(panel); // render - render.initTable(table); + render.initEntry(entry); //table.getTableColumns().get(0).set diff --git a/tests/com/idcanet/vasc/TestModelVascDataSource.java b/tests/com/idcanet/vasc/TestModelVascDataSource.java index f35198e..b241a76 100644 --- a/tests/com/idcanet/vasc/TestModelVascDataSource.java +++ b/tests/com/idcanet/vasc/TestModelVascDataSource.java @@ -37,6 +37,7 @@ import com.idcanet.vasc.core.entry.VascEntryFieldValue; import com.idcanet.vasc.core.entry.VascEntryRecordCreator; import com.idcanet.vasc.core.ui.VascSelectItem; import com.idcanet.vasc.core.ui.VascSelectItemModel; +import com.idcanet.vasc.impl.entry.BeanVascEntryRecordCreator; import com.idcanet.vasc.models.TestModel; /** @@ -103,6 +104,6 @@ public class TestModelVascDataSource extends AbstractVascBackend implements Vasc } public VascEntryRecordCreator provideVascEntryRecordCreator(VascEntry vascEntry) { - return null; + return new BeanVascEntryRecordCreator(TestModel.class); } } \ No newline at end of file diff --git a/tests/com/idcanet/vasc/TestTable.java b/tests/com/idcanet/vasc/TestTable.java index 597763f..0c73783 100644 --- a/tests/com/idcanet/vasc/TestTable.java +++ b/tests/com/idcanet/vasc/TestTable.java @@ -28,12 +28,13 @@ package com.idcanet.vasc; import java.util.Date; +import com.idcanet.vasc.core.VascController; import com.idcanet.vasc.core.VascEntry; import com.idcanet.vasc.core.VascEntryField; import com.idcanet.vasc.core.ui.VascList; +import com.idcanet.vasc.impl.DefaultVascController; import com.idcanet.vasc.impl.DefaultVascEntry; import com.idcanet.vasc.impl.DefaultVascEntryField; -import com.idcanet.vasc.impl.DefaultVascTableController; import com.idcanet.vasc.impl.actions.AddRowAction; import com.idcanet.vasc.impl.actions.CSVExportGlobalAction; import com.idcanet.vasc.impl.actions.DeleteRowAction; @@ -52,6 +53,17 @@ import com.idcanet.vasc.models.TestModel; */ public class TestTable { + static VascController getDefaultVascController() { + DefaultVascController c = new DefaultVascController(); + + + //entry.setVascEntryResourceResolver(new VascI18nTextValue()); + + return c; + + } + + static public VascEntry getVascTable() throws Exception { // define query @@ -63,6 +75,8 @@ public class TestTable { */ + VascController c = getDefaultVascController(); + TestModelVascDataSource data = new TestModelVascDataSource(); // config table @@ -72,24 +86,16 @@ public class TestTable { entry.setHeaderDescription("Met een hele coole tooltip"); entry.setHeaderImage("/resources/images/gabelfresser.gif"); entry.setHelpId("someKey"); - //entry.setVascTableController(new DefaultVascTableController()); - entry.setVascBackend(data); - - //table.setVascTextValue(new DefaultVascTextValue()); - entry.setVascEntryResourceResolver(new VascI18nTextValue()); - - // entry.setVascEntryRecordCreator(new BeanVascEntryRecordCreator(TestModel.class)); + entry.addRowAction(new AddRowAction()); entry.addRowAction(new EditRowAction()); entry.addRowAction(new DeleteRowAction()); entry.addGlobalAction(new XMLExportGlobalAction()); entry.addGlobalAction(new CSVExportGlobalAction()); - //table.addGlobalActions(new HTMLExportGlobalAction()); entry.addGlobalAction(new RefreshDataGlobalAction()); //table.addUserOptions(userOption); - //table.addColumnActions(new GraphColumnAction()); VascEntryField field = new DefaultVascEntryField(); @@ -98,7 +104,12 @@ public class TestTable { field.setDefaultValue("DEFFFFFF"); field.setHelpId("helpColumnKey"); field.setImage("/META-INF/images/silk/png/tick.png"); - field.setVascEntryFieldType(vascEntryFieldType) + try { + field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldType("TextField")); + } catch (Throwable e) { + e.printStackTrace(); + } + field.setVascEntryFieldValue(new BeanPropertyVascEntryFieldValue("name")); entry.addVascEntryField(field); diff --git a/tests/com/idcanet/vasc/models/TestModel.java b/tests/com/idcanet/vasc/models/TestModel.java index ece5fcb..0671a52 100644 --- a/tests/com/idcanet/vasc/models/TestModel.java +++ b/tests/com/idcanet/vasc/models/TestModel.java @@ -39,10 +39,10 @@ import com.idcanet.vasc.annotations.VascHelpId; import com.idcanet.vasc.annotations.VascImage; import com.idcanet.vasc.annotations.VascModelReference; import com.idcanet.vasc.annotations.VascName; -import com.idcanet.vasc.annotations.VascToolTip; -import com.idcanet.vasc.validator.VascDateFuture; -import com.idcanet.vasc.validator.VascObjectNotNull; -import com.idcanet.vasc.validator.VascStringLength; +import com.idcanet.vasc.annotations.VascDescription; +import com.idcanet.vasc.validators.VascDateFuture; +import com.idcanet.vasc.validators.VascObjectNotNull; +import com.idcanet.vasc.validators.VascStringLength; /** * TestModel @@ -51,7 +51,7 @@ import com.idcanet.vasc.validator.VascStringLength; * @author Willem Cazander * @version 1.0 Mar 28, 2007 */ -@VascToolTip(key="En een tooltip op het model") +@VascDescription(key="En een tooltip op het model") public class TestModel { private String name = null; @@ -82,7 +82,7 @@ public class TestModel { * @return the description */ @VascName(key="omscheiving") - @VascToolTip(key="De omscheiving") + @VascDescription(key="De omscheiving") @VascHelpId(helpId="help.id") @VascDefaultValue(defaultValue="xxxxx") @VascColumnWidth(width=200) diff --git a/tests/resources/vasc/tables.xml b/tests/resources/vasc/tables.xml index 73610a8..e7c9c48 100644 --- a/tests/resources/vasc/tables.xml +++ b/tests/resources/vasc/tables.xml @@ -80,15 +80,28 @@ Master + + + + + + + + + - - - + + + + + + +