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 2014/04/12 10:06:58 UTC

svn commit: r1586832 - in /cayenne/main/trunk: cayenne-project/src/main/java/org/apache/cayenne/project/validation/ cayenne-server/src/main/java/org/apache/cayenne/validation/ modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ modeler/ca...

Author: aadamchik
Date: Sat Apr 12 08:06:57 2014
New Revision: 1586832

URL: http://svn.apache.org/r1586832
Log:
CAY-1795 "Invisible" ObjAttribute in subclass

patch by Oleg Artyukevich - ModelerObjAttribute_4.patch

Added:
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/AttributeValidationFailure.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/ObjAttributeWrapperValidator.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/Wrapper.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveEvent.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
Modified:
    cayenne/main/trunk/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ConfigurationNodeValidator.java
    cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/validation/ValidationResult.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/UnsavedChangesDialog.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
    cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java

Modified: cayenne/main/trunk/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ConfigurationNodeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ConfigurationNodeValidator.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ConfigurationNodeValidator.java (original)
+++ cayenne/main/trunk/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ConfigurationNodeValidator.java Sat Apr 12 08:06:57 2014
@@ -26,9 +26,9 @@ import org.apache.cayenne.validation.Val
  * 
  * @since 3.1
  */
-abstract class ConfigurationNodeValidator {
+public abstract class ConfigurationNodeValidator {
 
-    void addFailure(
+    public void addFailure(
             ValidationResult validationResult,
             Object source,
             String messageFormat,
@@ -37,4 +37,10 @@ abstract class ConfigurationNodeValidato
         String message = String.format(messageFormat, messageParameters);
         validationResult.addFailure(new SimpleValidationFailure(source, message));
     }
+    
+    public void addFailure(
+    		ValidationResult validationResult,
+    		SimpleValidationFailure failure) {
+    	validationResult.addFailure(failure);
+    }
 }

Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/validation/ValidationResult.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/validation/ValidationResult.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/validation/ValidationResult.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/validation/ValidationResult.java Sat Apr 12 08:06:57 2014
@@ -102,6 +102,10 @@ public class ValidationResult implements
 
         return false;
     }
+    
+    public void clear() {
+    	failures.clear();
+    }
 
     @Override
     public String toString() {

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectController.java Sat Apr 12 08:06:57 2014
@@ -79,6 +79,7 @@ import org.apache.cayenne.modeler.action
 import org.apache.cayenne.modeler.action.NavigateForwardAction;
 import org.apache.cayenne.modeler.action.RevertAction;
 import org.apache.cayenne.modeler.action.SaveAction;
+import org.apache.cayenne.modeler.action.SaveAsAction;
 import org.apache.cayenne.modeler.editor.CallbackType;
 import org.apache.cayenne.modeler.editor.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
@@ -110,6 +111,8 @@ import org.apache.cayenne.modeler.event.
 import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
 import org.apache.cayenne.modeler.event.ProcedureParameterDisplayEvent;
 import org.apache.cayenne.modeler.event.ProcedureParameterDisplayListener;
+import org.apache.cayenne.modeler.event.ProjectOnSaveEvent;
+import org.apache.cayenne.modeler.event.ProjectOnSaveListener;
 import org.apache.cayenne.modeler.event.QueryDisplayEvent;
 import org.apache.cayenne.modeler.event.QueryDisplayListener;
 import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
@@ -233,7 +236,7 @@ public class ProjectController extends C
     protected CircularArray controllerStateHistory;
     protected int maxHistorySize = 20;
 
-    private EntityResolver entityResolver;
+    private EntityResolver entityResolver;    
 
     /**
      * Project files watcher. When project file is changed, user will be asked
@@ -574,7 +577,15 @@ public class ProjectController extends C
     public void removeDbEntityListener(DbEntityListener listener) {
         listenerList.remove(DbEntityListener.class, listener);
     }
+    
+    public void addProjectOnSaveListener(ProjectOnSaveListener listener) {
+    	listenerList.add(ProjectOnSaveListener.class, listener);
+    }
 
+    public void removeProjectOnSaveListener(ProjectOnSaveListener listener) {
+    	listenerList.remove(ProjectOnSaveListener.class, listener);
+    }
+    
     public void addObjEntityListener(ObjEntityListener listener) {
         listenerList.add(ObjEntityListener.class, listener);
     }
@@ -1491,7 +1502,7 @@ public class ProjectController extends C
         if (this.dirty != dirty) {
             this.dirty = dirty;
 
-            application.getActionManager().getAction(SaveAction.class).setEnabled(dirty);
+            enableSave(dirty);
             application.getActionManager().getAction(RevertAction.class).setEnabled(dirty);
 
             if (dirty) {
@@ -1716,6 +1727,14 @@ public class ProjectController extends C
             }
         }
     }
+    
+    public void fireProjectOnSaveEvent(ProjectOnSaveEvent e){
+    	for(EventListener listener : listenerList.getListeners(ProjectOnSaveListener.class)){
+    		ProjectOnSaveListener temp = (ProjectOnSaveListener) listener;
+    		temp.beforeSaveChanges(e);
+    	}
+    	
+    }
 
     public ArrayList<Embeddable> getEmbeddableNamesInCurRentDataDomain() {
         DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) getProject().getRootNode();
@@ -1758,5 +1777,14 @@ public class ProjectController extends C
      */
     public void setEntityTabSelection(int entityTabSelection) {
         this.entityTabSelection = entityTabSelection;
+    }    
+    
+    /**
+     * If true, all save buttons become available.
+     * @param enable
+     */
+    public void enableSave(boolean enable) {
+        application.getActionManager().getAction(SaveAction.class).setEnabled(enable);
+        application.getActionManager().getAction(SaveAsAction.class).setEnabled(enable);
     }
 }

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java Sat Apr 12 08:06:57 2014
@@ -34,6 +34,7 @@ import org.apache.cayenne.configuration.
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.validator.ValidationDisplayHandler;
 import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
+import org.apache.cayenne.modeler.event.ProjectOnSaveEvent;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.pref.RenamedPreferences;
 import org.apache.cayenne.project.Project;
@@ -161,7 +162,9 @@ public class SaveAsAction extends Cayenn
 
         ProjectValidator projectValidator = getApplication().getInjector().getInstance(ProjectValidator.class);
         ValidationResult validationResult = projectValidator.validate(getCurrentProject().getRootNode());
-
+        
+        getProjectController().fireProjectOnSaveEvent(new ProjectOnSaveEvent(SaveAsAction.class));
+        
         try {
             if (!saveAll()) {
                 return;

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/UnsavedChangesDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/UnsavedChangesDialog.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/UnsavedChangesDialog.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/UnsavedChangesDialog.java Sat Apr 12 08:06:57 2014
@@ -20,7 +20,11 @@
 package org.apache.cayenne.modeler.dialog;
 
 import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 
+import javax.swing.JButton;
+import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JOptionPane;
 
@@ -32,39 +36,62 @@ public class UnsavedChangesDialog {
     private static final String CLOSE_WITHOUT_SAVE = "Discard Changes";
     private static final String CANCEL = "Cancel";
 
-    private static final String[] OPTIONS = new String[] {
-            SAVE_AND_CLOSE, CLOSE_WITHOUT_SAVE, CANCEL
-    };
-
+    private JButton saveButton = new JButton(SAVE_AND_CLOSE);
+    private JButton withoutSaveButton = new JButton(CLOSE_WITHOUT_SAVE);
+    private JButton cancelButton = new JButton(CANCEL);
+    
     protected Component parent;
     protected String result = CANCEL;
 
     public UnsavedChangesDialog(Component parent) {
         this.parent = parent;
+        initButtons();
     }
-
+    
     public void show() {
         JOptionPane pane = new JOptionPane(
                 "You have unsaved changes. Do you want to save them?",
                 JOptionPane.QUESTION_MESSAGE);
-        pane.setOptions(OPTIONS);
-
+        pane.setOptions(new Object[] {saveButton, withoutSaveButton, cancelButton});
+        
         JDialog dialog = pane.createDialog(parent, "Unsaved Changes");
         dialog.setVisible(true);
-
         Object selectedValue = pane.getValue();
         // need to do an if..else chain, since
         // sometimes values are unexpected
         if (SAVE_AND_CLOSE.equals(selectedValue)) {
             result = SAVE_AND_CLOSE;
-        }
-        else if (CLOSE_WITHOUT_SAVE.equals(selectedValue)) {
+        } else if (CLOSE_WITHOUT_SAVE.equals(selectedValue)) {
             result = CLOSE_WITHOUT_SAVE;
-        }
-        else {
+        } else {
             result = CANCEL;
         }
     }
+    
+    private void initButtons(){
+        ActionListener listener =  new ActionListener(){
+            
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JOptionPane pane = getOptionPane((JComponent)e.getSource());
+                pane.setValue(e.getActionCommand());
+            }
+        };
+        
+        saveButton.addActionListener(listener);
+        withoutSaveButton.addActionListener(listener);
+        cancelButton.addActionListener(listener);
+    }
+    
+    private JOptionPane getOptionPane(JComponent parent) {
+        JOptionPane pane = null;
+        if (!(parent instanceof JOptionPane)) {
+            pane = getOptionPane((JComponent)parent.getParent());
+        } else {
+            pane = (JOptionPane) parent;
+        }
+        return pane;
+    }
 
     public boolean shouldSave() {
         return SAVE_AND_CLOSE.equals(result);

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java Sat Apr 12 08:06:57 2014
@@ -103,7 +103,7 @@ public class ObjAttributeInfoDialog exte
             stringToEmbeddables.put(emb.getClassName(), emb);
             embeddableNames.add(emb.getClassName());
         }
-        initController(model.getAttribute(row));
+        initController(model.getAttribute(row).getValue());
     }
 
     @Override

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java Sat Apr 12 08:06:57 2014
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.swing.DefaultCellEditor;
 import javax.swing.JComboBox;
@@ -46,13 +47,13 @@ import org.apache.cayenne.map.event.Enti
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.editor.wrapper.ObjAttributeWrapper;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CayenneTableModel;
 import org.apache.cayenne.modeler.util.CellEditorForAttributeTable;
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.modeler.util.ProjectUtil;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -60,24 +61,32 @@ import org.apache.cayenne.util.Util;
  * Allows adding/removing attributes, modifying the types and the names.
  * 
  */
-public class ObjAttributeTableModel extends CayenneTableModel {
+public class ObjAttributeTableModel extends CayenneTableModel<ObjAttributeWrapper> {
 
     // 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 DB_ATTRIBUTE_TYPE = 4;
-    static final int LOCKING = 5;
+    public static final int INHERITED = 0;
+    public static final int OBJ_ATTRIBUTE = 1;
+    public static final int OBJ_ATTRIBUTE_TYPE = 2;
+    public static final int DB_ATTRIBUTE = 3;
+    public static final int DB_ATTRIBUTE_TYPE = 4;
+    public static final int LOCKING = 5;
 
     protected ObjEntity entity;
     protected DbEntity dbEntity;
     private CellEditorForAttributeTable cellEditor;
     private CayenneTable table;
 
+    private static List<ObjAttributeWrapper> wrapObjAttributes(Collection<ObjAttribute> attributes) {
+        List<ObjAttributeWrapper>  wrappedAttributes = new ArrayList<ObjAttributeWrapper>();
+        for(ObjAttribute attr : attributes) {
+            wrappedAttributes.add(new ObjAttributeWrapper(attr));
+        }
+        return wrappedAttributes;
+    }
+
     public ObjAttributeTableModel(ObjEntity entity, ProjectController mediator,
             Object eventSource) {
-        super(mediator, eventSource, new ArrayList<Attribute>(entity.getAttributes()));
+        super(mediator, eventSource, wrapObjAttributes(entity.getAttributes()));
         // take a copy
         this.entity = entity;
         this.dbEntity = entity.getDbEntity();
@@ -85,7 +94,7 @@ public class ObjAttributeTableModel exte
         // order using local comparator
         Collections.sort(objectList, new AttributeComparator());
     }
-
+    
     protected void orderList() {
         // NOOP
     }
@@ -108,16 +117,16 @@ public class ObjAttributeTableModel exte
      */
     @Override
     public Class<?> getElementsClass() {
-        return ObjAttribute.class;
+        return ObjAttributeWrapper.class;
     }
 
     public DbEntity getDbEntity() {
         return dbEntity;
     }
 
-    public ObjAttribute getAttribute(int row) {
+    public ObjAttributeWrapper getAttribute(int row) {
         return (row >= 0 && row < objectList.size())
-                ? (ObjAttribute) objectList.get(row)
+                ? objectList.get(row)
                 : null;
     }
 
@@ -166,8 +175,7 @@ public class ObjAttributeTableModel exte
     }
 
     public Object getValueAt(int row, int column) {
-        ObjAttribute attribute = getAttribute(row);
-
+        ObjAttributeWrapper attribute = getAttribute(row);
         if (column == INHERITED) {
             return attribute.isInherited();
         }
@@ -194,7 +202,7 @@ public class ObjAttributeTableModel exte
         }
     }
 
-    private String getDBAttribute(ObjAttribute attribute, DbAttribute dbAttribute) {
+    private String getDBAttribute(ObjAttributeWrapper attribute, DbAttribute dbAttribute) {
         if (dbAttribute == null) {
             if (!attribute.isInherited()
                     && ((ObjEntity) attribute.getEntity()).isAbstract()) {
@@ -211,10 +219,10 @@ public class ObjAttributeTableModel exte
         return dbAttribute.getName();
     }
 
-    private String getDBAttributeType(ObjAttribute attribute, DbAttribute dbAttribute) {
+    private String getDBAttributeType(ObjAttributeWrapper attribute, DbAttribute dbAttribute) {
         int type;
         if (dbAttribute == null) {
-            if (!(attribute instanceof EmbeddedAttribute)) {
+            if (!(attribute.getValue() instanceof EmbeddedAttribute)) {
                 try {
                     type = TypesMapping.getSqlTypeByJava(attribute.getJavaClass());
                     // have to catch the exception here to make sure that
@@ -249,19 +257,47 @@ public class ObjAttributeTableModel exte
     public CellEditorForAttributeTable getCellEditor() {
         return cellEditor;
     }
+    
+    /**
+     * Correct errors that attributes have.
+     */
+    @Override
+    public void resetModel() {
+        for(ObjAttributeWrapper attribute : objectList) {
+            attribute.resetEdits();
+        }
+    }    
+    
+    /**
+     * @return false, if one or more attributes in model are not valid. 
+     */
+    @Override
+    public boolean isValid() {
+        for(ObjAttributeWrapper attribute : getObjectList()) {
+            if (!attribute.isValid()) {
+                return false;
+            }
+        }
 
+        return true;
+    }
+    
     public void setUpdatedValueAt(Object value, int row, int column) {
-
-        ObjAttribute attribute = getAttribute(row);
-        AttributeEvent event = new AttributeEvent(eventSource, attribute, entity);
+        
+        ObjAttributeWrapper attribute = getAttribute(row);
+        attribute.resetEdits();
+        AttributeEvent event = new AttributeEvent(eventSource, attribute.getValue(), entity);
         String path = null;
         Collection<String> nameAttr = null;
 
         if (column == OBJ_ATTRIBUTE) {
             event.setOldName(attribute.getName());
-            ProjectUtil.setAttributeName(attribute, value != null ? value
-                    .toString()
-                    .trim() : null);
+
+            attribute.setName(value != null ? value.toString().trim() : null);
+
+            if (attribute.isValid()) {
+                attribute.commitEdits();
+            }
             fireTableCellUpdated(row, column);
         }
         else if (column == OBJ_ATTRIBUTE_TYPE) {
@@ -449,8 +485,8 @@ public class ObjAttributeTableModel exte
     final class AttributeComparator implements Comparator {
 
         public int compare(Object o1, Object o2) {
-            Attribute a1 = (Attribute) o1;
-            Attribute a2 = (Attribute) o2;
+            Attribute a1 = ((ObjAttributeWrapper) o1).getValue();
+            Attribute a2 = ((ObjAttributeWrapper) o2).getValue();
 
             int delta = getWeight(a1) - getWeight(a2);
 
@@ -480,9 +516,9 @@ public class ObjAttributeTableModel exte
                 break;
             case DB_ATTRIBUTE:
             case DB_ATTRIBUTE_TYPE:
-                Collections.sort(objectList, new Comparator<ObjAttribute>() {
+                Collections.sort(objectList, new Comparator<ObjAttributeWrapper>() {
 
-                    public int compare(ObjAttribute o1, ObjAttribute o2) {
+                    public int compare(ObjAttributeWrapper o1, ObjAttributeWrapper o2) {
                         Integer compareObjAttributesVal = compareObjAttributes(o1, o2);
                         if (compareObjAttributesVal != null) {
                             return compareObjAttributesVal;
@@ -521,7 +557,7 @@ public class ObjAttributeTableModel exte
         return true;
     }
 
-    private Integer compareObjAttributes(ObjAttribute o1, ObjAttribute o2) {
+    private Integer compareObjAttributes(ObjAttributeWrapper o1, ObjAttributeWrapper o2) {
         if ((o1 == null && o2 == null) || o1 == o2) {
             return 0;
         }
@@ -533,5 +569,4 @@ public class ObjAttributeTableModel exte
         }
         return null;
     }
-
 }

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeTab.java Sat Apr 12 08:06:57 2014
@@ -36,7 +36,9 @@ import java.util.Map;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
+import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JTable;
@@ -46,11 +48,12 @@ import javax.swing.event.ListSelectionEv
 import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.AttributeEvent;
@@ -68,12 +71,17 @@ import org.apache.cayenne.modeler.action
 import org.apache.cayenne.modeler.action.PasteAction;
 import org.apache.cayenne.modeler.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.dialog.objentity.ObjAttributeInfoDialog;
+import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
+import org.apache.cayenne.modeler.editor.wrapper.ObjAttributeWrapper;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
+import org.apache.cayenne.modeler.event.ProjectOnSaveEvent;
+import org.apache.cayenne.modeler.event.ProjectOnSaveListener;
 import org.apache.cayenne.modeler.event.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.util.CayenneTable;
+import org.apache.cayenne.modeler.util.CayenneTableModel;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
@@ -84,7 +92,7 @@ import org.apache.cayenne.modeler.util.c
  * 
  */
 public class ObjEntityAttributeTab extends JPanel implements ObjEntityDisplayListener,
-        ObjEntityListener, ObjAttributeListener, ExistingSelectionProcessor {
+        ObjEntityListener, ObjAttributeListener, ExistingSelectionProcessor, ProjectOnSaveListener {
 
     protected ProjectController mediator;
     protected CayenneTable table;
@@ -128,7 +136,8 @@ public class ObjEntityAttributeTab exten
 
         table = new CayenneTable();
         table.setDefaultRenderer(String.class, new CellRenderer());
-
+        table.setDefaultRenderer(Boolean.class, new CheckBoxRenderer());
+        
         tablePreferences = new TableColumnPreferences(
                 ObjAttributeTableModel.class,
                 "objEntity/attributeTable");
@@ -151,7 +160,8 @@ public class ObjEntityAttributeTab exten
         mediator.addObjEntityDisplayListener(this);
         mediator.addObjEntityListener(this);
         mediator.addObjAttributeListener(this);
-
+        mediator.addProjectOnSaveListener(this);
+        
         table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
 
             public void valueChanged(ListSelectionEvent e) {
@@ -250,11 +260,18 @@ public class ObjEntityAttributeTab exten
 
         ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
 
-        List listAttrs = model.getObjectList();
+        List<ObjAttributeWrapper> listAttrs = model.getObjectList();
+        
+        // newSel - indexes of attributes to be selected from model
         int[] newSel = new int[attrs.length];
-
+        
+        // search for attributes to select from attributes that model has 
         for (int i = 0; i < attrs.length; i++) {
-            newSel[i] = listAttrs.indexOf(attrs[i]);
+            for (int j = 0; j < listAttrs.size(); j++) {
+                if (listAttrs.get(j).getValue() == attrs[i]) {
+                    newSel[i] = j;
+                }
+            }
         }
 
         table.select(newSel);
@@ -279,7 +296,7 @@ public class ObjEntityAttributeTab exten
             attrs = new ObjAttribute[sel.length];
 
             for (int i = 0; i < sel.length; i++) {
-                attrs[i] = model.getAttribute(sel[i]);
+                attrs[i] = model.getAttribute(sel[i]).getValue();
             }
 
             if (sel.length == 1) {
@@ -306,19 +323,40 @@ public class ObjEntityAttributeTab exten
     }
 
     public void objAttributeChanged(AttributeEvent e) {
-        rebuildTable((ObjEntity) e.getEntity());
+        ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
+        model.fireTableDataChanged();
         table.select(e.getAttribute());
     }
 
     public void objAttributeAdded(AttributeEvent e) {
-        rebuildTable((ObjEntity) e.getEntity());
+        ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
+
+        if(!model.isValid()){
+            model.resetModel();
+        }
+
+        model.addRow(new ObjAttributeWrapper((ObjAttribute)e.getAttribute()));
+        model.fireTableDataChanged();
         table.select(e.getAttribute());
     }
 
     public void objAttributeRemoved(AttributeEvent e) {
         ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
-        int ind = model.getObjectList().indexOf(e.getAttribute());
-        model.removeRow(e.getAttribute());
+        int ind = -1;
+        List<ObjAttributeWrapper> list = model.getObjectList();
+
+        for (int i = 0; i < list.size(); i++) {
+            if (list.get(i).getValue() == e.getAttribute()) {
+                ind = i;
+            }
+        }
+        
+        if(!model.isValid()){
+            model.resetModel();
+        }
+
+        model.removeRow(list.get(ind));
+        model.fireTableDataChanged();
         table.select(ind);
     }
 
@@ -332,6 +370,9 @@ public class ObjEntityAttributeTab exten
         // Important: process event even if this is the same entity,
         // since the inheritance structure might have changed
         if (entity != null) {
+            
+            // reset model before change ObjEntity
+        	resetTableModel();
             rebuildTable(entity);
         }
 
@@ -342,6 +383,15 @@ public class ObjEntityAttributeTab exten
         }
     }
 
+    
+    private void resetTableModel() {
+    	CayenneTableModel model = table.getCayenneModel();
+        if (model != null && !model.isValid()) {
+            model.resetModel();
+            model.fireTableDataChanged();
+        }
+    }
+    
     protected void rebuildTable(ObjEntity entity) {
         if (table.getEditingRow() != -1 && table.getEditingColumn() != -1) {
             TableCellEditor cellEditor = table.getCellEditor(table.getEditingRow(), table.getEditingColumn());
@@ -428,7 +478,7 @@ public class ObjEntityAttributeTab exten
 
             ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
             column = table.getColumnModel().getColumn(column).getModelIndex();
-            ObjAttribute attribute = model.getAttribute(row);
+            ObjAttributeWrapper attribute = model.getAttribute(row);
             if (column != ObjAttributeTableModel.INHERITED) {
 
                 if (!model.isCellEditable(row, column)) {
@@ -453,12 +503,67 @@ public class ObjEntityAttributeTab exten
                 }
                 setText("");
             }
-            setBackground(isSelected && !hasFocus
-                    ? table.getSelectionBackground()
-                    : table.getBackground());
+            if (!attribute.isValid()) {
+                setBackground(ValidatorDialog.WARNING_COLOR);
+                setToolTipText(attribute.getFailureDescription(column));
+            } else {
+                setBackground(isSelected && !hasFocus ? table
+                        .getSelectionBackground() : table.getBackground());
+                setToolTipText(null);
+            }
 
             return this;
         }
     }
+    
+    final class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
+
+        public CheckBoxRenderer() {
+            super();
+            setHorizontalAlignment(JLabel.CENTER);
+            setOpaque(true);
+        }
+
+        @Override
+        public Component getTableCellRendererComponent(
+                JTable table,
+                Object value, 
+                boolean isSelected, 
+                boolean hasFocus, 
+                int row,
+                int column) {
+
+            ObjAttributeTableModel model = (ObjAttributeTableModel) table.getModel();
+            column = table.getColumnModel().getColumn(column).getModelIndex();
+            ObjAttributeWrapper attribute = model.getAttribute(row);
+            setSelected((value != null && ((Boolean) value)));
+
+            if (!model.isCellEditable(row, column)) {
+                setForeground(Color.GRAY);
+            }
+            else {
+                setForeground(isSelected && !hasFocus ? table
+                        .getSelectionForeground() : table.getForeground());
+            }
+
+            if (!attribute.isValid()) {
+                setBackground(ValidatorDialog.WARNING_COLOR);
+                setToolTipText(attribute.getFailureDescription(column));
+            }
+            else {
+                setBackground(isSelected ? table.getSelectionBackground()
+                        : table.getBackground());
+                setToolTipText(null);
+            }
+
+            return this;
+        }
+
+    }
+
+	@Override
+	public void beforeSaveChanges(ProjectOnSaveEvent e) {
+		resetTableModel();
+	}
 
 }

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/AttributeValidationFailure.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/AttributeValidationFailure.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/AttributeValidationFailure.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/AttributeValidationFailure.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,17 @@
+package org.apache.cayenne.modeler.editor.validation;
+
+import org.apache.cayenne.validation.SimpleValidationFailure;
+
+/**
+ *  ValidationFailure implementation that described a failure of attribute.
+ */
+public class AttributeValidationFailure extends SimpleValidationFailure {
+
+    public  AttributeValidationFailure(int columnIndex, String error) {
+        super(columnIndex, error);
+    }
+
+    public int getColumnIndex() {
+        return (Integer)source;
+    }
+}

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/ObjAttributeWrapperValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/ObjAttributeWrapperValidator.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/ObjAttributeWrapperValidator.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/validation/ObjAttributeWrapperValidator.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,31 @@
+package org.apache.cayenne.modeler.editor.validation;
+
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.modeler.editor.ObjAttributeTableModel;
+import org.apache.cayenne.modeler.editor.wrapper.ObjAttributeWrapper;
+import org.apache.cayenne.project.validation.ConfigurationNodeValidator;
+import org.apache.cayenne.validation.ValidationResult;
+
+public class ObjAttributeWrapperValidator extends ConfigurationNodeValidator {
+
+    public boolean validate(ObjAttributeWrapper wrapper, ValidationResult validationResult) {
+        if (isAttributeNameOverlapped(wrapper)) {
+            addFailure(validationResult, new AttributeValidationFailure(
+                    ObjAttributeTableModel.OBJ_ATTRIBUTE,
+                    "Duplicate attribute name."));
+        }
+        
+        return wrapper.isValid();
+    }
+
+    /**
+     * @return false if entity has attribute with the same name.
+     */
+    private boolean isAttributeNameOverlapped(ObjAttributeWrapper attr) {
+    	ObjAttribute temp = attr.getEntity().getAttributeMap().get(attr.getName());
+    	if (temp != null && attr.getValue() != temp ){
+    		return true;
+    	}
+    	return false;
+    }
+}

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,143 @@
+package org.apache.cayenne.modeler.editor.wrapper;
+
+import java.util.List;
+
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.editor.validation.ObjAttributeWrapperValidator;
+import org.apache.cayenne.modeler.util.ProjectUtil;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+/**
+ *  A wrapper for a ObjAttribute instance. Allows to add failures, that connected
+ *  with attribute.
+ */
+public class ObjAttributeWrapper implements Wrapper<ObjAttribute> {
+
+    private ObjAttribute objAttribute;
+    private ValidationResult validationResult;
+
+    private ObjAttributeWrapperValidator validator = new ObjAttributeWrapperValidator();
+
+    // TODO: for now name is only wrapped attribute we validating but this
+    // can be extended to other ObjAttribute fields as well
+    private String name;
+
+    public ObjAttributeWrapper(ObjAttribute objAttribute) {
+        if (objAttribute == null) {
+            throw new IllegalArgumentException("Attribute cannot be null.");
+        }
+        this.objAttribute = objAttribute;
+        validationResult = new ValidationResult();
+    }
+
+    @Override
+    public ObjAttribute getValue() {
+        return objAttribute;
+    }
+
+    @Override
+    public boolean isValid() {
+    	return !validationResult.hasFailures();
+    }
+
+    /**
+     * @param column Index of column.
+     * @return String failure description, null if there is no such failure.
+     */
+    public String getFailureDescription(int column) {
+        String result = null;
+        if (validationResult.hasFailures(column)) {
+            List<ValidationFailure> failures= validationResult.getFailures(column);
+            
+            // there is only one failure for each column
+            result = failures.get(0).getDescription();
+        }
+        return result;
+    }
+
+    @Override
+    public void commitEdits() {
+        if (isValid()) {
+            ProjectUtil.setAttributeName(this.getValue(), name);
+        }
+    }
+
+    /**
+     * Correct ObjAttributeWrapper failures.
+     */
+    @Override
+    public void resetEdits() {
+        this.name = null;
+        validationResult.clear();
+    }
+
+    public ObjEntity getEntity() {
+        return objAttribute.getEntity();
+    }
+
+    public void setEntity(Entity entity) {
+        objAttribute.setEntity(entity);
+    }
+
+    public String getName() {
+        return name == null ? objAttribute.getName() : name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+        validator.validate(this, validationResult);
+    }
+
+    public Object getParent() {
+        return objAttribute.getEntity();
+    }
+
+    public void setParent(Object parent) {
+        objAttribute.setParent(parent);
+    }
+
+    public Class<?> getJavaClass() {
+        return objAttribute.getClass();
+    }
+
+    public String getType() {
+        return objAttribute.getType();
+    }
+
+    public void setType(String type) {
+        objAttribute.setType(type);
+    }
+
+    public boolean isUsedForLocking() {
+        return objAttribute.isUsedForLocking();
+    }
+
+    public void setUsedForLocking(boolean usedForLocking) {
+        objAttribute.setUsedForLocking(usedForLocking);
+    }
+
+    public DbAttribute getDbAttribute() {
+        return objAttribute.getDbAttribute();
+    }
+
+    public boolean isInherited() {
+        return objAttribute.isInherited();
+    }
+
+    public String getDbAttributeName() {
+        return objAttribute.getDbAttributeName();
+    }
+
+    public void setDbAttributePath(String dbAttributePath) {
+        objAttribute.setDbAttributePath(dbAttributePath);
+    }
+
+    public String getDbAttributePath() {
+        return objAttribute.getDbAttributePath();
+    }
+
+}

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/Wrapper.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/Wrapper.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/Wrapper.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/Wrapper.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,12 @@
+package org.apache.cayenne.modeler.editor.wrapper;
+
+public interface Wrapper<T> {
+
+    T getValue();
+
+    boolean isValid();
+
+    void commitEdits();
+
+    void resetEdits();
+}

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveEvent.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveEvent.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveEvent.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveEvent.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,13 @@
+package org.apache.cayenne.modeler.event;
+
+import org.apache.cayenne.event.CayenneEvent;
+
+/**
+ * Triggered while project is saved.
+ */
+public class ProjectOnSaveEvent extends CayenneEvent{
+
+	public ProjectOnSaveEvent(Object source) {
+		super(source);
+	}
+}

Added: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java?rev=1586832&view=auto
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java (added)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java Sat Apr 12 08:06:57 2014
@@ -0,0 +1,12 @@
+package org.apache.cayenne.modeler.event;
+
+import java.util.EventListener;
+
+/** 
+ * Interface for classes that are interested in ProjectOnSave events. 
+ */
+public interface ProjectOnSaveListener extends EventListener{
+	
+	/** Changes made before saving project	 */
+	public void beforeSaveChanges(ProjectOnSaveEvent e);
+}

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java Sat Apr 12 08:06:57 2014
@@ -87,8 +87,15 @@ public class CayenneTable extends JTable
         setDefaultEditor(String.class, textEditor);
     }
 
+    /**
+     * @return CayenneTableModel, or null if model can't be casted to CayenneTableModel.
+     */
     public CayenneTableModel getCayenneModel() {
-        return (CayenneTableModel) getModel();
+        TableModel model = getModel();
+        if(model instanceof CayenneTableModel) {
+            return (CayenneTableModel) model;
+        }
+        return null;
     }
 
     /**

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java Sat Apr 12 08:06:57 2014
@@ -43,11 +43,11 @@ import org.apache.commons.logging.LogFac
  * Superclass of CayenneModeler table model classes.
  * 
  */
-public abstract class CayenneTableModel extends AbstractTableModel {
+public abstract class CayenneTableModel<T> extends AbstractTableModel {
 
     protected ProjectController mediator;
     protected Object eventSource;
-    protected List objectList;
+    protected List<T> objectList;
 
     private static Log logObj = LogFactory.getLog(CayenneTableModel.class);
 
@@ -55,7 +55,7 @@ public abstract class CayenneTableModel 
      * Constructor for CayenneTableModel.
      */
     public CayenneTableModel(ProjectController mediator, Object eventSource,
-            java.util.List objectList) {
+            java.util.List<T> objectList) {
         
         super();
         this.eventSource = eventSource;
@@ -143,11 +143,11 @@ public abstract class CayenneTableModel 
     /**
      * Returns internal object list.
      */
-    public java.util.List getObjectList() {
+    public java.util.List<T> getObjectList() {
         return objectList;
     }
 
-    public void addRow(Object row) {
+    public void addRow(T row) {
         objectList.add(row);
         fireTableDataChanged();
     }
@@ -205,6 +205,20 @@ public abstract class CayenneTableModel 
         Collections.swap(objectList, i, j);
         fireTableDataChanged();
     }
+    
+    /**
+     * Correct errors that model has.
+     */
+    public void resetModel() {
+		// do nothing by default
+	}
+    
+    /**
+     * @return false, if model is not valid. 
+     */
+    public boolean isValid() {
+		return true;
+	}
 
     protected class PropertyComparator implements Comparator {
 

Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java?rev=1586832&r1=1586831&r2=1586832&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java Sat Apr 12 08:06:57 2014
@@ -197,7 +197,7 @@ public class ProjectUtil {
             entity.addAttribute(attribute);
         }
     }
-    
+
     
     /**
      * Changes the name of the embeddable attribute and all references to this embeddable attribute.