You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by am...@apache.org on 2008/08/13 01:41:04 UTC

svn commit: r685375 - in /cayenne/main/trunk/framework: cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/projec...

Author: amaniatis
Date: Tue Aug 12 16:41:02 2008
New Revision: 685375

URL: http://svn.apache.org/viewvc?rev=685375&view=rev
Log:
CAY-794 Patch from Marcin Skladaniec.

Allow abstract object entities in the model.

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/EntityUtils.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjAttributeValidator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjEntityValidator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/client-subclass.vm
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/embeddable-subclass.vm
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/singleclass.vm
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/subclass.vm
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/EntityUtils.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/EntityUtils.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/EntityUtils.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/EntityUtils.java Tue Aug 12 16:41:02 2008
@@ -162,6 +162,23 @@
     public MappingNamespace getEntityResolver() {
         return primaryDataMap.getNamespace();
     }
+    
+    /**
+     * Returns true if current ObjEntity is defined as abstract.
+     */
+    public boolean isAbstract() {
+        return isAbstract(objEntity);
+    }
+    
+    /**
+     * Returns true if current ObjEntity is defined as abstract.
+     */
+    public boolean isAbstract(ObjEntity anObjEntity) {
+        if (anObjEntity == null) 
+            return false;
+        
+        return objEntity.getIsAbstract();
+    }
 
     /**
      * Returns true if current ObjEntity contains at least one toMany relationship.
@@ -169,6 +186,7 @@
     public boolean hasToManyRelationships() {
         return hasToManyRelationships(objEntity);
     }
+    
 
     /**
      * Returns true if an ObjEntity contains at least one toMany relationship.

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/MapLoader.java Tue Aug 12 16:41:02 2008
@@ -869,6 +869,9 @@
         objEntity.setClassName(atts.getValue("", "className"));
         objEntity.setClientClassName(atts.getValue("", "clientClassName"));
 
+        String isAbstract = atts.getValue("", "abstract");
+        objEntity.setIsAbstract(TRUE.equalsIgnoreCase(isAbstract));
+        
         String readOnly = atts.getValue("", "readOnly");
         objEntity.setReadOnly(TRUE.equalsIgnoreCase(readOnly));
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/ObjEntity.java Tue Aug 12 16:41:02 2008
@@ -74,6 +74,7 @@
     protected boolean readOnly;
     protected int lockType;
 
+    protected boolean isAbstract;
     protected boolean serverOnly;
     protected String clientClassName;
     protected String clientSuperClassName;
@@ -108,6 +109,10 @@
             encoder.print("\" superEntityName=\"");
             encoder.print(getSuperEntityName());
         }
+        
+        if (getIsAbstract()) {
+            encoder.print("\" abstract=\"true");
+        }
 
         if (isServerOnly()) {
             encoder.print("\" serverOnly=\"true");
@@ -408,6 +413,18 @@
         return (getDataMap() == null || isServerOnly()) ? false : getDataMap()
                 .isClientSupported();
     }
+    
+    public boolean getIsAbstract() {
+        return isAbstract;
+    }
+    
+    /**
+     * Sets whether this entity is abstract only.
+     * 
+     */
+    public void setIsAbstract(boolean isAbstract) {
+        this.isAbstract = isAbstract;
+    }
 
     /**
      * Returns true if this entity is not available on the client.

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjAttributeValidator.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjAttributeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjAttributeValidator.java Tue Aug 12 16:41:02 2008
@@ -20,6 +20,7 @@
 package org.apache.cayenne.project.validator;
 
 import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.project.ProjectPath;
 import org.apache.cayenne.util.Util;
 
@@ -70,7 +71,9 @@
             validator.registerWarning("ObjAttribute has no type.", path);
         }
 
-        if (attribute.getDbAttribute() == null) {
+        if (attribute.getEntity() instanceof ObjEntity && ((ObjEntity)attribute.getEntity()).getIsAbstract()) {
+            //nothing, abstract entity does not have to define a dbAttribute
+        } else if (attribute.getDbAttribute() == null) {
             validator.registerWarning("ObjAttribute has no DbAttribute mapping.", path);
         }
         // can't support generated meaningful attributes for now; besides they don't make

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjEntityValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjEntityValidator.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjEntityValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ObjEntityValidator.java Tue Aug 12 16:41:02 2008
@@ -45,7 +45,7 @@
         validateSuperClassName(ent, path, validator);
 
         // validate DbEntity presence
-        if (ent.getDbEntity() == null) {
+        if (ent.getDbEntity() == null && !ent.getIsAbstract()) {
             validator.registerWarning("ObjEntity has no DbEntity mapping.", path);
         }
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/client-subclass.vm
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/client-subclass.vm?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/client-subclass.vm (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/client-subclass.vm Tue Aug 12 16:41:02 2008
@@ -42,6 +42,6 @@
 /**
  * A persistent class mapped as "${object.name}" Cayenne entity.
  */
-public class ${subClassName} extends ${superClassName} {
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${subClassName} extends ${superClassName} {
 
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/embeddable-subclass.vm
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/embeddable-subclass.vm?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/embeddable-subclass.vm (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/embeddable-subclass.vm Tue Aug 12 16:41:02 2008
@@ -40,6 +40,6 @@
 ${importUtils.generate()}
 
 
-public class ${subClassName} extends ${superClassName} {
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${subClassName} extends ${superClassName} {
 
 }
\ No newline at end of file

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/singleclass.vm
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/singleclass.vm?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/singleclass.vm (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/singleclass.vm Tue Aug 12 16:41:02 2008
@@ -47,7 +47,7 @@
 #end
 ${importUtils.generate()}
 
-public class ${subClassName} extends ${baseClassName} {
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${subClassName} extends ${baseClassName} {
 
 ## Create property names
 #foreach( $attr in ${object.DeclaredAttributes} )

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/subclass.vm
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/subclass.vm?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/subclass.vm (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/resources/dotemplates/v1_2/subclass.vm Tue Aug 12 16:41:02 2008
@@ -32,6 +32,6 @@
 ${importUtils.addType("${entityUtils.superPackageName}.${entityUtils.superClassName}")}##
 ${importUtils.generate()}
 
-public class ${entityUtils.subClassName} extends ${entityUtils.superClassName} {
+public#if("true" == "${object.getIsAbstract()}") abstract#end class ${entityUtils.subClassName} extends ${entityUtils.superClassName} {
 
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java?rev=685375&r1=685374&r2=685375&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java Tue Aug 12 16:41:02 2008
@@ -103,11 +103,13 @@
     protected JCheckBox excludeDefaultListeners;
 
     protected JComponent clientSeparator;
+    protected JLabel isAbstractLabel;
     protected JLabel serverOnlyLabel;
     protected JLabel clientClassNameLabel;
     protected JLabel clientSuperClassNameLabel;
 
     protected JCheckBox serverOnly;
+    protected JCheckBox isAbstract;
     protected TextAdapter clientClassName;
     protected TextAdapter clientSuperClassName;
 
@@ -176,6 +178,7 @@
         syncWithDbEntityButton.setIcon(ModelerUtil.buildIcon("icon-sync.gif"));
         syncWithDbEntityButton.setToolTipText("Sync this ObjEntity with its DBEntity");
 
+        isAbstract = new JCheckBox();
         serverOnly = new JCheckBox();
         clientClassName = new TextAdapter(new JTextField()) {
 
@@ -203,6 +206,7 @@
         builder.append("ObjEntity Name:", name.getComponent(), 3);
         builder.append("Inheritance:", superEntityCombo, 3);
         builder.append(tableLabel, dbEntityCombo, syncWithDbEntityButton);
+        isAbstractLabel = builder.append("Abstract class:", isAbstract, 3);
 
         builder.appendSeparator();
 
@@ -360,6 +364,17 @@
                 }
             }
         });
+        
+        isAbstract.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                ObjEntity entity = mediator.getCurrentObjEntity();
+                if (entity != null) {
+                    entity.setIsAbstract(isAbstract.isSelected());
+                    mediator.fireObjEntityEvent(new EntityEvent(this, entity));
+                }
+            }
+        });
     }
 
     /**
@@ -376,7 +391,8 @@
         superClassName.setText(entity.getSuperClassName());
         className.setText(entity.getClassName());
         readOnly.setSelected(entity.isReadOnly());
-
+        
+        isAbstract.setSelected(entity.getIsAbstract());
         serverOnly.setSelected(entity.isServerOnly());
         clientClassName.setText(entity.getClientClassName());
         clientSuperClassName.setText(entity.getClientSuperClassName());