
org.apache.cayenne.modeler.dialog.objentity.ObjAttributeInfoDialog Maven / Gradle / Ivy
/*****************************************************************
* 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.dialog.objentity;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.EmbeddableAttribute;
import org.apache.cayenne.map.EmbeddedAttribute;
import org.apache.cayenne.map.Entity;
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.EntityEvent;
import org.apache.cayenne.map.event.MapEvent;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.editor.ObjAttributeTableModel;
import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
import org.apache.cayenne.modeler.event.EntityDisplayEvent;
import org.apache.cayenne.modeler.util.CayenneController;
import org.apache.cayenne.modeler.util.EntityTreeAttributeRelationshipFilter;
import org.apache.cayenne.modeler.util.EntityTreeModel;
import org.apache.cayenne.modeler.util.ModelerUtil;
import org.apache.cayenne.project.extension.info.ObjectInfo;
import org.apache.cayenne.swing.BindingBuilder;
import org.apache.cayenne.util.CayenneMapEntry;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.tree.TreePath;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static org.apache.cayenne.modeler.dialog.objentity.ObjAttributeInfoDialogView.EMBEDDABLE_PANEL;
import static org.apache.cayenne.modeler.dialog.objentity.ObjAttributeInfoDialogView.FLATTENED_PANEL;
public class ObjAttributeInfoDialog extends CayenneController implements TreeSelectionListener {
private ObjAttributeTableModel model;
private OverrideEmbeddableAttributeTableModel embeddableModel;
private int row;
protected ObjAttributeInfoDialogView view;
protected ObjAttribute attribute;
protected ObjAttribute attributeSaved;
protected List relTargets;
protected Map stringToEmbeddables;
protected List embeddableNames;
protected ProjectController mediator;
private Object lastObjectType;
public ObjAttributeInfoDialog(ProjectController mediator, int row, ObjAttributeTableModel model) {
super(mediator);
this.view = new ObjAttributeInfoDialogView();
this.mediator = mediator;
this.model = model;
this.row = row;
this.stringToEmbeddables = new HashMap<>();
this.embeddableNames = new ArrayList<>();
for (Embeddable emb : mediator.getEmbeddablesInCurrentDataDomain()) {
stringToEmbeddables.put(emb.getClassName(), emb);
embeddableNames.add(emb.getClassName());
}
initController(model.getAttribute(row).getValue());
}
@Override
public Component getView() {
return view;
}
/**
* Starts options dialog.
*/
public void startupAction() {
view.pack();
view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
view.setModal(true);
makeCloseableOnEscape();
centerView();
view.setVisible(true);
}
private void initController(ObjAttribute attr) {
for (String embeddableName : embeddableNames) {
((DefaultComboBoxModel) view.getTypeComboBox().getModel()).addElement(embeddableName);
}
this.attribute = attr;
if (attribute instanceof EmbeddedAttribute || embeddableNames.contains(attribute.getType())) {
this.attributeSaved = new EmbeddedAttribute();
} else {
this.attributeSaved = new ObjAttribute();
}
copyObjAttribute(attributeSaved, attribute);
relTargets = new ArrayList(attribute.getEntity().getDataMap().getDbEntities());
/*
* Register auto-selection of the target
*/
view.getPathBrowser().addTreeSelectionListener(this);
view.getAttributeName().setText(attribute.getName());
if (attribute.getDbAttributePath() != null) {
if (attribute.getDbAttributePath().contains(".")) {
String path = attribute.getDbAttributePath();
view.getCurrentPathLabel().setText(path.replace(".", " -> "));
} else {
view.getCurrentPathLabel().setText(attribute.getDbAttributePath());
}
} else {
view.getCurrentPathLabel().setText("");
}
view.getSourceEntityLabel().setText(attribute.getEntity().getName());
view.getTypeComboBox().setSelectedItem(attribute.getType());
view.getUsedForLockingCheckBox().setSelected(attribute.isUsedForLocking());
view.getLazyCheckBox().setSelected(attribute.isLazy());
view.getCommentField().setText(ObjectInfo
.getFromMetaData(mediator.getApplication().getMetaData(),
attr,
ObjectInfo.COMMENT));
BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
builder.bindToAction(view.getCancelButton(), "closeAction()");
builder.bindToAction(view.getSelectPathButton(), "setPath(true)");
builder.bindToAction(view.getSaveButton(), "saveMapping()");
/*
* set filter for ObjAttributePathBrowser
*/
if (view.getPathBrowser().getModel() == null) {
Entity firstEntity = null;
if (attribute.getDbAttribute() == null) {
if (attribute.getParent() instanceof ObjEntity) {
DbEntity dbEnt = ((ObjEntity) attribute.getParent()).getDbEntity();
if (dbEnt != null) {
Collection attrib = dbEnt.getAttributes();
Collection rel = dbEnt.getRelationships();
if (attrib.size() > 0) {
Iterator iter = attrib.iterator();
firstEntity = iter.next().getEntity();
} else if (rel.size() > 0) {
Iterator iter = rel.iterator();
firstEntity = iter.next().getSourceEntity();
}
}
}
} else {
firstEntity = getFirstEntity();
}
if (firstEntity != null) {
EntityTreeModel treeModel = new EntityTreeModel(firstEntity);
treeModel.setFilter(new EntityTreeAttributeRelationshipFilter());
view.getPathBrowser().setModel(treeModel);
}
}
if (attribute.getDbAttribute() != null) {
setSelectionPath();
}
view.getTypeComboBox().addItemListener(e -> {
if (lastObjectType != null) {
if (!lastObjectType.equals(e.getItemSelectable())) {
if (embeddableNames.contains(e.getItemSelectable().getSelectedObjects()[0].toString())) {
if (attributeSaved instanceof ObjAttribute) {
EmbeddedAttribute copyAttrSaved = new EmbeddedAttribute();
copyObjAttribute(copyAttrSaved, attributeSaved);
attributeSaved = copyAttrSaved;
}
} else {
if (attributeSaved instanceof EmbeddedAttribute) {
ObjAttribute copyAttrSaved = new ObjAttribute();
copyObjAttribute(copyAttrSaved, attributeSaved);
attributeSaved = copyAttrSaved;
}
}
attributeSaved.setType(e.getItemSelectable().getSelectedObjects()[0].toString());
rebuildTable();
setEnabledSaveButton();
}
}
});
view.getTypeComboBox().addActionListener(e -> {
boolean isType = false;
String[] typeNames = ModelerUtil.getRegisteredTypeNames();
for (String typeName : typeNames) {
if (view.getTypeComboBox().getSelectedItem() == null ||
typeName.equals(view.getTypeComboBox().getSelectedItem().toString())) {
isType = true;
}
}
if (isType || !mediator.getEmbeddableNamesInCurrentDataDomain()
.contains((String)view.getTypeComboBox().getSelectedItem())) {
((CardLayout) view.getTypeManagerPane().getLayout()).show(view.getTypeManagerPane(), FLATTENED_PANEL);
} else {
((CardLayout) view.getTypeManagerPane().getLayout()).show(view.getTypeManagerPane(), EMBEDDABLE_PANEL);
view.getCurrentPathLabel().setText("");
}
});
view.getAttributeName().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
if (!view.getAttributeName().getText().equals(attribute.getName())) {
setEnabledSaveButton();
}
}
public void keyReleased(KeyEvent e) {
if (!view.getAttributeName().getText().equals(attribute.getName())) {
setEnabledSaveButton();
}
}
public void keyTyped(KeyEvent e) {
}
});
rebuildTable();
}
private void setEnabledSaveButton() {
if (!attribute.getDbPathIterator().hasNext()) {
view.getSaveButton().setEnabled(true);
} else {
boolean isAttributeLast = false;
Iterator it = attribute.getDbPathIterator();
while (it.hasNext()) {
Object obj = it.next();
if (obj instanceof DbAttribute && !it.hasNext()) {
isAttributeLast = true;
}
}
view.getSaveButton().setEnabled(isAttributeLast);
}
}
private void setUpTableStructure() {
DefaultTableCellRenderer renderer = new CellRenderer();
TableColumn nameColumn = view.getOverrideAttributeTable().getColumnModel()
.getColumn(OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE);
nameColumn.setCellRenderer(renderer);
TableColumn typeColumn = view.getOverrideAttributeTable().getColumnModel()
.getColumn(OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE_TYPE);
typeColumn.setCellRenderer(renderer);
TableColumn dbAttrColumn = view.getOverrideAttributeTable().getColumnModel()
.getColumn(OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE);
dbAttrColumn.setCellRenderer(renderer);
TableColumn dbAttrTypeColumn = view.getOverrideAttributeTable().getColumnModel()
.getColumn(OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE_TYPE);
dbAttrTypeColumn.setCellRenderer(renderer);
view.getTablePreferences().bind(view.getOverrideAttributeTable(), null, null, null,
OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE, true);
initComboBoxes();
}
private void initComboBoxes() {
Collection nameAttr = null;
if (attributeSaved != null) {
DbEntity currentEnt = attributeSaved.getEntity().getDbEntity();
if (currentEnt != null) {
nameAttr = ModelerUtil.getDbAttributeNames(currentEnt);
embeddableModel.setCellEditor(nameAttr, view.getOverrideAttributeTable());
embeddableModel.setComboBoxes(
nameAttr,
view.getOverrideAttributeTable().convertColumnIndexToView(
OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE));
}
}
}
private void rebuildTable() {
String typeName = null;
Collection embAttrTempCopy = new ArrayList<>();
if (attributeSaved.getType() != null) {
typeName = attributeSaved.getType();
}
if (embeddableNames.contains(typeName)) {
Collection embAttrTemp = stringToEmbeddables.get(typeName).getAttributes();
for (EmbeddableAttribute temp : embAttrTemp) {
EmbeddableAttribute at = new EmbeddableAttribute();
at.setDbAttributeName(temp.getDbAttributeName());
at.setName(temp.getName());
at.setType(temp.getType());
at.setEmbeddable(temp.getEmbeddable());
embAttrTempCopy.add(at);
}
}
embeddableModel = new OverrideEmbeddableAttributeTableModel(mediator, this, embAttrTempCopy, attributeSaved);
view.getOverrideAttributeTable().setModel(embeddableModel);
view.getOverrideAttributeTable().setRowHeight(25);
view.getOverrideAttributeTable().setRowMargin(3);
setUpTableStructure();
if (view.getTypeComboBox().getSelectedItem() == null) {
lastObjectType = "";
} else {
lastObjectType = view.getTypeComboBox().getSelectedItem();
}
}
public void closeAction() {
view.dispose();
}
public boolean setPath(boolean isChange) {
if (isChange()) {
if(view.getTypeComboBox().getSelectedItem() != null) {
attributeSaved.setType(view.getTypeComboBox().getSelectedItem().toString());
}
attributeSaved.setName(view.getAttributeName().getText());
attributeSaved.setUsedForLocking(view.getUsedForLockingCheckBox().isSelected());
attributeSaved.setLazy(view.getLazyCheckBox().isSelected());
ObjectInfo.putToMetaData(mediator.getApplication().getMetaData(),
attributeSaved,
ObjectInfo.COMMENT,
view.getCommentField().getText());
}
if (!(attributeSaved instanceof EmbeddedAttribute) || isRegistredType(attributeSaved.getType())) {
StringBuilder attributePath = new StringBuilder();
StringBuilder pathStr = new StringBuilder();
TreePath path = view.getPathBrowser().getSelectionPath();
if (attribute.getEntity().getDbEntity() != null && path != null) {
if (path.getLastPathComponent() instanceof DbAttribute) {
Object[] pathComponents = path.getPath();
for (int i = 0; i < pathComponents.length; i++) {
boolean attrOrRel = true;
if (pathComponents[i] instanceof DbAttribute) {
pathStr.append(((DbAttribute) pathComponents[i]).getName());
attributePath.append(((DbAttribute) pathComponents[i]).getName());
} else if (pathComponents[i] instanceof DbRelationship) {
pathStr.append(((DbRelationship) pathComponents[i]).getName());
attributePath.append(((DbRelationship) pathComponents[i]).getName());
} else {
attrOrRel = false;
}
if (i != pathComponents.length - 1 && attrOrRel) {
pathStr.append(" -> ");
attributePath.append(".");
}
}
}
} else {
view.getCurrentPathLabel().setText("");
}
view.getCurrentPathLabel().setText(pathStr.toString());
if (attribute.getDbAttributePath() != null
&& ((view.getTypeComboBox().getSelectedItem() != null && !embeddableNames.contains(view.getTypeComboBox().getSelectedItem().toString()))
|| view.getTypeComboBox().getSelectedItem() == null)) {
if (!attribute.getDbAttributePath().equals(attributePath.toString())) {
attributeSaved.setDbAttributePath(attributePath.toString());
if (!attribute.getDbAttributePath().equals(attributePath.toString()) && isChange) {
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
}
return true;
}
} else {
if (attributePath.length() > 0
|| (attribute instanceof EmbeddedAttribute && !(attributeSaved instanceof EmbeddedAttribute))) {
attributeSaved.setDbAttributePath(attributePath.toString());
if (attributePath.length() == 0) {
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
return false;
}
return true;
}
}
}
return false;
}
public boolean isChange() {
boolean isOverrideTableChange = ((OverrideEmbeddableAttributeTableModel) view.getOverrideAttributeTable()
.getModel()).isAttributeOverrideChange();
return isOverrideTableChange
|| !attribute.getName().equals(view.getAttributeName().getText())
|| (attribute.getType() == null && view.getTypeComboBox().getSelectedItem() != null)
|| !Objects.equals(attribute.getType(), view.getTypeComboBox().getSelectedItem())
|| attribute.isUsedForLocking() != view.getUsedForLockingCheckBox().isSelected()
|| attribute.isLazy() != view.getLazyCheckBox().isSelected()
|| !ObjectInfo.getFromMetaData(
mediator.getApplication().getMetaData(), attribute, ObjectInfo.COMMENT)
.equals(view.getCommentField().getText());
}
private void updateTable() {
model.setUpdatedValueAt(attributeSaved.getName(), row, 0);
model.setUpdatedValueAt(attributeSaved.getType(), row, 1);
model.setUpdatedValueAt(attributeSaved.isUsedForLocking(), row, 4);
model.setUpdatedValueAt(attributeSaved.isLazy(), row, 5);
model.setUpdatedValueAt(ObjectInfo
.getFromMetaData(mediator.getApplication().getMetaData(),
attributeSaved,
ObjectInfo.COMMENT), row, 6);
}
public void saveMapping() {
if (setPath(false)) {
if (JOptionPane.showConfirmDialog(getView(),
"You have changed Db Attribute path. Do you want it to be saved?", "Save ObjAttribute",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
if (attribute instanceof EmbeddedAttribute) {
changeAttributeObject();
} else {
updateTable();
}
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
} else {
updateTable();
}
} else {
if ((attributeSaved instanceof EmbeddedAttribute && !(attribute instanceof EmbeddedAttribute))
|| (!(attributeSaved instanceof EmbeddedAttribute) && attribute instanceof EmbeddedAttribute)) {
changeAttributeObject();
} else {
if (attributeSaved instanceof EmbeddedAttribute && embeddableModel.isAttributeOverrideChange()) {
Map overrides = ((EmbeddedAttribute) attributeSaved).getAttributeOverrides();
Map currentOverrAttr = getCurrentOverrideAttribute();
compareAndSetOverrideInEmbeddedAttribute(attributeSaved, overrides, currentOverrAttr);
}
updateTable();
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
}
if (attributeSaved instanceof EmbeddedAttribute && attribute instanceof EmbeddedAttribute) {
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
if (embeddableModel.isAttributeOverrideChange()) {
Map overrides;
overrides = ((EmbeddedAttribute) attribute).getAttributeOverrides();
Map currentOverrAttr = ((EmbeddedAttribute) attributeSaved).getAttributeOverrides();
compareAndSetOverrideInEmbeddedAttribute(attribute, overrides, currentOverrAttr);
}
}
}
closeAction();
}
private void changeAttributeObject() {
if (attributeSaved instanceof EmbeddedAttribute && embeddableModel.isAttributeOverrideChange()) {
Map overrides = ((EmbeddedAttribute) attributeSaved).getAttributeOverrides();
Map currentOverrAttr = getCurrentOverrideAttribute();
compareAndSetOverrideInEmbeddedAttribute(attributeSaved, overrides, currentOverrAttr);
}
if (attributeSaved instanceof EmbeddedAttribute) {
attributeSaved.setDbAttributePath(null);
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 2);
}
model.getEntity().removeAttribute(attribute.getName());
model.getEntity().addAttribute(attributeSaved);
mediator.fireObjEntityEvent(new EntityEvent(this, model.getEntity(), MapEvent.CHANGE));
EntityDisplayEvent event = new EntityDisplayEvent(this, mediator.getCurrentObjEntity(),
mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator.getProject().getRootNode());
mediator.fireObjEntityDisplayEvent(event);
mediator.fireObjAttributeEvent(new AttributeEvent(this, attributeSaved, model.getEntity(), MapEvent.CHANGE));
AttributeDisplayEvent eventAttr = new AttributeDisplayEvent(this, attributeSaved,
mediator.getCurrentObjEntity(), mediator.getCurrentDataMap(), (DataChannelDescriptor) mediator
.getProject().getRootNode());
mediator.fireObjAttributeDisplayEvent(eventAttr);
}
public Map getCurrentOverrideAttribute() {
Map currentEmbeddableOverrite = new HashMap<>();
Collection embList = embeddableModel.getEmbeddableList();
Embeddable emb = stringToEmbeddables.get(attributeSaved.getType());
for (EmbeddableAttribute e : embList) {
if ((emb.getAttribute(e.getName()).getDbAttributeName() == null && e.getDbAttributeName() != null)
|| (emb.getAttribute(e.getName()).getDbAttributeName() != null && !emb.getAttribute(e.getName())
.getDbAttributeName().equals(e.getDbAttributeName()))) {
currentEmbeddableOverrite.put(e.getName(), e.getDbAttributeName());
}
}
return currentEmbeddableOverrite;
}
public void valueChanged(TreeSelectionEvent e) {
}
private Entity getFirstEntity() {
Iterator it = attribute.getDbPathIterator();
Entity firstEnt = attribute.getDbAttribute().getEntity();
boolean setEnt = false;
while (it.hasNext()) {
Object ob = it.next();
if (ob instanceof DbRelationship) {
if (!setEnt) {
firstEnt = ((DbRelationship) ob).getSourceEntity();
setEnt = true;
}
} else if (ob instanceof DbAttribute) {
if (!setEnt) {
firstEnt = ((DbAttribute) ob).getEntity();
}
}
}
return firstEnt;
}
/**
* Selects path in browser
*/
public void setSelectionPath() {
List list = new ArrayList<>();
boolean isAttributeLast = false;
Iterator it = attribute.getDbPathIterator();
while (it.hasNext()) {
CayenneMapEntry obj = it.next();
list.add(obj);
if (obj instanceof DbAttribute && !it.hasNext()) {
isAttributeLast = true;
}
}
if (isAttributeLast) {
Object[] path = new Object[list.size() + 1];
path[0] = getFirstEntity();
System.arraycopy(list.toArray(), 0, path, 1, list.size());
view.getPathBrowser().setSelectionPath(new TreePath(path));
view.getSaveButton().setEnabled(true);
}
}
public boolean isRegistredType(String typeName) {
boolean isType = false;
String[] typeNames = ModelerUtil.getRegisteredTypeNames();
for (String nextTypeName : typeNames) {
if (nextTypeName.equals(typeName)) {
isType = true;
}
}
return isType;
}
// custom renderer used for inherited attributes highlighting
final class CellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
OverrideEmbeddableAttributeTableModel model = (OverrideEmbeddableAttributeTableModel) table.getModel();
if (!model.isCellEditable(row, column)) {
setForeground(Color.DARK_GRAY);
} else {
setForeground(isSelected && !hasFocus ? table.getSelectionForeground() : table.getForeground());
}
setBackground(isSelected && !hasFocus ? table.getSelectionBackground() : table.getBackground());
return this;
}
}
private void copyObjAttribute(ObjAttribute attributeSaved, ObjAttribute attribute) {
attributeSaved.setDbAttributePath(attribute.getDbAttributePath());
attributeSaved.setName(attribute.getName());
attributeSaved.setEntity(attribute.getEntity());
attributeSaved.setParent(attribute.getParent());
attributeSaved.setType(attribute.getType());
attributeSaved.setUsedForLocking(attribute.isUsedForLocking());
attributeSaved.setLazy(attribute.isLazy());
String comment = ObjectInfo
.getFromMetaData(mediator.getApplication().getMetaData(),
attribute,
ObjectInfo.COMMENT);
ObjectInfo.putToMetaData(mediator.getApplication().getMetaData(),
attributeSaved,
ObjectInfo.COMMENT,
comment);
if (attributeSaved instanceof EmbeddedAttribute) {
Map attrOverrides;
if (attribute instanceof EmbeddedAttribute) {
attrOverrides = ((EmbeddedAttribute) attribute).getAttributeOverrides();
} else {
attrOverrides = new HashMap<>();
}
if (attrOverrides.size() > 0) {
for (Map.Entry attrOv : attrOverrides.entrySet()) {
((EmbeddedAttribute) attributeSaved).addAttributeOverride(attrOv.getKey(), attrOv.getValue());
}
}
}
}
private void compareAndSetOverrideInEmbeddedAttribute(ObjAttribute attribute, Map overrides,
Map currentOverrAttr) {
ArrayList keysForDelete = new ArrayList<>();
ArrayList keysForAdd = new ArrayList<>();
for (Object o : overrides.entrySet()) {
Map.Entry obj = (Map.Entry) o;
String key = (String) obj.getKey();
if (currentOverrAttr.get(key) == null || !(obj.getValue().equals(currentOverrAttr.get(key)))) {
keysForDelete.add(key);
}
}
for (Object o : currentOverrAttr.entrySet()) {
Map.Entry obj = (Map.Entry) o;
String key = (String) obj.getKey();
if (overrides.get(key) == null || !(obj.getValue().equals(overrides.get(key)))) {
keysForAdd.add(key);
}
}
for (String aKeysForDelete : keysForDelete) {
((EmbeddedAttribute) attribute).removeAttributeOverride(aKeysForDelete);
}
for (String key : keysForAdd) {
((EmbeddedAttribute) attribute).addAttributeOverride(key, currentOverrAttr.get(key));
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy