From f401b61a6c618060f7833d3ae7b64b01964e18d0 Mon Sep 17 00:00:00 2001 From: willemc Date: Tue, 18 Nov 2008 22:04:23 +0100 Subject: [PATCH] [svn r346] WIP, with working x4o and simple ldap backend for listing end editing entries --- .classpath | 7 +- .mymetadata | 13 ++ .project | 27 +++ lib/idcanet-x4o-bin.jar | Bin 108048 -> 109218 bytes src/META-INF/fieldtype-lang.eld | 33 ++- src/META-INF/fieldtypes.xml | 215 ++++++++---------- src/META-INF/vasc-lang.eld | 22 +- .../vasc/backends/ldap/LdapVascBackend.java | 139 ++++++++++- .../ldap/SimpleLdapConnectionProvider.java | 11 +- .../vasc/core/AbstractVascEntryFieldType.java | 68 +++--- ...t.java => VascBackendControllerLocal.java} | 23 +- src/com/idcanet/vasc/core/VascController.java | 6 + .../vasc/core/VascEntryControllerLocal.java | 40 ++++ .../idcanet/vasc/core/VascEntryFieldType.java | 13 +- ...t.java => VascEventChannelController.java} | 27 +-- .../VascEventChannelControllerResolver.java | 38 ++++ src/com/idcanet/vasc/core/VascException.java | 4 + .../idcanet/vasc/core/VascFrontendData.java | 24 +- .../idcanet/vasc/core/ui/VascUIComponent.java | 7 +- .../idcanet/vasc/core/ui/VascValueModel.java | 14 +- .../frontends/swing/SwingVascFrontend.java | 58 ++--- .../vasc/frontends/swing/ui/SwingBoolean.java | 4 +- .../swing/ui/SwingButton.java} | 44 ++-- .../frontends/swing/ui/SwingColorChooser.java | 4 +- .../vasc/frontends/swing/ui/SwingDate.java | 4 +- .../vasc/frontends/swing/ui/SwingLabel.java | 4 +- .../vasc/frontends/swing/ui/SwingList.java | 12 +- .../vasc/frontends/swing/ui/SwingText.java | 4 +- .../frontends/swing/ui/SwingTextArea.java | 4 +- .../vasc/frontends/swt/SwtVascFrontend.java | 29 ++- .../web/jsf/JSFVascFrontendRenderer.java | 0 .../frontends/web/jsf/VascUIComponent.java | 108 +++++++++ .../frontends/web/jsf/VascUIComponentTag.java | 79 +++++++ .../impl/DefaultVascBackedEntryFinalizer.java | 39 +++- .../impl/DefaultVascBackendController.java | 7 +- .../vasc/impl/DefaultVascController.java | 17 ++ .../vasc/impl/DefaultVascEntryController.java | 4 +- .../vasc/impl/DefaultVascEntryField.java | 2 +- .../vasc/impl/DefaultVascEntryFieldSet.java | 5 + .../vasc/impl/DefaultVascFrontendData.java | 84 +++++-- .../vasc/impl/DefaultVascFrontendHelper.java | 34 ++- .../vasc/impl/DefaultVascLinkEntry.java | 55 +++++ .../type/MultiTextVascEntryFieldType.java | 131 +++++++++++ .../x4o/VascBackendElementConfigurator.java | 68 ++++++ .../x4o/VascEntryElementConfigurator.java | 68 ++++++ .../VascEntryFieldSetParameterConverter.java | 63 +++++ .../VascEntryFieldTypeParameterConverter.java | 62 +++++ src/com/idcanet/vasc/impl/x4o/VascParser.java | 79 +++++++ tests/META-INF/vasc-lang.eld | 27 --- tests/META-INF/vasc-namespaces.xml | 8 - tests/com/idcanet/vasc/SwingTest.java | 50 +++- tests/com/idcanet/vasc/TestTable.java | 60 ++--- tests/resources/vasc/tables.xml | 200 +++++----------- www/META-INF/MANIFEST.MF | 3 + www/META-INF/vasc-jsf.taglib.xml | 15 ++ www/WEB-INF/faces-config.xml | 31 +++ www/WEB-INF/vasc-jsf.tld | 27 +++ www/WEB-INF/web.xml | 81 +++++++ www/index.jsp | 12 + www/vasc_test1.jsp | 24 ++ 60 files changed, 1756 insertions(+), 585 deletions(-) create mode 100644 .mymetadata rename src/com/idcanet/vasc/core/{ui/AbstractVascUIComponent.java => VascBackendControllerLocal.java} (79%) create mode 100644 src/com/idcanet/vasc/core/VascEntryControllerLocal.java rename src/com/idcanet/vasc/core/{ui/VascList.java => VascEventChannelController.java} (66%) create mode 100644 src/com/idcanet/vasc/core/VascEventChannelControllerResolver.java rename src/com/idcanet/vasc/{core/ui/VascUIComponentImplLoader.java => frontends/swing/ui/SwingButton.java} (65%) create mode 100644 src/com/idcanet/vasc/frontends/web/jsf/JSFVascFrontendRenderer.java create mode 100644 src/com/idcanet/vasc/frontends/web/jsf/VascUIComponent.java create mode 100644 src/com/idcanet/vasc/frontends/web/jsf/VascUIComponentTag.java create mode 100644 src/com/idcanet/vasc/impl/DefaultVascLinkEntry.java create mode 100644 src/com/idcanet/vasc/impl/type/MultiTextVascEntryFieldType.java create mode 100644 src/com/idcanet/vasc/impl/x4o/VascBackendElementConfigurator.java create mode 100644 src/com/idcanet/vasc/impl/x4o/VascEntryElementConfigurator.java create mode 100644 src/com/idcanet/vasc/impl/x4o/VascEntryFieldSetParameterConverter.java create mode 100644 src/com/idcanet/vasc/impl/x4o/VascEntryFieldTypeParameterConverter.java create mode 100644 src/com/idcanet/vasc/impl/x4o/VascParser.java delete mode 100644 tests/META-INF/vasc-lang.eld delete mode 100644 tests/META-INF/vasc-namespaces.xml create mode 100644 www/META-INF/MANIFEST.MF create mode 100644 www/META-INF/vasc-jsf.taglib.xml create mode 100644 www/WEB-INF/faces-config.xml create mode 100644 www/WEB-INF/vasc-jsf.tld create mode 100644 www/WEB-INF/web.xml create mode 100644 www/index.jsp create mode 100644 www/vasc_test1.jsp diff --git a/.classpath b/.classpath index 4ce1b82..ba9359e 100644 --- a/.classpath +++ b/.classpath @@ -1,7 +1,7 @@ - - + + @@ -19,5 +19,6 @@ - + + diff --git a/.mymetadata b/.mymetadata new file mode 100644 index 0000000..d053dbb --- /dev/null +++ b/.mymetadata @@ -0,0 +1,13 @@ + + + + + + + diff --git a/.project b/.project index 7d4a4b1..e78fd34 100644 --- a/.project +++ b/.project @@ -5,13 +5,40 @@ + + com.genuitec.eclipse.j2eedt.core.WebClasspathBuilder + + + org.eclipse.jdt.core.javabuilder + + com.genuitec.eclipse.j2eedt.core.J2EEProjectValidator + + + + + com.genuitec.eclipse.j2eedt.core.DeploymentDescriptorValidator + + + + + org.eclipse.wst.validation.validationbuilder + + + + + com.genuitec.eclipse.ast.deploy.core.DeploymentBuilder + + + + com.genuitec.eclipse.ast.deploy.core.deploymentnature + com.genuitec.eclipse.j2eedt.core.webnature org.eclipse.jem.workbench.JavaEMFNature org.eclipse.jdt.core.javanature org.eclipse.jem.beaninfo.BeanInfoNature diff --git a/lib/idcanet-x4o-bin.jar b/lib/idcanet-x4o-bin.jar index bb27fcbd104a6033e2a23a00b305adca033eb0a8..9d465c73375a86caa538bf2b280dc5fc59822824 100644 GIT binary patch delta 16204 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±2ZW%p3Kl>Z`bOZMw*WrauHestQ%?s&=?@v2D3EQ0z+d6jn>|38 z-`;NljUc1$px{q(2Hg}wY#}2K3^|ug_m@(H#eb9@eo2(xLc9vtKX5^BAzh~W`u;`< zcG?w;UI;vcMRU8q;)5Lu0WMh2KQ}Ff04MCS8~95hpbYEb1r{m-)L>7&!O=w!jU`|3 TLJ`36h=dsi<~0bCSD60;AZ0&U delta 14826 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 H7UBN@o$2~v diff --git a/src/META-INF/fieldtype-lang.eld b/src/META-INF/fieldtype-lang.eld index 235da1e..0167ca3 100644 --- a/src/META-INF/fieldtype-lang.eld +++ b/src/META-INF/fieldtype-lang.eld @@ -1,18 +1,27 @@ - - - + - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/META-INF/fieldtypes.xml b/src/META-INF/fieldtypes.xml index f2dd20f..16b6d8d 100644 --- a/src/META-INF/fieldtypes.xml +++ b/src/META-INF/fieldtypes.xml @@ -7,144 +7,113 @@ - - + - - + + + + + - + + + + + + + + + + + + + + + - - + + + + + + + - + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + - - - - - - - - - --> \ No newline at end of file diff --git a/src/META-INF/vasc-lang.eld b/src/META-INF/vasc-lang.eld index 4f3ba4a..9d7b1e8 100644 --- a/src/META-INF/vasc-lang.eld +++ b/src/META-INF/vasc-lang.eld @@ -3,7 +3,7 @@ - + @@ -16,9 +16,23 @@ --> - - - + + + + + + + + + + + + + + + + + diff --git a/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java b/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java index 9f66d42..8841c7a 100644 --- a/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java +++ b/src/com/idcanet/vasc/backends/ldap/LdapVascBackend.java @@ -26,7 +26,10 @@ package com.idcanet.vasc.backends.ldap; +import java.util.ArrayList; +import java.util.Enumeration; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -36,6 +39,12 @@ import com.idcanet.vasc.core.VascEntryField; import com.idcanet.vasc.core.VascException; import com.idcanet.vasc.core.entry.VascEntryFieldValue; import com.idcanet.vasc.core.entry.VascEntryRecordCreator; +import com.novell.ldap.LDAPAttribute; +import com.novell.ldap.LDAPAttributeSet; +import com.novell.ldap.LDAPConnection; +import com.novell.ldap.LDAPEntry; +import com.novell.ldap.LDAPSearchConstraints; +import com.novell.ldap.LDAPSearchResults; /** * @@ -46,6 +55,10 @@ public class LdapVascBackend extends AbstractVascBackend { private LdapConnectionProvider ldapConnectionProvider = null; + private String baseDN = null; + private String keyAttribute = null; + private String ldapFilter = null; + /** * @return the ldapConnectionProvider @@ -68,26 +81,98 @@ public class LdapVascBackend extends AbstractVascBackend { * @see com.idcanet.vasc.core.VascBackend#execute() */ public List execute() throws Exception { - return null; + LdapConnectionProvider prov = getLdapConnectionProvider(); + LDAPConnection connection = prov.getLdapConnection(); + List result = new ArrayList(50); + try { + + + LDAPSearchConstraints cons = new LDAPSearchConstraints(); + cons.setBatchSize( 0 ); + cons.setTimeLimit( 10000 ) ; + + int searchScope = LDAPConnection.SCOPE_ONE; + String searchBase = baseDN; + + System.out.println("\n\tReading object :" + searchBase + " with filter: " + ldapFilter); + LDAPSearchResults searchResults = connection.search( + searchBase, // object to read + searchScope, // scope - read single object + ldapFilter, // search filter + null, // return all attributes + false); // return attrs and values + + System.out.println("Got object :" + searchResults.getCount()); + while (searchResults.hasMore()) { + LDAPEntry entry = searchResults.next(); + System.out.println("We found "+entry.getDN()); + Map map = new HashMap(10); + + LDAPAttributeSet attributeSet = entry.getAttributeSet(); + Iterator i = attributeSet.iterator(); + while (i.hasNext()) { + LDAPAttribute attr = (LDAPAttribute)i.next(); + //System.out.println("ATTR: "+attr.getName()+" ... "); + + map.put(attr.getName(), attr.getStringValueArray()); + } + result.add(map); + } + } finally { + if (connection!=null) { + connection.clone(); + } + } + return result; } /** * @see com.idcanet.vasc.core.VascBackend#merge(java.lang.Object) */ public Object merge(Object object) throws Exception { - return object; + LdapConnectionProvider prov = getLdapConnectionProvider(); + LDAPConnection connection = prov.getLdapConnection(); + try { + + return object; + } finally { + if (connection!=null) { + connection.clone(); + } + } } /** * @see com.idcanet.vasc.core.VascBackend#persist(java.lang.Object) */ - public void persist(Object object) throws Exception { + public void persist(Object object) throws Exception { + LdapConnectionProvider prov = getLdapConnectionProvider(); + LDAPConnection connection = prov.getLdapConnection(); + try { + LDAPEntry entry = new LDAPEntry(); + // entry.getAttributeSet(). + + connection.add(entry); + } finally { + if (connection!=null) { + connection.clone(); + } + } } /** * @see com.idcanet.vasc.core.VascBackend#delete(java.lang.Object) */ public void delete(Object object) throws Exception { + LdapConnectionProvider prov = getLdapConnectionProvider(); + LDAPConnection connection = prov.getLdapConnection(); + try { + + } finally { + if (connection!=null) { + connection.clone(); + } + } } /** @@ -117,7 +202,11 @@ public class LdapVascBackend extends AbstractVascBackend { @SuppressWarnings("unchecked") public Object getValue(VascEntryField field, Object record) throws VascException { Map map = (Map)record; - return map.get(field.getBackendName()); + String[] r = (String[])map.get(field.getBackendName()); + if (r.length==1) { + return r[0]; + } + return r; } /** @@ -131,4 +220,46 @@ public class LdapVascBackend extends AbstractVascBackend { }; return result; } + + /** + * @return the baseDN + */ + public String getBaseDN() { + return baseDN; + } + + /** + * @param baseDN the baseDN to set + */ + public void setBaseDN(String baseDN) { + this.baseDN = baseDN; + } + + /** + * @return the keyAttribute + */ + public String getKeyAttribute() { + return keyAttribute; + } + + /** + * @param keyAttribute the keyAttribute to set + */ + public void setKeyAttribute(String keyAttribute) { + this.keyAttribute = keyAttribute; + } + + /** + * @return the ldapFilter + */ + public String getLdapFilter() { + return ldapFilter; + } + + /** + * @param ldapFilter the ldapFilter to set + */ + public void setLdapFilter(String ldapFilter) { + this.ldapFilter = ldapFilter; + } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java b/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java index b353a88..b14df75 100644 --- a/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java +++ b/src/com/idcanet/vasc/backends/ldap/SimpleLdapConnectionProvider.java @@ -35,7 +35,6 @@ import com.novell.ldap.LDAPConnection; */ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { - private String ldapHost = "localhost"; private int ldapPort = LDAPConnection.DEFAULT_PORT; private int ldapVersion = LDAPConnection.LDAP_V3; @@ -73,7 +72,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { return ldapHost; } - /** * @param ldapHost the ldapHost to set */ @@ -81,7 +79,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { this.ldapHost = ldapHost; } - /** * @return the ldapPort */ @@ -89,7 +86,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { return ldapPort; } - /** * @param ldapPort the ldapPort to set */ @@ -97,7 +93,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { this.ldapPort = ldapPort; } - /** * @return the ldapVersion */ @@ -105,7 +100,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { return ldapVersion; } - /** * @param ldapVersion the ldapVersion to set */ @@ -113,7 +107,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { this.ldapVersion = ldapVersion; } - /** * @return the bindUser */ @@ -121,7 +114,6 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { return bindUser; } - /** * @param bindUser the bindUser to set */ @@ -137,11 +129,10 @@ public class SimpleLdapConnectionProvider implements LdapConnectionProvider { return bindPass; } - /** * @param bindPass the bindPass to set */ public void setBindPass(String bindPass) { this.bindPass = bindPass; - } + } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java b/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java index 7ca3811..89ab19d 100644 --- a/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java +++ b/src/com/idcanet/vasc/core/AbstractVascEntryFieldType.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import com.idcanet.vasc.core.ui.VascUIComponent; +import com.idcanet.vasc.core.ui.VascValueModel; import com.idcanet.vasc.validators.VascValidator; /** @@ -42,10 +43,11 @@ import com.idcanet.vasc.validators.VascValidator; abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { private String id = null; - private List> autoDetectionClasses = null; + private Class autoDetectClass = null; private List vascValidators = null; private Map properties = null; + private Object dataObject = null; private String uiComponentId = null; private String inputMask = null; @@ -89,6 +91,20 @@ abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { return new ArrayList(properties.keySet()); } + /** + * @return the dataObject + */ + public Object getDataObject() { + return dataObject; + } + + /** + * @param dataObject the dataObject to set + */ + public void setDataObject(Object dataObject) { + this.dataObject = dataObject; + } + /** * @see com.idcanet.vasc.core.VascEntryFieldType#getVascValidators() */ @@ -111,17 +127,17 @@ abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { } /** - * @see com.idcanet.vasc.core.VascEntryFieldType#addAutoDetectionClass(java.lang.Class) + * @see com.idcanet.vasc.core.VascEntryFieldType#getAutoDetectClass() */ - public void addAutoDetectionClass(Class classObject) { - autoDetectionClasses.add(classObject); + public Class getAutoDetectClass() { + return autoDetectClass; } /** - * @see com.idcanet.vasc.core.VascEntryFieldType#getAutoDetectionClasses() + * @see com.idcanet.vasc.core.VascEntryFieldType#setAutoDetectClass(java.lang.Class) */ - public List> getAutoDetectionClasses() { - return autoDetectionClasses; + public void setAutoDetectClass(Class autoDetectClass) { + this.autoDetectClass=autoDetectClass; } /** @@ -155,7 +171,7 @@ abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { /** * @see com.idcanet.vasc.core.VascEntryFieldType#getUIComponentCount() */ - public int getUIComponentCount() { + public int getUIComponentCount(VascEntryField entryField) throws VascException { return 1; } @@ -163,42 +179,32 @@ abstract public class AbstractVascEntryFieldType implements VascEntryFieldType { * @see com.idcanet.vasc.core.VascEntryFieldType#provideEditorUIComponent(int) */ public VascUIComponent provideEditorUIComponent(int index,VascEntryField entryField) throws VascException { - if (index!=0) { - return null; - } ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl == null) { cl = entryField.getClass().getClassLoader(); // fallback } String compId = getUIComponentId(); if (compId==null) { - compId = VascUIComponent.VASC_TEXT; // ??? mmmm + compId = VascUIComponent.VASC_TEXT; } - String componentClass = entryField.getVascEntry().getVascFrontendData().getVascUIComponent(compId); - try { - return (VascUIComponent)cl.loadClass(componentClass).newInstance(); - } catch (Exception e) { - throw new VascException(); - } + return entryField.getVascEntry().getVascFrontendData().getVascUIComponent(compId); } /** * @see com.idcanet.vasc.core.VascEntryFieldType#provideLabelUIComponent(int) */ public VascUIComponent provideLabelUIComponent(int index,VascEntryField entryField) throws VascException { - if (index!=0) { - return null; - } - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - if (cl == null) { - cl = entryField.getClass().getClassLoader(); // fallback - } - String componentClass = entryField.getVascEntry().getVascFrontendData().getVascUIComponent(VascUIComponent.VASC_LABEL); - try { - return (VascUIComponent)cl.loadClass(componentClass).newInstance(); - } catch (Exception e) { - throw new VascException(); - } + return entryField.getVascEntry().getVascFrontendData().getVascUIComponent(VascUIComponent.VASC_LABEL); } + /** + * @see com.idcanet.vasc.core.VascEntryFieldType#provideEditorVascValueModel() + */ + public VascValueModel provideEditorVascValueModel(int index,VascEntryField entryField) throws VascException { + if (index>0) { + throw new IllegalArgumentException("You have to override provideEditorVascValueModel if multi editor support is needed"); + } + VascValueModel model = new VascValueModel(); + return model; + } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/ui/AbstractVascUIComponent.java b/src/com/idcanet/vasc/core/VascBackendControllerLocal.java similarity index 79% rename from src/com/idcanet/vasc/core/ui/AbstractVascUIComponent.java rename to src/com/idcanet/vasc/core/VascBackendControllerLocal.java index 889b13b..2249590 100644 --- a/src/com/idcanet/vasc/core/ui/AbstractVascUIComponent.java +++ b/src/com/idcanet/vasc/core/VascBackendControllerLocal.java @@ -24,28 +24,15 @@ * should not be interpreted as representing official policies, either expressed or implied, of IDCA. */ -package com.idcanet.vasc.core.ui; +package com.idcanet.vasc.core; + /** * * @author Willem Cazander - * @version 1.0 Aug 12, 2007 + * @version 1.0 Nov 17, 2008 */ -abstract public class AbstractVascUIComponent implements VascUIComponent { +public interface VascBackendControllerLocal extends VascBackendController { - private VascUIComponent wrapper = null; - - /** - * @return the wrapper - */ - public VascUIComponent getWrapper() { - return wrapper; - } - - /** - * @param wrapper the wrapper to set - */ - public void setWrapper(VascUIComponent wrapper) { - this.wrapper = wrapper; - } + public void addVascBackend(VascBackend backend); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascController.java b/src/com/idcanet/vasc/core/VascController.java index f413eeb..cda2fc1 100644 --- a/src/com/idcanet/vasc/core/VascController.java +++ b/src/com/idcanet/vasc/core/VascController.java @@ -51,4 +51,10 @@ public interface VascController { * @return Returns the VascEntryFieldControllerResolver */ public VascEntryFieldTypeControllerResolver getVascEntryFieldTypeControllerResolver(); + + /** + * + * @return Returns the VascEventChannelControllerResolver + */ + public VascEventChannelControllerResolver getVascEventChannelControllerResolver(); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascEntryControllerLocal.java b/src/com/idcanet/vasc/core/VascEntryControllerLocal.java new file mode 100644 index 0000000..3c38f4f --- /dev/null +++ b/src/com/idcanet/vasc/core/VascEntryControllerLocal.java @@ -0,0 +1,40 @@ +/* + * 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; + + +/** + * The local interface which is not used in controllers. + * But is needed to be able to add entry in a safe way. + * + * @author Willem Cazander + * @version 1.0 Nov 16, 2008 + */ +public interface VascEntryControllerLocal extends VascEntryController { + + public void addVascEntry(VascEntry entry,VascController vascController) throws VascException; +} \ 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 26524a0..069506a 100644 --- a/src/com/idcanet/vasc/core/VascEntryFieldType.java +++ b/src/com/idcanet/vasc/core/VascEntryFieldType.java @@ -29,6 +29,7 @@ package com.idcanet.vasc.core; import java.util.List; import com.idcanet.vasc.core.ui.VascUIComponent; +import com.idcanet.vasc.core.ui.VascValueModel; import com.idcanet.vasc.validators.VascValidator; @@ -48,8 +49,8 @@ public interface VascEntryFieldType { public String getInputMask(); public void setInputMask(String inputMask); - public List> getAutoDetectionClasses(); - public void addAutoDetectionClass(Class classObject); + public Class getAutoDetectClass(); + public void setAutoDetectClass(Class classObject); public void addVascValidator(VascValidator vascValidator); public void removeVascValidator(VascValidator vascValidator); @@ -59,7 +60,11 @@ public interface VascEntryFieldType { public String getProperty(String name); public List getPropertyNames(); - public int getUIComponentCount(); + public void setDataObject(Object data); + public Object getDataObject(); + + public int getUIComponentCount(VascEntryField entryField) throws VascException; public VascUIComponent provideLabelUIComponent(int index,VascEntryField entryField) throws VascException; public VascUIComponent provideEditorUIComponent(int index,VascEntryField entryField) throws VascException; -} \ No newline at end of file + public VascValueModel provideEditorVascValueModel(int index,VascEntryField entryField) throws VascException; +} diff --git a/src/com/idcanet/vasc/core/ui/VascList.java b/src/com/idcanet/vasc/core/VascEventChannelController.java similarity index 66% rename from src/com/idcanet/vasc/core/ui/VascList.java rename to src/com/idcanet/vasc/core/VascEventChannelController.java index 6e304a2..2e3bf54 100644 --- a/src/com/idcanet/vasc/core/ui/VascList.java +++ b/src/com/idcanet/vasc/core/VascEventChannelController.java @@ -24,36 +24,15 @@ * should not be interpreted as representing official policies, either expressed or implied, of IDCA. */ -package com.idcanet.vasc.core.ui; - -import com.idcanet.vasc.core.VascEntry; -import com.idcanet.vasc.core.VascEntryField; +package com.idcanet.vasc.core; /** * * @author Willem Cazander - * @version 1.0 Aug 12, 2007 + * @version 1.0 Oct 27, 2008 */ -public class VascList extends VascUIComponentImplLoader { +public interface VascEventChannelController { - private VascSelectItemModel vascSelectItemModel = null; - public Object createComponent(VascEntry entry,VascEntryField entryField,VascValueModel model,Object gui) throws Exception { - return loadAndCreateComponent(this, entry, model, gui); - } - - /** - * @return the vascSelectItemModel - */ - public VascSelectItemModel getVascSelectItemModel() { - return vascSelectItemModel; - } - - /** - * @param vascSelectItemModel the vascSelectItemModel to set - */ - public void setVascSelectItemModel(VascSelectItemModel vascSelectItemModel) { - this.vascSelectItemModel = vascSelectItemModel; - } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascEventChannelControllerResolver.java b/src/com/idcanet/vasc/core/VascEventChannelControllerResolver.java new file mode 100644 index 0000000..774c4ee --- /dev/null +++ b/src/com/idcanet/vasc/core/VascEventChannelControllerResolver.java @@ -0,0 +1,38 @@ +/* + * 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; + + +/** + * + * @author Willem Cazander + * @version 1.0 Oct 27, 2008 + */ +public interface VascEventChannelControllerResolver { + + public VascEventChannelController getVascEventChannelController(); +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/VascException.java b/src/com/idcanet/vasc/core/VascException.java index b8e614d..2a26e34 100644 --- a/src/com/idcanet/vasc/core/VascException.java +++ b/src/com/idcanet/vasc/core/VascException.java @@ -40,6 +40,10 @@ public class VascException extends Exception { public VascException() { } + public VascException(String message) { + super(message); + } + public VascException(Exception e) { super(e); } diff --git a/src/com/idcanet/vasc/core/VascFrontendData.java b/src/com/idcanet/vasc/core/VascFrontendData.java index 52b6ee6..245281f 100644 --- a/src/com/idcanet/vasc/core/VascFrontendData.java +++ b/src/com/idcanet/vasc/core/VascFrontendData.java @@ -29,6 +29,7 @@ package com.idcanet.vasc.core; import java.util.List; import com.idcanet.vasc.core.entry.VascEntryResourceResolver; +import com.idcanet.vasc.core.ui.VascUIComponent; /** @@ -37,17 +38,7 @@ import com.idcanet.vasc.core.entry.VascEntryResourceResolver; * @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 */ @@ -101,5 +92,14 @@ public interface VascFrontendData { public void putVascUIComponent(String rendererId,String uiComponentClass); - public String getVascUIComponent(String rendererId); + public VascUIComponent getVascUIComponent(String rendererId) throws VascException; + public String getVascUIComponentClass(String rendererId); + + public void setVascController(VascController vascController); + + public VascController getVascController(); + + public void addFieldVascUIComponents(VascEntryField field,VascUIComponent uiComponent,Object editor); + public VascUIComponent getFieldVascUIComponent(VascEntryField field); + public Object getFieldRealRenderer(VascEntryField field); } \ No newline at end of file diff --git a/src/com/idcanet/vasc/core/ui/VascUIComponent.java b/src/com/idcanet/vasc/core/ui/VascUIComponent.java index bed5eda..f38960d 100644 --- a/src/com/idcanet/vasc/core/ui/VascUIComponent.java +++ b/src/com/idcanet/vasc/core/ui/VascUIComponent.java @@ -40,16 +40,15 @@ public interface VascUIComponent { static public final String VASC_LABEL = "VascLabel"; static public final String VASC_TEXT = "VascText"; static public final String VASC_LIST = "VascList"; + static public final String VASC_BUTTON = "VascButton"; // optional ui Components static public final String VASC_TEXTAREA = "VascTextArea"; static public final String VASC_BOOLEAN = "VascBoolean"; static public final String VASC_DATE = "VascDate"; + static public final String VASC_COLOR = "VascColor"; - static public final String[] requiredUIComponents = {VASC_LABEL,VASC_TEXT,VASC_LIST}; - - public void setWrapper(VascUIComponent wrapper); - public VascUIComponent getWrapper(); + static public final String[] requiredUIComponents = {VASC_LABEL,VASC_TEXT,VASC_LIST,VASC_BUTTON}; public Object createComponent(VascEntry entry,VascEntryField entryField,VascValueModel model,Object gui) throws Exception; diff --git a/src/com/idcanet/vasc/core/ui/VascValueModel.java b/src/com/idcanet/vasc/core/ui/VascValueModel.java index 8b077ee..adc5ddb 100644 --- a/src/com/idcanet/vasc/core/ui/VascValueModel.java +++ b/src/com/idcanet/vasc/core/ui/VascValueModel.java @@ -41,17 +41,29 @@ public class VascValueModel { private Object value = null; private List listeners = null; + private VascValueModel parentModel = null; public VascValueModel() { listeners = new ArrayList(2); } + public VascValueModel(VascValueModel parentModel) { + this(); + this.parentModel=parentModel; + } public Object getValue() throws VascException { + if (parentModel!=null) { + return parentModel.getValue(); + } return value; } public void setValue(Object value) throws VascException { - this.value = value; + if (parentModel!=null) { + parentModel.setValue(value); + } else { + this.value = value; + } fireListeners(); } diff --git a/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java b/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java index eec3e97..f638935 100644 --- a/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java +++ b/src/com/idcanet/vasc/frontends/swing/SwingVascFrontend.java @@ -31,8 +31,6 @@ import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Font; -import java.awt.Image; -import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; @@ -79,6 +77,8 @@ import com.idcanet.vasc.core.ui.VascColumnValueModelListener; import com.idcanet.vasc.core.ui.VascUIComponent; import com.idcanet.vasc.core.ui.VascValueModel; import com.idcanet.vasc.frontends.swing.ui.SwingBoolean; +import com.idcanet.vasc.frontends.swing.ui.SwingButton; +import com.idcanet.vasc.frontends.swing.ui.SwingColorChooser; import com.idcanet.vasc.frontends.swing.ui.SwingDate; import com.idcanet.vasc.frontends.swing.ui.SwingLabel; import com.idcanet.vasc.frontends.swing.ui.SwingList; @@ -110,11 +110,13 @@ public class SwingVascFrontend extends AbstractVascFrontend { vfd.putVascUIComponent(VascUIComponent.VASC_LABEL,SwingLabel.class.getName()); vfd.putVascUIComponent(VascUIComponent.VASC_TEXT, SwingText.class.getName()); vfd.putVascUIComponent(VascUIComponent.VASC_LIST, SwingList.class.getName()); + vfd.putVascUIComponent(VascUIComponent.VASC_BUTTON, SwingButton.class.getName()); // optional UI components vfd.putVascUIComponent(VascUIComponent.VASC_BOOLEAN , SwingBoolean.class.getName()); vfd.putVascUIComponent(VascUIComponent.VASC_DATE , SwingDate.class.getName()); vfd.putVascUIComponent(VascUIComponent.VASC_TEXTAREA, SwingTextArea.class.getName()); + vfd.putVascUIComponent(VascUIComponent.VASC_COLOR, SwingColorChooser.class.getName()); } public ImageIcon getImageIcon(String imageResource) { @@ -188,7 +190,7 @@ public class SwingVascFrontend extends AbstractVascFrontend { , null // Default button's label ); if (response==JOptionPane.YES_OPTION) { - entry.getVascFrontendData().getVascBackend().delete(rowBean); + entry.getVascFrontendData().getVascController().getVascBackendControllerResolver().getVascBackendController().getVascBackendById(entry.getBackendId()).delete(rowBean); entry.getVascFrontendData().getEntryDataList().remove(rowBean); entry.getVascFrontendData().setEntryDataObject(null); //entry.getVascFrontendController().getVascFrontendHelper().fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, rowBean); @@ -262,9 +264,11 @@ public class SwingVascFrontend extends AbstractVascFrontend { if (c.isEdit()==false) { continue; } - column++; - for (int i=0;i"); + writer.append(" Today is: " + new Date()); + writer.append("

"); + + + HtmlInputText inputText = new HtmlInputText(); + inputText.setParent(this); + // inputText.setId(this.getId() + ":_text1"); + inputText.encodeBegin(context); + inputText.encodeEnd(context); + + if (inputText.getRendersChildren()) { + for (UIComponent child:inputText.getChildren()) { + child.encodeBegin(context); + child.encodeEnd(context); + } + } + + } + + + public void restoreState(FacesContext context, Object state) { + this.state = (Object[]) state; + super.restoreState(context, this.state[0]); + bar = (String) this.state[1]; + } + + public Object saveState(FacesContext context) { + if (state == null) { + state = new Object[2]; + } + state[0] = super.saveState(context); + state[1] = bar; + return state; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/frontends/web/jsf/VascUIComponentTag.java b/src/com/idcanet/vasc/frontends/web/jsf/VascUIComponentTag.java new file mode 100644 index 0000000..4383c47 --- /dev/null +++ b/src/com/idcanet/vasc/frontends/web/jsf/VascUIComponentTag.java @@ -0,0 +1,79 @@ +/* + * 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.frontends.web.jsf; + +import javax.el.ValueExpression; +import javax.faces.component.UIComponent; +import javax.faces.component.UIComponentBase; +import javax.faces.context.FacesContext; +import javax.faces.context.ResponseWriter; +import javax.faces.render.Renderer; +import javax.faces.webapp.UIComponentTag; + +/** + * + * + * @author Willem Cazander + * @version 1.0 Nov 16, 2008 + */ +public class VascUIComponentTag extends UIComponentTag { + + protected ValueExpression bar; + + public String getComponentType() { + return VascUIComponent.COMPONENT_TYPE; + } + + public String getRendererType() { + return VascUIComponent.COMPONENT_TYPE; + } + + public ValueExpression getBar() { + return bar; + } + + protected void setProperties(UIComponent component) { + super.setProperties(component); + VascUIComponent download = null; + try { + //foo = (VascUIComponent) component; + } catch (ClassCastException cce) { + throw new IllegalStateException("Component " + component.toString() + + " not expected type. Expected: com.foo.Foo. Perhaps you're missing a tag?"); + } + + if (bar != null) { + //foo.setValueExpression("bar", bar); + } + } + + public void release() { + super.release(); + bar = null; + } + +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/DefaultVascBackedEntryFinalizer.java b/src/com/idcanet/vasc/impl/DefaultVascBackedEntryFinalizer.java index 7553483..eb8576c 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascBackedEntryFinalizer.java +++ b/src/com/idcanet/vasc/impl/DefaultVascBackedEntryFinalizer.java @@ -26,12 +26,12 @@ package com.idcanet.vasc.impl; -import java.util.Date; - +import com.idcanet.vasc.core.VascBackend; import com.idcanet.vasc.core.VascController; import com.idcanet.vasc.core.VascEntry; import com.idcanet.vasc.core.VascEntryField; import com.idcanet.vasc.core.VascEntryFieldSet; +import com.idcanet.vasc.core.VascEntryFieldType; import com.idcanet.vasc.core.VascEntryFinalizer; import com.idcanet.vasc.core.VascException; import com.idcanet.vasc.core.VascLinkEntry; @@ -67,6 +67,13 @@ public class DefaultVascBackedEntryFinalizer implements VascEntryFinalizer { } } + // Check if backendId is valid + VascBackend back = vascController.getVascBackendControllerResolver().getVascBackendController().getVascBackendById( entry.getBackendId() ); + if (back==null) { + throw new IllegalArgumentException("The VascEntry backendId is not found in backends: '"+entry.getBackendId()+"'"); + } + + // Fill up all not field i18n keys String id = entry.getId(); @@ -183,18 +190,26 @@ public class DefaultVascBackedEntryFinalizer implements VascEntryFinalizer { //vef.setStyleList("vasc.entry."+id+"."+vid+".styleEdit"); } if (vef.getVascEntryFieldValue()==null) { - vef.setVascEntryFieldValue( vascController.getVascBackendControllerResolver().getVascBackendController().getVascBackendById( entry.getBackendId() ).provideVascEntryFieldValue(vef) ); + VascBackend back2 = vascController.getVascBackendControllerResolver().getVascBackendController().getVascBackendById( entry.getBackendId() ); + vef.setVascEntryFieldValue(back2.provideVascEntryFieldValue(vef)); } - if (vef.getVascEntryFieldType()==null) { - - - vef.setVascEntryFieldType(vascController.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("TextField")); - - if (vef.getDefaultValue() instanceof Boolean) { - ///vef.setVascEntryFieldType(vascEntryFieldType); - } else if (vef.getDefaultValue() instanceof Date) { - } else { + if (vef.getVascEntryFieldType()==null) { + Object defValue = vef.getDefaultValue(); + if (defValue != null) { + for (String typeId: vascController.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeIds()) { + VascEntryFieldType type = vascController.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById(typeId); + + if (type.getAutoDetectClass()!=null) { + if (type.getAutoDetectClass().isAssignableFrom(defValue.getClass())) { + vef.setVascEntryFieldType(type); + break; + } + } + } + } + if (vef.getVascEntryFieldType()==null) { + vef.setVascEntryFieldType(vascController.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("TextField")); } //vef.setStyleList("vasc.entry."+id+"."+vid+".styleEdit"); } diff --git a/src/com/idcanet/vasc/impl/DefaultVascBackendController.java b/src/com/idcanet/vasc/impl/DefaultVascBackendController.java index c52c9ce..451a031 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascBackendController.java +++ b/src/com/idcanet/vasc/impl/DefaultVascBackendController.java @@ -30,7 +30,7 @@ import java.util.HashMap; import java.util.Map; import com.idcanet.vasc.core.VascBackend; -import com.idcanet.vasc.core.VascBackendController; +import com.idcanet.vasc.core.VascBackendControllerLocal; /** * @@ -38,7 +38,7 @@ import com.idcanet.vasc.core.VascBackendController; * @author Willem Cazander * @version 1.0 Sep 18, 2008 */ -public class DefaultVascBackendController implements VascBackendController { +public class DefaultVascBackendController implements VascBackendControllerLocal { private Map backends = null; @@ -53,6 +53,9 @@ public class DefaultVascBackendController implements VascBackendController { return backends.get(id); } + /** + * Local + */ public void addVascBackend(VascBackend backend) { if (backend==null) { throw new NullPointerException("backend must not be null."); diff --git a/src/com/idcanet/vasc/impl/DefaultVascController.java b/src/com/idcanet/vasc/impl/DefaultVascController.java index 92f5508..aa370b3 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascController.java +++ b/src/com/idcanet/vasc/impl/DefaultVascController.java @@ -30,6 +30,7 @@ import com.idcanet.vasc.core.VascBackendControllerResolver; import com.idcanet.vasc.core.VascController; import com.idcanet.vasc.core.VascEntryControllerResolver; import com.idcanet.vasc.core.VascEntryFieldTypeControllerResolver; +import com.idcanet.vasc.core.VascEventChannelControllerResolver; /** * @@ -42,7 +43,23 @@ public class DefaultVascController implements VascController { private VascBackendControllerResolver vascBackendControllerResolver = null; private VascEntryControllerResolver vascEntryControllerResolver = null; private VascEntryFieldTypeControllerResolver vascEntryFieldTypeControllerResolver = null; + private VascEventChannelControllerResolver vascEventChannelControllerResolver = null; + /** + * @return the vascEventChannelControllerResolver + */ + public VascEventChannelControllerResolver getVascEventChannelControllerResolver() { + return vascEventChannelControllerResolver; + } + + /** + * @param vascEventChannelControllerResolver the vascEventChannelControllerResolver to set + */ + public void setVascEventChannelControllerResolver( + VascEventChannelControllerResolver vascEventChannelControllerResolver) { + this.vascEventChannelControllerResolver = vascEventChannelControllerResolver; + } + /** * @return the vascBackendControllerResolver */ diff --git a/src/com/idcanet/vasc/impl/DefaultVascEntryController.java b/src/com/idcanet/vasc/impl/DefaultVascEntryController.java index 59b2372..39367fe 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascEntryController.java +++ b/src/com/idcanet/vasc/impl/DefaultVascEntryController.java @@ -33,7 +33,7 @@ import java.util.Map; import com.idcanet.vasc.core.VascController; import com.idcanet.vasc.core.VascEntry; -import com.idcanet.vasc.core.VascEntryController; +import com.idcanet.vasc.core.VascEntryControllerLocal; import com.idcanet.vasc.core.VascException; /** @@ -42,7 +42,7 @@ import com.idcanet.vasc.core.VascException; * @author Willem Cazander * @version 1.0 Sep 18, 2008 */ -public class DefaultVascEntryController implements VascEntryController { +public class DefaultVascEntryController implements VascEntryControllerLocal { private Map entries = null; diff --git a/src/com/idcanet/vasc/impl/DefaultVascEntryField.java b/src/com/idcanet/vasc/impl/DefaultVascEntryField.java index 86d3b61..108d830 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascEntryField.java +++ b/src/com/idcanet/vasc/impl/DefaultVascEntryField.java @@ -95,7 +95,7 @@ public class DefaultVascEntryField implements VascEntryField { } public DefaultVascEntryField(String id) { - super(); + this(); setId(id); } diff --git a/src/com/idcanet/vasc/impl/DefaultVascEntryFieldSet.java b/src/com/idcanet/vasc/impl/DefaultVascEntryFieldSet.java index 1a9b6af..918bf1a 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascEntryFieldSet.java +++ b/src/com/idcanet/vasc/impl/DefaultVascEntryFieldSet.java @@ -26,6 +26,7 @@ package com.idcanet.vasc.impl; +import java.util.ArrayList; import java.util.List; import com.idcanet.vasc.core.VascEntryFieldSet; @@ -52,6 +53,10 @@ public class DefaultVascEntryFieldSet implements VascEntryFieldSet { private List vascEntryFieldIds = null; + public DefaultVascEntryFieldSet() { + vascEntryFieldIds = new ArrayList(10); + } + /** * @return the id */ diff --git a/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java b/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java index 2c745fc..26c9fa1 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java +++ b/src/com/idcanet/vasc/impl/DefaultVascFrontendData.java @@ -31,12 +31,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.idcanet.vasc.core.VascBackend; +import com.idcanet.vasc.core.VascController; +import com.idcanet.vasc.core.VascEntryField; import com.idcanet.vasc.core.VascEntryFinalizer; +import com.idcanet.vasc.core.VascException; 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; +import com.idcanet.vasc.core.ui.VascUIComponent; /** @@ -46,7 +49,6 @@ import com.idcanet.vasc.core.entry.VascEntryResourceResolver; */ public class DefaultVascFrontendData implements VascFrontendData { - private VascBackend vascBackend = null; private List entryDataList = null; private Object entryDataObject = null; private VascFrontend vascFrontend = null; @@ -54,26 +56,19 @@ public class DefaultVascFrontendData implements VascFrontendData { private VascFrontendHelper vascFrontendHelper = null; private VascEntryResourceResolver vascEntryResourceResolver = null; private Map uiComponents = null; + private VascController vascController = null; + + private Map fieldComps = null; + private Map fieldEditors = null; public DefaultVascFrontendData() { entryDataList = new ArrayList(0); uiComponents = new HashMap(8); + + fieldComps = new HashMap(8); + fieldEditors = new HashMap(8); } - - /** - * @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 */ @@ -158,10 +153,27 @@ public class DefaultVascFrontendData implements VascFrontendData { this.vascEntryResourceResolver = vascEntryResourceResolver; } + + public VascUIComponent getVascUIComponent(String rendererId) throws VascException { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == null) { + cl = rendererId.getClass().getClassLoader(); // fallback + } + String componentClass = getVascUIComponentClass(rendererId); + if (componentClass==null) { + throw new VascException("No component Class found for frontend UIComponent: "+rendererId); + } + try { + return (VascUIComponent)cl.loadClass(componentClass).newInstance(); + } catch (Exception e) { + throw new VascException(e); + } + } + /** * @see com.idcanet.vasc.core.VascFrontendData#getVascUIComponent(java.lang.String) */ - public String getVascUIComponent(String rendererId) { + public String getVascUIComponentClass(String rendererId) { return uiComponents.get(rendererId); } @@ -171,4 +183,40 @@ public class DefaultVascFrontendData implements VascFrontendData { public void putVascUIComponent(String rendererId, String uiComponentClass) { uiComponents.put(rendererId, uiComponentClass); } + + /** + * @return the vascController + */ + public VascController getVascController() { + return vascController; + } + + /** + * @param vascController the vascController to set + */ + public void setVascController(VascController vascController) { + this.vascController = vascController; + } + + /** + * @see com.idcanet.vasc.core.VascFrontendData#addFieldVascUIComponents(com.idcanet.vasc.core.VascEntryField, com.idcanet.vasc.core.ui.VascUIComponent, java.lang.Object) + */ + public void addFieldVascUIComponents(VascEntryField field,VascUIComponent uiComponent, Object editor) { + fieldComps.put(field, uiComponent); + fieldEditors.put(field, editor); + } + + /** + * @see com.idcanet.vasc.core.VascFrontendData#getFieldRealRenderer(com.idcanet.vasc.core.VascEntryField) + */ + public Object getFieldRealRenderer(VascEntryField field) { + return fieldEditors.get(field); + } + + /** + * @see com.idcanet.vasc.core.VascFrontendData#getFieldVascUIComponent(com.idcanet.vasc.core.VascEntryField) + */ + public VascUIComponent getFieldVascUIComponent(VascEntryField field) { + return fieldComps.get(field); + } } \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java b/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java index f431651..099742f 100644 --- a/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java +++ b/src/com/idcanet/vasc/impl/DefaultVascFrontendHelper.java @@ -34,6 +34,8 @@ 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; +import com.idcanet.vasc.core.ui.VascUIComponent; +import com.idcanet.vasc.validators.VascValidator; /** @@ -117,7 +119,7 @@ public class DefaultVascFrontendHelper implements VascFrontendHelper { if (object!=null) { return object; } - object = entry.getVascFrontendData().getVascBackend().provideVascEntryRecordCreator(entry).newRecord(entry); + object = entry.getVascFrontendData().getVascController().getVascBackendControllerResolver().getVascBackendController().getVascBackendById(entry.getBackendId()).provideVascEntryRecordCreator(entry).newRecord(entry); //fireVascEvent(VascEventListener.VascEventType.BEAN_INIT, object); return object; } @@ -143,7 +145,7 @@ public class DefaultVascFrontendHelper implements VascFrontendHelper { public Object mergeObject(VascEntry entry, Object object) { Object result = null; try { - object = entry.getVascFrontendData().getVascBackend().merge(object); + object = entry.getVascFrontendData().getVascController().getVascBackendControllerResolver().getVascBackendController().getVascBackendById(entry.getBackendId()).merge(object); //fireVascEvent(VascEventListener.VascEventType.BEAN_MERGE,object); // todo: make faster // add to table at position old old object @@ -162,7 +164,7 @@ public class DefaultVascFrontendHelper implements VascFrontendHelper { */ public void refreshData(VascEntry entry) throws Exception { entry.getVascFrontendData().setEntryDataObject(null); - entry.getVascFrontendData().setEntryDataList(entry.getVascFrontendData().getVascBackend().execute()); + entry.getVascFrontendData().setEntryDataList(entry.getVascFrontendData().getVascController().getVascBackendControllerResolver().getVascBackendController().getVascBackendById(entry.getBackendId()).execute()); //fireVascEvent(VascEventListener.VascEventType.DATA_UPDATE, null); } @@ -197,6 +199,32 @@ public class DefaultVascFrontendHelper implements VascFrontendHelper { //logger.fine("Got invaliled value: "+ival.length); for(VascEntryField col:entry.getVascEntryFields()) { + + try { + Object object = col.getVascEntryFieldValue().getValue(col, bean); + VascUIComponent comp = entry.getVascFrontendData().getFieldVascUIComponent(col); + + for (VascValidator val:col.getVascEntryFieldType().getVascValidators()) { + if (val.isObjectValid(object)==false) { + comp.setErrorText("error"); + error = true; + } else { + comp.setErrorText(null); + } + } + + for (VascValidator val:col.getVascValidators()) { + if (val.isObjectValid(object)==false) { + comp.setErrorText("error"); + error = true; + } else { + comp.setErrorText(null); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + /* if(col.getVascUIComponent()==null) { continue; // we only DISPLAY user input errors !! diff --git a/src/com/idcanet/vasc/impl/DefaultVascLinkEntry.java b/src/com/idcanet/vasc/impl/DefaultVascLinkEntry.java new file mode 100644 index 0000000..607b829 --- /dev/null +++ b/src/com/idcanet/vasc/impl/DefaultVascLinkEntry.java @@ -0,0 +1,55 @@ +/* + * Copyright 2004-2008 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.VascLinkEntry; + + +/** + * The DefaultVascLinkEntry + * + * @author Willem Cazander + * @version 1.0 Oct 27, 2007 + */ +public class DefaultVascLinkEntry implements VascLinkEntry { + + private String vascEntryName = null; + + /** + * @return the vascEntryName + */ + public String getVascEntryName() { + return vascEntryName; + } + + /** + * @param vascEntryName the vascEntryName to set + */ + public void setVascEntryName(String vascEntryName) { + this.vascEntryName = vascEntryName; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/type/MultiTextVascEntryFieldType.java b/src/com/idcanet/vasc/impl/type/MultiTextVascEntryFieldType.java new file mode 100644 index 0000000..87c9c52 --- /dev/null +++ b/src/com/idcanet/vasc/impl/type/MultiTextVascEntryFieldType.java @@ -0,0 +1,131 @@ +/* + * 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.util.List; + +import com.idcanet.vasc.core.VascEntryField; +import com.idcanet.vasc.core.VascException; +import com.idcanet.vasc.core.ui.VascValueModel; + + +/** + * Custem FieldType for multi text values. + * + * @author Willem Cazander + * @version 1.0 Nov 17, 2008 + */ +public class MultiTextVascEntryFieldType extends DefaultVascEntryFieldType { + + private Object getIndexValue(VascEntryField entryField,int index) throws VascException { + Object record = entryField.getVascEntry().getVascFrontendData().getEntryDataObject(); + Object value = entryField.getVascEntryFieldValue().getValue(entryField, record); + + if (value instanceof List) { + return ((List)value).get(index); + } + if (value instanceof String[]) { + if (index >= ((String[])value).length ) { + return ""; + } + return ((String[])value)[index]; + } + if (value instanceof String) { + return ((String)value); + } + throw new VascException("Unknown object type"); + } + + private void setIndexValue(VascEntryField entryField,int index,Object newValue) throws VascException { + Object record = entryField.getVascEntry().getVascFrontendData().getEntryDataObject(); + Object value = entryField.getVascEntryFieldValue().getValue(entryField, record); + + if (value instanceof List) { + ((List)value).set(index, newValue); + return; + } + if (value instanceof String[]) { + + if (index+1 > ((String[])value).length ) { + String[] n = new String[index+1]; + for (int i=0;i<((String[])value).length;i++) { + n[i]= ((String[])value)[i]; + } + value = n; + } + ((String[])value)[index] = newValue.toString(); + return; + } + if (value instanceof String) { + value = new String[] { (String)value }; + return; + } + throw new VascException("Unknown object type: "+value); + } + + /** + * @see com.idcanet.vasc.core.AbstractVascEntryFieldType#getUIComponentCount(com.idcanet.vasc.core.VascEntryField) + */ + @Override + public int getUIComponentCount(VascEntryField entryField) throws VascException { + + + Object record = entryField.getVascEntry().getVascFrontendData().getEntryDataObject(); + Object value = entryField.getVascEntryFieldValue().getValue(entryField, record); + + if (value instanceof List) { + return ((List)value).size()+1; + } + if (value instanceof String[]) { + return ((String[])value).length+1; + } + if (value instanceof String) { + return 1+1; + } + throw new VascException("Unknown object type: "+value); + } + + /** + * @see com.idcanet.vasc.core.AbstractVascEntryFieldType#provideEditorVascValueModel(int, com.idcanet.vasc.core.VascEntryField) + */ + @Override + public VascValueModel provideEditorVascValueModel(final int index,final VascEntryField entryField) { + VascValueModel model = new VascValueModel() { + public Object getValue() throws VascException { + Object value = getIndexValue(entryField,index); + return value; + } + + public void setValue(Object value) throws VascException { + setIndexValue(entryField,index,value); + super.setValue(value); + } + }; + + return model; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/x4o/VascBackendElementConfigurator.java b/src/com/idcanet/vasc/impl/x4o/VascBackendElementConfigurator.java new file mode 100644 index 0000000..6fa28a7 --- /dev/null +++ b/src/com/idcanet/vasc/impl/x4o/VascBackendElementConfigurator.java @@ -0,0 +1,68 @@ +/* + * Copyright 2004-2008 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.x4o; + +import com.idcanet.vasc.core.VascBackend; +import com.idcanet.vasc.core.VascBackendController; +import com.idcanet.vasc.core.VascBackendControllerLocal; +import com.idcanet.vasc.core.VascController; + +import com.idcanet.x4o.element.AbstractElementConfigurator; +import com.idcanet.x4o.element.Element; +import com.idcanet.x4o.element.ElementConfiguratorException; + + +/** + * Adds the backend to the local controller + * + * @author Willem Cazander + * @version 1.0 Nov 16, 2008 + */ +public class VascBackendElementConfigurator extends AbstractElementConfigurator { + + /** + * @see com.idcanet.x4o.element.AbstractElementConfigurator#doConfigEndTag(com.idcanet.x4o.element.Element) + */ + @Override + public void doConfigEndTag(Element element) throws ElementConfiguratorException { + + VascBackend backend = (VascBackend)element.getElementObject(); + + VascController vascController = VascParser.getVascController(element.getElementContext()); + VascBackendController backendController = vascController.getVascBackendControllerResolver().getVascBackendController(); + + if (backendController instanceof VascBackendControllerLocal) { + try { + ((VascBackendControllerLocal)backendController).addVascBackend(backend); + } catch (Exception e) { + throw new ElementConfiguratorException(this,"Couln't add backend: "+e.getMessage(),e); + } + } else { + throw new ElementConfiguratorException(this,"Can not add backend '"+backend.getId()+"' to VascBackendController because we have no access to VascBackendControllerLocal interface."); + } + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/x4o/VascEntryElementConfigurator.java b/src/com/idcanet/vasc/impl/x4o/VascEntryElementConfigurator.java new file mode 100644 index 0000000..93fde9c --- /dev/null +++ b/src/com/idcanet/vasc/impl/x4o/VascEntryElementConfigurator.java @@ -0,0 +1,68 @@ +/* + * Copyright 2004-2008 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.x4o; + +import com.idcanet.vasc.core.VascController; +import com.idcanet.vasc.core.VascEntry; +import com.idcanet.vasc.core.VascEntryController; +import com.idcanet.vasc.core.VascEntryControllerLocal; +import com.idcanet.vasc.core.VascException; +import com.idcanet.x4o.element.AbstractElementConfigurator; +import com.idcanet.x4o.element.Element; +import com.idcanet.x4o.element.ElementConfiguratorException; + + +/** + * Converts the type to the type object + * + * @author Willem Cazander + * @version 1.0 Nov 16, 2008 + */ +public class VascEntryElementConfigurator extends AbstractElementConfigurator { + + /** + * @see com.idcanet.x4o.element.AbstractElementConfigurator#doConfigEndTag(com.idcanet.x4o.element.Element) + */ + @Override + public void doConfigEndTag(Element element) throws ElementConfiguratorException { + + VascEntry entry = (VascEntry)element.getElementObject(); + + VascController vascController = VascParser.getVascController(element.getElementContext()); + VascEntryController entryController = vascController.getVascEntryControllerResolver().getVascEntryController(); + + if (entryController instanceof VascEntryControllerLocal) { + try { + ((VascEntryControllerLocal)entryController).addVascEntry(entry, vascController); + } catch (VascException e) { + throw new ElementConfiguratorException(this,"Couln't add entry: "+e.getMessage(),e); + } + } else { + throw new ElementConfiguratorException(this,"Can not add entry '"+entry.getId()+"' to VascEntryController because we have no access to VascEntryControllerLocal interface."); + } + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/x4o/VascEntryFieldSetParameterConverter.java b/src/com/idcanet/vasc/impl/x4o/VascEntryFieldSetParameterConverter.java new file mode 100644 index 0000000..60655b6 --- /dev/null +++ b/src/com/idcanet/vasc/impl/x4o/VascEntryFieldSetParameterConverter.java @@ -0,0 +1,63 @@ +/* + * Copyright 2004-2008 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.x4o; + +import com.idcanet.vasc.core.VascEntryFieldSet; +import com.idcanet.x4o.element.AbstractElementParameterConverter; +import com.idcanet.x4o.element.Element; +import com.idcanet.x4o.element.ElementParameterConverterException; + + +/** + * Converts the VascEntryFieldSet parameter + * + * @author Willem Cazander + * @version 1.0 Nov 17, 2008 + */ +public class VascEntryFieldSetParameterConverter extends AbstractElementParameterConverter { + + /** + * @see com.idcanet.x4o.element.AbstractElementParameterConverter#doConvertParameter(com.idcanet.x4o.element.Element, java.lang.Object) + */ + @Override + public Object doConvertParameter(Element element, Object parameterValue) throws ElementParameterConverterException { + + if (parameterValue==null) { + throw new NullPointerException("can't convert null parameter"); + } + if ("".equals(parameterValue)) { + return null; + } + String[] ids = parameterValue.toString().split(","); + + VascEntryFieldSet set = (VascEntryFieldSet)element.getElementObject(); + for (String id:ids) { + set.addVascEntryFieldId(id); + } + return null; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/x4o/VascEntryFieldTypeParameterConverter.java b/src/com/idcanet/vasc/impl/x4o/VascEntryFieldTypeParameterConverter.java new file mode 100644 index 0000000..1e60f03 --- /dev/null +++ b/src/com/idcanet/vasc/impl/x4o/VascEntryFieldTypeParameterConverter.java @@ -0,0 +1,62 @@ +/* + * Copyright 2004-2008 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.x4o; + +import com.idcanet.vasc.core.VascController; +import com.idcanet.x4o.element.AbstractElementParameterConverter; +import com.idcanet.x4o.element.Element; +import com.idcanet.x4o.element.ElementParameterConverterException; + + +/** + * Converts the type to the type object + * + * @author Willem Cazander + * @version 1.0 Nov 16, 2008 + */ +public class VascEntryFieldTypeParameterConverter extends AbstractElementParameterConverter { + + /** + * @see com.idcanet.x4o.element.AbstractElementParameterConverter#doConvertParameter(com.idcanet.x4o.element.Element, java.lang.Object) + */ + @Override + public Object doConvertParameter(Element element, Object parameterValue) throws ElementParameterConverterException { + + if (parameterValue==null) { + throw new NullPointerException("can't convert null parameter"); + } + if ("".equals(parameterValue)) { + parameterValue = "TextField"; // ?? + } + String fieldID = parameterValue.toString(); + + VascController controller = VascParser.getVascController(element.getElementContext()); + Object result = controller.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById(fieldID); + + return result; + } +} \ No newline at end of file diff --git a/src/com/idcanet/vasc/impl/x4o/VascParser.java b/src/com/idcanet/vasc/impl/x4o/VascParser.java new file mode 100644 index 0000000..b796ea9 --- /dev/null +++ b/src/com/idcanet/vasc/impl/x4o/VascParser.java @@ -0,0 +1,79 @@ +/* + * Copyright 2004-2008 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.x4o; + +import java.io.IOException; +import javax.el.ValueExpression; +import javax.xml.parsers.ParserConfigurationException; +import org.xml.sax.SAXException; + +import com.idcanet.vasc.core.VascController; +import com.idcanet.x4o.core.X4OParser; +import com.idcanet.x4o.element.ElementContext; + +/** + * Parses the vasc xml streams + * + * + * + * @author Willem Cazander + * @version 1.0 Oct 27, 2008 + */ +public class VascParser extends X4OParser { + + static public String VASC_LANGUAGE = "vasc"; + private VascController vascController = null; + + /** + * @see X4OParser#X4OParser(String) + */ + public VascParser(VascController vascController) throws Exception { + super(VASC_LANGUAGE); + if (vascController==null) { + throw new NullPointerException("vascController may not be null"); + } + this.vascController=vascController; + } + + public VascController getVascController() { + return vascController; + } + + static public VascController getVascController(ElementContext context) { + ValueExpression ee = context.getExpressionFactory().createValueExpression(context.getELContext(),"${vascController}", VascController.class); + VascController con = (VascController)ee.getValue(context.getELContext()); + return con; + } + + protected void preStartParsing() throws ParserConfigurationException,SAXException,IOException { + super.preStartParsing(); + + // Add the controller to EL + ValueExpression ee = getElementContext().getExpressionFactory().createValueExpression(getElementContext().getELContext(),"${vascController}", VascController.class); + ee.setValue(getElementContext().getELContext(), vascController); + } +} \ No newline at end of file diff --git a/tests/META-INF/vasc-lang.eld b/tests/META-INF/vasc-lang.eld deleted file mode 100644 index c19c954..0000000 --- a/tests/META-INF/vasc-lang.eld +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/META-INF/vasc-namespaces.xml b/tests/META-INF/vasc-namespaces.xml deleted file mode 100644 index 01ac3aa..0000000 --- a/tests/META-INF/vasc-namespaces.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Vasc namespace for x4o vasc state/table/column language - - META-INF/vasc-lang.eld - \ No newline at end of file diff --git a/tests/com/idcanet/vasc/SwingTest.java b/tests/com/idcanet/vasc/SwingTest.java index 5df6d2e..657a27f 100644 --- a/tests/com/idcanet/vasc/SwingTest.java +++ b/tests/com/idcanet/vasc/SwingTest.java @@ -26,10 +26,15 @@ package com.idcanet.vasc; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.InputStream; import java.util.logging.LogManager; import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JPanel; import com.idcanet.vasc.core.VascEntry; @@ -57,16 +62,43 @@ public class SwingTest extends TestCase { public void testAll() throws Exception { JFrame.setDefaultLookAndFeelDecorated(false); + VascEntry entry = TestTable.getVascTable(); + JFrame frame = viewEntry(entry); + while (frame.isVisible()) { + Thread.sleep(1000); + } + } + + public JFrame viewEntry(final VascEntry entry) throws Exception { // get GUI JFrame frame = new JFrame(); - frame.setTitle("Vasc Test - Swing"); + frame.setTitle("Vasc Test - Swing - "+entry.getName()); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo(null); - - // get table - VascEntry entry = TestTable.getVascTable(); - + + JMenuBar menubar = new JMenuBar(); + JMenu vascMenu = new JMenu("Vasc Entries"); + + for (final String id:entry.getVascFrontendData().getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryIds()) { + JMenuItem item = new JMenuItem(id); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + VascEntry ee = entry.getVascFrontendData().getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryById(id); + TestTable.fill(ee,entry.getVascFrontendData().getVascController()); + viewEntry(ee); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + + }); + vascMenu.add(item); + } + menubar.add(vascMenu); + frame.setJMenuBar(menubar); + // define redering JPanel panel = new JPanel(); SwingVascFrontend render = new SwingVascFrontend(panel); @@ -74,18 +106,12 @@ public class SwingTest extends TestCase { // render render.initEntry(entry); - - //table.getTableColumns().get(0).set - - //render.renderEdit(table.getTableData().get(0)); render.renderView(); // view frame.pack(); frame.setVisible(true); - while (frame.isVisible()) { - Thread.sleep(1000); - } + return frame; } } \ No newline at end of file diff --git a/tests/com/idcanet/vasc/TestTable.java b/tests/com/idcanet/vasc/TestTable.java index bf79968..dc50243 100644 --- a/tests/com/idcanet/vasc/TestTable.java +++ b/tests/com/idcanet/vasc/TestTable.java @@ -32,7 +32,6 @@ 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.DefaultVascBackedEntryFinalizer; import com.idcanet.vasc.impl.DefaultVascBackendController; import com.idcanet.vasc.impl.DefaultVascBackendControllerResolver; @@ -50,12 +49,9 @@ import com.idcanet.vasc.impl.actions.DeleteRowAction; import com.idcanet.vasc.impl.actions.EditRowAction; import com.idcanet.vasc.impl.actions.RefreshDataGlobalAction; import com.idcanet.vasc.impl.actions.XMLExportGlobalAction; -import com.idcanet.vasc.impl.entry.BeanVascEntryRecordCreator; -import com.idcanet.vasc.impl.entry.BeanPropertyVascEntryFieldValue; -import com.idcanet.vasc.impl.entry.DefaultVascEntryResourceResolver; import com.idcanet.vasc.impl.type.DefaultVascEntryFieldTypeController; import com.idcanet.vasc.impl.type.DefaultVascEntryFieldTypeControllerResolver; -import com.idcanet.vasc.models.TestModel; +import com.idcanet.vasc.impl.x4o.VascParser; /** @@ -69,7 +65,7 @@ public class TestTable { // for test TestModelVascDataSource backend = new TestModelVascDataSource(); - backend.setId("testBackend"); + backend.setId("testBackend1"); // config full controller for local jvm use DefaultVascController c = new DefaultVascController(); @@ -87,6 +83,7 @@ public class TestTable { DefaultVascEntryFieldTypeControllerResolver vascEntryFieldTypeControllerResolver = new DefaultVascEntryFieldTypeControllerResolver(); DefaultVascEntryFieldTypeController vascEntryFieldTypeController = new DefaultVascEntryFieldTypeController(); + //vascEntryFieldTypeController. vascEntryFieldTypeControllerResolver.setVascEntryFieldTypeController(vascEntryFieldTypeController); c.setVascEntryFieldTypeControllerResolver(vascEntryFieldTypeControllerResolver); @@ -94,19 +91,10 @@ public class TestTable { } - - static public VascEntry getVascTable() throws Exception { - - VascController c = getDefaultVascController(); - - // config table - VascEntry entry = new DefaultVascEntry(); - entry.setId("test1"); - entry.setBackendId("testBackend"); - + static public void fill(VascEntry entry,VascController c) { DefaultVascFrontendData vascFrontendData = new DefaultVascFrontendData(); - vascFrontendData.setVascBackend(c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend")); - + vascFrontendData.setVascController(c); + VascI18nTextValue vascEntryResourceResolver = new VascI18nTextValue();// new DefaultVascEntryResourceResolver(); vascFrontendData.setVascEntryResourceResolver(vascEntryResourceResolver); @@ -114,7 +102,7 @@ public class TestTable { vascFrontendData.setVascFrontendHelper(vascFrontendHelper); entry.setVascFrontendData(vascFrontendData); - + entry.addRowAction(new AddRowAction()); entry.addRowAction(new EditRowAction()); entry.addRowAction(new DeleteRowAction()); @@ -122,7 +110,28 @@ public class TestTable { entry.addGlobalAction(new XMLExportGlobalAction()); entry.addGlobalAction(new CSVExportGlobalAction()); entry.addGlobalAction(new RefreshDataGlobalAction()); + } + + static public VascEntry getVascTable() throws Exception { + VascController c = getDefaultVascController(); + + VascParser parser = new VascParser(c); + parser.parseResource("resources/vasc/tables.xml"); + + VascEntry entry = parser.getVascController().getVascEntryControllerResolver().getVascEntryController().getVascEntryById("test1"); + fill(entry,c); + + + // config table + + //VascEntry entry = new DefaultVascEntry(); + //entry.setId("test1"); + //entry.setBackendId("testBackend"); + + + + /* //table.addUserOptions(userOption); //table.addColumnActions(new GraphColumnAction()); @@ -131,6 +140,7 @@ public class TestTable { entry.addVascEntryField(field); field = new DefaultVascEntryField("description"); + field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("EmailField")); entry.addVascEntryField(field); field = new DefaultVascEntryField("active"); @@ -142,19 +152,14 @@ public class TestTable { entry.addVascEntryField(field); field = new DefaultVascEntryField("testModel"); - //field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("TextField")); - //field.getVascEntryFieldType() - VascList list = new VascList(); - list.setVascSelectItemModel((TestModelVascDataSource)c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend")); - //field.setVascUIComponent(list); + field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("ListField")); + field.getVascEntryFieldType().setDataObject(c.getVascBackendControllerResolver().getVascBackendController().getVascBackendById("testBackend")); entry.addVascEntryField(field); field = new DefaultVascEntryField("hexColor"); + field.setVascEntryFieldType(c.getVascEntryFieldTypeControllerResolver().getVascEntryFieldTypeController().getVascEntryFieldTypeById("ColorField")); field.setDefaultValue("#FF3355"); - //VascColorChooser ui = new VascColorChooser(); - //ui.setHexSwingEncoding(true); - //field.setVascUIComponent(ui); entry.addVascEntryField(field); printEntry(entry); @@ -165,6 +170,7 @@ public class TestTable { DefaultVascFrontendEntryFinalizer f2 = new DefaultVascFrontendEntryFinalizer(); entry = f2.finalizeVascEntry(entry,c); //printEntry(entry); + */ return entry; } diff --git a/tests/resources/vasc/tables.xml b/tests/resources/vasc/tables.xml index 488cf20..f56a572 100644 --- a/tests/resources/vasc/tables.xml +++ b/tests/resources/vasc/tables.xml @@ -2,6 +2,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (&(objectClass=sudoRole)) - ${baseDn},cn=%s - sudoRole,top - - - - - - - - \ No newline at end of file diff --git a/www/META-INF/MANIFEST.MF b/www/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/www/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/www/META-INF/vasc-jsf.taglib.xml b/www/META-INF/vasc-jsf.taglib.xml new file mode 100644 index 0000000..fa8b340 --- /dev/null +++ b/www/META-INF/vasc-jsf.taglib.xml @@ -0,0 +1,15 @@ + + + + + http://foo.com/foo + + foo + + com.foo.Foo + com.foo.component.Foo + + + \ No newline at end of file diff --git a/www/WEB-INF/faces-config.xml b/www/WEB-INF/faces-config.xml new file mode 100644 index 0000000..cfd6c98 --- /dev/null +++ b/www/WEB-INF/faces-config.xml @@ -0,0 +1,31 @@ + + + + + + Vasc + vasc-jsf + com.idcanet.vasc.frontends.web.jsf.VascUIComponent + + + + + + \ No newline at end of file diff --git a/www/WEB-INF/vasc-jsf.tld b/www/WEB-INF/vasc-jsf.tld new file mode 100644 index 0000000..2421927 --- /dev/null +++ b/www/WEB-INF/vasc-jsf.tld @@ -0,0 +1,27 @@ + + + + 1.0 + vasc + http://vasc.idcanet.com/jsf + + + vasc + com.idcanet.vasc.frontends.web.jsf.VascUIComponentTag + JSP + + + id + false + true + + + + bar + false + java.lang.Object + + + \ No newline at end of file diff --git a/www/WEB-INF/web.xml b/www/WEB-INF/web.xml new file mode 100644 index 0000000..5715804 --- /dev/null +++ b/www/WEB-INF/web.xml @@ -0,0 +1,81 @@ + + + + index.jsp + + + + facelets.SKIP_COMMENTS + true + + + + javax.faces.STATE_SAVING_METHOD + server + + + com.sun.faces.validateXml + true + + + com.sun.faces.verifyObjects + true + + + javax.faces.DEFAULT_SUFFIX + .jsp + + + + + facelets.VIEW_MAPPINGS + *.xhtml + + + + + Faces Servlet + javax.faces.webapp.FacesServlet + 1 + + + + + Faces Servlet + /faces/* + + + Faces Servlet + *.jsf + + + + + + diff --git a/www/index.jsp b/www/index.jsp new file mode 100644 index 0000000..db9befe --- /dev/null +++ b/www/index.jsp @@ -0,0 +1,12 @@ + + + TEST INDEX.JSP + \ No newline at end of file diff --git a/www/vasc_test1.jsp b/www/vasc_test1.jsp new file mode 100644 index 0000000..cb446ca --- /dev/null +++ b/www/vasc_test1.jsp @@ -0,0 +1,24 @@ + + + + + + + +

TEST vasc1

+

The HelloWorld UI Component:

+ +
+ + +
+
\ No newline at end of file