blob: f33717fd3abf1348e328fc459c80d7c1116133a3 [file] [log] [blame]
/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
****************************************************************/
package org.apache.cayenne.modeler.editor;
import java.awt.BorderLayout;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.event.AttributeEvent;
import org.apache.cayenne.map.event.EmbeddableEvent;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.action.ActionManager;
import org.apache.cayenne.modeler.action.CreateAttributeAction;
import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
import org.apache.cayenne.modeler.util.Comparators;
import org.apache.cayenne.modeler.util.TextAdapter;
import org.apache.cayenne.project.extension.info.ObjectInfo;
import org.apache.cayenne.util.Util;
import org.apache.cayenne.validation.ValidationException;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
public class EmbeddableTab extends JPanel implements EmbeddableDisplayListener {
protected ProjectController mediator;
protected TextAdapter className;
protected TextAdapter comment;
public EmbeddableTab(ProjectController mediator) {
this.mediator = mediator;
initView();
initController();
}
private void initController() {
mediator.addEmbeddableDisplayListener(this);
}
private void initView() {
this.setLayout(new BorderLayout());
JToolBar toolBar = new JToolBar();
toolBar.setBorder(BorderFactory.createEmptyBorder());
toolBar.setFloatable(false);
ActionManager actionManager = Application.getInstance().getActionManager();
toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton());
add(toolBar, BorderLayout.NORTH);
className = new TextAdapter(new JTextField()) {
@Override
protected void updateModel(String text) {
setClassName(text);
}
};
comment = new TextAdapter(new JTextField()) {
@Override
protected void updateModel(String text) {
setComment(text);
}
};
FormLayout layout = new FormLayout(
"right:50dlu, 3dlu, fill:150dlu, 3dlu, fill:100",
"");
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
builder.append("Class Name:", className.getComponent(), 3);
builder.append("Comment:", comment.getComponent(), 3);
add(builder.getPanel(), BorderLayout.CENTER);
}
void setClassName(String newClassName) {
if (newClassName != null && newClassName.trim().length() == 0) {
newClassName = null;
}
Embeddable embeddable = mediator.getCurrentEmbeddable();
if (embeddable == null) {
return;
}
if (Util.nullSafeEquals(newClassName, embeddable.getClassName())) {
return;
}
if (newClassName == null) {
throw new ValidationException("Embeddable name is required.");
}
else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) {
// if newClassName dupliucates in other DataMaps
DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode();
if (domain != null) {
for (DataMap nextMap : domain.getDataMaps()) {
if (nextMap == embeddable.getDataMap()) {
continue;
}
Embeddable conflictingEmbeddable = nextMap.getEmbeddable(newClassName);
if (conflictingEmbeddable != null) {
throw new ValidationException(
"Duplicate Embeddable name in another DataMap: "
+ newClassName
+ ".");
}
}
}
// completely new name, set new name for embeddable
EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable
.getClassName());
String oldName = embeddable.getClassName();
embeddable.setClassName(newClassName);
mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap());
Iterator it = ((DataChannelDescriptor) mediator.getProject().getRootNode()).getDataMaps().iterator();
while (it.hasNext()) {
DataMap dataMap = (DataMap) it.next();
Iterator<ObjEntity> ent = dataMap.getObjEntities().stream()
.sorted(Comparators.getDataMapChildrenComparator())
.iterator();
while (ent.hasNext()) {
Collection<ObjAttribute> attr = ent.next().getAttributes();
Iterator<ObjAttribute> 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
.getEntity());
mediator.fireObjAttributeEvent(ev);
}
}
}
}
}
else {
// there is an embeddable with the same name
throw new ValidationException("There is another embeddable with name '"
+ newClassName
+ "'.");
}
}
public void currentEmbeddableChanged(EmbeddableDisplayEvent e) {
Embeddable embeddable = e.getEmbeddable();
if (embeddable == null || !e.isEmbeddableChanged()) {
return;
}
initFromModel(embeddable);
}
private void initFromModel(Embeddable embeddable) {
className.setText(embeddable.getClassName());
comment.setText(getComment(embeddable));
}
void setComment(String comment) {
Embeddable embeddable = mediator.getCurrentEmbeddable();
if (embeddable == null) {
return;
}
ObjectInfo.putToMetaData(mediator.getApplication().getMetaData(), embeddable, ObjectInfo.COMMENT, comment);
mediator.fireEmbeddableEvent(new EmbeddableEvent(this, embeddable), mediator.getCurrentDataMap());
}
String getComment(Embeddable embeddable) {
return ObjectInfo.getFromMetaData(mediator.getApplication().getMetaData(), embeddable, ObjectInfo.COMMENT);
}
}