Modified: labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/RelationListMapping.java URL: http://svn.apache.org/viewvc/labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/RelationListMapping.java?rev=886729&r1=886728&r2=886729&view=diff ============================================================================== --- labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/RelationListMapping.java (original) +++ labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/RelationListMapping.java Thu Dec 3 10:13:07 2009 @@ -32,6 +32,7 @@ import org.apache.openjpa.sdo.ImplHelper; import org.apache.openjpa.sdo.SDOInstanceMapping; import org.apache.openjpa.sdo.SDOMetaDataFactory; +import org.apache.openjpa.sdo.SDOTypeParser; import serp.bytecode.Annotation; import serp.bytecode.Annotations; @@ -49,257 +50,259 @@ * @since 0.2.0 */ public class RelationListMapping extends RelationMapping { - Type componentType; - Property componentProperty; - Class cls; - RelationListMapping(TypeMapping tm, Property p, FieldMetaData fm) { - super(tm, p, fm); - componentProperty = ImplHelper.getComponentProperty(property.getType()); - if (componentProperty == null) componentProperty = property; - componentType = componentProperty.getType(); - } - - public String getName() { - return "RelationListMapping"; - } - - public String getFieldTypeName() { - String javaClassName = ImplHelper.getFullClassName(componentType); - return "java.util.List<"+javaClassName+">"; - } - - public Class getFieldType(SDOMetaDataFactory repos) { - cls = repos.getJavaClass(componentType); - return List.class; - } - - - public String[] getAnnotationStrings() { - // Right now we need only for SDO2POJOGenerator - if (!property.isContainment()) - // Do not use CascadeType.REMOVE if isContainment is false - return new String[] {"@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE})","@JoinTable(name=\"" + owner.getType().getName() + "_" + componentProperty.getName() + "\")"}; - else - return new String[] {"@OneToMany(cascade={CascadeType.ALL}, mappedBy=\"container\")","@ElementDependent","@JoinTable(name=\"" + owner.getType().getName() + "_" + componentProperty.getName() + "\")"}; -// return new String[] {"@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE}, mappedBy=\"container\")"}; - } - - public void annotate(BCMember field) { - Annotations annos = field.getDeclaredRuntimeAnnotations(true); - Annotation r = annos.addAnnotation(OneToMany.class); - r.addProperty("targetEntity").setClassNameValue(ImplHelper.getFullClassName(componentType)); - if (!property.isContainment()) { - CascadeType[] c = new CascadeType[] {CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE}; - r.addProperty("cascade").setValue(c); - } else { - annos.addAnnotation(ElementDependent.class); - CascadeType[] c = {CascadeType.ALL}; - r.addProperty("cascade").setValue(c); - r.addProperty("mappedBy").setValue("container"); - } - Annotation t = annos.addAnnotation(JoinTable.class); - String tn = owner.getType().getName() + "_" + componentProperty.getName(); - t.addProperty("name").setValue(tn); - } - - public DataObject populateDataObject(DataObject target, Object source, - SDOInstanceMapping ctx) throws Exception { - if (!property.equals(componentProperty)) { - if (target.isSet(property)) - target = target.getDataObject(property); - else - target = target.createDataObject(property); - } - List value = (List) getter.invoke(source, NULL_ARGS); - List oldvalue = null; - if (target.isSet(componentProperty)) - oldvalue = target.getList(componentProperty); - if ((oldvalue == null || oldvalue.size() <= 0) && (value == null || value.size() <= 0)) - return target; - if (value == null || value.size() <= 0) { - target.unset(componentProperty); - return target; - } - List<DataObject> dataList = new ArrayList<DataObject>(); - for (Object element:value) { - try { - dataList.add(ctx.populateDataObject(element, true)); - } catch (EntityNotFoundException e) { - // TODO: Insert Logging here - //e.printStackTrace(); - } - } - if (oldvalue == null || oldvalue.size() <= 0) { - target.setList(componentProperty, dataList); - return target; - } - List<DataObject> removed = new ArrayList(); - removed.addAll(oldvalue); - removed.removeAll(dataList); - boolean rt = oldvalue.retainAll(dataList); - boolean rm = dataList.removeAll(oldvalue); - if (rt || dataList.size() > 0) - oldvalue.addAll(dataList); - if (componentProperty.isContainment()) { - for (DataObject d:removed) { - d.detach(); - } - } - return target; - } - - public Object populatePC(Object pc, DataObject data, - SDOInstanceMapping ctx) throws Exception { - if (!property.equals(componentProperty)) { - if (data.isSet(property)) - data = data.getDataObject(property); - else - data = null; - } - ArrayList<DataObject> value = null; - if (data != null && data.isSet(componentProperty)) { - value = new ArrayList(); - value.addAll(data.getList(componentProperty)); - } - List oldvalue = (List) getter.invoke(pc, NULL_ARGS); - if ((oldvalue == null || oldvalue.size() <= 0) && (value == null || value.size() <= 0)) - return pc; - if (value == null || value.size() <= 0) { - setter.invoke(pc, new Object[]{null}); - return pc; - } - List pcList = new ArrayList(); - for (DataObject d:value) { - pcList.add(ctx.populatePC(d)); - } - if (oldvalue == null || oldvalue.size() <= 0) { - setter.invoke(pc, new Object[]{pcList}); - return pc; - } - List removed = new ArrayList(); - removed.addAll(oldvalue); - removed.removeAll(pcList); - boolean rt = oldvalue.retainAll(pcList); - boolean rm = pcList.removeAll(oldvalue); - if (rt || pcList.size() > 0) - oldvalue.addAll(pcList); - if (componentProperty.isContainment()) { - for (Object d:removed) { - Method m = d.getClass().getDeclaredMethod("setContainer", new Class[]{owner.getJavaClass()}); - m.invoke(d, new Object[]{null}); - } - } - return pc; - } - - public Object applyChangesModify(DataObject source, Object target, - ChangeSummary.Setting change, SDOInstanceMapping ctx) throws Exception { - Object nullObj = null; - if (!property.equals(componentProperty)) { - if (source.isSet(property)) - source = source.getDataObject(property); - else - source = null; - } - List pcList = (List) getter.invoke(target, NULL_ARGS); - if (pcList == null) { - if (source.isSet(componentProperty)) { - pcList = new ArrayList(); - setter.invoke(target, pcList); - } else { - return target; - } - } -/* if (!source.isSet(componentProperty)) { - setter.invoke(target, nullObj); - return target; - } */ - List<DataObject> oldvalue = new ArrayList(); - oldvalue.addAll((List) change.getValue()); - List<DataObject> newvalue = new ArrayList(); - newvalue.addAll(source.getList(change.getProperty())); - List<DataObject> removed = new ArrayList(); - removed.addAll(oldvalue); - removed.removeAll(newvalue); - oldvalue.retainAll(newvalue); - newvalue.removeAll(oldvalue); - for (DataObject d:newvalue) { - int idx = indexOf(ctx, pcList, d); - if (idx != -1 && "merge".equals(ctx.getEm().getApplyChangesMode())) { - pcList.remove(idx); - idx = -1; - } - if (idx == -1) { - Object result = ctx.applyChanges(d); - if (result != null && !pcList.contains(result)) { - pcList.add(result); - if (change.getProperty().isContainment()) { - Method g = result.getClass().getDeclaredMethod("getContainer", new Class[]{owner.getJavaClass()}); - Method s = result.getClass().getDeclaredMethod("setContainer", new Class[]{owner.getJavaClass()}); - if (!target.equals(g.invoke(result, NULL_ARGS))) - s.invoke(result, target); - } - } - } - } - for (DataObject d:removed) { - int idx = indexOf(ctx, pcList, d); - if (idx != -1) { - Object result = pcList.remove(idx); - if (change.getProperty().isContainment()) { - Method g = result.getClass().getDeclaredMethod("getContainer", new Class[]{owner.getJavaClass()}); - Method s = result.getClass().getDeclaredMethod("setContainer", new Class[]{owner.getJavaClass()}); - if (target.equals(g.invoke(result, NULL_ARGS))) - s.invoke(result, nullObj); - } - } - } - return target; - } - - private int indexOf(SDOInstanceMapping ctx, List pcList, DataObject d) { - int ret = 0; - for (Object pc:pcList) { - if (ImplHelper.idMatch(ctx.getEm(), d, pc)) { - return ret; - } - ret++; - } - return -1; - } - - public Object applyChangesCreate(DataObject source, Object target, - SDOInstanceMapping ctx) throws Exception { - Object nullObj = null; - if (!property.equals(componentProperty)) { - if (source.isSet(property)) - source = source.getDataObject(property); - else - source = null; - } - List pcList = (List) getter.invoke(target, NULL_ARGS); - if (pcList == null) { - if (source.isSet(componentProperty)) { - pcList = new ArrayList(); - setter.invoke(target, pcList); + private Type componentType; + private Property componentProperty; + private Class<?> cls; + + RelationListMapping(TypeMapping tm, Property p, FieldMetaData fm) { + super(tm, p, fm); + componentProperty = SDOTypeParser.getComponentProperty(property.getType()); + if (componentProperty == null) + componentProperty = property; + componentType = componentProperty.getType(); + } + + public String getName() { + return "RelationListMapping"; + } + + public String getFieldTypeName() { + String javaClassName = ImplHelper.getFullClassName(componentType); + return "java.util.List<" + javaClassName + ">"; + } + + public Class<?> getFieldType(SDOMetaDataFactory repos) { + cls = repos.getJavaClass(componentType); + return List.class; + } + + public String[] getAnnotationStrings() { + // Right now we need only for SDO2POJOGenerator + if (!property.isContainment()) + // Do not use CascadeType.REMOVE if isContainment is false + return new String[] { "@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE})", + "@JoinTable(name=\"" + owner.getType().getName() + "_" + componentProperty.getName() + "\")" }; + else + return new String[] { "@OneToMany(cascade={CascadeType.ALL}, mappedBy=\"container\")", "@ElementDependent", + "@JoinTable(name=\"" + owner.getType().getName() + "_" + componentProperty.getName() + "\")" }; + } + + public void annotate(BCMember field) { + Annotations annos = field.getDeclaredRuntimeAnnotations(true); + Annotation r = annos.addAnnotation(OneToMany.class); + r.addProperty("targetEntity").setClassNameValue(ImplHelper.getFullClassName(componentType)); + if (!property.isContainment()) { + CascadeType[] c = new CascadeType[] { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE }; + r.addProperty("cascade").setValue(c); } else { - return target; + annos.addAnnotation(ElementDependent.class); + CascadeType[] c = { CascadeType.ALL }; + r.addProperty("cascade").setValue(c); + r.addProperty("mappedBy").setValue("container"); } - } - List<DataObject> newvalue = source.getList(componentProperty); - for (DataObject d:newvalue) { - int idx = indexOf(ctx, pcList, d); - if (idx != -1 && "merge".equals(ctx.getEm().getApplyChangesMode())) { - pcList.remove(idx); - idx = -1; - } - if (idx == -1) { - Object result = ctx.applyChanges(d); - pcList.add(result); - } - } - return target; - } + Annotation t = annos.addAnnotation(JoinTable.class); + String tn = owner.getType().getName() + "_" + componentProperty.getName(); + t.addProperty("name").setValue(tn); + } + + public DataObject populateDataObject(DataObject target, Object source, SDOInstanceMapping ctx) throws Exception { + if (!property.equals(componentProperty)) { + if (target.isSet(property)) + target = target.getDataObject(property); + else + target = target.createDataObject(property); + } + List value = (List) getter.invoke(source, NULL_ARGS); + List oldvalue = null; + if (target.isSet(componentProperty)) + oldvalue = target.getList(componentProperty); + if ((oldvalue == null || oldvalue.size() <= 0) && (value == null || value.size() <= 0)) + return target; + if (value == null || value.size() <= 0) { + target.unset(componentProperty); + return target; + } + List<DataObject> dataList = new ArrayList<DataObject>(); + for (Object element : value) { + try { + dataList.add(ctx.populateDataObject(element, true)); + } catch (EntityNotFoundException e) { + // TODO: Insert Logging here + // e.printStackTrace(); + } + } + if (oldvalue == null || oldvalue.size() <= 0) { + target.setList(componentProperty, dataList); + return target; + } + List<DataObject> removed = new ArrayList(); + removed.addAll(oldvalue); + removed.removeAll(dataList); + boolean rt = oldvalue.retainAll(dataList); + boolean rm = dataList.removeAll(oldvalue); + if (rt || dataList.size() > 0) + oldvalue.addAll(dataList); + if (componentProperty.isContainment()) { + for (DataObject d : removed) { + d.detach(); + } + } + return target; + } -} + public Object populatePC(Object pc, DataObject data, SDOInstanceMapping ctx) throws Exception { + if (!property.equals(componentProperty)) { + if (data.isSet(property)) + data = data.getDataObject(property); + else + data = null; + } + ArrayList<DataObject> value = null; + if (data != null && data.isSet(componentProperty)) { + value = new ArrayList(); + value.addAll(data.getList(componentProperty)); + } + List oldvalue = (List) getter.invoke(pc, NULL_ARGS); + if ((oldvalue == null || oldvalue.size() <= 0) && (value == null || value.size() <= 0)) + return pc; + if (value == null || value.size() <= 0) { + setter.invoke(pc, new Object[] { null }); + return pc; + } + List pcList = new ArrayList(); + for (DataObject d : value) { + pcList.add(ctx.populatePC(d)); + } + if (oldvalue == null || oldvalue.size() <= 0) { + setter.invoke(pc, new Object[] { pcList }); + return pc; + } + List removed = new ArrayList(); + removed.addAll(oldvalue); + removed.removeAll(pcList); + boolean rt = oldvalue.retainAll(pcList); + boolean rm = pcList.removeAll(oldvalue); + if (rt || pcList.size() > 0) + oldvalue.addAll(pcList); + if (componentProperty.isContainment()) { + for (Object d : removed) { + Method m = d.getClass().getDeclaredMethod("setContainer", new Class[] { owner.getJavaClass() }); + m.invoke(d, new Object[] { null }); + } + } + return pc; + } + public Object applyChangesModify(DataObject source, Object target, ChangeSummary.Setting change, + SDOInstanceMapping ctx) throws Exception { + Object nullObj = null; + if (!property.equals(componentProperty)) { + if (source.isSet(property)) + source = source.getDataObject(property); + else + source = null; + } + List pcList = (List) getter.invoke(target, NULL_ARGS); + if (pcList == null) { + if (source.isSet(componentProperty)) { + pcList = new ArrayList(); + setter.invoke(target, pcList); + } else { + return target; + } + } + /* + * if (!source.isSet(componentProperty)) { setter.invoke(target, + * nullObj); return target; } + */ + List<DataObject> oldvalue = new ArrayList(); + oldvalue.addAll((List) change.getValue()); + List<DataObject> newvalue = new ArrayList(); + newvalue.addAll(source.getList(change.getProperty())); + List<DataObject> removed = new ArrayList(); + removed.addAll(oldvalue); + removed.removeAll(newvalue); + oldvalue.retainAll(newvalue); + newvalue.removeAll(oldvalue); + for (DataObject d : newvalue) { + int idx = indexOf(ctx, pcList, d); + if (idx != -1 && "merge".equals(ctx.getEntityManager().getApplyChangesMode())) { + pcList.remove(idx); + idx = -1; + } + if (idx == -1) { + Object result = ctx.applyChanges(d); + if (result != null && !pcList.contains(result)) { + pcList.add(result); + if (change.getProperty().isContainment()) { + Method g = result.getClass().getDeclaredMethod("getContainer", + new Class[] { owner.getJavaClass() }); + Method s = result.getClass().getDeclaredMethod("setContainer", + new Class[] { owner.getJavaClass() }); + if (!target.equals(g.invoke(result, NULL_ARGS))) + s.invoke(result, target); + } + } + } + } + for (DataObject d : removed) { + int idx = indexOf(ctx, pcList, d); + if (idx != -1) { + Object result = pcList.remove(idx); + if (change.getProperty().isContainment()) { + Method g = result.getClass() + .getDeclaredMethod("getContainer", new Class[] { owner.getJavaClass() }); + Method s = result.getClass() + .getDeclaredMethod("setContainer", new Class[] { owner.getJavaClass() }); + if (target.equals(g.invoke(result, NULL_ARGS))) + s.invoke(result, nullObj); + } + } + } + return target; + } + + private int indexOf(SDOInstanceMapping ctx, List<Object> pcList, DataObject sdo) { + int ret = 0; + for (Object pc : pcList) { + if (ImplHelper.idMatch(ctx.getEntityManager(), sdo, pc)) { + return ret; + } + ret++; + } + return -1; + } + + public Object applyChangesCreate(DataObject source, Object target, SDOInstanceMapping ctx) throws Exception { + Object nullObj = null; + if (!property.equals(componentProperty)) { + if (source.isSet(property)) + source = source.getDataObject(property); + else + source = null; + } + List pcList = (List) getter.invoke(target, NULL_ARGS); + if (pcList == null) { + if (source.isSet(componentProperty)) { + pcList = new ArrayList(); + setter.invoke(target, pcList); + } else { + return target; + } + } + List<DataObject> newvalue = source.getList(componentProperty); + for (DataObject d : newvalue) { + int idx = indexOf(ctx, pcList, d); + if (idx != -1 && "merge".equals(ctx.getEntityManager().getApplyChangesMode())) { + pcList.remove(idx); + idx = -1; + } + if (idx == -1) { + Object result = ctx.applyChanges(d); + pcList.add(result); + } + } + return target; + } + +}
Modified: labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/SDOMappingStrategyInstaller.java URL: http://svn.apache.org/viewvc/labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/SDOMappingStrategyInstaller.java?rev=886729&r1=886728&r2=886729&view=diff ============================================================================== --- labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/SDOMappingStrategyInstaller.java (original) +++ labs/fluid/src/main/java/org/apache/openjpa/sdo/mapping/SDOMappingStrategyInstaller.java Thu Dec 3 10:13:07 2009 @@ -22,6 +22,7 @@ import org.apache.openjpa.meta.FieldMetaData; import org.apache.openjpa.sdo.ImplHelper; +import org.apache.openjpa.sdo.SDOTypeParser; import commonj.sdo.Property; import commonj.sdo.Type; @@ -46,7 +47,7 @@ * @return the mapping to be used for the given Type. */ public static TypeMapping decideStrategy(Type type, Class<?> cls) { - List<Property> c = ImplHelper.getContainments().get(type); + List<Property> c = SDOTypeParser.getContainments().get(type); if (c == null || c.size() == 0) { return new IdenticalTypeMapping(type, cls); } else if (c.size() == 1) { @@ -68,9 +69,9 @@ * */ public static PropertyMapping decideStrategy(TypeMapping tm, Property p, FieldMetaData fmd) { - if (ImplHelper.isIdentity(p)) + if (SDOTypeParser.isIdentity(p)) return new IdentityMapping(tm, p, fmd); - if (ImplHelper.isVersion(p)) + if (SDOTypeParser.isVersion(p)) return new VersionMapping(tm, p, fmd); if (p.getType().isDataType()) { if (p.isMany()) { @@ -82,8 +83,8 @@ if (p.equals(tm.getOwner())) { return new ContainerRelationMapping(tm, p, fmd); } - if (ImplHelper.isContainer(p.getType())) { - Type componentType = ImplHelper.getComponentType(p.getType()); + if (SDOTypeParser.isContainer(p.getType())) { + Type componentType = SDOTypeParser.getComponentType(p.getType()); if (componentType.isDataType()) return new PrimitiveListMapping(tm, p, fmd); else { @@ -91,7 +92,7 @@ } } if (p.isContainment()) { - List <Property> c = ImplHelper.getContainments().get(p.getType()); + List <Property> c = SDOTypeParser.getContainments().get(p.getType()); if (c != null && c.size() > 1 && c.contains(p)) { if (p.isMany()) return new EmbeddedRelationListMapping(tm, p, fmd); Modified: labs/fluid/src/test/java/example/basic/TestCRUD.java URL: http://svn.apache.org/viewvc/labs/fluid/src/test/java/example/basic/TestCRUD.java?rev=886729&r1=886728&r2=886729&view=diff ============================================================================== --- labs/fluid/src/test/java/example/basic/TestCRUD.java (original) +++ labs/fluid/src/test/java/example/basic/TestCRUD.java Thu Dec 3 10:13:07 2009 @@ -6,6 +6,7 @@ import javax.persistence.Query; import org.apache.openjpa.persistence.OpenJPAEntityManager; import org.apache.openjpa.sdo.ImplHelper; +import org.apache.openjpa.sdo.SDOTypeParser; import commonj.sdo.DataObject; import commonj.sdo.Type; @@ -91,16 +92,16 @@ for (Object o : result) { int before = count("Person"); DataObject dataObject = (DataObject) o; - int v0 = ImplHelper.getVersion(dataObject); + int v0 = SDOTypeParser.getVersion(dataObject); assertTrue(v0>0); - assertNotNull(ImplHelper.getIdValue(dataObject)); + assertNotNull(SDOTypeParser.getIdValue(dataObject)); dataObject.setString("firstName", "Ron"); em.getTransaction().begin(); DataObject merged = em.merge(dataObject); assertNotSame(merged, dataObject); em.getTransaction().commit(); - int v1 = ImplHelper.getVersion(merged); + int v1 = SDOTypeParser.getVersion(merged); assertTrue(v1>v0); assertEquals("Ron", merged.getString("firstName")); int after = count("Person"); Modified: labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java URL: http://svn.apache.org/viewvc/labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java?rev=886729&r1=886728&r2=886729&view=diff ============================================================================== --- labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java (original) +++ labs/fluid/src/test/java/org/apache/openjpa/sdo/TestSDO.java Thu Dec 3 10:13:07 2009 @@ -54,7 +54,7 @@ assertNotNull(poType); Property id2 = ImplHelper.getIdentityProperty(poType); assertNotNull(id2); - assertTrue(ImplHelper.isIdentity(id2)); + assertTrue(SDOTypeParser.isIdentity(id2)); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
