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/25 11:06:53 UTC

svn commit: r829522 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/ framework...

Author: aadamchik
Date: Sun Oct 25 10:06:52 2009
New Revision: 829522

URL: http://svn.apache.org/viewvc?rev=829522&view=rev
Log:
CAY-1260 (Exerimental) Modeler support for embeddables and embedded attributes

patch from Olga Tkachova:

 - rewrote the method of saving attribute in ObjAttribute inspector.
 - remove In (editable) column for embeddable attributes
 - rename the close button in ObjAttribute inspector to cancel
 - validation for missing Java type of embeddables
 - validation for DbAttribute mapping in EmdeddebleAttribute.
 - when changing java package for the DataMap, it update embeddables.

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableAttributeValidator.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableAttributeErrorMsg.java
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.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/TreeNodeValidator.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.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/AbstractCallbackListenersTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Sun Oct 25 10:06:52 2009
@@ -25,6 +25,7 @@
 CAY-1236 Allow providing custom INSERT, UPDATE, DELETE query builders
 CAY-1241 Add method to ExpressionFactory to match against the primary key of an object or list of objects
 CAY-1254 filtering an inExp(a, b) does not work when the path (a) refers to a collection of objects
+CAY-1260 (Exerimental) Modeler support for embeddables and embedded attributes
 CAY-1261 Auto-inject values in NEW objects with declared qualifiers
 CAY-1263 Cayenne Oracle adapter should automatically strip IN clauses with more than 1000 elements
 CAY-1268 Implement 'setStatementFetchSize' for RelationshipQuery

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java Sun Oct 25 10:06:52 2009
@@ -28,6 +28,7 @@
 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;
 import org.apache.cayenne.map.Relationship;
@@ -94,6 +95,9 @@
         else if (rootNode instanceof Embeddable) {
             this.traverseEmbeddable(Collections.singletonList(rootNode).iterator(), path);
         }
+        else if (rootNode instanceof EmbeddableAttribute) {
+            this.traverseEmbeddableAttributes(Collections.singletonList(rootNode).iterator(), path);
+        }
         else if (rootNode instanceof Attribute) {
             this.traverseAttributes(Collections.singletonList(rootNode).iterator(), path);
         }
@@ -198,7 +202,7 @@
             handler.projectNode(entPath);
 
             if (handler.shouldReadChildren(emd, path)) {
-                this.traverseAttributes(emd.getAttributes().iterator(), entPath);
+                this.traverseEmbeddableAttributes(emd.getAttributes().iterator(), entPath);
             }
         }
     }
@@ -270,6 +274,18 @@
             handler.projectNode(path.appendToPath(attributes.next()));
         }
     }
+    
+    public void traverseEmbeddableAttributes(Iterator emAttributes, ProjectPath path) {
+        if (sort) {
+            emAttributes = Util.sortedIterator(
+                    emAttributes,
+                    ProjectTraversal.mapObjectComparator);
+        }
+
+        while (emAttributes.hasNext()) {
+            handler.projectNode(path.appendToPath(emAttributes.next()));
+        }
+    }
 
     public void traverseRelationships(Iterator relationships, ProjectPath path) {
         if (sort) {

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableAttributeValidator.java?rev=829522&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableAttributeValidator.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/validator/EmbeddableAttributeValidator.java Sun Oct 25 10:06:52 2009
@@ -0,0 +1,52 @@
+/*****************************************************************
+ *   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.map.EmbeddableAttribute;
+import org.apache.cayenne.project.ProjectPath;
+import org.apache.cayenne.util.Util;
+
+
+public class EmbeddableAttributeValidator extends TreeNodeValidator {
+    
+    public EmbeddableAttributeValidator() {
+        super();
+    }
+
+    @Override
+    public void validateObject(ProjectPath path, Validator validator) {
+        EmbeddableAttribute emAttribute = (EmbeddableAttribute) path.getObject();
+        
+        // Must have name
+        if (Util.isEmptyString(emAttribute.getName())) {
+            validator.registerError("Unnamed ObjAttribute.", path);
+        }
+        
+        // skip validation of inherited attributes
+        if (path.getObjectParent() != null
+                && path.getObjectParent() != emAttribute.getEmbeddable()) {
+            return;
+        }
+        
+        // all attributes must have type
+        if (Util.isEmptyString(emAttribute.getType())) {
+            validator.registerWarning("EmbeddableAttribute has no type.", path);
+        }
+    }
+}

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=829522&r1=829521&r2=829522&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 Sun Oct 25 10:06:52 2009
@@ -19,6 +19,13 @@
 
 package org.apache.cayenne.project.validator;
 
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.project.ProjectPath;
@@ -70,9 +77,55 @@
             validator.registerWarning("ObjAttribute has no type.", path);
         }
 
-        if (attribute.getEntity() instanceof ObjEntity && ((ObjEntity)attribute.getEntity()).isAbstract()) {
-            //nothing, abstract entity does not have to define a dbAttribute
-        } else if (attribute.getDbAttribute() == null) {
+        if (attribute.getEntity() instanceof ObjEntity
+                && ((ObjEntity) attribute.getEntity()).isAbstract()) {
+            // nothing, abstract entity does not have to define a dbAttribute
+        }
+        else if (attribute instanceof EmbeddedAttribute) {
+            Map<String, String> attrOverrides = ((EmbeddedAttribute) attribute)
+                    .getAttributeOverrides();
+            Embeddable emb = ((EmbeddedAttribute) attribute).getEmbeddable();
+            if (emb == null && ((EmbeddedAttribute) attribute).getType() != null) {
+                validator.registerWarning(
+                        "EmbeddedAttribute has incorrect Embeddable.",
+                        path);
+            }
+            else if (emb == null && ((EmbeddedAttribute) attribute).getType() == null) {
+                validator.registerWarning("EmbeddedAttribute has no Embeddable.", path);
+            }
+
+            if (emb != null) {
+                Collection<EmbeddableAttribute> embAttributes = emb.getAttributes();
+
+                Iterator<EmbeddableAttribute> it = embAttributes.iterator();
+                while (it.hasNext()) {
+                    EmbeddableAttribute embAttr = (EmbeddableAttribute) it.next();
+                    String dbAttributeName;
+                    if (attrOverrides.size() > 0
+                            && attrOverrides.containsKey(embAttr.getName())) {
+                        dbAttributeName = attrOverrides.get(embAttr.getName());
+                    }
+                    else {
+                        dbAttributeName = embAttr.getDbAttributeName();
+                    }
+
+                    if (dbAttributeName == "" || dbAttributeName == null) {
+                        validator.registerWarning(
+                                "EmbeddedAttribute has no DbAttribute mapping.",
+                                path);
+                    }
+                    else if (((ObjEntity) attribute.getEntity())
+                            .getDbEntity()
+                            .getAttribute(dbAttributeName) == null) {
+                        validator.registerWarning(
+                                "EmbeddedAttribute has incorrect DbAttribute mapping.",
+                                path);
+                    }
+                }
+            }
+
+        }
+        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
@@ -82,5 +135,6 @@
             validator.registerWarning("ObjAttribute is mapped to a generated PK: "
                     + attribute.getDbAttributeName(), path);
         }
+
     }
 }

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=829522&r1=829521&r2=829522&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 Sun Oct 25 10:06:52 2009
@@ -25,7 +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.EmbeddedAttribute;
+import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -40,7 +40,6 @@
 /**
  * Validator of a single node in a project object tree. <i>Do not confuse with
  * org.apache.cayenne.access.DataNode. </i>
- * 
  */
 public abstract class TreeNodeValidator {
 
@@ -54,6 +53,7 @@
     protected static final DbEntityValidator dbEntityValidator = new DbEntityValidator();
     protected static final DbAttributeValidator dbAttrValidator = new DbAttributeValidator();
     protected static final DbRelationshipValidator dbRelValidator = new DbRelationshipValidator();
+    protected static final EmbeddableAttributeValidator embeddableAttributeValidator = new EmbeddableAttributeValidator();
 
     protected static final ProcedureValidator procedureValidator = new ProcedureValidator();
 
@@ -71,11 +71,11 @@
     public static void validate(ProjectPath path, Validator validator) {
         Object validatedObj = path.getObject();
         TreeNodeValidator validatorObj = null;
-        if (validatedObj instanceof EmbeddedAttribute) {
-            //TODO
-            return;
+
+        if (validatedObj instanceof EmbeddableAttribute) {
+            validatorObj = embeddableAttributeValidator;
         }
-        if (validatedObj instanceof ObjAttribute) {
+        else if (validatedObj instanceof ObjAttribute) {
             validatorObj = objAttrValidator;
         }
         else if (validatedObj instanceof ObjRelationship) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java Sun Oct 25 10:06:52 2009
@@ -19,10 +19,17 @@
 
 package org.apache.cayenne.modeler.dialog.datamap;
 
-import java.util.Iterator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddedAttribute;
+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.map.event.EntityEvent;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.util.Util;
@@ -74,6 +81,25 @@
             defaultPackage = defaultPackage + '.';
         }
 
+        Map<String, String> oldNameEmbeddableToNewName = new HashMap<String,String>();
+        
+        for (Embeddable embeddable : dataMap.getEmbeddables()) {
+            
+            String oldName = embeddable.getClassName();
+            
+            Pattern p = Pattern.compile("[.]");
+            String[] tokens = p.split(oldName);
+            String className = tokens[tokens.length-1];
+            
+            if (doAll || Util.isEmptyString(oldName) || oldName.indexOf('.') < 0) {
+                EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable.getClassName());
+                String newClassName = defaultPackage + className;
+                oldNameEmbeddableToNewName.put(oldName, newClassName);
+                embeddable.setClassName(newClassName);
+                mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap());
+            }
+        }
+        
         for (ObjEntity entity : dataMap.getObjEntities()) {
             String oldName = getClassName(entity);
 
@@ -82,6 +108,16 @@
                         .getName() : oldName);
                 setClassName(entity, defaultPackage + className);
             }
+            
+            for(ObjAttribute attribute: entity.getAttributes()){
+                if(attribute instanceof EmbeddedAttribute){
+                    if(oldNameEmbeddableToNewName.size()>0 && oldNameEmbeddableToNewName.containsKey(attribute.getType())){
+                        attribute.setType(oldNameEmbeddableToNewName.get(attribute.getType()));
+                        AttributeEvent ev = new AttributeEvent(this, attribute, entity);
+                        mediator.fireObjAttributeEvent(ev);
+                    }
+                }
+            }
         }
 
         shutdown();

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=829522&r1=829521&r2=829522&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 Sun Oct 25 10:06:52 2009
@@ -424,91 +424,91 @@
     }
 
     public boolean setPath(boolean isChange) {
-        StringBuilder attributePath = new StringBuilder();
-        StringBuilder pathStr = new StringBuilder();
-        if (((ObjEntity) attribute.getEntity()).getDbEntity() != null) {
-            TreePath path = view.getPathBrowser().getSelectionPath();
-
-            if (path.getLastPathComponent() instanceof DbAttribute) {
-                Object[] pathComponents = path.getPath();
-                for (int i = 0; i < pathComponents.length; i++) {
-                    boolean attrOrRel = true;
-                    if (pathComponents[i] instanceof DbAttribute) {
-                        pathStr.append(((DbAttribute) pathComponents[i]).getName());
-                        attributePath.append(((DbAttribute) pathComponents[i]).getName());
-                    }
-                    else if (pathComponents[i] instanceof DbRelationship) {
-                        pathStr.append(((DbRelationship) pathComponents[i]).getName());
-                        attributePath.append(((DbRelationship) pathComponents[i])
-                                .getName());
-                    }
-                    else {
-                        attrOrRel = false;
-                    }
 
-                    if (i != pathComponents.length - 1 && attrOrRel) {
-                        pathStr.append(" -> ");
-                        attributePath.append(".");
+        if (isChange()) {
+            attributeSaved.setType(view.getType().getSelectedItem().toString());
+            attributeSaved.setName(view.getAttributeName().getText());
+        }
+
+        if (!(attributeSaved instanceof EmbeddedAttribute)
+                || isRegistredType(attributeSaved.getType())) {
+
+            StringBuilder attributePath = new StringBuilder();
+            StringBuilder pathStr = new StringBuilder();
+            if (((ObjEntity) attribute.getEntity()).getDbEntity() != null) {
+                TreePath path = view.getPathBrowser().getSelectionPath();
+
+                if (path.getLastPathComponent() instanceof DbAttribute) {
+                    Object[] pathComponents = path.getPath();
+                    for (int i = 0; i < pathComponents.length; i++) {
+                        boolean attrOrRel = true;
+                        if (pathComponents[i] instanceof DbAttribute) {
+                            pathStr.append(((DbAttribute) pathComponents[i]).getName());
+                            attributePath.append(((DbAttribute) pathComponents[i])
+                                    .getName());
+                        }
+                        else if (pathComponents[i] instanceof DbRelationship) {
+                            pathStr
+                                    .append(((DbRelationship) pathComponents[i])
+                                            .getName());
+                            attributePath.append(((DbRelationship) pathComponents[i])
+                                    .getName());
+                        }
+                        else {
+                            attrOrRel = false;
+                        }
+
+                        if (i != pathComponents.length - 1 && attrOrRel) {
+                            pathStr.append(" -> ");
+                            attributePath.append(".");
+                        }
                     }
                 }
             }
-        }
-        else {
-            view.getCurrentPathLabel().setText("");
-        }
+            else {
+                view.getCurrentPathLabel().setText("");
+            }
 
-        view.getCurrentPathLabel().setText(pathStr.toString());
+            view.getCurrentPathLabel().setText(pathStr.toString());
 
-        if (attribute.getDbAttributePath() != null
-                && !embeddableNames.contains(view.getType().getSelectedItem().toString())) {
-            if (!attribute.getDbAttributePath().equals(attributePath.toString())
-                    || isChange()) {
+            if (attribute.getDbAttributePath() != null
+                    && !embeddableNames.contains(view
+                            .getType()
+                            .getSelectedItem()
+                            .toString())) {
+                if (!attribute.getDbAttributePath().equals(attributePath.toString())) {
 
-                if (isRegistredType(attributeSaved.getType())) {
-                    attributeSaved.setDbAttributePath(attributePath.toString());
-                }
-                else {
-                    attributeSaved.setDbAttributePath("");
-                }
-                attributeSaved.setName(view.getAttributeName().getText());
-                attributeSaved.setType(view.getType().getSelectedItem().toString());
+                    if (isRegistredType(attributeSaved.getType())) {
+                        attributeSaved.setDbAttributePath(attributePath.toString());
+                    }
+                    else {
+                        attributeSaved.setDbAttributePath("");
+                    }
 
-                if (!attribute.getDbAttributePath().equals(attributePath.toString())
-                        && isChange) {
-                    model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+                    if (!attribute.getDbAttributePath().equals(attributePath.toString())
+                            && isChange) {
+                        model.setUpdatedValueAt(
+                                attributeSaved.getDbAttributePath(),
+                                row,
+                                3);
+                    }
+                    return true;
                 }
-
-                return true;
             }
-        }
-        else {
-            if (attributePath.length() > 0 || isChange()) {
-                if (isRegistredType(attributeSaved.getType())) {
-                    attributeSaved.setDbAttributePath(attributePath.toString());
-                }
-                else {
-                    attributeSaved.setDbAttributePath("");
-
-                    if (attributeSaved instanceof EmbeddedAttribute) {
+            else {
+                if (attributePath.length() > 0
+                        || (attribute instanceof EmbeddedAttribute && !(attributeSaved instanceof EmbeddedAttribute))) {
 
-                        if (embeddableModel.isAttributeOverrideChange()) {
-                            Map<String, String> overrides = ((EmbeddedAttribute) attributeSaved)
-                                    .getAttributeOverrides();
-                            Map<String, String> currentOverrAttr = getCurrentOverrideAttribute();
-                            compareAndSetOverrideInEmbeddedAttribute(
-                                    attributeSaved,
-                                    overrides,
-                                    currentOverrAttr);
-                        }
+                    attributeSaved.setDbAttributePath(attributePath.toString());
+                    if (attributePath.length() == 0) {
+                        model.setUpdatedValueAt(
+                                attributeSaved.getDbAttributePath(),
+                                row,
+                                3);
+                        return false;
                     }
-
+                    return true;
                 }
-                attributeSaved.setType(view.getType().getSelectedItem().toString());
-                attributeSaved.setName(view.getAttributeName().getText());
-                if (attributePath.length() > 0 && isChange) {
-                    model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
-                }
-                return true;
             }
         }
         return false;
@@ -532,75 +532,119 @@
     public void saveMapping() {
 
         if (setPath(false)) {
+
             if (JOptionPane.showConfirmDialog(
                     (Component) getView(),
                     "You have changed Db Attribute path. Do you want it to be saved?",
                     "Save ObjAttribute",
                     JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
 
-                if ((attributeSaved instanceof EmbeddedAttribute && !(attribute instanceof EmbeddedAttribute))
-                        || (!(attributeSaved instanceof EmbeddedAttribute) && attribute instanceof EmbeddedAttribute)) {
-                    model.getEntity().removeAttribute(attribute.getName());
-                    model.getEntity().addAttribute(attributeSaved);
-
-                    mediator.fireObjEntityEvent(new EntityEvent(
-                            this,
-                            model.getEntity(),
-                            MapEvent.CHANGE));
-
-                    EntityDisplayEvent event = new EntityDisplayEvent(
-                            this,
-                            mediator.getCurrentObjEntity(),
-                            mediator.getCurrentDataMap(),
-                            mediator.getCurrentDataDomain());
-
-                    mediator.fireObjEntityDisplayEvent(event);
+                if (attribute instanceof EmbeddedAttribute) {
+                    changeAttributeObject();
+                }
+                else {
+                    model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
+                    model.setUpdatedValueAt(attributeSaved.getType(), row, 2);
+                }
 
-                    mediator.fireObjAttributeEvent(new AttributeEvent(
-                            this,
-                            attributeSaved,
-                            model.getEntity(),
-                            MapEvent.CHANGE));
+                model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+            }
+            else {
+                model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
+                model.setUpdatedValueAt(attributeSaved.getType(), row, 2);
+            }
+        }
+        else {
 
-                    AttributeDisplayEvent eventAttr = new AttributeDisplayEvent(
-                            this,
-                            attributeSaved,
-                            mediator.getCurrentObjEntity(),
-                            mediator.getCurrentDataMap(),
-                            mediator.getCurrentDataDomain());
+            if ((attributeSaved instanceof EmbeddedAttribute && !(attribute instanceof EmbeddedAttribute))
+                    || (!(attributeSaved instanceof EmbeddedAttribute) && attribute instanceof EmbeddedAttribute)) {
+                changeAttributeObject();
+            }
+            else if ((attributeSaved instanceof EmbeddedAttribute && attribute instanceof EmbeddedAttribute)
+                    || (!(attributeSaved instanceof EmbeddedAttribute) && !(attribute instanceof EmbeddedAttribute))) {
 
-                    mediator.fireObjAttributeDisplayEvent(eventAttr);
+                if (attributeSaved instanceof EmbeddedAttribute
+                        && embeddableModel.isAttributeOverrideChange()) {
+                    Map<String, String> overrides = ((EmbeddedAttribute) attributeSaved)
+                            .getAttributeOverrides();
+                    Map<String, String> currentOverrAttr = getCurrentOverrideAttribute();
 
+                    compareAndSetOverrideInEmbeddedAttribute(
+                            attributeSaved,
+                            overrides,
+                            currentOverrAttr);
                 }
 
-                if ((attributeSaved instanceof EmbeddedAttribute && attribute instanceof EmbeddedAttribute)
-                        || (!(attributeSaved instanceof EmbeddedAttribute) && !(attribute instanceof EmbeddedAttribute))) {
-                    model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
-                    model.setUpdatedValueAt(attributeSaved.getType(), row, 2);
-                    model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
-                }
+                model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
+                model.setUpdatedValueAt(attributeSaved.getType(), row, 2);
+                model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+            }
 
-                if (attributeSaved instanceof EmbeddedAttribute
-                        && attribute instanceof EmbeddedAttribute) {
+            if (attributeSaved instanceof EmbeddedAttribute
+                    && attribute instanceof EmbeddedAttribute) {
 
-                    if (embeddableModel.isAttributeOverrideChange()) {
-                        Map<String, String> overrides;
-                        overrides = ((EmbeddedAttribute) attribute)
-                                .getAttributeOverrides();
-                        Map<String, String> currentOverrAttr = ((EmbeddedAttribute) attributeSaved)
-                                .getAttributeOverrides();
-
-                        compareAndSetOverrideInEmbeddedAttribute(
-                                attribute,
-                                overrides,
-                                currentOverrAttr);
-                    }
+                model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+                if (embeddableModel.isAttributeOverrideChange()) {
+                    Map<String, String> overrides;
+                    overrides = ((EmbeddedAttribute) attribute).getAttributeOverrides();
+                    Map<String, String> currentOverrAttr = ((EmbeddedAttribute) attributeSaved)
+                            .getAttributeOverrides();
+
+                    compareAndSetOverrideInEmbeddedAttribute(
+                            attribute,
+                            overrides,
+                            currentOverrAttr);
                 }
             }
         }
         closeAction();
     }
 
+    private void changeAttributeObject() {
+
+        if (attributeSaved instanceof EmbeddedAttribute
+                && embeddableModel.isAttributeOverrideChange()) {
+            Map<String, String> overrides = ((EmbeddedAttribute) attributeSaved)
+                    .getAttributeOverrides();
+            Map<String, String> currentOverrAttr = getCurrentOverrideAttribute();
+            compareAndSetOverrideInEmbeddedAttribute(
+                    attributeSaved,
+                    overrides,
+                    currentOverrAttr);
+        }
+        if (attributeSaved instanceof EmbeddedAttribute) {
+            attributeSaved.setDbAttributePath(null);
+            model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+        }
+
+        model.getEntity().removeAttribute(attribute.getName());
+        model.getEntity().addAttribute(attributeSaved);
+
+        mediator.fireObjEntityEvent(new EntityEvent(
+                this,
+                model.getEntity(),
+                MapEvent.CHANGE));
+
+        EntityDisplayEvent event = new EntityDisplayEvent(this, mediator
+                .getCurrentObjEntity(), mediator.getCurrentDataMap(), mediator
+                .getCurrentDataDomain());
+
+        mediator.fireObjEntityDisplayEvent(event);
+
+        mediator.fireObjAttributeEvent(new AttributeEvent(this, attributeSaved, model
+                .getEntity(), MapEvent.CHANGE));
+
+        AttributeDisplayEvent eventAttr = new AttributeDisplayEvent(
+                this,
+                attributeSaved,
+                mediator.getCurrentObjEntity(),
+                mediator.getCurrentDataMap(),
+                mediator.getCurrentDataDomain());
+
+        mediator.fireObjAttributeDisplayEvent(eventAttr);
+
+    }
+
     public Map<String, String> getCurrentOverrideAttribute() {
         Map<String, String> currentEmbeddableOverrite = new HashMap<String, String>();
         Collection<EmbeddableAttribute> embList = embeddableModel.getEmbeddableList();
@@ -857,7 +901,5 @@
             ((EmbeddedAttribute) attribute).addAttributeOverride(key, currentOverrAttr
                     .get(key));
         }
-
     }
-
 }

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=829522&r1=829521&r2=829522&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 Sun Oct 25 10:06:52 2009
@@ -81,7 +81,7 @@
         this.mediator = mediator;
 
         // create widgets
-        this.cancelButton = new JButton("Close");
+        this.cancelButton = new JButton("Cancel");
         this.saveButton = new JButton("Done");
         this.selectPathButton = new JButton("Select path");
 

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableAttributeErrorMsg.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableAttributeErrorMsg.java?rev=829522&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableAttributeErrorMsg.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EmbeddableAttributeErrorMsg.java Sun Oct 25 10:06:52 2009
@@ -0,0 +1,72 @@
+/*****************************************************************
+ *   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.map.EmbeddableAttribute;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.project.validator.ValidationInfo;
+
+public class EmbeddableAttributeErrorMsg extends ValidationDisplayHandler {
+
+    protected DataMap map;
+    protected Embeddable embeddable;
+    protected EmbeddableAttribute embeddableAttribute;
+
+    public EmbeddableAttributeErrorMsg(ValidationInfo result) {
+        super(result);
+        Object[] path = result.getPath().getPath();
+        int len = path.length;
+
+        if (len >= 1) {
+            embeddableAttribute = (EmbeddableAttribute) path[len - 1];
+        }
+
+        if (len >= 2) {
+            embeddable = (Embeddable) path[len - 2];
+        }
+
+        if (len >= 3) {
+            map = (DataMap) path[len - 3];
+        }
+
+        if (len >= 4) {
+            domain = (DataDomain) path[len - 4];
+        }
+    }
+
+    @Override
+    public void displayField(ProjectController mediator, JFrame frame) {
+        EmbeddableAttributeDisplayEvent event = new EmbeddableAttributeDisplayEvent(
+                frame,
+                embeddable,
+                embeddableAttribute,
+                map,
+                domain);
+
+        mediator.fireEmbeddableDisplayEvent(event);
+        mediator.fireEmbeddableAttributeDisplayEvent(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=829522&r1=829521&r2=829522&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 Sun Oct 25 10:06:52 2009
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.modeler.dialog.validator;
 
 import javax.swing.JFrame;
@@ -26,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.EmbeddableAttribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
@@ -37,11 +37,12 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-/** 
+/**
  * Superclass of CayenneModeler validation messages.
  * 
  */
 public abstract class ValidationDisplayHandler {
+
     private static Log logObj = LogFactory.getLog(ValidationDisplayHandler.class);
 
     public static final int NO_ERROR = ValidationInfo.VALID;
@@ -58,6 +59,9 @@
         if (validatedObj instanceof Attribute) {
             msg = new AttributeErrorMsg(result);
         }
+        else if (validatedObj instanceof EmbeddableAttribute) {
+            msg = new EmbeddableAttributeErrorMsg(result);
+        }
         else if (validatedObj instanceof Relationship) {
             msg = new RelationshipErrorMsg(result);
         }
@@ -95,8 +99,8 @@
         this.validationInfo = validationInfo;
     }
 
-    /** 
-     * Fires event to display the screen where error should be corrected. 
+    /**
+     * Fires event to display the screen where error should be corrected.
      */
     public abstract void displayField(ProjectController mediator, JFrame frame);
 
@@ -105,7 +109,7 @@
         return validationInfo.getMessage();
     }
 
-    /** Returns the severity of the error message.*/
+    /** Returns the severity of the error message. */
     public int getSeverity() {
         return validationInfo.getSeverity();
     }
@@ -131,6 +135,7 @@
     }
 
     private static final class NullHanlder extends ValidationDisplayHandler {
+
         NullHanlder(ValidationInfo info) {
             super(info);
         }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackListenersTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackListenersTab.java?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackListenersTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackListenersTab.java Sun Oct 25 10:06:52 2009
@@ -23,7 +23,6 @@
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 import javax.swing.DefaultComboBoxModel;

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java Sun Oct 25 10:06:52 2009
@@ -171,10 +171,6 @@
     }
 
     private void setUpTableStructure(EmbeddableAttributeTableModel model) {
-        TableColumn inheritanceColumn = table.getColumnModel().getColumn(
-                EmbeddableAttributeTableModel.INHERITED);
-        inheritanceColumn.setMinWidth(20);
-        inheritanceColumn.setMaxWidth(20);
 
         TableColumn nameColumn = table.getColumnModel().getColumn(
                 EmbeddableAttributeTableModel.OBJ_ATTRIBUTE);

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java?rev=829522&r1=829521&r2=829522&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java Sun Oct 25 10:06:52 2009
@@ -39,10 +39,9 @@
     private Embeddable embeddable;
 
     // Columns
-    static final int INHERITED = 0;
-    static final int OBJ_ATTRIBUTE = 1;
-    static final int OBJ_ATTRIBUTE_TYPE = 2;
-    static final int DB_ATTRIBUTE = 3;
+    static final int OBJ_ATTRIBUTE = 0;
+    static final int OBJ_ATTRIBUTE_TYPE = 1;
+    static final int DB_ATTRIBUTE = 2;
 
     private CellEditorForAttributeTable cellEditor;
 
@@ -94,13 +93,11 @@
     }
 
     public int getColumnCount() {
-        return 4;
+        return 3;
     }
 
     public String getColumnName(int column) {
         switch (column) {
-            case INHERITED:
-                return "In";
             case OBJ_ATTRIBUTE:
                 return "ObjAttribute";
             case OBJ_ATTRIBUTE_TYPE:
@@ -115,10 +112,7 @@
     public Object getValueAt(int row, int column) {
         EmbeddableAttribute attribute = getEmbeddableAttribute(row);
 
-        if (column == INHERITED) {
-            return null;
-        }
-        else if (column == OBJ_ATTRIBUTE) {
+        if (column == OBJ_ATTRIBUTE) {
             return attribute.getName();
         }
         else if (column == OBJ_ATTRIBUTE_TYPE) {