diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Embeddable.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Embeddable.java index 744a5cc4db..7b0f7f67df 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/Embeddable.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Embeddable.java @@ -46,6 +46,7 @@ public class Embeddable implements ConfigurationNode, XMLSerializable, Serializa private static final long serialVersionUID = -7163768090567642099L; protected String className; + protected String nameWithPackage; protected SortedMap attributes; protected DataMap dataMap; @@ -54,7 +55,7 @@ public Embeddable() { } public Embeddable(String className) { - this.attributes = new TreeMap(); + this.attributes = new TreeMap<>(); this.className = className; } @@ -165,6 +166,14 @@ public void setClassName(String className) { this.className = className; } + public String getNameWithPackage() { + return nameWithPackage; + } + + public void setNameWithPackage(String nameWithPackage) { + this.nameWithPackage = nameWithPackage; + } + /** * {@link XMLSerializable} implementation that generates XML for embeddable. */ @@ -175,6 +184,12 @@ public void encodeAsXML(XMLEncoder encoder) { encoder.print(getClassName()); encoder.print("\""); } + + if (getNameWithPackage() != null) { + encoder.print(" embeddableName=\""); + encoder.print(getNameWithPackage()); + encoder.print("\""); + } encoder.println(">"); encoder.indent(1); diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java index 2ea7a6fe0f..abda1503de 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/map/MapLoader.java @@ -729,6 +729,8 @@ public void endElement(String namespaceURI, String localName, String qName) thro private void processStartEmbeddable(Attributes atts) { embeddable = new Embeddable(atts.getValue("", "className")); + String embeddableName = atts.getValue("", "embeddableName"); + embeddable.setNameWithPackage(embeddableName); dataMap.addEmbeddable(embeddable); } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java index 071867245a..da4297424f 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java @@ -58,7 +58,8 @@ public void performAction(ActionEvent e) { Embeddable embeddable = new Embeddable(); String baseName = NameBuilder.builder(embeddable, dataMap).name(); String nameWithPackage = dataMap.getNameWithDefaultPackage(baseName); - embeddable.setClassName(nameWithPackage); + embeddable.setClassName(baseName); + embeddable.setNameWithPackage(nameWithPackage); createEmbeddable(dataMap, embeddable); application.getUndoManager().addEdit(new CreateEmbeddableUndoableEdit(dataMap, embeddable)); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java index cf2040bce1..3800967e17 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java @@ -51,6 +51,7 @@ public class EmbeddableTab extends JPanel implements EmbeddableDisplayListener { protected ProjectController mediator; + protected JTextField nameWithPackage; protected TextAdapter className; public EmbeddableTab(ProjectController mediator) { @@ -82,12 +83,16 @@ protected void updateModel(String text) { } }; + nameWithPackage = new JTextField(); + nameWithPackage.setEditable(false); + FormLayout layout = new FormLayout( - "right:50dlu, 3dlu, fill:150dlu, 3dlu, fill:100", + "right:100dlu, 3dlu, fill:200dlu, 3dlu, fill:100", ""); DefaultFormBuilder builder = new DefaultFormBuilder(layout); builder.setDefaultDialogBorder(); - builder.append("Class Name:", className.getComponent(), 3); + builder.append("Embeddable Name:", className.getComponent(), 3); + builder.append("Java Class:", nameWithPackage, 3); add(builder.getPanel(), BorderLayout.CENTER); } @@ -115,8 +120,7 @@ void setClassName(String newClassName) { if (newClassName == null) { throw new ValidationException("Embeddable name is required."); - } - else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) { + } else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) { // if newClassName dupliucates in other DataMaps DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode(); @@ -139,9 +143,13 @@ else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) { // completely new name, set new name for embeddable EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable .getClassName()); - String oldName = embeddable.getClassName(); + embeddable.setClassName(newClassName); + String oldName = embeddable.getNameWithPackage(); + String newName = mediator.getCurrentDataMap().getDefaultPackage() + "." + embeddable.getClassName(); + embeddable.setNameWithPackage(newName); + mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap()); Iterator it =((DataChannelDescriptor) mediator.getProject().getRootNode()).getDataMaps().iterator(); @@ -155,10 +163,10 @@ else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) { Iterator attrIt = attr.iterator(); while (attrIt.hasNext()) { - ObjAttribute atribute = attrIt.next(); - if (atribute.getType()==null || atribute.getType().equals(oldName)) { - atribute.setType(newClassName); - AttributeEvent ev = new AttributeEvent(this, atribute, atribute + ObjAttribute attribute = attrIt.next(); + if (attribute.getType()==null || attribute.getType().equals(oldName)) { + attribute.setType(newName); + AttributeEvent ev = new AttributeEvent(this, attribute, attribute .getEntity()); mediator.fireObjAttributeEvent(ev); } @@ -167,8 +175,9 @@ else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) { } } - } - else { + initFromModel(embeddable); + + } else { // there is an embeddable with the same name throw new ValidationException("There is another embeddable with name '" + newClassName @@ -187,5 +196,6 @@ public void currentEmbeddableChanged(EmbeddableDisplayEvent e) { private void initFromModel(Embeddable embeddable) { className.setText(embeddable.getClassName()); + nameWithPackage.setText(embeddable.getNameWithPackage()); } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java index 263a0c0c5c..1177380de7 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java @@ -212,7 +212,7 @@ public void initComboBoxes() { for (DataMap dataMap : ((DataChannelDescriptor) mediator.getProject().getRootNode()).getDataMaps()) { for (Embeddable emb : dataMap.getEmbeddables()) { - embeddableNames.add(emb.getClassName()); + embeddableNames.add(emb.getNameWithPackage()); } } diff --git a/pom.xml b/pom.xml index 19943a3189..631b0d2aac 100644 --- a/pom.xml +++ b/pom.xml @@ -360,7 +360,7 @@ ognl ognl - 3.2.2 + 2.6.3 opensymphony