/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.descriptor; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.swing.JOptionPane; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import org.eclipse.persistence.tools.workbench.framework.action.AbstractFrameworkAction; import org.eclipse.persistence.tools.workbench.framework.app.ApplicationNode; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWInterfaceAliasDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWMappingDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.MWTransactionalDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptor; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.descriptor.relational.TableDescriptorNode; import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ReadOnlyListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.SortedListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel; import org.eclipse.persistence.tools.workbench.uitools.cell.AbstractCellRendererAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.CellRendererAdapter; import org.eclipse.persistence.tools.workbench.utility.filters.Filter; import org.eclipse.persistence.tools.workbench.utility.iterators.FilteringIterator; /** * @version 10.1.3 */ public class AdvancedPolicyAction extends AbstractFrameworkAction { public AdvancedPolicyAction(WorkbenchContext context) { super(context); initializeRepositoryResources(); } private void initializeRepositoryResources() { initializeTextAndMnemonic("ADVANCED_PROPERTIES_MENU_ITEM"); initializeToolTipText("ADVANCED_PROPERTIES_MENU_ITEM.tooltip"); initializeIcon("descriptor.advancedProperties"); } protected String getResourceString(String key) { return resourceRepository().getString(key); } private List buildApplicableAdvancedPolicyHolderList() { List advancedPolicyList = new ArrayList(); if (supportsMappingDescriptorPolicies()) { advancedPolicyList.add(new AfterLoadingPolicyHolder()); advancedPolicyList.add(new CopyingPolicyHolder()); advancedPolicyList.add(new InheritencePolicyHolder()); advancedPolicyList.add(new InstantiationPolicyHolder()); } // special case, ALL mapping descriptors support events // except for 0-X Descriptors. Post 10.1.3, this will change. if (supportsEventsPolicy()) { advancedPolicyList.add(new EventsPolicyHolder()); } // another special case, only table descriptors and eis root // descriptors support interface alias policy if (supportsInterfaceAliasPolicy()) { advancedPolicyList.add(new InterfaceAliasPolicyHolder()); } if (supportsTransactionalDescriptorProperties()) { advancedPolicyList.add(new ReturningPolicyHolder()); } if (supportsTableDescriptorProperties()) { advancedPolicyList.add(new MultiTableInfoPolicyHolder()); } return advancedPolicyList; } private boolean supportsEventsPolicy() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { if (!((DescriptorNode) selectedNodes[i]).supportsEventsPolicy()) { return false; } } return true; } private boolean supportsInterfaceAliasPolicy() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { if (!((DescriptorNode) selectedNodes[i]).supportsInterfaceAliasPolicy()) { return false; } } return true; } private boolean supportsMappingDescriptorPolicies() { return true; } private boolean supportsTransactionalDescriptorProperties() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { if (!((DescriptorNode) selectedNodes[i]).supportsTransactionalDescriptorProperties()) { return false; } } return true; } private boolean supportsTableDescriptorProperties() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { if (!((DescriptorNode) selectedNodes[i]).isTableDescriptor()) { return false; } } return true; } protected void execute() { List advancedPolicyItemList = buildApplicableAdvancedPolicyHolderList(); ListValueModel advancedPoliciesListModel = buildAdvancedPolicyListModel(advancedPolicyItemList); Iterator selectedItems = buildSelectedItems(advancedPolicyItemList.iterator()); ObjectListSelectionModel selectionModel = buildSelectionModel(advancedPoliciesListModel, selectedItems); AdvancedPolicyChooser chooser = new AdvancedPolicyChooser(getWorkbenchContext(), advancedPoliciesListModel, selectionModel, buildAdvancedPropertiesCellRenderer()); chooser.setVisible(true); if (chooser.wasCanceled()) { return; } List selectedValues = Arrays.asList(selectionModel.getSelectedValues()); for (Iterator selectedValueIterator = selectedValues.iterator(); selectedValueIterator.hasNext();) { AdvancedPolicyHolder checkListHolder = (AdvancedPolicyHolder)selectedValueIterator.next(); if (!checkListHolder.initialSelectionState()) { checkListHolder.addToSelectedNodes(); } } for (Iterator allValues = advancedPolicyItemList.iterator(); allValues.hasNext();) { AdvancedPolicyHolder checkListHolder = (AdvancedPolicyHolder)allValues.next(); if (!selectedValues.contains(checkListHolder) && checkListHolder.initialSelectionState()) { checkListHolder.removeFromSelectedNodes(); } } } private ObjectListSelectionModel buildSelectionModel(ListValueModel itemHolder, Iterator selectedItems) { ListModelAdapter adapter = new ListModelAdapter(itemHolder); adapter.addListDataListener(new HackableListDataListener()); ObjectListSelectionModel model = new ObjectListSelectionModel(adapter); model.setSelectedValues(selectedItems); return model; } private Iterator buildSelectedItems(Iterator allItems) { Filter iteratorFilter = new Filter() { public boolean accept(Object o) { return ((AdvancedPolicyHolder)o).initialSelectionState(); } }; return new FilteringIterator(allItems, iteratorFilter); } protected ListValueModel buildAdvancedPolicyListModel(List itemList) { return new SortedListValueModelAdapter(new ReadOnlyListValueModel(itemList), buildAdvancedPolicyComparator()); } private CellRendererAdapter buildAdvancedPropertiesCellRenderer() { return new AbstractCellRendererAdapter() { public String buildText(Object value) { return ((AdvancedPolicyHolder) value).displayString(); } }; } private Comparator buildAdvancedPolicyComparator() { return new Comparator() { public int compare(Object o1, Object o2) { return Collator.getInstance().compare(((AdvancedPolicyHolder) o1).displayString(), ((AdvancedPolicyHolder) o2).displayString()); } }; } protected interface AdvancedPolicyHolder { public void addToSelectedNodes(); public void removeFromSelectedNodes(); public boolean initialSelectionState(); public String displayString(); } //TODO Hackable??? This needs to be removed private class HackableListDataListener implements ListDataListener { public void contentsChanged(ListDataEvent e) { } public void intervalAdded(ListDataEvent e) { } public void intervalRemoved(ListDataEvent e) { } } private class CopyingPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (!mappingDescriptor.getCopyPolicy().isActive()) { mappingDescriptor.addCopyPolicy(); } } } public void removeFromSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (mappingDescriptor.getCopyPolicy().isActive()) { mappingDescriptor.removeCopyPolicy(); } } } public boolean initialSelectionState() { ApplicationNode[] selectedNodes = selectedNodes(); boolean isSelected = true; for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); isSelected &= mappingDescriptor.getCopyPolicy().isActive(); } return isSelected; } public String displayString() { return getResourceString("COPY_POLICY_MAPPING_DESCRIPTOR_ACTION"); } } private class AfterLoadingPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (!mappingDescriptor.getAfterLoadingPolicy().isActive()) { mappingDescriptor.addAfterLoadingPolicy(); } } } public void removeFromSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (mappingDescriptor.getAfterLoadingPolicy().isActive()) { mappingDescriptor.removeAfterLoadingPolicy(); } } } public boolean initialSelectionState() { ApplicationNode[] selectedNodes = selectedNodes(); boolean isSelected = true; for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); isSelected &= mappingDescriptor.getAfterLoadingPolicy().isActive(); } return isSelected; } public String displayString() { return getResourceString("AFTER_LOAD_POLICY_MAPPING_DESCRIPTOR_ACTION"); } } private class InheritencePolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (!mappingDescriptor.getInheritancePolicy().isActive()) { mappingDescriptor.addInheritancePolicy(); } } } public void removeFromSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (mappingDescriptor.getInheritancePolicy().isActive()) { mappingDescriptor.removeInheritancePolicy(); } } } public boolean initialSelectionState() { ApplicationNode[] selectedNodes = selectedNodes(); boolean isSelected = true; for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); isSelected &= mappingDescriptor.getInheritancePolicy().isActive(); } return isSelected; } public String displayString() { return getResourceString("INHERITANCE_POLICY_MAPPING_DESCRIPTOR_ACTION"); } } private class InstantiationPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (!mappingDescriptor.getInstantiationPolicy().isActive()) { mappingDescriptor.addInstantiationPolicy(); } } } public void removeFromSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (mappingDescriptor.getInstantiationPolicy().isActive()) { mappingDescriptor.removeInstantiationPolicy(); } } } public boolean initialSelectionState() { ApplicationNode[] selectedNodes = selectedNodes(); boolean isSelected = true; for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); isSelected &= mappingDescriptor.getInstantiationPolicy().isActive(); } return isSelected; } public String displayString() { return getResourceString("INSTANTIATION_POLICY_MAPPING_DESCRIPTOR_ACTION"); } } public class EventsPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (!mappingDescriptor.getEventsPolicy().isActive()) { mappingDescriptor.addEventsPolicy(); } } } public void removeFromSelectedNodes() { ApplicationNode[] selectedNodes = selectedNodes(); for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); if (mappingDescriptor.getEventsPolicy().isActive()) { mappingDescriptor.removeEventsPolicy(); } } } public boolean initialSelectionState() { ApplicationNode[] selectedNodes = selectedNodes(); boolean isSelected = true; for (int i = 0; i < selectedNodes.length; i++) { MappingDescriptorNode descNode = (MappingDescriptorNode)selectedNodes[i]; MWMappingDescriptor mappingDescriptor = descNode.getMappingDescriptor(); isSelected &= mappingDescriptor.getEventsPolicy().isActive(); } return isSelected; } public String displayString() { return getResourceString("EVENTS_POLICY_MAPPING_DESCRIPTOR_ACTION"); } } private class InterfaceAliasPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode )selection[i]; MWInterfaceAliasDescriptor desc = (MWInterfaceAliasDescriptor)node.getDescriptor(); if (!desc.getInterfaceAliasPolicy().isActive()) { desc.addInterfaceAliasPolicy(); } } } public boolean initialSelectionState() { boolean isSelected = true; ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode)selection[i]; isSelected &= ((MWInterfaceAliasDescriptor)node.getDescriptor()).getInterfaceAliasPolicy().isActive(); } return isSelected; } public void removeFromSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode )selection[i]; MWInterfaceAliasDescriptor desc = (MWInterfaceAliasDescriptor)node.getDescriptor(); if (desc.getInterfaceAliasPolicy().isActive()) { desc.removeInterfaceAliasPolicy(); } } } public String displayString() { return getResourceString("INTERFACE_ALIAS_ACTION"); } } private class MultiTableInfoPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode )selection[i]; MWTableDescriptor desc = (MWTableDescriptor)node.getDescriptor(); if (!desc.getMultiTableInfoPolicy().isActive()) { desc.addMultiTableInfoPolicy(); } } } public boolean initialSelectionState() { boolean isSelected = true; ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { TableDescriptorNode node = (TableDescriptorNode )selection[i]; isSelected &= ((MWTableDescriptor)node.getDescriptor()).getMultiTableInfoPolicy().isActive(); } return isSelected; } public void removeFromSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode )selection[i]; MWTableDescriptor desc = (MWTableDescriptor)node.getDescriptor(); if (desc.getMultiTableInfoPolicy().isActive()) { desc.removeMultiTableInfoPolicy(); } } } public String displayString() { return getResourceString("MULTI_TABLE_INFO_ACTION"); } } private class ReturningPolicyHolder implements AdvancedPolicyHolder { public void addToSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode) selection[i]; MWTransactionalDescriptor desc = (MWTransactionalDescriptor) node.getDescriptor(); if (!desc.getReturningPolicy().isActive()) { JOptionPane.showMessageDialog( getWorkbenchContext().getCurrentWindow(), getResourceString("NATIVE_RETURNING_NOT_SUPPORTED_ON_PLATFORM"), getResourceString("NATIVE_RETURNING_NOT_SUPPORTED_ON_PLATFORM_TITLE"), JOptionPane.INFORMATION_MESSAGE); desc.addReturningPolicy(); } } } public boolean initialSelectionState() { boolean isSelected = true; ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode) selection[i]; isSelected &= ((MWTransactionalDescriptor) node.getDescriptor()).getReturningPolicy().isActive(); } return isSelected; } public void removeFromSelectedNodes() { ApplicationNode[] selection = selectedNodes(); for (int i = 0; i < selection.length; i++) { MappingDescriptorNode node = (MappingDescriptorNode )selection[i]; MWTransactionalDescriptor desc = (MWTransactionalDescriptor) node.getDescriptor(); if (desc.getReturningPolicy().isActive()) { desc.removeReturningPolicy(); } } } public String displayString() { return getResourceString("RETURNING_ACTION"); } } }