Author: kevin1219
Date: Tue Aug 26 09:17:15 2008
New Revision: 2608

Modified:
   trunk/src/ca/sqlpower/architect/olap/OLAPSession.java
   trunk/src/ca/sqlpower/architect/olap/OLAPUtil.java
   trunk/src/ca/sqlpower/architect/olap/SchemaWatcher.java
   trunk/src/ca/sqlpower/architect/swingui/olap/HierarchyEditPanel.java
   trunk/src/ca/sqlpower/architect/swingui/olap/LevelEditPanel.java
   trunk/src/ca/sqlpower/architect/swingui/olap/MeasureEditPanel.java
   trunk/src/ca/sqlpower/architect/swingui/olap/OLAPObjectNameValidator.java
   trunk/src/ca/sqlpower/architect/swingui/olap/VirtualCubeEditPanel.java
trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateDimensionAction.java trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateHierarchyAction.java trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateLevelAction.java trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateMeasureAction.java trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateVirtualCubeAction.java

Log:
Fixed SchemaWatcher to correctly remove entries from the name to object maps, it was calling remove by the value instead of the key. It also keeps a map of virtual cubes now. OLAPUtil.isNameUnique() now handles hierarchy, level, measure, and virtual cubes. Also added the corresponding name validators to edit panels. Hierarchies are handled differently from the rest because its name can be null. Null is considered the same as empty string and the parent's name. OLAPUtil.isNameUnique() and the validator now uses OLAPObject.getName() instead of OLAPUtil.nameFor() because the it's easier to work with the non-modified names.

Modified: trunk/src/ca/sqlpower/architect/olap/OLAPSession.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/olap/OLAPSession.java       (original)
+++ trunk/src/ca/sqlpower/architect/olap/OLAPSession.java Tue Aug 26 09:17:15 2008
@@ -27,6 +27,7 @@
 import ca.sqlpower.architect.olap.MondrianModel.CubeDimension;
 import ca.sqlpower.architect.olap.MondrianModel.Dimension;
 import ca.sqlpower.architect.olap.MondrianModel.Schema;
+import ca.sqlpower.architect.olap.MondrianModel.VirtualCube;

 /**
* The collection of objects that support editing and use of an OLAP schema.
@@ -148,8 +149,8 @@
     }

     /**
- * Returns a CubeDimension in the child schema with the given name and in a
-     * particular Cube.
+     * Returns a CubeDimension in the child schema with the given name and
+     * parent Cube.
      *
      * @param cubeName Name of the Cube to search in.
      * @param dimName Name of the CubeDimension to search for.
@@ -167,5 +168,15 @@
      */
     public Cube findCube(String name) {
         return schemaWatcher.findCube(name);
+    }
+
+    /**
+     * Returns a VirtualCube in the child schema with the given name.
+     *
+     * @param name The name to search by.
+     * @return A VirtualCube with the name, or null if not found.
+     */
+    public VirtualCube findVirtualCube(String name) {
+        return schemaWatcher.findVirtualCube(name);
     }
 }

Modified: trunk/src/ca/sqlpower/architect/olap/OLAPUtil.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/olap/OLAPUtil.java  (original)
+++ trunk/src/ca/sqlpower/architect/olap/OLAPUtil.java Tue Aug 26 09:17:15 2008
@@ -38,10 +38,13 @@
 import ca.sqlpower.architect.olap.MondrianModel.Hierarchy;
 import ca.sqlpower.architect.olap.MondrianModel.InlineTable;
 import ca.sqlpower.architect.olap.MondrianModel.Join;
+import ca.sqlpower.architect.olap.MondrianModel.Level;
+import ca.sqlpower.architect.olap.MondrianModel.Measure;
 import ca.sqlpower.architect.olap.MondrianModel.RelationOrJoin;
 import ca.sqlpower.architect.olap.MondrianModel.Schema;
 import ca.sqlpower.architect.olap.MondrianModel.Table;
 import ca.sqlpower.architect.olap.MondrianModel.View;
+import ca.sqlpower.architect.olap.MondrianModel.VirtualCube;
 import ca.sqlpower.architect.olap.MondrianModel.VirtualCubeDimension;

 /**
@@ -314,7 +317,8 @@
     }

     /**
-     * Checks if the name is unique for an OLAPObject.
+     * Checks if the name is unique for an OLAPObject, relies on
+     * [EMAIL PROTECTED] OLAPObject#getName()} for name comparisons.
      *
      * @param parent
      *            The object that will be the parent.
@@ -331,15 +335,43 @@
throw new IllegalArgumentException("Can't find OLAPSession ancestor: " + parent);
         }

-        OLAPObject foundObj;
         if (type == Cube.class) {
-            foundObj = olapSession.findCube(name);
+            return olapSession.findCube(name) == null;
         } else if (type == Dimension.class && parent instanceof Schema) {
-            foundObj = olapSession.findPublicDimension(name);
+            return olapSession.findPublicDimension(name) == null;
+        } else if (type == VirtualCube.class) {
+            return olapSession.findVirtualCube(name) == null;
+        } else if (type == Measure.class) {
+            Cube c = (Cube) parent;
+            for (Measure m : c.getMeasures()) {
+                if (m.getName().equals(name)) {
+                    return false;
+                }
+            }
+            return true;
+        } else if (type == Level.class) {
+            Hierarchy h = (Hierarchy) parent;
+            for (Level l : h.getLevels()) {
+                if (l.getName().equals(name)) {
+                    return false;
+                }
+            }
+            return true;
+        } else if (type == Hierarchy.class) {
+            Dimension d = (Dimension) parent;
+            for (Hierarchy h : d.getHierarchies()) {
+                // null name is the same as having the parent's name.
+                if (name == null || name.equals(parent.getName())) {
+ if (h.getName() == null || h.getName().equals(parent.getName())) {
+                        return false;
+                    }
+                } else if (name.equals(h.getName())) {
+                    return false;
+                }
+            }
+            return true;
         } else {
             return true;
         }
-
-        return foundObj == null;
     }
 }

Modified: trunk/src/ca/sqlpower/architect/olap/SchemaWatcher.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/olap/SchemaWatcher.java     (original)
+++ trunk/src/ca/sqlpower/architect/olap/SchemaWatcher.java Tue Aug 26 09:17:15 2008
@@ -63,6 +63,11 @@
      * Maps Cube name to object.
      */
     private final Map<String, Cube> cubes = new HashMap<String, Cube>();
+
+    /**
+     * Maps VirtualCube name to object.
+     */
+ private final Map<String, VirtualCube> vCubes = new HashMap<String, VirtualCube>();

     /**
      * Maps Dimension to a list of DimensionUsages that references it.
@@ -103,6 +108,8 @@
                 cubeDimensions.put(cubeDimKey, (CubeDimension) child);
             } else if (child instanceof Dimension) {
                 publicDimensions.put(child.getName(), (Dimension) child);
+            } else if (child instanceof VirtualCube) {
+                vCubes.put(child.getName(), (VirtualCube) child);
             }

             if (child.allowsChildren()) {
@@ -253,6 +260,8 @@
             addToCubeUsagesMap(cu);
         } else if (e.getChild() instanceof VirtualCube) {
             VirtualCube vc = (VirtualCube) e.getChild();
+            vCubes.put(vc.getName(), vc);
+
             CubeUsages cubeUsages = vc.getCubeUsage();

// CubeUsages are a property of VirtualCube instead of a child. This means
@@ -273,7 +282,8 @@
     public void olapChildRemoved(OLAPChildEvent e) {
if (e.getSource() instanceof Cube && e.getChild() instanceof CubeDimension) {
             CubeDimension cd = (CubeDimension) e.getChild();
-            cubeDimensions.remove(cd);
+            Cube c = (Cube) cd.getParent();
+ cubeDimensions.remove(new CubeDimensionKey(c.getName(), cd.getName()));

// remove the VirtualCubeDimensions referencing this CubeDimension. List<VirtualCubeDimension> vCubeDims = vCubeDimensionMap.get(cd);
@@ -293,7 +303,7 @@
             }
         } else if (e.getChild() instanceof Dimension) {
             Dimension dim = (Dimension) e.getChild();
-            publicDimensions.remove(dim);
+            publicDimensions.remove(dim.getName());

             // remove the DimensionUsages referencing this Dimension.
             List<DimensionUsage> dimUsages = dimensionUsageMap.get(dim);
@@ -316,7 +326,7 @@
             vCubeDimensionMap.remove(dim);
         } else if (e.getChild() instanceof Cube) {
             Cube cube = (Cube) e.getChild();
-            cubes.remove(cube);
+            cubes.remove(cube.getName());

             // remove the CubeUsages referencing this Cube.
             List<CubeUsage> cubeUsages = cubeUsageMap.get(cube);
@@ -346,6 +356,7 @@
             }
         } else if (e.getChild() instanceof VirtualCube) {
             VirtualCube vc = (VirtualCube) e.getChild();
+            vCubes.remove(vc.getName());

// CubeUsages are a property of VirtualCube instead of a child. This means // OLAPUtil.listenToHierarchy() doesn't pick them up. So we have to listen
@@ -442,13 +453,19 @@

                 cubes.remove(oldName);
                 cubes.put(newName, cube);
+            } else if (evt.getSource() instanceof VirtualCube) {
+                VirtualCube vCube = (VirtualCube) evt.getSource();
+                String oldName = (String) evt.getOldValue();
+                String newName = (String) evt.getNewValue();
+
+                vCubes.remove(oldName);
+                vCubes.put(newName, vCube);
             }
         }
     }

     /**
-     * Searches through the map of public dimensions for one with the given
-     * name and returns it.
+     * Finds and returns a Dimension with the given name.
      *
      * @param name
      *            The name to search by.
@@ -459,9 +476,8 @@
     }

     /**
-     * Searches through the map of CubeDimensions for one with a
- * [EMAIL PROTECTED] CubeDimensionKey} that matches the given cube name and dimension
-     * name and returns it.
+ * Finds and returns a CubeDimension with a [EMAIL PROTECTED] CubeDimensionKey} that
+     * matches the given cube name and dimension name.
      *
      * @param cubeName
      *            Part of the [EMAIL PROTECTED] CubeDimensionKey} to search by.
@@ -475,7 +491,7 @@
     }

     /**
-     * Finds and returns the map of Cubes for one with the given name.
+     * Finds and returns a Cube with the given name.
      *
      * @param name
      *            The name to search by.
@@ -483,6 +499,17 @@
      */
     public Cube findCube(String name) {
         return cubes.get(name);
+    }
+
+    /**
+     * Finds and returns a VirtualCube with the given name.
+     *
+     * @param name
+     *            The name to search by.
+     * @return A VirtualCube with the given name, or null if none found.
+     */
+    public VirtualCube findVirtualCube(String name) {
+        return vCubes.get(name);
     }

     /**

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/HierarchyEditPanel.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/HierarchyEditPanel.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/HierarchyEditPanel.java Tue Aug 26 09:17:15 2008
@@ -32,12 +32,16 @@
 import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Hierarchy;
 import ca.sqlpower.architect.olap.MondrianModel.Table;
-import ca.sqlpower.swingui.DataEntryPanel;
+import ca.sqlpower.validation.Validator;
+import ca.sqlpower.validation.swingui.FormValidationHandler;
+import ca.sqlpower.validation.swingui.StatusComponent;
+import ca.sqlpower.validation.swingui.ValidatableDataEntryPanel;
+import ca.sqlpower.validation.swingui.ValidationHandler;

 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;

-public class HierarchyEditPanel implements DataEntryPanel {
+public class HierarchyEditPanel implements ValidatableDataEntryPanel {

     private final Hierarchy hierarchy;
     private final JPanel panel;
@@ -46,6 +50,13 @@
     private final JComboBox tableChooser;

     /**
+     * Validation handler for errors in the dialog
+     */
+    private FormValidationHandler handler;
+    private StatusComponent status = new StatusComponent();
+
+
+    /**
      * Creates a new property editor for the given OLAP Hierarchy.
      *
      * @param cube The data model of the hierarchy to edit
@@ -59,15 +70,25 @@
                 "left:max(40dlu;pref), 3dlu, 80dlu:grow", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
+        builder.append(status, 3);
         builder.append("Name", name = new JTextField(hierarchy.getName()));
builder.append("Caption", captionField = new JTextField(hierarchy.getCaption())); builder.append("Table", tableChooser = new JComboBox(new Vector<SQLTable>(tables))); tableChooser.setSelectedItem(OLAPUtil.tableForHierarchy(hierarchy)); // XXX this isn't quite right.. it would set the default as the local value
+
+        handler = new FormValidationHandler(status);
+ Validator validator = new OLAPObjectNameValidator(hierarchy.getParent(), hierarchy, true);
+        handler.addValidateObject(name, validator);
+
         panel = builder.getPanel();
     }
     public boolean applyChanges() {
         hierarchy.startCompoundEdit("Modify hierarchy properties");
-        hierarchy.setName(name.getText());
+        if (!(name.getText().equals(""))) {
+            hierarchy.setName(name.getText());
+        } else {
+            hierarchy.setName(null);
+        }
         if (!(captionField.getText().equals(""))) {
             hierarchy.setCaption(captionField.getText());
         } else {
@@ -94,6 +115,9 @@

     public boolean hasUnsavedChanges() {
         return true;
+    }
+    public ValidationHandler getValidationHandler() {
+        return handler;
     }

 }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/LevelEditPanel.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/LevelEditPanel.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/LevelEditPanel.java Tue Aug 26 09:17:15 2008
@@ -30,12 +30,16 @@
 import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Hierarchy;
 import ca.sqlpower.architect.olap.MondrianModel.Level;
-import ca.sqlpower.swingui.DataEntryPanel;
+import ca.sqlpower.validation.Validator;
+import ca.sqlpower.validation.swingui.FormValidationHandler;
+import ca.sqlpower.validation.swingui.StatusComponent;
+import ca.sqlpower.validation.swingui.ValidatableDataEntryPanel;
+import ca.sqlpower.validation.swingui.ValidationHandler;

 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;

-public class LevelEditPanel implements DataEntryPanel {
+public class LevelEditPanel implements ValidatableDataEntryPanel {

     private final Level level;
     private final JPanel panel;
@@ -44,6 +48,12 @@
     private JComboBox columnChooser;

     /**
+     * Validation handler for errors in the dialog
+     */
+    private FormValidationHandler handler;
+    private StatusComponent status = new StatusComponent();
+
+    /**
      * Creates a new property editor for the given level of a hierarchy.
      *
      * @param cube
@@ -58,6 +68,7 @@
                 "left:max(40dlu;pref), 3dlu, 80dlu:grow", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
+        builder.append(status, 3);
         builder.append("Name", name = new JTextField(level.getName()));
builder.append("Caption", captionField = new JTextField(level.getCaption()));
         builder.append("Column", columnChooser = new JComboBox());
@@ -70,8 +81,15 @@
             columnChooser.addItem("Parent dimension has no table");
             columnChooser.setEnabled(false);
         }
+
+        handler = new FormValidationHandler(status);
+ Validator validator = new OLAPObjectNameValidator(level.getParent(), level, false);
+        handler.addValidateObject(name, validator);
+
+
         panel = builder.getPanel();
     }
+
     public boolean applyChanges() {
         level.startCompoundEdit("Modify Level Properties");
         level.setName(name.getText());
@@ -98,6 +116,10 @@

     public boolean hasUnsavedChanges() {
         return true;
+    }
+
+    public ValidationHandler getValidationHandler() {
+        return handler;
     }



Modified: trunk/src/ca/sqlpower/architect/swingui/olap/MeasureEditPanel.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/MeasureEditPanel.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/MeasureEditPanel.java Tue Aug 26 09:17:15 2008
@@ -26,12 +26,16 @@

 import mondrian.rolap.RolapAggregator;
 import ca.sqlpower.architect.olap.MondrianModel.Measure;
-import ca.sqlpower.swingui.DataEntryPanel;
+import ca.sqlpower.validation.Validator;
+import ca.sqlpower.validation.swingui.FormValidationHandler;
+import ca.sqlpower.validation.swingui.StatusComponent;
+import ca.sqlpower.validation.swingui.ValidatableDataEntryPanel;
+import ca.sqlpower.validation.swingui.ValidationHandler;

 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;

-public class MeasureEditPanel implements DataEntryPanel {
+public class MeasureEditPanel implements ValidatableDataEntryPanel {

     private final Measure measure;
     private final JPanel panel;
@@ -40,6 +44,12 @@
     private JComboBox aggregator;

     /**
+     * Validation handler for errors in the dialog
+     */
+    private FormValidationHandler handler;
+    private StatusComponent status = new StatusComponent();
+
+    /**
      * Creates a new property editor for the given OLAP Measure.
      *
      * @param cube The data model of the measure to edit
@@ -51,12 +61,18 @@
                 "left:max(40dlu;pref), 3dlu, 80dlu:grow", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
+        builder.append(status, 3);
         builder.append("Name", name = new JTextField(measure.getName()));
builder.append("Caption", captionField = new JTextField(measure.getCaption())); builder.append("Aggregator", aggregator = new JComboBox(RolapAggregator.enumeration.getNames()));
         if (measure.getAggregator() != null) {
             aggregator.setSelectedItem(measure.getAggregator());
         }
+
+        handler = new FormValidationHandler(status);
+ Validator validator = new OLAPObjectNameValidator(measure.getParent(), measure, false);
+        handler.addValidateObject(name, validator);
+
         panel = builder.getPanel();
     }
     public boolean applyChanges() {
@@ -82,6 +98,9 @@

     public boolean hasUnsavedChanges() {
         return true;
+    }
+    public ValidationHandler getValidationHandler() {
+        return handler;
     }

 }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/OLAPObjectNameValidator.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/OLAPObjectNameValidator.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/OLAPObjectNameValidator.java Tue Aug 26 09:17:15 2008
@@ -26,8 +26,9 @@
 import ca.sqlpower.validation.Validator;

 /**
- * A simple validator for OLAPObjects that checks for invalid names.
- *
+ * A simple validator for OLAPObjects that checks for invalid names, relies on
+ * [EMAIL PROTECTED] OLAPObject#getName()} for name comparisons.
+ *
  */
 public class OLAPObjectNameValidator implements Validator {

@@ -51,16 +52,14 @@

         if (value == null || value.length() == 0) {
             if (allowNull) {
- if (OLAPUtil.nameFor(obj) != null && !OLAPUtil.isNameUnique(parent, obj.getClass(), null)) { + if (obj.getName() != null && !OLAPUtil.isNameUnique(parent, obj.getClass(), null)) { return ValidateResult.createValidateResult(Status.FAIL, "Name already exists.");
                 }
             } else {
return ValidateResult.createValidateResult(Status.FAIL, "A name is required.");
             }
-        } else {
- if (!(value.equals(OLAPUtil.nameFor(obj))) && !OLAPUtil.isNameUnique(parent, obj.getClass(), value)) { - return ValidateResult.createValidateResult(Status.FAIL, "Name already exists.");
-            }
+ } else if (!value.equals(obj.getName()) && !OLAPUtil.isNameUnique(parent, obj.getClass(), value)) { + return ValidateResult.createValidateResult(Status.FAIL, "Name already exists.");
         }

         return ValidateResult.createValidateResult(Status.OK, "");

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/VirtualCubeEditPanel.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/VirtualCubeEditPanel.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/VirtualCubeEditPanel.java Tue Aug 26 09:17:15 2008
@@ -29,12 +29,16 @@

 import ca.sqlpower.architect.olap.MondrianModel.VirtualCube;
 import ca.sqlpower.architect.olap.MondrianModel.VirtualCubeMeasure;
-import ca.sqlpower.swingui.DataEntryPanel;
+import ca.sqlpower.validation.Validator;
+import ca.sqlpower.validation.swingui.FormValidationHandler;
+import ca.sqlpower.validation.swingui.StatusComponent;
+import ca.sqlpower.validation.swingui.ValidatableDataEntryPanel;
+import ca.sqlpower.validation.swingui.ValidationHandler;

 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;

-public class VirtualCubeEditPanel implements DataEntryPanel {
+public class VirtualCubeEditPanel implements ValidatableDataEntryPanel {

     private final VirtualCube vCube;
     private final JPanel panel;
@@ -43,6 +47,13 @@
     private JComboBox defMeasure;

     /**
+     * Validation handler for errors in the dialog
+     */
+    private FormValidationHandler handler;
+    private StatusComponent status = new StatusComponent();
+
+
+    /**
      * Creates a new property editor for the given OLAP Virtual Cube.
      *
      * @param vCube The data model of the Virtual Cube to edit
@@ -54,6 +65,7 @@
                 "left:max(40dlu;pref), 3dlu, 80dlu:grow", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
+        builder.append(status, 3);
builder.append("Name", nameField = new JTextField(vCube.getName())); builder.append("Caption", captionField = new JTextField(vCube.getCaption()));

@@ -68,6 +80,11 @@
                 break;
             }
         }
+
+        handler = new FormValidationHandler(status);
+ Validator validator = new OLAPObjectNameValidator(vCube.getParent(), vCube, false);
+        handler.addValidateObject(nameField, validator);
+
         panel = builder.getPanel();
     }

@@ -95,6 +112,10 @@

     public boolean hasUnsavedChanges() {
         return true;
+    }
+
+    public ValidationHandler getValidationHandler() {
+        return handler;
     }

 }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateDimensionAction.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateDimensionAction.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateDimensionAction.java Tue Aug 26 09:17:15 2008
@@ -54,7 +54,7 @@
while (!OLAPUtil.isNameUnique(schema, Dimension.class, "New Dimension " + count)) {
             count++;
         }
-        dim.setName("New Cube " + count);
+        dim.setName("New Dimension " + count);

         if (playpen.getSelectedContainers().size() >= 1) {
             // TODO add a DimensionUsage to the selected cube(s)

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateHierarchyAction.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateHierarchyAction.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateHierarchyAction.java Tue Aug 26 09:17:15 2008
@@ -21,6 +21,7 @@

 import ca.sqlpower.architect.ArchitectException;
 import ca.sqlpower.architect.ArchitectRuntimeException;
+import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Hierarchy;
 import ca.sqlpower.architect.swingui.ArchitectSwingSession;
 import ca.sqlpower.architect.swingui.PlayPen;
@@ -40,7 +41,13 @@
     @Override
     protected Hierarchy addNewChild(DimensionPane pane) {
         Hierarchy h = new Hierarchy();
-        h.setName("New Hierarchy");
+
+        int count = 1;
+ while (!OLAPUtil.isNameUnique(pane.getModel(), Hierarchy.class, "New Hierarchy " + count)) {
+            count++;
+        }
+        h.setName("New Hierarchy " + count);
+
         pane.getModel().addHierarchy(h);
         return h;
     }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateLevelAction.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateLevelAction.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateLevelAction.java Tue Aug 26 09:17:15 2008
@@ -23,6 +23,7 @@

 import ca.sqlpower.architect.ArchitectException;
 import ca.sqlpower.architect.ArchitectRuntimeException;
+import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Dimension;
 import ca.sqlpower.architect.olap.MondrianModel.Hierarchy;
 import ca.sqlpower.architect.olap.MondrianModel.Level;
@@ -70,7 +71,13 @@
         }

         Level l = new Level();
-        l.setName("New Level");
+
+        int count = 1;
+ while (!OLAPUtil.isNameUnique(newParent, Level.class, "New Level " + count)) {
+            count++;
+        }
+        l.setName("New Level " + count);
+
         newParent.addLevel(newIndex, l);
         return l;
     }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateMeasureAction.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateMeasureAction.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateMeasureAction.java Tue Aug 26 09:17:15 2008
@@ -19,6 +19,7 @@

 package ca.sqlpower.architect.swingui.olap.action;

+import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Measure;
 import ca.sqlpower.architect.swingui.ArchitectSwingSession;
 import ca.sqlpower.architect.swingui.PlayPen;
@@ -35,7 +36,13 @@
     @Override
     protected Measure addNewChild(CubePane pane) {
         Measure m = new Measure();
-        m.setName("New Measure");
+
+        int count = 1;
+ while (!OLAPUtil.isNameUnique(pane.getModel(), Measure.class, "New Measure " + count)) {
+            count++;
+        }
+        m.setName("New Measure " + count);
+
         pane.getModel().addMeasure(m);
         return m;
     }

Modified: trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateVirtualCubeAction.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateVirtualCubeAction.java (original) +++ trunk/src/ca/sqlpower/architect/swingui/olap/action/CreateVirtualCubeAction.java Tue Aug 26 09:17:15 2008
@@ -23,6 +23,7 @@
 import java.awt.event.ActionEvent;

 import ca.sqlpower.architect.ArchitectException;
+import ca.sqlpower.architect.olap.OLAPUtil;
 import ca.sqlpower.architect.olap.MondrianModel.Schema;
 import ca.sqlpower.architect.olap.MondrianModel.VirtualCube;
 import ca.sqlpower.architect.swingui.AbstractPlacer;
@@ -45,7 +46,13 @@

     public void actionPerformed(ActionEvent e) {
         VirtualCube vCube = new VirtualCube();
-        vCube.setName("New Virtual Cube");
+
+        int count = 1;
+ while (!OLAPUtil.isNameUnique(schema, VirtualCube.class, "New Virtual Cube " + count)) {
+            count++;
+        }
+        vCube.setName("New Virtual Cube " + count);
+
VirtualCubePane cp = new VirtualCubePane(vCube, playpen.getContentPane());
         VirtualCubePlacer cubePlacer = new VirtualCubePlacer(cp);
         cubePlacer.dirtyup();

Reply via email to