Author: aaime Date: 2011-01-27 07:40:36 -0800 (Thu, 27 Jan 2011) New Revision: 36494 Modified: branches/2.6.x/modules/extension/xsd/ branches/2.6.x/modules/extension/xsd/xsd-core/src/main/java/org/geotools/xml/EMFUtils.java branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/bindings/QueryTypeBinding.java branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/v1_0/WFSConfiguration.java Log: Backporting better round tripping support for GetFeature from trunk, auth given in http://jira.codehaus.org/browse/GEOT-3301 but forgot this bit Property changes on: branches/2.6.x/modules/extension/xsd ___________________________________________________________________ Modified: svn:mergeinfo - /trunk/modules/extension/xsd:35504,35583,35734,35736,35744,35761-35769,35990,36219,36296 + /trunk/modules/extension/xsd:35504,35583,35734,35736,35744,35761-35769,35990,36219,36272-36274,36296 Modified: branches/2.6.x/modules/extension/xsd/xsd-core/src/main/java/org/geotools/xml/EMFUtils.java =================================================================== --- branches/2.6.x/modules/extension/xsd/xsd-core/src/main/java/org/geotools/xml/EMFUtils.java 2011-01-27 11:12:47 UTC (rev 36493) +++ branches/2.6.x/modules/extension/xsd/xsd-core/src/main/java/org/geotools/xml/EMFUtils.java 2011-01-27 15:40:36 UTC (rev 36494) @@ -16,6 +16,7 @@ */ package org.geotools.xml; +import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; @@ -24,8 +25,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; /** @@ -90,13 +93,50 @@ public static void add(EObject eobject, String property, Object value) { EStructuralFeature feature = feature(eobject, property); - if ((feature != null) && isCollection(eobject, property)) { - Collection collection = (Collection) get(eobject, property); - collection.addAll(collection(value)); + if ((feature != null)) { + add(eobject, feature, value); } } /** + * Adds a value to a multi-valued propert of an eobject. + * <p> + * The <param>feature</param> must map to a multi-valued property of the + * eobject. The {@link #isCollection(EStructuralFeature)} method can be used + * to test this. + * </p> + * + * @param eobject The object. + * @param feature The multi-valued feature. + * @param value The value to add. + */ + public static void add(EObject eobject, EStructuralFeature feature, Object value) { + if (isCollection(eobject, feature)) { + Collection collection = (Collection) eobject.eGet(feature); + if (collection == null) { + //most likely not an ECollection + collection = createEmptyCollection(feature); + eobject.eSet(feature, collection); + } + collection.addAll(collection(value)); + } + } + + static Collection createEmptyCollection(EStructuralFeature feature) { + Class clazz = feature.getEType().getInstanceClass(); + if (EList.class.isAssignableFrom(clazz)) { + return new BasicEList(); + } + if (List.class.isAssignableFrom(clazz)) { + return new ArrayList(); + } + if (Set.class.isAssignableFrom(clazz)) { + return new HashSet(); + } + throw new IllegalArgumentException("Unable to create collection for " + clazz); + } + + /** * Returns a collection view for value, taking care of the case where value * is of an array type, in which case the collection returned contains the * array elements, not the array itself. @@ -151,13 +191,33 @@ return false; } - if (EList.class.isAssignableFrom(feature.getEType().getInstanceClass())) { + if (Collection.class.isAssignableFrom(feature.getEType().getInstanceClass())) { return true; } return false; } + + /** + * Determines if a feature of an eobject is a collection. + * + * @return <code>true</code> if the feature is a collection, otherwise + * <code>false</code> + */ + public static boolean isCollection(EObject eobject, EStructuralFeature feature) { + + Object o = eobject.eGet(feature); + if (o != null) { + return o instanceof Collection; + } + + if (Collection.class.isAssignableFrom(feature.getEType().getInstanceClass())) { + return true; + } + return false; + } + /** * Method which looks up a structure feature of an eobject, first doing * an exact name match, then a case insensitive one. @@ -338,7 +398,7 @@ * * @param prototype The object to be cloned from. * @param factory The factory used to create the clone. - * @param deeplag indicating wether to perform a deep clone. + * @param deep�Flag indicating wether to perform a deep clone. * * @return THe cloned object, with all properties the same to the original. */ Modified: branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/bindings/QueryTypeBinding.java =================================================================== --- branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/bindings/QueryTypeBinding.java 2011-01-27 11:12:47 UTC (rev 36493) +++ branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/bindings/QueryTypeBinding.java 2011-01-27 15:40:36 UTC (rev 36494) @@ -16,6 +16,7 @@ */ package org.geotools.wfs.bindings; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -24,6 +25,7 @@ import net.opengis.wfs.QueryType; import net.opengis.wfs.WfsFactory; +import org.eclipse.emf.ecore.EObject; import org.geotools.wfs.WFS; import org.geotools.xml.AbstractComplexEMFBinding; @@ -188,8 +190,14 @@ List typeName = query.getTypeName(); StringBuilder typeNameList = new StringBuilder(); if (typeName != null) { - for (Iterator<String> it = typeName.iterator(); it.hasNext();) { - typeNameList.append(it.next()); + for (Iterator it = typeName.iterator(); it.hasNext();) { + Object o = it.next(); + if (o instanceof QName) { + QName qName = (QName) o; + o = qName.getPrefix() + ":" + qName.getLocalPart(); + } + + typeNameList.append(o); if (it.hasNext()) { typeNameList.append(","); } @@ -206,4 +214,16 @@ return super.getProperty(object, name); } + + @Override + protected void setProperty(EObject eObject, String property, Object value, boolean lax) { + if ("typeName".equals(property)) { + QueryType query = (QueryType) eObject; + if (query.getTypeName() == null) { + query.setTypeName(new ArrayList()); + } + } + + super.setProperty(eObject, property, value, lax); + } } Modified: branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/v1_0/WFSConfiguration.java =================================================================== --- branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/v1_0/WFSConfiguration.java 2011-01-27 11:12:47 UTC (rev 36493) +++ branches/2.6.x/modules/extension/xsd/xsd-wfs/src/main/java/org/geotools/wfs/v1_0/WFSConfiguration.java 2011-01-27 15:40:36 UTC (rev 36494) @@ -36,4 +36,8 @@ addDependency(new OGCConfiguration()); } + + protected void configureBindings(org.picocontainer.MutablePicoContainer container) { + container.registerComponentImplementation(WFS.QueryType, QueryTypeBinding.class); + } } |