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 2009/10/30 16:33:33 UTC

svn commit: r831333 - in /cayenne/main/trunk/framework: cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ cayenne-modeler/src/main/java/org/apache/c...

Author: aadamchik
Date: Fri Oct 30 15:33:32 2009
New Revision: 831333

URL: http://svn.apache.org/viewvc?rev=831333&view=rev
Log:
CAY-1295 Finish modeler support for embeddables and embedded attributes

two more patches from Olga, combined into 1 commit

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableValidator.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableErrorMsg.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/TreeNodeValidator.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/ValidationDisplayHandler.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableValidator.java?rev=831333&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableValidator.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableValidator.java Fri Oct 30 15:33:32 2009
@@ -0,0 +1,87 @@
+/*****************************************************************
+ *   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.project.validator;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.project.ProjectPath;
+import org.apache.cayenne.util.Util;
+
+public class EmbeddableValidator extends TreeNodeValidator {
+
+    public EmbeddableValidator() {
+        super();
+    }
+
+    @Override
+    public void validateObject(ProjectPath path, Validator validator) {
+        Embeddable emb = (Embeddable) path.getObject();
+        validateName(emb, path,validator);
+    }
+
+    protected void validateName(Embeddable emb, ProjectPath path, Validator validator) {
+        String name = emb.getClassName();
+
+        // Must have name
+        if (Util.isEmptyString(name)) {
+            validator.registerError("Unnamed Embeddable.", path);
+            return;
+        }
+
+        DataMap map = (DataMap) path.getObjectParent();
+        if (map == null) {
+            return;
+        }
+
+        // check for duplicate names in the parent context
+        for (Embeddable otherEmb : map.getEmbeddables()) {
+            if (otherEmb == emb) {
+                continue;
+            }
+
+            if (name.equals(otherEmb.getClassName())) {
+                validator.registerError("Duplicate Embeddable name: " + name + ".", path);
+                break;
+            }
+        }
+
+        // check for dupliucates in other DataMaps
+        DataDomain domain = path.firstInstanceOf(DataDomain.class);
+        if (domain != null) {
+            for (DataMap nextMap : domain.getDataMaps()) {
+                if (nextMap == map) {
+                    continue;
+                }
+
+                Embeddable conflictingEmbeddable = nextMap.getEmbeddable(name);
+                if (conflictingEmbeddable != null) {
+
+                        validator.registerWarning(
+                                "Duplicate Embeddable name in another DataMap: "
+                                        + name
+                                        + ".",
+                                path);
+                        break;
+                }
+            }
+        }
+    }
+
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/TreeNodeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/TreeNodeValidator.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/TreeNodeValidator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/TreeNodeValidator.java Fri Oct 30 15:33:32 2009
@@ -25,6 +25,7 @@
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
@@ -54,6 +55,7 @@
     protected static final DbAttributeValidator dbAttrValidator = new DbAttributeValidator();
     protected static final DbRelationshipValidator dbRelValidator = new DbRelationshipValidator();
     protected static final EmbeddableAttributeValidator embeddableAttributeValidator = new EmbeddableAttributeValidator();
+    protected static final EmbeddableValidator embeddableValidator = new EmbeddableValidator();
 
     protected static final ProcedureValidator procedureValidator = new ProcedureValidator();
 
@@ -72,7 +74,10 @@
         Object validatedObj = path.getObject();
         TreeNodeValidator validatorObj = null;
 
-        if (validatedObj instanceof EmbeddableAttribute) {
+        if (validatedObj instanceof Embeddable) {
+            validatorObj = embeddableValidator;
+        }
+        else if (validatedObj instanceof EmbeddableAttribute) {
             validatorObj = embeddableAttributeValidator;
         }
         else if (validatedObj instanceof ObjAttribute) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java Fri Oct 30 15:33:32 2009
@@ -44,6 +44,7 @@
 import javax.swing.tree.TreePath;
 
 import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
@@ -100,18 +101,18 @@
         this.row = row;
         this.stringToEmbeddables = new HashMap<String, Embeddable>();
         this.embeddableNames = new ArrayList<String>();
-        Iterator it = mediator.getProject().treeNodes();
+        
+        Iterator it = mediator.getCurrentDataDomain().getDataMaps().iterator();
         while (it.hasNext()) {
-            ProjectPath path = (ProjectPath) it.next();
-            Object o = path.getObject();
-            Object[] p = path.getPath();
-            if (o instanceof Embeddable) {
-                Embeddable emb = (Embeddable) p[p.length - 1];
+            DataMap dataMap = (DataMap) it.next();
+            Iterator<Embeddable> embs = dataMap.getEmbeddables().iterator();
+            while (embs.hasNext()) {
+                Embeddable emb = (Embeddable) embs.next();
                 stringToEmbeddables.put(emb.getClassName(), emb);
                 embeddableNames.add(emb.getClassName());
             }
         }
-
+        
         initController(model.getAttribute(row));
     }
 

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java Fri Oct 30 15:33:32 2009
@@ -108,11 +108,10 @@
         CellConstraints cc = new CellConstraints();
         final PanelBuilder builder = new PanelBuilder(
                 new FormLayout(
-                        "right:max(50dlu;pref), 3dlu, fill:min(200dlu;pref), 15dlu, right:max(30dlu;pref), 3dlu, 185dlu, "
-                                + "3dlu, 20dlu, 3dlu, fill:min(70dlu;pref)",
+                        "right:max(50dlu;pref), 3dlu, 200dlu, 15dlu, right:max(30dlu;pref), 3dlu, 200dlu",
                         "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 6dlu, p, 6dlu, p, 3dlu, fill:p:grow"));
         builder.setDefaultDialogBorder();
-        builder.addSeparator("ObjAttribute Information", cc.xywh(1, 1, 11, 1));
+        builder.addSeparator("ObjAttribute Information", cc.xywh(1, 1, 7, 1));
 
         builder.addLabel("Attribute:", cc.xy(1, 3));
         builder.add(attributeName, cc.xywh(3, 3, 1, 1));
@@ -129,13 +128,13 @@
         builder.addLabel("Type:", cc.xy(1, 11));
         builder.add(type, cc.xywh(3, 11, 1, 1));
 
-        builder.addSeparator("Mapping to Attributes", cc.xywh(1, 13, 10, 1));
+        builder.addSeparator("Mapping to Attributes", cc.xywh(1, 13, 7, 1));
 
         typeManagerPane = new JPanel();
         typeManagerPane.setLayout(new CardLayout());
 
         final FormLayout fL = new FormLayout(
-                "483dlu ",
+                "493dlu ",
                 "p, 3dlu, fill:min(128dlu;pref):grow");
 
         // panel for Flattened attribute
@@ -155,7 +154,7 @@
 
         // panel for embeddable attribute
         final FormLayout fLEmb = new FormLayout(
-                "483dlu ",
+                "493dlu ",
                 "fill:min(140dlu;pref):grow");
 
         final PanelBuilder embeddablePane = new PanelBuilder(fLEmb);
@@ -168,7 +167,7 @@
         typeManagerPane.add(builderPathPane.getPanel(), FLATTENED_PANEL);
         typeManagerPane.add(embeddablePane.getPanel(), EMBEDDABLE_PANEL);
 
-        builder.add(typeManagerPane, cc.xywh(1, 15, 11, 1));
+        builder.add(typeManagerPane, cc.xywh(1, 15, 7, 1));
 
         add(builder.getPanel(), BorderLayout.CENTER);
 

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableErrorMsg.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableErrorMsg.java?rev=831333&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableErrorMsg.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableErrorMsg.java Fri Oct 30 15:33:32 2009
@@ -0,0 +1,62 @@
+/*****************************************************************
+ *   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.modeler.dialog.validator;
+
+import javax.swing.JFrame;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.project.validator.ValidationInfo;
+
+
+public class EmbeddableErrorMsg extends ValidationDisplayHandler {
+
+    protected DataMap map;
+    protected Embeddable embeddable;
+    
+    public EmbeddableErrorMsg(ValidationInfo result) {
+        super(result);
+        
+        
+        Object[] path = result.getPath().getPath();
+        int len = path.length;
+
+        if (len >= 1) {
+            embeddable = (Embeddable) path[len - 1];
+        }
+
+        if (len >= 2) {
+            map = (DataMap) path[len - 2];
+        }
+
+        if (len >= 3) {
+            domain = (DataDomain) path[len - 3];
+        }
+    }
+
+    @Override
+    public void displayField(ProjectController mediator, JFrame frame) {
+        EmbeddableDisplayEvent event = new EmbeddableDisplayEvent(frame, embeddable, map, domain);
+        mediator.fireEmbeddableDisplayEvent(event);
+    }
+
+}

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/ValidationDisplayHandler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/ValidationDisplayHandler.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/ValidationDisplayHandler.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/ValidationDisplayHandler.java Fri Oct 30 15:33:32 2009
@@ -25,6 +25,7 @@
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Procedure;
@@ -56,7 +57,10 @@
         Object validatedObj = result.getValidatedObject();
 
         ValidationDisplayHandler msg = null;
-        if (validatedObj instanceof Attribute) {
+        if (validatedObj instanceof Embeddable) {
+            msg = new EmbeddableErrorMsg(result);
+        }
+        else if (validatedObj instanceof Attribute) {
             msg = new AttributeErrorMsg(result);
         }
         else if (validatedObj instanceof EmbeddableAttribute) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java Fri Oct 30 15:33:32 2009
@@ -19,13 +19,20 @@
 package org.apache.cayenne.modeler.editor;
 
 import java.awt.BorderLayout;
+import java.util.Collection;
 import java.util.EventObject;
+import java.util.Iterator;
 
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 import javax.swing.JToolBar;
 
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
@@ -95,31 +102,77 @@
         }
 
         Embeddable embeddable = mediator.getCurrentEmbeddable();
-        
+
         if (embeddable == null) {
             return;
         }
-        
+
         if (Util.nullSafeEquals(newClassName, embeddable.getClassName())) {
             return;
         }
-        
-        if(newClassName == null){
-            throw new ValidationException("Entity name is required.");
-        }  else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) {
+
+        if (newClassName == null) {
+            throw new ValidationException("Embeddable name is required.");
+        }
+        else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) {
+            
+            // if newClassName dupliucates in other DataMaps 
+            DataDomain domain = mediator.getCurrentDataDomain();
+            if (domain != null) {
+                for (DataMap nextMap : domain.getDataMaps()) {
+                    if (nextMap == embeddable.getDataMap()) {
+                        continue;
+                    }
+
+                    Embeddable conflictingEmbeddable = nextMap.getEmbeddable(newClassName);
+                    if (conflictingEmbeddable != null) {
+                        throw new ValidationException(
+                                    "Duplicate Embeddable name in another DataMap: "
+                                            + newClassName
+                                            + ".");
+                    }
+                }
+            }
+            
             // completely new name, set new name for embeddable
-            EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable.getClassName());
+            EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable
+                    .getClassName());
+            String oldName = embeddable.getClassName();
             embeddable.setClassName(newClassName);
-            
+
             mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap());
-        } else {
+
+            Iterator it = mediator.getCurrentDataDomain().getDataMaps().iterator();
+            while (it.hasNext()) {
+                DataMap dataMap = (DataMap) it.next();
+                Iterator<ObjEntity> ent = dataMap.getObjEntities().iterator();
+
+                while (ent.hasNext()) {
+                    
+                    Collection<ObjAttribute> attr = ent.next().getAttributes();
+                    Iterator<ObjAttribute> attrIt = attr.iterator();
+                    
+                    while (attrIt.hasNext()) {
+                        ObjAttribute atribute = attrIt.next();
+                        if (atribute.getType()==null || atribute.getType().equals(oldName)) {
+                            atribute.setType(newClassName);
+                            AttributeEvent ev = new AttributeEvent(this, atribute, atribute
+                                    .getEntity());
+                            mediator.fireObjAttributeEvent(ev);
+                        }
+                    }
+                    
+                }
+            }
+
+        }
+        else {
             // there is an embeddable with the same name
             throw new ValidationException("There is another embeddable with name '"
                     + newClassName
                     + "'.");
         }
 
-      
     }
 
     public void currentEmbeddableChanged(EmbeddableDisplayEvent e) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java?rev=831333&r1=831332&r2=831333&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java Fri Oct 30 15:33:32 2009
@@ -45,6 +45,7 @@
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
 
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
@@ -186,13 +187,12 @@
         List<String> embeddableNames = new ArrayList<String>();
         List<String> typeNames = new ArrayList<String>();
 
-        Iterator it = mediator.getProject().treeNodes();
+        Iterator it = mediator.getCurrentDataDomain().getDataMaps().iterator();
         while (it.hasNext()) {
-            ProjectPath path = (ProjectPath) it.next();
-            Object o = path.getObject();
-            Object[] p = path.getPath();
-            if (o instanceof Embeddable) {
-                Embeddable emb = (Embeddable) p[p.length - 1];
+            DataMap dataMap = (DataMap) it.next();
+            Iterator<Embeddable> embs = dataMap.getEmbeddables().iterator();
+            while (embs.hasNext()) {
+                Embeddable emb = (Embeddable) embs.next();
                 embeddableNames.add(emb.getClassName());
             }
         }