Repository: cayenne Updated Branches: refs/heads/master 4a8a8425e -> 162d06e46
CAY-2405 Broken prefetch of entity with inheritance and attribute with custom java type Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/7ae85329 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/7ae85329 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/7ae85329 Branch: refs/heads/master Commit: 7ae85329ca368523db1656e155f15094cbf87aa3 Parents: 4a8a842 Author: Nikita Timofeev <stari...@gmail.com> Authored: Thu Feb 8 14:39:48 2018 +0300 Committer: Nikita Timofeev <stari...@gmail.com> Committed: Thu Feb 8 14:39:48 2018 +0300 ---------------------------------------------------------------------- RELEASE-NOTES.txt | 1 + .../select/DefaultSelectTranslator.java | 59 +++++--- .../query/QueryWithInheritancePrefetchIT.java | 140 +++++++++++++++++++ .../testdo/inheritance_with_enum/Dependent.java | 9 ++ .../testdo/inheritance_with_enum/Root.java | 9 ++ .../testdo/inheritance_with_enum/Sub.java | 9 ++ .../testdo/inheritance_with_enum/Type.java | 28 ++++ .../inheritance_with_enum/auto/_Dependent.java | 104 ++++++++++++++ .../inheritance_with_enum/auto/_Root.java | 131 +++++++++++++++++ .../testdo/inheritance_with_enum/auto/_Sub.java | 87 ++++++++++++ .../cayenne/unit/di/server/CayenneProjects.java | 1 + .../cayenne/unit/di/server/SchemaBuilder.java | 3 +- .../resources/cayenne-inheritance-with-enum.xml | 7 + .../resources/inheritance-with-enum.map.xml | 38 +++++ 14 files changed, 602 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/RELEASE-NOTES.txt ---------------------------------------------------------------------- diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 37878eb..bcbd440 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -36,6 +36,7 @@ CAY-2389 DbEntity qualifier with DbPath expression translates into wrong SQL CAY-2392 Modeler: Unable to remove DataNode CAY-2397 Modeler: Unable to set enum:value as Entity qualifier CAY-2401 Modeler: NPE in ObjEntity sync action +CAY-2405 Broken prefetch of entity with inheritance and attribute with custom java type ---------------------------------- Release: 4.1.M1 http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java index 67b3cfd..b1da173 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java @@ -687,8 +687,8 @@ public class DefaultSelectTranslator extends QueryAssembler implements SelectTra resetJoinStack(); DbRelationship r = null; - for (PathComponent<DbAttribute, DbRelationship> component : table.resolvePath(dbPrefetch, - getPathAliases())) { + for (PathComponent<DbAttribute, DbRelationship> component : + table.resolvePath(dbPrefetch, getPathAliases())) { r = component.getRelationship(); dbRelationshipAdded(r, JoinType.LEFT_OUTER, null); } @@ -698,35 +698,48 @@ public class DefaultSelectTranslator extends QueryAssembler implements SelectTra , prefetch, oe.getName()); } - // add columns from the target entity, including those that are - // matched - // against the FK of the source entity. This is needed to - // determine - // whether optional relationships are null + // add columns from the target entity, including those that are matched + // against the FK of the source entity. + // This is needed to determine whether optional relationships are null - // go via target OE to make sure that Java types are mapped - // correctly... + // go via target OE to make sure that Java types are mapped correctly... ObjRelationship targetRel = (ObjRelationship) prefetchExp.evaluate(oe); ObjEntity targetEntity = targetRel.getTargetEntity(); String labelPrefix = dbPrefetch.getPath(); - for (ObjAttribute oa : targetEntity.getAttributes()) { - Iterator<CayenneMapEntry> dbPathIterator = oa.getDbPathIterator(); - while (dbPathIterator.hasNext()) { - Object pathPart = dbPathIterator.next(); - - if (pathPart == null) { - throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName()); - } else if (pathPart instanceof DbRelationship) { - DbRelationship rel = (DbRelationship) pathPart; - dbRelationshipAdded(rel, JoinType.INNER, null); - } else if (pathPart instanceof DbAttribute) { - DbAttribute attribute = (DbAttribute) pathPart; - appendColumn(columns, oa, attribute, attributes, labelPrefix + '.' + attribute.getName()); + PropertyVisitor prefetchVisitor = new PropertyVisitor() { + public boolean visitAttribute(AttributeProperty property) { + ObjAttribute oa = property.getAttribute(); + Iterator<CayenneMapEntry> dbPathIterator = oa.getDbPathIterator(); + while (dbPathIterator.hasNext()) { + Object pathPart = dbPathIterator.next(); + + if (pathPart == null) { + throw new CayenneRuntimeException("ObjAttribute has no component: %s", oa.getName()); + } else if (pathPart instanceof DbRelationship) { + DbRelationship rel = (DbRelationship) pathPart; + dbRelationshipAdded(rel, JoinType.INNER, null); + } else if (pathPart instanceof DbAttribute) { + DbAttribute dbAttr = (DbAttribute) pathPart; + + appendColumn(columns, oa, dbAttr, attributes, labelPrefix + '.' + dbAttr.getName()); + } } + return true; } - } + + public boolean visitToMany(ToManyProperty property) { + return true; + } + + public boolean visitToOne(ToOneProperty property) { + return true; + } + }; + + ClassDescriptor prefetchClassDescriptor = entityResolver.getClassDescriptor(targetEntity.getName()); + prefetchClassDescriptor.visitAllProperties(prefetchVisitor); // append remaining target attributes such as keys DbEntity targetDbEntity = r.getTargetEntity(); http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/query/QueryWithInheritancePrefetchIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/QueryWithInheritancePrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/QueryWithInheritancePrefetchIT.java new file mode 100644 index 0000000..75d5526 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/query/QueryWithInheritancePrefetchIT.java @@ -0,0 +1,140 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.query; + +import java.util.List; + +import org.apache.cayenne.configuration.server.ServerRuntime; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.inheritance_with_enum.Dependent; +import org.apache.cayenne.testdo.inheritance_with_enum.Root; +import org.apache.cayenne.testdo.inheritance_with_enum.Sub; +import org.apache.cayenne.testdo.inheritance_with_enum.Type; +import org.apache.cayenne.unit.di.DataChannelInterceptor; +import org.apache.cayenne.unit.di.server.CayenneProjects; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * + * This one is about https://issues.apache.org/jira/browse/CAY-2405 + * + * @since 4.1 + */ +@UseServerRuntime(CayenneProjects.INHERITANCE_WITH_ENUM_PROJECT) +public class QueryWithInheritancePrefetchIT extends ServerCase { + + @Inject + private ServerRuntime runtime; + + @Inject + private DBHelper dbHelper; + + @Inject + private DataChannelInterceptor queryInterceptor; + + @Before + public void createTestData() throws Exception { + TableHelper tRoot = new TableHelper(dbHelper, "iwe_root"); + tRoot.setColumns("id", "type", "name", "enum"); + + tRoot.insert(1, 0, "root1", null); + tRoot.insert(2, 1, "enum1", Type.type1.ordinal()); + tRoot.insert(3, 1, "enum2", Type.type2.ordinal()); + + TableHelper tDependent = new TableHelper(dbHelper, "iwe_dependent"); + tDependent.setColumns("id", "root_id", "name"); + + tDependent.insert(1, 1, "test1"); + tDependent.insert(2, 2, "test2"); + tDependent.insert(3, 3, "test3"); + } + + /** + * Validate that direct select of objects works + */ + @Test + public void directQuery() { + List<Root> result = ObjectSelect.query(Root.class) + .orderBy("db:" + Root.ID_PK_COLUMN) + .select(runtime.newContext()); + + assertEquals(3, result.size()); + + assertNotNull(result.get(0)); + assertFalse(result.get(0) instanceof Sub); + assertTrue(result.get(1) instanceof Sub); + assertTrue(result.get(2) instanceof Sub); + + assertEquals(Type.type1, ((Sub)result.get(1)).getEnum()); + assertEquals(Type.type2, ((Sub)result.get(2)).getEnum()); + } + + @Test + public void queryWithJointPrefetch() { + List<Dependent> result = ObjectSelect.query(Dependent.class) + .prefetch(Dependent.ROOT.joint()) + .select(runtime.newContext()); + + assertPrefetchResult(result); + } + + @Test + public void queryWithDisjointPrefetch() { + List<Dependent> result = ObjectSelect.query(Dependent.class) + .prefetch(Dependent.ROOT.disjoint()) + .select(runtime.newContext()); + + assertPrefetchResult(result); + } + + @Test + public void queryWithDisjointByIdPrefetch() { + List<Dependent> result = ObjectSelect.query(Dependent.class) + .prefetch(Dependent.ROOT.disjointById()) + .select(runtime.newContext()); + + assertPrefetchResult(result); + } + + private void assertPrefetchResult(final List<Dependent> result) { + assertEquals(3, result.size()); + + queryInterceptor.runWithQueriesBlocked(() -> { + assertNotNull(result.get(0).getRoot()); + assertFalse(result.get(0).getRoot() instanceof Sub); + assertTrue(result.get(1).getRoot() instanceof Sub); + assertTrue(result.get(2).getRoot() instanceof Sub); + + assertEquals(Type.type1, ((Sub) result.get(1).getRoot()).getEnum()); + assertEquals(Type.type2, ((Sub) result.get(2).getRoot()).getEnum()); + }); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Dependent.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Dependent.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Dependent.java new file mode 100644 index 0000000..2b086dc --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Dependent.java @@ -0,0 +1,9 @@ +package org.apache.cayenne.testdo.inheritance_with_enum; + +import org.apache.cayenne.testdo.inheritance_with_enum.auto._Dependent; + +public class Dependent extends _Dependent { + + private static final long serialVersionUID = 1L; + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Root.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Root.java new file mode 100644 index 0000000..423abb5 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Root.java @@ -0,0 +1,9 @@ +package org.apache.cayenne.testdo.inheritance_with_enum; + +import org.apache.cayenne.testdo.inheritance_with_enum.auto._Root; + +public class Root extends _Root { + + private static final long serialVersionUID = 1L; + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Sub.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Sub.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Sub.java new file mode 100644 index 0000000..28ddd46 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Sub.java @@ -0,0 +1,9 @@ +package org.apache.cayenne.testdo.inheritance_with_enum; + +import org.apache.cayenne.testdo.inheritance_with_enum.auto._Sub; + +public class Sub extends _Sub { + + private static final long serialVersionUID = 1L; + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Type.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Type.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Type.java new file mode 100644 index 0000000..0a283c7 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/Type.java @@ -0,0 +1,28 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.testdo.inheritance_with_enum; + +/** + * @since 4.1 + */ +public enum Type { + type1, + type2 +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Dependent.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Dependent.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Dependent.java new file mode 100644 index 0000000..e6aebf7 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Dependent.java @@ -0,0 +1,104 @@ +package org.apache.cayenne.testdo.inheritance_with_enum.auto; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import org.apache.cayenne.BaseDataObject; +import org.apache.cayenne.exp.Property; +import org.apache.cayenne.testdo.inheritance_with_enum.Root; + +/** + * Class _Dependent was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Dependent extends BaseDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "id"; + + public static final Property<String> NAME = Property.create("name", String.class); + public static final Property<Root> ROOT = Property.create("root", Root.class); + + protected String name; + + protected Object root; + + public void setName(String name) { + beforePropertyWrite("name", this.name, name); + this.name = name; + } + + public String getName() { + beforePropertyRead("name"); + return this.name; + } + + public void setRoot(Root root) { + setToOneTarget("root", root, true); + } + + public Root getRoot() { + return (Root)readProperty("root"); + } + + @Override + public Object readPropertyDirectly(String propName) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch(propName) { + case "name": + return this.name; + case "root": + return this.root; + default: + return super.readPropertyDirectly(propName); + } + } + + @Override + public void writePropertyDirectly(String propName, Object val) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch (propName) { + case "name": + this.name = (String)val; + break; + case "root": + this.root = val; + break; + default: + super.writePropertyDirectly(propName, val); + } + } + + private void writeObject(ObjectOutputStream out) throws IOException { + writeSerialized(out); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + readSerialized(in); + } + + @Override + protected void writeState(ObjectOutputStream out) throws IOException { + super.writeState(out); + out.writeObject(this.name); + out.writeObject(this.root); + } + + @Override + protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException { + super.readState(in); + this.name = (String)in.readObject(); + this.root = in.readObject(); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Root.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Root.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Root.java new file mode 100644 index 0000000..3a8a95f --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Root.java @@ -0,0 +1,131 @@ +package org.apache.cayenne.testdo.inheritance_with_enum.auto; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.List; + +import javax.annotation.Generated; + +import org.apache.cayenne.BaseDataObject; +import org.apache.cayenne.exp.Property; +import org.apache.cayenne.testdo.inheritance_with_enum.Dependent; + +/** + * Class _Root was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Root extends BaseDataObject { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "id"; + + public static final Property<String> NAME = Property.create("name", String.class); + public static final Property<Short> TYPE = Property.create("type", Short.class); + public static final Property<List<Dependent>> DEPENDENTS = Property.create("dependents", List.class); + + protected String name; + protected short type; + + protected Object dependents; + + public void setName(String name) { + beforePropertyWrite("name", this.name, name); + this.name = name; + } + + public String getName() { + beforePropertyRead("name"); + return this.name; + } + + public void setType(short type) { + beforePropertyWrite("type", this.type, type); + this.type = type; + } + + public short getType() { + beforePropertyRead("type"); + return this.type; + } + + public void addToDependents(Dependent obj) { + addToManyTarget("dependents", obj, true); + } + + public void removeFromDependents(Dependent obj) { + removeToManyTarget("dependents", obj, true); + } + + @SuppressWarnings("unchecked") + public List<Dependent> getDependents() { + return (List<Dependent>)readProperty("dependents"); + } + + @Override + public Object readPropertyDirectly(String propName) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch(propName) { + case "name": + return this.name; + case "type": + return this.type; + case "dependents": + return this.dependents; + default: + return super.readPropertyDirectly(propName); + } + } + + @Override + public void writePropertyDirectly(String propName, Object val) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch (propName) { + case "name": + this.name = (String)val; + break; + case "type": + this.type = val == null ? 0 : (short)val; + break; + case "dependents": + this.dependents = val; + break; + default: + super.writePropertyDirectly(propName, val); + } + } + + private void writeObject(ObjectOutputStream out) throws IOException { + writeSerialized(out); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + readSerialized(in); + } + + @Override + protected void writeState(ObjectOutputStream out) throws IOException { + super.writeState(out); + out.writeObject(this.name); + out.writeShort(this.type); + out.writeObject(this.dependents); + } + + @Override + protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException { + super.readState(in); + this.name = (String)in.readObject(); + this.type = in.readShort(); + this.dependents = in.readObject(); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Sub.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Sub.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Sub.java new file mode 100644 index 0000000..9b8f8ef --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_with_enum/auto/_Sub.java @@ -0,0 +1,87 @@ +package org.apache.cayenne.testdo.inheritance_with_enum.auto; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +import org.apache.cayenne.exp.Property; +import org.apache.cayenne.testdo.inheritance_with_enum.Root; +import org.apache.cayenne.testdo.inheritance_with_enum.Type; + +/** + * Class _Sub was generated by Cayenne. + * It is probably a good idea to avoid changing this class manually, + * since it may be overwritten next time code is regenerated. + * If you need to make any customizations, please use subclass. + */ +public abstract class _Sub extends Root { + + private static final long serialVersionUID = 1L; + + public static final String ID_PK_COLUMN = "id"; + + public static final Property<Type> ENUM = Property.create("enum", Type.class); + + protected Type _enum; + + + public void setEnum(Type _enum) { + beforePropertyWrite("enum", this._enum, _enum); + this._enum = _enum; + } + + public Type getEnum() { + beforePropertyRead("enum"); + return this._enum; + } + + @Override + public Object readPropertyDirectly(String propName) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch(propName) { + case "enum": + return this._enum; + default: + return super.readPropertyDirectly(propName); + } + } + + @Override + public void writePropertyDirectly(String propName, Object val) { + if(propName == null) { + throw new IllegalArgumentException(); + } + + switch (propName) { + case "enum": + this._enum = (Type)val; + break; + default: + super.writePropertyDirectly(propName, val); + } + } + + private void writeObject(ObjectOutputStream out) throws IOException { + writeSerialized(out); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + readSerialized(in); + } + + @Override + protected void writeState(ObjectOutputStream out) throws IOException { + super.writeState(out); + out.writeObject(this._enum); + } + + @Override + protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException { + super.readState(in); + this._enum = (Type)in.readObject(); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/CayenneProjects.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/CayenneProjects.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/CayenneProjects.java index 857027b..8d58595 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/CayenneProjects.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/CayenneProjects.java @@ -82,4 +82,5 @@ public class CayenneProjects { public static final String WEIGHTED_SORT_PROJECT = "cayenne-weighted-sort.xml"; public static final String HYBRID_DATA_OBJECT_PROJECT = "cayenne-hybrid-data-object.xml"; public static final String JAVA8 = "cayenne-java8.xml"; + public static final String INHERITANCE_WITH_ENUM_PROJECT = "cayenne-inheritance-with-enum.xml"; } http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java index aa1669c..ebd018d 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java @@ -82,7 +82,8 @@ public class SchemaBuilder { "table-primitives.map.xml", "generic.map.xml", "map-db1.map.xml", "map-db2.map.xml", "embeddable.map.xml", "qualified.map.xml", "quoted-identifiers.map.xml", "inheritance-single-table1.map.xml", "inheritance-vertical.map.xml", "oneway-rels.map.xml", "unsupported-distinct-types.map.xml", - "array-type.map.xml", "cay-2032.map.xml", "weighted-sort.map.xml", "hybrid-data-object.map.xml", "java8.map.xml" }; + "array-type.map.xml", "cay-2032.map.xml", "weighted-sort.map.xml", "hybrid-data-object.map.xml", + "java8.map.xml", "inheritance-with-enum.map.xml" }; // hardcoded dependent entities that should be excluded // if LOBs are not supported http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/resources/cayenne-inheritance-with-enum.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/cayenne-inheritance-with-enum.xml b/cayenne-server/src/test/resources/cayenne-inheritance-with-enum.xml new file mode 100644 index 0000000..cd5e399 --- /dev/null +++ b/cayenne-server/src/test/resources/cayenne-inheritance-with-enum.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<domain xmlns="http://cayenne.apache.org/schema/10/domain" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain http://cayenne.apache.org/schema/10/domain.xsd" + project-version="10"> + <map name="inheritance-with-enum"/> +</domain> http://git-wip-us.apache.org/repos/asf/cayenne/blob/7ae85329/cayenne-server/src/test/resources/inheritance-with-enum.map.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/inheritance-with-enum.map.xml b/cayenne-server/src/test/resources/inheritance-with-enum.map.xml new file mode 100644 index 0000000..97027b2 --- /dev/null +++ b/cayenne-server/src/test/resources/inheritance-with-enum.map.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd" + project-version="10"> + <property name="defaultPackage" value="org.apache.cayenne.testdo.inheritance_with_enum"/> + <db-entity name="iwe_dependent"> + <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/> + <db-attribute name="name" type="VARCHAR" length="200"/> + <db-attribute name="root_id" type="INTEGER"/> + </db-entity> + <db-entity name="iwe_root"> + <db-attribute name="enum" type="INTEGER"/> + <db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/> + <db-attribute name="name" type="VARCHAR" length="255"/> + <db-attribute name="type" type="SMALLINT" isMandatory="true"/> + </db-entity> + <obj-entity name="Dependent" className="org.apache.cayenne.testdo.inheritance_with_enum.Dependent" dbEntityName="iwe_dependent"> + <obj-attribute name="name" type="java.lang.String" db-attribute-path="name"/> + </obj-entity> + <obj-entity name="Root" className="org.apache.cayenne.testdo.inheritance_with_enum.Root" dbEntityName="iwe_root"> + <qualifier><![CDATA[type = 0]]></qualifier> + <obj-attribute name="name" type="java.lang.String" db-attribute-path="name"/> + <obj-attribute name="type" type="short" db-attribute-path="type"/> + </obj-entity> + <obj-entity name="Sub" superEntityName="Root" className="org.apache.cayenne.testdo.inheritance_with_enum.Sub"> + <qualifier><![CDATA[type = 1]]></qualifier> + <obj-attribute name="enum" type="org.apache.cayenne.testdo.inheritance_with_enum.Type" db-attribute-path="enum"/> + </obj-entity> + <db-relationship name="root" source="iwe_dependent" target="iwe_root"> + <db-attribute-pair source="root_id" target="id"/> + </db-relationship> + <db-relationship name="dependents" source="iwe_root" target="iwe_dependent" toMany="true"> + <db-attribute-pair source="id" target="root_id"/> + </db-relationship> + <obj-relationship name="root" source="Dependent" target="Root" deleteRule="Nullify" db-relationship-path="root"/> + <obj-relationship name="dependents" source="Root" target="Dependent" deleteRule="Deny" db-relationship-path="dependents"/> +</data-map>