You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/11/12 08:22:26 UTC
svn commit: r713287 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java
test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java
Author: aadamchik
Date: Tue Nov 11 23:22:26 2008
New Revision: 713287
URL: http://svn.apache.org/viewvc?rev=713287&view=rev
Log:
CAY-795 Horizontal inheritance
encoding attribute override information in the AttributeProperties
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java?rev=713287&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/AttributePropertyDecorator.java Tue Nov 11 23:22:26 2008
@@ -0,0 +1,75 @@
+/*****************************************************************
+ * 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.reflect;
+
+import org.apache.cayenne.map.ObjAttribute;
+
+/**
+ * A class that presents an AttributeProperty view for an inherited attribute at a given
+ * subclass. It applies all needed attribute overrides.
+ *
+ * @since 3.0
+ */
+class AttributePropertyDecorator implements AttributeProperty {
+
+ private AttributeProperty delegate;
+ private ObjAttribute attribute;
+
+ AttributePropertyDecorator(ClassDescriptor owningClassDescriptor,
+ AttributeProperty delegate) {
+
+ this.delegate = delegate;
+ this.attribute = (ObjAttribute) owningClassDescriptor.getEntity().getAttribute(
+ delegate.getName());
+ }
+
+ public ObjAttribute getAttribute() {
+ return attribute;
+ }
+
+ public boolean visit(PropertyVisitor visitor) {
+ return visitor.visitAttribute(this);
+ }
+
+ public String getName() {
+ return delegate.getName();
+ }
+
+ public void injectValueHolder(Object object) throws PropertyException {
+ delegate.injectValueHolder(object);
+ }
+
+ public Object readProperty(Object object) throws PropertyException {
+ return delegate.readProperty(object);
+ }
+
+ public Object readPropertyDirectly(Object object) throws PropertyException {
+ return delegate.readPropertyDirectly(object);
+ }
+
+ public void writeProperty(Object object, Object oldValue, Object newValue)
+ throws PropertyException {
+ delegate.writeProperty(object, oldValue, newValue);
+ }
+
+ public void writePropertyDirectly(Object object, Object oldValue, Object newValue)
+ throws PropertyException {
+ delegate.writePropertyDirectly(object, oldValue, newValue);
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java?rev=713287&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/reflect/PersistentDescriptorVisitTest.java Tue Nov 11 23:22:26 2008
@@ -0,0 +1,105 @@
+/*****************************************************************
+ * 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.reflect;
+
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.testdo.horizontalinherit.SubEntity2;
+import org.apache.cayenne.unit.InheritanceCase;
+
+public class PersistentDescriptorVisitTest extends InheritanceCase {
+
+ public void testVisitDeclaredProperties() {
+
+ final ClassDescriptor subentity1 = getDomain()
+ .getEntityResolver()
+ .getClassDescriptor("SubEntity1");
+
+ final int[] attributeCount = new int[1];
+ subentity1.visitDeclaredProperties(new PropertyVisitor() {
+
+ public boolean visitAttribute(AttributeProperty property) {
+ attributeCount[0]++;
+ assertTrue(attributeCount[0] < 2);
+ ObjAttribute attribute = property.getAttribute();
+ assertSame(subentity1.getEntity(), attribute.getEntity());
+ return true;
+ }
+
+ public boolean visitToMany(ToManyProperty property) {
+ fail("No relationships expected");
+ return true;
+ }
+
+ public boolean visitToOne(ToOneProperty property) {
+ fail("No relationships expected");
+ return true;
+ }
+ });
+
+ assertEquals(1, attributeCount[0]);
+ }
+
+ public void testVisitProperties() {
+
+ final ClassDescriptor subentity2 = getDomain()
+ .getEntityResolver()
+ .getClassDescriptor("SubEntity2");
+
+ final int[] attributeCount = new int[1];
+ subentity2.visitProperties(new PropertyVisitor() {
+
+ public boolean visitAttribute(AttributeProperty property) {
+ attributeCount[0]++;
+ assertTrue(attributeCount[0] < 4);
+ ObjAttribute attribute = property.getAttribute();
+ assertSame(subentity2.getEntity(), attribute.getEntity());
+
+ if (attribute.getName().equals(SubEntity2.SUB_ENTITY_INT_ATTR_PROPERTY)) {
+ assertEquals("SUBENTITY_INT_DB_ATTR", attribute.getDbAttributePath());
+ }
+ else if (attribute.getName().equals(SubEntity2.SUPER_INT_ATTR_PROPERTY)) {
+ assertEquals("SUPER_INT_DB_ATTR", attribute.getDbAttributePath());
+ }
+ else if (attribute
+ .getName()
+ .equals(SubEntity2.SUPER_STRING_ATTR_PROPERTY)) {
+ assertEquals("OVERRIDDEN_STRING_DB_ATTR", attribute
+ .getDbAttributePath());
+ }
+ else {
+ fail("Unexpected attribute: " + attribute);
+ }
+
+ return true;
+ }
+
+ public boolean visitToMany(ToManyProperty property) {
+ fail("No relationships expected");
+ return true;
+ }
+
+ public boolean visitToOne(ToOneProperty property) {
+ fail("No relationships expected");
+ return true;
+ }
+ });
+
+ assertEquals(3, attributeCount[0]);
+ }
+}