You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ol...@apache.org on 2009/12/30 14:11:57 UTC

svn commit: r894609 - /cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/

Author: oltka
Date: Wed Dec 30 13:11:56 2009
New Revision: 894609

URL: http://svn.apache.org/viewvc?rev=894609&view=rev
Log:
CAY-1352 in "code generation" dialog add generation embeddables

Added:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
      - copied, changed from r894432, cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabController.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
      - copied, changed from r894432, cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabPanel.java
Removed:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabController.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabPanel.java
Modified:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java

Copied: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java (from r894432, cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabController.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java?p2=cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java&p1=cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabController.java&r1=894432&r2=894609&rev=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabController.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java Wed Dec 30 13:11:56 2009
@@ -28,17 +28,17 @@
 import org.apache.commons.collections.Predicate;
 import org.apache.commons.collections.PredicateUtils;
 
-public class EntitiesTabController extends CayenneController {
+public class ClassesTabController extends CayenneController {
 
     public static final String GENERATE_PROPERTY = "generate";
 
-    protected EntitiesTabPanel view;
+    protected ClassesTabPanel view;
     protected ObjectBinding tableBinding;
 
-    public EntitiesTabController(CodeGeneratorControllerBase parent) {
+    public ClassesTabController(CodeGeneratorControllerBase parent) {
         super(parent);
 
-        this.view = new EntitiesTabPanel();
+        this.view = new ClassesTabPanel();
         initBindings();
     }
 
@@ -62,25 +62,25 @@
 
         tableBuilder.addColumn(
                 "",
-                "parent.setCurrentEntity(#item), selected",
+                "parent.setCurrentClass(#item), selected",
                 Boolean.class,
                 true,
                 Boolean.TRUE);
         tableBuilder.addColumn(
-                "Entity",
-                "#item.name",
+                "Class",
+                "parent.getItemName(#item)",
                 String.class,
                 false,
                 "XXXXXXXXXXXXXX");
 
         tableBuilder.addColumn(
                 "Comments, Warnings",
-                "parent.getProblem(#item.name)",
+                "parent.getProblem(#item)",
                 String.class,
                 false,
                 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
 
-        this.tableBinding = tableBuilder.bindToTable(view.getTable(), "parent.entities");
+        this.tableBinding = tableBuilder.bindToTable(view.getTable(), "parent.classes");
     }
 
     public boolean isSelected() {
@@ -89,19 +89,19 @@
 
     public void setSelected(boolean selected) {
         getParentController().setSelected(selected);
-        entitySelectedAction();
+        classSelectedAction();
     }
 
     /**
      * A callback action that updates the state of Select All checkbox.
      */
-    public void entitySelectedAction() {
-        int selectedCount = getParentController().getSelectedEntitiesSize();
+    public void classSelectedAction() {
+        int selectedCount = getParentController().getSelectedEntitiesSize() + getParentController().getSelectedEmbeddablesSize() ;
 
         if (selectedCount == 0) {
             view.getCheckAll().setSelected(false);
         }
-        else if (selectedCount == getParentController().getEntities().size()) {
+        else if (selectedCount == getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(true);
         }
     }

Copied: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java (from r894432, cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabPanel.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java?p2=cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java&p1=cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabPanel.java&r1=894432&r2=894609&rev=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/EntitiesTabPanel.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java Wed Dec 30 13:11:56 2009
@@ -34,29 +34,29 @@
 
 /**
  */
-public class EntitiesTabPanel extends JPanel {
+public class ClassesTabPanel extends JPanel {
 
     protected JTable table;
     protected JCheckBox checkAll;
     protected JLabel checkAllLabel;
 
-    public EntitiesTabPanel() {
+    public ClassesTabPanel() {
 
         this.table = new JTable();
 
         // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
         // table header????
         this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Entities");
+        this.checkAllLabel = new JLabel("Check All Classes");
 
         checkAll.addItemListener(new ItemListener() {
 
             public void itemStateChanged(ItemEvent event) {
                 if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Entities");
+                    checkAllLabel.setText("Uncheck All Classess");
                 }
                 else {
-                    checkAllLabel.setText("Check All Entities");
+                    checkAllLabel.setText("Check All Classes");
                 }
             }
         });

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java?rev=894609&r1=894608&r2=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java Wed Dec 30 13:11:56 2009
@@ -45,13 +45,13 @@
 
     protected CodeGeneratorDialog view;
 
-    protected EntitiesTabController entitySelector;
+    protected ClassesTabController clessSelector;
     protected GeneratorTabController generatorSelector;
 
     public CodeGeneratorController(CayenneController parent, DataMap dataMap) {
         super(parent, dataMap);
 
-        this.entitySelector = new EntitiesTabController(this);
+        this.clessSelector = new ClassesTabController(this);
         this.generatorSelector = new GeneratorTabController(this);
     }
 
@@ -64,7 +64,7 @@
         // show dialog even on empty DataMap, as custom generation may still take
         // advantage of it
 
-        view = new CodeGeneratorDialog(generatorSelector.getView(), entitySelector
+        view = new CodeGeneratorDialog(generatorSelector.getView(), clessSelector
                 .getView());
         initBindings();
 
@@ -82,7 +82,7 @@
 
         builder.bindToAction(view.getCancelButton(), "cancelAction()");
         builder.bindToAction(view.getGenerateButton(), "generateAction()");
-        builder.bindToAction(this, "entitySelectedAction()", SELECTED_PROPERTY);
+        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
         builder.bindToAction(
                 generatorSelector,
                 "generatorSelectedAction()",
@@ -100,10 +100,10 @@
                 : PredicateUtils.falsePredicate();
 
         updateSelection(predicate);
-        entitySelector.entitySelectedAction();
+        clessSelector.classSelectedAction();
     }
 
-    public void entitySelectedAction() {
+    public void classesSelectedAction() {
         int size = getSelectedEntitiesSize();
         String label;
 
@@ -117,7 +117,21 @@
             label = size + " entities selected";
         }
 
-        view.getEntityCount().setText(label);
+        label = label.concat("; ");
+        
+        int sizeEmb = getSelectedEmbeddablesSize();
+
+        if (sizeEmb == 0) {
+            label = label + "No embeddables selected";
+        }
+        else if (sizeEmb == 1) {
+            label = label + "One embeddable selected";
+        }
+        else {
+            label =label + sizeEmb + " embeddables selected";
+        }
+        
+        view.getClassesCount().setText(label);
     }
 
     public void cancelAction() {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java?rev=894609&r1=894608&r2=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java Wed Dec 30 13:11:56 2009
@@ -23,7 +23,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -48,17 +47,25 @@
 
     protected ValidationResult validation;
 
-    protected List<ObjEntity> entities;
+    protected List<Object> classes;
+
     protected Set selectedEntities;
+    protected Set selectedEmbeddables;
 
-    protected transient ObjEntity currentEntity;
+    protected transient Object currentClass;
 
     public CodeGeneratorControllerBase(CayenneController parent, DataMap dataMap) {
         super(parent);
 
         this.dataMap = dataMap;
-        this.entities = new ArrayList(dataMap.getObjEntities());
+        this.classes = new ArrayList(dataMap.getObjEntities());
+        classes.addAll(new ArrayList(dataMap.getEmbeddables()));
         this.selectedEntities = new HashSet();
+        this.selectedEmbeddables = new HashSet();
+    }
+
+    public List<Object> getClasses() {
+        return classes;
     }
 
     public abstract Component getView();
@@ -68,9 +75,18 @@
         ValidationResult validationBuffer = new ValidationResult();
 
         if (validator != null) {
-            for (ObjEntity entity : entities) {
-                validator.validateEntity(validationBuffer, entity, false);
+            for (Object classObj : classes) {
+                if (classObj instanceof ObjEntity) {
+                    validator.validateEntity(
+                            validationBuffer,
+                            (ObjEntity) classObj,
+                            false);
+                }
+                else if (classObj instanceof Embeddable) {
+                    validator.validateEmbeddable(validationBuffer, (Embeddable) classObj);
+                }
             }
+
         }
 
         this.validation = validationBuffer;
@@ -80,18 +96,35 @@
 
         boolean modified = false;
 
-        for (ObjEntity entity : entities) {
-            boolean select = predicate.evaluate(entity);
-
-            if (select) {
-                if (selectedEntities.add(entity.getName())) {
-                    modified = true;
-                }
-            } else {
-                if (selectedEntities.remove(entity.getName())) {
-                    modified = true;
+        for (Object classObj : classes) {
+            boolean select = predicate.evaluate(classObj);
+            if (classObj instanceof ObjEntity) {
+
+                if (select) {
+                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+                        modified = true;
+                    }
+                }
+                else {
+                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+                        modified = true;
+                    }
                 }
             }
+            else if (classObj instanceof Embeddable) {
+                if (select) {
+                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+                else {
+                    if (selectedEmbeddables
+                            .remove(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+            }
+
         }
 
         if (modified) {
@@ -102,17 +135,26 @@
     }
 
     public Collection<Embeddable> getSelectedEmbeddables() {
-        // TODO: andrus, 12/9/2007 - until Modeler filtering of embeddables is
-        // implemented, show all embeddables we have
-        return dataMap.getEmbeddables();
+
+        List<Embeddable> selected = new ArrayList<Embeddable>(selectedEmbeddables.size());
+
+        for (Object classObj : classes) {
+            if (classObj instanceof Embeddable
+                    && selectedEmbeddables.contains(((Embeddable) classObj)
+                            .getClassName())) {
+                selected.add((Embeddable) classObj);
+            }
+        }
+
+        return selected;
     }
 
     public List<ObjEntity> getSelectedEntities() {
         List<ObjEntity> selected = new ArrayList<ObjEntity>(selectedEntities.size());
-
-        for (ObjEntity entity : entities) {
-            if (selectedEntities.contains(entity.getName())) {
-                selected.add(entity);
+        for (Object classObj : classes) {
+            if (classObj instanceof ObjEntity
+                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
+                selected.add(((ObjEntity) classObj));
             }
         }
 
@@ -123,21 +165,30 @@
         return selectedEntities.size();
     }
 
-    public List getEntities() {
-        return entities;
+    public int getSelectedEmbeddablesSize() {
+        return selectedEmbeddables.size();
     }
 
     /**
      * Returns the first encountered validation problem for an antity matching the name or
      * null if the entity is valid or the entity is not present.
      */
-    public String getProblem(String entityName) {
+    public String getProblem(Object obj) {
 
+        String name = null;
+        
+        if (obj instanceof ObjEntity) {
+            name = ((ObjEntity) obj).getName();
+        }
+        else if (obj instanceof Embeddable) {
+            name = ((Embeddable) obj).getClassName();
+        }
+        
         if (validation == null) {
             return null;
         }
 
-        List failures = validation.getFailures(entityName);
+        List failures = validation.getFailures(name);
         if (failures.isEmpty()) {
             return null;
         }
@@ -146,37 +197,65 @@
     }
 
     public boolean isSelected() {
-        return currentEntity != null
-                ? selectedEntities.contains(currentEntity.getName())
-                : false;
+        if (currentClass instanceof ObjEntity) {
+            return currentClass != null ? selectedEntities
+                    .contains(((ObjEntity) currentClass).getName()) : false;
+        }
+        if (currentClass instanceof Embeddable) {
+            return currentClass != null ? selectedEmbeddables
+                    .contains(((Embeddable) currentClass).getClassName()) : false;
+        }
+        return false;
+
     }
 
     public void setSelected(boolean selectedFlag) {
-        if (currentEntity == null) {
+        if (currentClass == null) {
             return;
         }
-
-        if (selectedFlag) {
-            if (selectedEntities.add(currentEntity.getName())) {
-                firePropertyChange(SELECTED_PROPERTY, null, null);
+        if (currentClass instanceof ObjEntity) {
+            if (selectedFlag) {
+                if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+            else {
+                if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
             }
         }
-        else {
-            if (selectedEntities.remove(currentEntity.getName())) {
-                firePropertyChange(SELECTED_PROPERTY, null, null);
+        if (currentClass instanceof Embeddable) {
+            if (selectedFlag) {
+                if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+            else {
+                if (selectedEmbeddables
+                        .remove(((Embeddable) currentClass).getClassName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
             }
         }
     }
 
-    public ObjEntity getCurrentEntity() {
-        return currentEntity;
+    public Object getCurrentClass() {
+        return currentClass;
     }
 
-    public void setCurrentEntity(ObjEntity currentEntity) {
-        this.currentEntity = currentEntity;
+    public void setCurrentClass(Object currentClass) {
+        this.currentClass = currentClass;
     }
 
     public DataMap getDataMap() {
         return dataMap;
     }
+
+    public String getItemName(Object obj) {
+        if (obj instanceof Embeddable) {
+            return ((Embeddable) obj).getClassName();
+        }
+        return ((ObjEntity) obj).getName();
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java?rev=894609&r1=894608&r2=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java Wed Dec 30 13:11:56 2009
@@ -42,7 +42,7 @@
 
     protected JButton generateButton;
     protected JButton cancelButton;
-    protected JLabel entityCount;
+    protected JLabel classesCount;
 
     public CodeGeneratorDialog(Component generatorPanel, Component entitySelectorPanel) {
         super(Application.getFrame());
@@ -50,19 +50,19 @@
         this.tabs = new JTabbedPane(SwingConstants.TOP);
         this.generateButton = new JButton("Generate");
         this.cancelButton = new JButton("Cancel");
-        this.entityCount = new JLabel("No entities selected");
-        entityCount.setFont(entityCount.getFont().deriveFont(10f));
+        this.classesCount = new JLabel("No classes selected");
+        classesCount.setFont(classesCount.getFont().deriveFont(10f));
 
         // assemble
 
         tabs.addTab("Code Generator", generatorPanel);
-        tabs.addTab("Entities", entitySelectorPanel);
+        tabs.addTab("Classes", entitySelectorPanel);
 
         JPanel messages = new JPanel(new BorderLayout());
-        messages.add(entityCount, BorderLayout.WEST);
+        messages.add(classesCount, BorderLayout.WEST);
 
         JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(entityCount);
+        buttons.add(classesCount);
         buttons.add(Box.createHorizontalStrut(50));
         buttons.add(cancelButton);
         buttons.add(generateButton);
@@ -83,7 +83,7 @@
         return generateButton;
     }
 
-    public JLabel getEntityCount() {
-        return entityCount;
+    public JLabel getClassesCount() {
+        return classesCount;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java?rev=894609&r1=894608&r2=894609&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java Wed Dec 30 13:11:56 2009
@@ -32,6 +32,8 @@
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.map.Attribute;
+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;
@@ -88,7 +90,7 @@
 
         outputFolder.setText(getOutputPath());
         bindingBuilder.bindToAction(outputSelect, "selectOutputFolderAction()");
-        bindingBuilder.bindToTextField(outputFolder,"outputPath");
+        bindingBuilder.bindToTextField(outputFolder, "outputPath");
     }
 
     protected CodeGeneratorControllerBase getParentController() {
@@ -115,19 +117,24 @@
 
         // no destination folder
         if (outputDir == null) {
-            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+            JOptionPane.showMessageDialog(
+                    this.getView(),
+                    "Select directory for source files.");
             return null;
         }
 
         // no such folder
         if (!outputDir.exists() && !outputDir.mkdirs()) {
-            JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir + ". Select a different one.");
+            JOptionPane.showMessageDialog(this.getView(), "Can't create directory "
+                    + outputDir
+                    + ". Select a different one.");
             return null;
         }
 
         // not a directory
         if (!outputDir.isDirectory()) {
-            JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory.");
+            JOptionPane.showMessageDialog(this.getView(), outputDir
+                    + " is not a valid directory.");
             return null;
         }
 
@@ -175,6 +182,85 @@
         return generator;
     }
 
+    public void validateEmbeddable(
+            ValidationResult validationBuffer,
+            Embeddable embeddable) {
+        ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
+        if (embeddableFailure != null) {
+            validationBuffer.addFailure(embeddableFailure);
+            return;
+        }
+
+        for (EmbeddableAttribute attribute : embeddable.getAttributes()) {
+            ValidationFailure failure = validateEmbeddableAttribute(attribute);
+            if (failure != null) {
+                validationBuffer.addFailure(failure);
+                return;
+            }
+        }
+    }
+
+    private ValidationFailure validateEmbeddableAttribute(EmbeddableAttribute attribute) {
+        String name = attribute.getEmbeddable().getClassName();
+
+        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(
+                name,
+                "attribute.name",
+                attribute.getName());
+        if (emptyName != null) {
+            return emptyName;
+        }
+
+        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(
+                name,
+                "attribute.name",
+                attribute.getName());
+        if (badName != null) {
+            return badName;
+        }
+
+        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(
+                name,
+                "attribute.type",
+                attribute.getType());
+        if (emptyType != null) {
+            return emptyType;
+        }
+
+        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(
+                name,
+                "attribute.type",
+                attribute.getType());
+        if (badType != null) {
+            return badType;
+        }
+
+        return null;
+    }
+
+    protected ValidationFailure validateEmbeddable(Embeddable embeddable) {
+
+        String name = embeddable.getClassName();
+
+        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(
+                name,
+                "className",
+                embeddable.getClassName());
+        if (emptyClass != null) {
+            return emptyClass;
+        }
+
+        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(
+                name,
+                "className",
+                embeddable.getClassName());
+        if (badClass != null) {
+            return badClass;
+        }
+
+        return null;
+    }
+
     public void validateEntity(
             ValidationResult validationBuffer,
             ObjEntity entity,
@@ -208,13 +294,11 @@
             }
         }
 
-        {
-            for (ObjRelationship rel : entity.getRelationships()) {
-                ValidationFailure failure = validateRelationship(rel, clientValidation);
-                if (failure != null) {
-                    validationBuffer.addFailure(failure);
-                    return;
-                }
+        for (ObjRelationship rel : entity.getRelationships()) {
+            ValidationFailure failure = validateRelationship(rel, clientValidation);
+            if (failure != null) {
+                validationBuffer.addFailure(failure);
+                return;
             }
         }
     }
@@ -293,17 +377,18 @@
 
         return null;
     }
-    
+
     protected ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
 
         String name = attribute.getEntity().getName();
-        
+
         // validate embeddedAttribute and attribute names
-        // embeddedAttribute returned attibute as [name_embeddedAttribute].[name_attribute]
+        // embeddedAttribute returned attibute as
+        // [name_embeddedAttribute].[name_attribute]
         String[] attributes = attribute.getName().split("\\.");
         String nameEmbeddedAttribute = attributes[0];
         int beginIndex = attributes[0].length();
-        String attr = attribute.getName().substring(beginIndex+1);
+        String attr = attribute.getName().substring(beginIndex + 1);
 
         ValidationFailure emptyEmbeddedName = BeanValidationFailure.validateNotEmpty(
                 name,
@@ -312,7 +397,7 @@
         if (emptyEmbeddedName != null) {
             return emptyEmbeddedName;
         }
-        
+
         ValidationFailure badEmbeddedName = CodeValidationUtil.validateJavaIdentifier(
                 name,
                 "attribute.name",
@@ -320,7 +405,7 @@
         if (badEmbeddedName != null) {
             return badEmbeddedName;
         }
-        
+
         ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(
                 name,
                 "attribute.name",
@@ -328,7 +413,7 @@
         if (emptyName != null) {
             return emptyName;
         }
-        
+
         ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(
                 name,
                 "attribute.name",
@@ -501,43 +586,45 @@
         }
     }
 
-    private void initOutputFolder(){
+    private void initOutputFolder() {
 
         String path = null;
         if (preferences.getOutputPath() == null) {
             if (System.getProperty("cayenne.cgen.destdir") != null) {
                 setOutputPath(System.getProperty("cayenne.cgen.destdir"));
-            } else {
+            }
+            else {
                 // init default directory..
                 FSPath lastPath = Application
                         .getInstance()
                         .getFrameController()
                         .getLastDirectory();
 
-                path = checkDefaultMavenResourceDir(lastPath,"test");
+                path = checkDefaultMavenResourceDir(lastPath, "test");
 
-                if (path != null || (path=checkDefaultMavenResourceDir(lastPath,"main")) != null) {
+                if (path != null
+                        || (path = checkDefaultMavenResourceDir(lastPath, "main")) != null) {
                     setOutputPath(path);
-                } else {
-                    File lastDir = (lastPath != null)
-                            ? lastPath.getExistingDirectory(false)
-                            : null;
+                }
+                else {
+                    File lastDir = (lastPath != null) ? lastPath
+                            .getExistingDirectory(false) : null;
                     setOutputPath(lastDir != null ? lastDir.getAbsolutePath() : null);
                 }
             }
         }
     }
-    
+
     private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
         String path = lastPath.getPath();
-        String resourcePath = buildFilePath("src",dirType,"resources");
+        String resourcePath = buildFilePath("src", dirType, "resources");
         int idx = path.indexOf(resourcePath);
         if (idx < 0) {
             return null;
         }
-        return path.substring(0,idx)
-                + buildFilePath("src",dirType,"java") +
-                path.substring(idx+resourcePath.length());
+        return path.substring(0, idx)
+                + buildFilePath("src", dirType, "java")
+                + path.substring(idx + resourcePath.length());
     }
 
     private static final String buildFilePath(String... pathElements) {
@@ -545,10 +632,9 @@
             return "";
         }
         StringBuilder path = new StringBuilder(pathElements[0]);
-        for(int i=1;i<pathElements.length;i++) {
-            path.append(File.separator).append( pathElements[i]);
+        for (int i = 1; i < pathElements.length; i++) {
+            path.append(File.separator).append(pathElements[i]);
         }
         return path.toString();
     }
-
 }