diff options
author | Sebastien Gabel | 2014-09-26 13:05:12 +0000 |
---|---|---|
committer | Sebastien Gabel | 2014-09-26 13:05:12 +0000 |
commit | e297a370a5f247a1bcc6e69103c450e07593b678 (patch) | |
tree | 485d65bfa9fe775d6c03cc849d5392f372032990 /plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src | |
parent | 7fab913ec9f16b7b02a36c6d2f3e6645735a984c (diff) | |
download | org.eclipse.papyrus-e297a370a5f247a1bcc6e69103c450e07593b678.tar.gz org.eclipse.papyrus-e297a370a5f247a1bcc6e69103c450e07593b678.tar.xz org.eclipse.papyrus-e297a370a5f247a1bcc6e69103c450e07593b678.zip |
Bug 438931 - [ModelExplorer][EMF Facet] Non deterministic order of the facet references defined in custom file
Consist in using List implementations instead of Set.
Change-Id: I382e99f09ae713882f600ab70de7fc9ab3eaaad6
Signed-off-by: Sebastien Gabel <sebastien.gabel@esterel-technologies.com>
Diffstat (limited to 'plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src')
-rw-r--r-- | plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src/org/eclipse/papyrus/emf/facet/custom/ui/internal/CustomizedTreeContentProvider.java | 1012 |
1 files changed, 506 insertions, 506 deletions
diff --git a/plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src/org/eclipse/papyrus/emf/facet/custom/ui/internal/CustomizedTreeContentProvider.java b/plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src/org/eclipse/papyrus/emf/facet/custom/ui/internal/CustomizedTreeContentProvider.java index c5a96e72e83..ead389ac0df 100644 --- a/plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src/org/eclipse/papyrus/emf/facet/custom/ui/internal/CustomizedTreeContentProvider.java +++ b/plugins/facet/org.eclipse.papyrus.emf.facet.custom.ui/src/org/eclipse/papyrus/emf/facet/custom/ui/internal/CustomizedTreeContentProvider.java @@ -1,507 +1,507 @@ -/*******************************************************************************
- * Copyright (c) 2012, 2014 Mia-Software, CEA, and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Nicolas Bros (Mia-Software) - Bug 379683 - customizable Tree content provider
- * Gregoire Dupe (Mia-Software) - Bug 385292 - [CustomizedTreeContentProvider] StackOverFlow when refreshing a TreeViewer with ICustomizedTreeContentProvider
- * Gregoire Dupe (Mia-Software) - Bug 386387 - [CustomizedTreeContentProvider] The TreeElements are not preserved between two calls to getElements()
- * Christian W. Damus (CEA) - bug 430700
- * Christian W. Damus (CEA) - bug 440795
- * Christian W. Damus (CEA) - bug 441857
- *
- *******************************************************************************/
-package org.eclipse.papyrus.emf.facet.custom.ui.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.ETypedElement;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.papyrus.emf.facet.custom.core.ICustomizationManager;
-import org.eclipse.papyrus.emf.facet.custom.core.exception.CustomizationException;
-import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EAttributeTreeElement;
-import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement;
-import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EReferenceTreeElement;
-import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeElement;
-import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeproxyFactory;
-import org.eclipse.papyrus.emf.facet.custom.ui.IContentPropertiesHandler;
-import org.eclipse.papyrus.emf.facet.custom.ui.IContentPropertiesHandlerFactory;
-import org.eclipse.papyrus.emf.facet.custom.ui.ICustomizedContentProvider;
-import org.eclipse.papyrus.emf.facet.custom.ui.ICustomizedTreeContentProvider;
-import org.eclipse.papyrus.emf.facet.efacet.core.FacetUtils;
-import org.eclipse.papyrus.emf.facet.efacet.core.IFacetManager;
-import org.eclipse.papyrus.emf.facet.efacet.core.exception.FacetManagerException;
-import org.eclipse.papyrus.emf.facet.util.core.Logger;
-
-@SuppressWarnings("deprecation")
-// @SuppressWarnings("deprecation") : Bug 380229 - [deprecated] ICustomizedContentProvider
-public class CustomizedTreeContentProvider implements ICustomizedTreeContentProvider, ICustomizedContentProvider {
-
- private final ICustomizationManager customManager;
- private final IContentPropertiesHandler contentHandler;
- private Object[] rootElements;
-
- private final Map<EObjectCacheElement, TreeElement> cache;
-
- private class EObjectCacheElement {
-
- // Not null
- private final EObject element;
-
- // May be null
- private final TreeElement parent;
-
- public EObjectCacheElement(EObject element, TreeElement parent) {
- this.element = element;
- this.parent = parent;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + getOuterType().hashCode();
- result = prime * result + ((element == null) ? 0 : element.hashCode());
- result = prime * result + ((parent == null) ? 0 : parent.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (!(obj instanceof EObjectCacheElement)) {
- return false;
- }
- EObjectCacheElement other = (EObjectCacheElement) obj;
- if (!getOuterType().equals(other.getOuterType())) {
- return false;
- }
- if (element == null) {
- if (other.element != null) {
- return false;
- }
- } else if (!element.equals(other.element)) {
- return false;
- }
- if (parent == null) {
- if (other.parent != null) {
- return false;
- }
- } else if (!parent.equals(other.parent)) {
- return false;
- }
- return true;
- }
-
- private CustomizedTreeContentProvider getOuterType() {
- return CustomizedTreeContentProvider.this;
- }
- }
-
- public CustomizedTreeContentProvider(final ICustomizationManager customManager) {
- this.customManager = customManager;
- this.contentHandler = IContentPropertiesHandlerFactory.DEFAULT.createIContentPropertiesHandler(customManager);
- this.cache = new HashMap<EObjectCacheElement, TreeElement>();
- }
-
- protected Object[] getRootElements(final Object inputElement) {
- Object[] result;
- if (inputElement == null) {
- result = new Object[0];
- } else if (inputElement instanceof EObject) {
- result = new EObject[] { (EObject) inputElement };
- } else if (inputElement instanceof Collection<?>) {
- result = ((Collection<?>) inputElement).toArray();
- } else if (inputElement instanceof EObject[]) {
- result = (EObject[]) inputElement;
- } else {
- throw new IllegalArgumentException("Unhandled input element type: " + inputElement.getClass().getSimpleName()); //$NON-NLS-1$
- }
- return result;
- }
-
- public Object[] getElements(final Object inputElement) {
- // Reconcile the (possibly changed) list of root elements with our tree element proxies
-
- final Object[] elements = getRootElements(inputElement);
- final List<Object> elementList = new ArrayList<Object>();
-
- // Index the existing elements
- final Map<Object, Object> index = new IdentityHashMap<Object, Object>(elements.length + 1);
- if (this.rootElements != null) {
- for (Object next : this.rootElements) {
- if (next instanceof EObjectTreeElement) {
- // Maps to its tree-element proxy
- index.put(((EObjectTreeElement) next).getEObject(), next);
- } else {
- // Maps to itself
- index.put(next, next);
- }
- }
- }
-
- for (final Object element : elements) {
- if (!isVisible(element, null)) {
- continue;
- }
-
- Object existing = index.get(element);
- if (existing != null) {
- // Just add it
- elementList.add(existing);
- } else if (element instanceof EObject) {
- final EObjectTreeElement eObjectProxy = getEObjectProxy(element, null);
- elementList.add(eObjectProxy);
- } else {
- elementList.add(element);
- }
- }
-
- this.rootElements = elementList.toArray();
- return this.rootElements;
- }
-
- protected static EObjectTreeElement createEObjectProxy(final Object element, final TreeElement parent) {
- final EObject eObject = (EObject) element;
- final EObjectTreeElement eObjectProxy = TreeproxyFactory.eINSTANCE.createEObjectTreeElement();
- eObjectProxy.setEObject(eObject);
- eObjectProxy.setParent(parent);
- return eObjectProxy;
- }
-
- public Object[] getChildren(final Object parentElement) {
- Object[] result;
- if (parentElement == null) {
- result = new Object[0];
- } else if (parentElement instanceof EObjectTreeElement) {
- final EObjectTreeElement eObjectProxy = (EObjectTreeElement) parentElement;
- result = getChildren(eObjectProxy);
- } else if (parentElement instanceof EAttributeTreeElement) {
- final EAttributeTreeElement attributeProxy = (EAttributeTreeElement) parentElement;
- result = getChildren(attributeProxy);
- } else if (parentElement instanceof EReferenceTreeElement) {
- final EReferenceTreeElement referenceProxy = (EReferenceTreeElement) parentElement;
- result = getChildren(referenceProxy);
- } else {
- Logger.logError("Unknown element in tree: " + parentElement.getClass(), Activator.getDefault()); //$NON-NLS-1$
- result = new Object[0];
- }
- return result;
- }
-
- public Object[] getChildren(final EObjectTreeElement treeElement) {
- Set<EStructuralFeature> facetFeatures;
- try {
- facetFeatures = FacetUtils.getETypedElements(treeElement.getEObject(), EStructuralFeature.class, customManager.getFacetManager());
- } catch (FacetManagerException e) {
- facetFeatures = Collections.emptySet();
- Logger.logError(e, Activator.getDefault());
- }
-
- final ArrayList<Object> children = new ArrayList<Object>();
- createAttributes(treeElement, facetFeatures, children);
- createReferences(treeElement, facetFeatures, children);
- return children.toArray();
- }
-
- public Object[] getChildren(final EAttributeTreeElement attributeProxy) {
- final List<Object> children = new ArrayList<Object>();
- final EAttribute eAttribute = attributeProxy.getEAttribute();
- if (eAttribute.isMany()) {
- final TreeElement parent = attributeProxy.getParent();
- if (!(parent instanceof EObjectTreeElement)) {
- throw new IllegalStateException("An attribute should appear only under a model element"); //$NON-NLS-1$
- }
- final EObjectTreeElement parentProxy = (EObjectTreeElement) parent;
- final EObject eObject = parentProxy.getEObject();
-
- try {
- final IFacetManager facetManager = this.customManager.getFacetManager();
- final List<Object> result = facetManager.getOrInvokeMultiValued(eObject, eAttribute, null);
- for (final Object object : result) {
- if (object instanceof EObject) {
- final EObject childEObject = (EObject) object;
- children.add(getEObjectProxy(childEObject, attributeProxy));
- }
- children.add(object);
- }
- } catch (final FacetManagerException e) {
- Logger.logError(e, Activator.getDefault());
- }
- }
- return children.toArray();
- }
-
- public Object[] getChildren(final EReferenceTreeElement referenceProxy) {
- List<? extends Object> result;
- final EReference eReference = referenceProxy.getEReference();
- final TreeElement parent = referenceProxy.getParent();
- if (!(parent instanceof EObjectTreeElement)) {
- throw new IllegalStateException("A reference should appear only under a model element"); //$NON-NLS-1$
- }
- final EObjectTreeElement parentProxy = (EObjectTreeElement) parent;
- final EObject eObject = parentProxy.getEObject();
- if (eReference.isMany()) {
- result = getMultiValuedReferenceChildren(eReference, eObject, referenceProxy);
- } else {
- final Object child = getSingleValuedReferenceChild(eReference, eObject, referenceProxy);
- if (child == null) {
- result = Collections.emptyList();
- } else {
- result = Collections.singletonList(child);
- }
- }
- return result.toArray();
- }
-
- private TreeElement getSingleValuedReferenceChild(final EReference eReference,
- final EObject eObject, final EReferenceTreeElement parent) {
- TreeElement child = null;
- if (parent.getReferedEObjectTE() == null || parent.getReferedEObjectTE().size() == 0) {
- try {
- final IFacetManager facetManager = this.customManager
- .getFacetManager();
- final EObject referedEObject = facetManager.getOrInvoke(
- eObject, eReference, EObject.class);
- if (referedEObject != null) {
- child = getEObjectProxy(referedEObject, parent);
- }
- } catch (final FacetManagerException e) {
- Logger.logError(e, Activator.getDefault());
- }
- } else {
- child = parent.getReferedEObjectTE().get(0);
- }
- return child;
- }
-
- private List<EObjectTreeElement> getMultiValuedReferenceChildren(
- final EReference eReference, final EObject eObject,
- final EReferenceTreeElement parent) {
- List<EObjectTreeElement> children = new ArrayList<EObjectTreeElement>();
- if (parent.getReferedEObjectTE() == null || parent.getReferedEObjectTE().size() == 0) {
- try {
- final IFacetManager facetManager = this.customManager
- .getFacetManager();
- final List<Object> result = facetManager
- .getOrInvokeMultiValued(eObject, eReference, null);
- for (final Object object : result) {
- if (object instanceof EObject) {
- final EObject childEObject = (EObject) object;
- children.add(getEObjectProxy(childEObject, parent));
- }
- }
- } catch (final FacetManagerException e) {
- Logger.logError(e, Activator.getDefault());
- }
- } else {
- children = parent.getReferedEObjectTE();
- }
- return children;
- }
-
- public Object getParent(final Object element) {
- Object result = null;
- if (element instanceof TreeElement) {
- final TreeElement treeElement = (TreeElement) element;
- result = treeElement.getParent();
- }
- return result;
- }
-
- public boolean hasChildren(final Object element) {
- return getChildren(element).length > 0;
- }
-
-
-
- public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
- if (oldInput != newInput) {
- cache.clear();
- }
- }
-
- public ICustomizationManager getCustomizationManager() {
- return this.customManager;
- }
-
- public boolean isVisible(final Object object, final ETypedElement eTypedElement) {
- Boolean result = Boolean.TRUE;
- if (object instanceof EObject) {
- final EObject eObject = (EObject) object;
- try {
- result = this.customManager.getCustomValueOf(eObject, eTypedElement, this.contentHandler.getIsVisible(), Boolean.class);
- } catch (final CustomizationException e) {
- Logger.logError(e, Activator.getDefault());
- }
- }
- return result.booleanValue();
- }
-
- private boolean collapseLink(final Object object, final EReference eTypedElement) {
- Boolean result = Boolean.TRUE;
- if (object instanceof EObject) {
- final EObject eObject = (EObject) object;
- try {
- result = this.customManager.getCustomValueOf(eObject, eTypedElement, this.contentHandler.getCollapseLink(), Boolean.class);
- } catch (final CustomizationException e) {
- Logger.logError(e, Activator.getDefault());
- }
- }
- return result.booleanValue();
- }
-
-
-
- private void createReferences(final EObjectTreeElement treeElement, Collection<EStructuralFeature> facetFeatures, Collection<Object> children) {
- final EObject eObject = treeElement.getEObject();
-
- for (EReference next : eObject.eClass().getEAllReferences()) {
- createReference(treeElement, eObject, next, children);
- }
- for (EStructuralFeature next : facetFeatures) {
- if (next instanceof EReference) {
- createReference(treeElement, eObject, (EReference) next, children);
- }
- }
- }
-
- private void createReference(EObjectTreeElement treeElement, EObject eObject, EReference eReference, Collection<Object> children) {
- if (isVisible(eObject, eReference)) {
- if (collapseLink(eObject, eReference)) {
- if (eReference.getUpperBound() != 1) {
- collectMultiValuedReferenceChildren(eReference, eObject, treeElement, children);
- } else {
- Object child = getSingleValuedReferenceChild(eReference, eObject, treeElement);
- if (child != null) {
- children.add(child);
- }
- }
- } else {
- children.add(getEReferenceProxy(eReference, treeElement));
- }
- }
- }
-
- private void createAttributes(final EObjectTreeElement treeElement, Collection<EStructuralFeature> facetFeatures, Collection<? super TreeElement> children) {
- final EObject eObject = treeElement.getEObject();
-
- for (EAttribute next : eObject.eClass().getEAllAttributes()) {
- createAttribute(treeElement, eObject, next, children);
- }
- for (EStructuralFeature next : facetFeatures) {
- if (next instanceof EAttribute) {
- createAttribute(treeElement, eObject, (EAttribute) next, children);
- }
- }
- }
-
- private void createAttribute(EObjectTreeElement treeElement, EObject eObject, EAttribute eAttribute, Collection<? super TreeElement> children) {
- if (isVisible(eObject, eAttribute)) {
- TreeElement eAttributeTreeElement = getEAttributeProxy(eAttribute, treeElement);
- if (eAttributeTreeElement != null) {
- children.add(eAttributeTreeElement);
- }
- }
- }
-
-
- private EReferenceTreeElement createReferenceProxy(final EReference reference, final EObjectTreeElement parent) {
- final EObject eObject = parent.getEObject();
- if (isVisible(eObject, reference)) {
- final EReferenceTreeElement referenceProxy = TreeproxyFactory.eINSTANCE.createEReferenceTreeElement();
- referenceProxy.setEReference(reference);
- referenceProxy.setParent(parent);
- return referenceProxy;
- }
- return null;
- }
-
- private EAttributeTreeElement createAttributeProxy(final EAttribute attribute, final EObjectTreeElement parent) {
- final EObject eObject = parent.getEObject();
- if (isVisible(eObject, attribute)) {
- final EAttributeTreeElement attributeProxy = TreeproxyFactory.eINSTANCE.createEAttributeTreeElement();
- attributeProxy.setEAttribute(attribute);
- attributeProxy.setParent(parent);
- return attributeProxy;
- }
- return null;
- }
-
- private Object getSingleValuedReferenceChild(final EReference eReference, final EObject eObject, final TreeElement parent) {
- Object child = null;
- try {
- final IFacetManager facetManager = this.customManager.getFacetManager();
- final Object result = facetManager.getOrInvoke(eObject, eReference, null);
- if (result instanceof EObject) {
- final EObject childEObject = (EObject) result;
- child = getEObjectProxy(childEObject, parent);
- }
- } catch (final FacetManagerException e) {
- Logger.logError(e, Activator.getDefault());
- }
- return child;
- }
-
- private void collectMultiValuedReferenceChildren(final EReference eReference, final EObject eObject, final TreeElement parent, Collection<Object> children) {
- try {
- final IFacetManager facetManager = this.customManager.getFacetManager();
- final List<Object> result = facetManager.getOrInvokeMultiValued(eObject, eReference, null);
- for (final Object object : result) {
- if (object instanceof EObject) {
- final EObject childEObject = (EObject) object;
- children.add(getEObjectProxy(childEObject, parent));
- }
- }
- } catch (final FacetManagerException e) {
- Logger.logError(e, Activator.getDefault());
- }
- }
-
- protected EObjectTreeElement getEObjectProxy(final Object element, final TreeElement parent) {
- EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent);
- if (!(cache.containsKey(cacheElement))) {
- cache.put(cacheElement, createEObjectProxy(element, parent));
- }
- return (EObjectTreeElement) cache.get(cacheElement);
- }
-
- protected EAttributeTreeElement getEAttributeProxy(final Object element, final TreeElement parent) {
- EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent);
- if (!(cache.containsKey(cacheElement))) {
- cache.put(cacheElement, createAttributeProxy((EAttribute) element, (EObjectTreeElement) parent));
- }
- return (EAttributeTreeElement) cache.get(cacheElement);
- }
-
- protected EReferenceTreeElement getEReferenceProxy(final Object element, final EObjectTreeElement parent) {
- EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent);
- if (!(cache.containsKey(cacheElement))) {
- cache.put(cacheElement, createReferenceProxy((EReference) element, parent));
- }
- return (EReferenceTreeElement) cache.get(cacheElement);
- }
-
- public void dispose() {
- cache.clear();
- }
+/******************************************************************************* + * Copyright (c) 2012, 2014 Mia-Software, CEA, and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Nicolas Bros (Mia-Software) - Bug 379683 - customizable Tree content provider + * Gregoire Dupe (Mia-Software) - Bug 385292 - [CustomizedTreeContentProvider] StackOverFlow when refreshing a TreeViewer with ICustomizedTreeContentProvider + * Gregoire Dupe (Mia-Software) - Bug 386387 - [CustomizedTreeContentProvider] The TreeElements are not preserved between two calls to getElements() + * Christian W. Damus (CEA) - bug 430700 + * Christian W. Damus (CEA) - bug 440795 + * Christian W. Damus (CEA) - bug 441857 + * Sebastien Gabel (Esterel Technologies) - Bug 438931 - Non deterministic order of the facet references defined in custom file + * + *******************************************************************************/ +package org.eclipse.papyrus.emf.facet.custom.ui.internal; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.ETypedElement; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.papyrus.emf.facet.custom.core.ICustomizationManager; +import org.eclipse.papyrus.emf.facet.custom.core.exception.CustomizationException; +import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EAttributeTreeElement; +import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement; +import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EReferenceTreeElement; +import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeElement; +import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeproxyFactory; +import org.eclipse.papyrus.emf.facet.custom.ui.IContentPropertiesHandler; +import org.eclipse.papyrus.emf.facet.custom.ui.IContentPropertiesHandlerFactory; +import org.eclipse.papyrus.emf.facet.custom.ui.ICustomizedContentProvider; +import org.eclipse.papyrus.emf.facet.custom.ui.ICustomizedTreeContentProvider; +import org.eclipse.papyrus.emf.facet.efacet.core.FacetUtils; +import org.eclipse.papyrus.emf.facet.efacet.core.IFacetManager; +import org.eclipse.papyrus.emf.facet.efacet.core.exception.FacetManagerException; +import org.eclipse.papyrus.emf.facet.util.core.Logger; + +@SuppressWarnings("deprecation") +// @SuppressWarnings("deprecation") : Bug 380229 - [deprecated] ICustomizedContentProvider +public class CustomizedTreeContentProvider implements ICustomizedTreeContentProvider, ICustomizedContentProvider { + + private final ICustomizationManager customManager; + private final IContentPropertiesHandler contentHandler; + private Object[] rootElements; + + private final Map<EObjectCacheElement, TreeElement> cache; + + private class EObjectCacheElement { + + // Not null + private final EObject element; + + // May be null + private final TreeElement parent; + + public EObjectCacheElement(EObject element, TreeElement parent) { + this.element = element; + this.parent = parent; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + result = prime * result + ((element == null) ? 0 : element.hashCode()); + result = prime * result + ((parent == null) ? 0 : parent.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof EObjectCacheElement)) { + return false; + } + EObjectCacheElement other = (EObjectCacheElement) obj; + if (!getOuterType().equals(other.getOuterType())) { + return false; + } + if (element == null) { + if (other.element != null) { + return false; + } + } else if (!element.equals(other.element)) { + return false; + } + if (parent == null) { + if (other.parent != null) { + return false; + } + } else if (!parent.equals(other.parent)) { + return false; + } + return true; + } + + private CustomizedTreeContentProvider getOuterType() { + return CustomizedTreeContentProvider.this; + } + } + + public CustomizedTreeContentProvider(final ICustomizationManager customManager) { + this.customManager = customManager; + this.contentHandler = IContentPropertiesHandlerFactory.DEFAULT.createIContentPropertiesHandler(customManager); + this.cache = new HashMap<EObjectCacheElement, TreeElement>(); + } + + protected Object[] getRootElements(final Object inputElement) { + Object[] result; + if (inputElement == null) { + result = new Object[0]; + } else if (inputElement instanceof EObject) { + result = new EObject[] { (EObject) inputElement }; + } else if (inputElement instanceof Collection<?>) { + result = ((Collection<?>) inputElement).toArray(); + } else if (inputElement instanceof EObject[]) { + result = (EObject[]) inputElement; + } else { + throw new IllegalArgumentException("Unhandled input element type: " + inputElement.getClass().getSimpleName()); //$NON-NLS-1$ + } + return result; + } + + public Object[] getElements(final Object inputElement) { + // Reconcile the (possibly changed) list of root elements with our tree element proxies + + final Object[] elements = getRootElements(inputElement); + final List<Object> elementList = new ArrayList<Object>(); + + // Index the existing elements + final Map<Object, Object> index = new IdentityHashMap<Object, Object>(elements.length + 1); + if (this.rootElements != null) { + for (Object next : this.rootElements) { + if (next instanceof EObjectTreeElement) { + // Maps to its tree-element proxy + index.put(((EObjectTreeElement) next).getEObject(), next); + } else { + // Maps to itself + index.put(next, next); + } + } + } + + for (final Object element : elements) { + if (!isVisible(element, null)) { + continue; + } + + Object existing = index.get(element); + if (existing != null) { + // Just add it + elementList.add(existing); + } else if (element instanceof EObject) { + final EObjectTreeElement eObjectProxy = getEObjectProxy(element, null); + elementList.add(eObjectProxy); + } else { + elementList.add(element); + } + } + + this.rootElements = elementList.toArray(); + return this.rootElements; + } + + protected static EObjectTreeElement createEObjectProxy(final Object element, final TreeElement parent) { + final EObject eObject = (EObject) element; + final EObjectTreeElement eObjectProxy = TreeproxyFactory.eINSTANCE.createEObjectTreeElement(); + eObjectProxy.setEObject(eObject); + eObjectProxy.setParent(parent); + return eObjectProxy; + } + + public Object[] getChildren(final Object parentElement) { + Object[] result; + if (parentElement == null) { + result = new Object[0]; + } else if (parentElement instanceof EObjectTreeElement) { + final EObjectTreeElement eObjectProxy = (EObjectTreeElement) parentElement; + result = getChildren(eObjectProxy); + } else if (parentElement instanceof EAttributeTreeElement) { + final EAttributeTreeElement attributeProxy = (EAttributeTreeElement) parentElement; + result = getChildren(attributeProxy); + } else if (parentElement instanceof EReferenceTreeElement) { + final EReferenceTreeElement referenceProxy = (EReferenceTreeElement) parentElement; + result = getChildren(referenceProxy); + } else { + Logger.logError("Unknown element in tree: " + parentElement.getClass(), Activator.getDefault()); //$NON-NLS-1$ + result = new Object[0]; + } + return result; + } + + public Object[] getChildren(final EObjectTreeElement treeElement) { + Collection<EStructuralFeature> facetFeatures; + try { + facetFeatures = FacetUtils.getETypedElements(treeElement.getEObject(), EStructuralFeature.class, customManager.getFacetManager()); + } catch (FacetManagerException e) { + facetFeatures = Collections.emptyList(); + Logger.logError(e, Activator.getDefault()); + } + + final Collection<Object> children = new ArrayList<Object>(); + createAttributes(treeElement, facetFeatures, children); + createReferences(treeElement, facetFeatures, children); + return children.toArray(); + } + + public Object[] getChildren(final EAttributeTreeElement attributeProxy) { + final List<Object> children = new ArrayList<Object>(); + final EAttribute eAttribute = attributeProxy.getEAttribute(); + if (eAttribute.isMany()) { + final TreeElement parent = attributeProxy.getParent(); + if (!(parent instanceof EObjectTreeElement)) { + throw new IllegalStateException("An attribute should appear only under a model element"); //$NON-NLS-1$ + } + final EObjectTreeElement parentProxy = (EObjectTreeElement) parent; + final EObject eObject = parentProxy.getEObject(); + + try { + final IFacetManager facetManager = this.customManager.getFacetManager(); + final List<Object> result = facetManager.getOrInvokeMultiValued(eObject, eAttribute, null); + for (final Object object : result) { + if (object instanceof EObject) { + final EObject childEObject = (EObject) object; + children.add(getEObjectProxy(childEObject, attributeProxy)); + } + children.add(object); + } + } catch (final FacetManagerException e) { + Logger.logError(e, Activator.getDefault()); + } + } + return children.toArray(); + } + + public Object[] getChildren(final EReferenceTreeElement referenceProxy) { + List<? extends Object> result; + final EReference eReference = referenceProxy.getEReference(); + final TreeElement parent = referenceProxy.getParent(); + if (!(parent instanceof EObjectTreeElement)) { + throw new IllegalStateException("A reference should appear only under a model element"); //$NON-NLS-1$ + } + final EObjectTreeElement parentProxy = (EObjectTreeElement) parent; + final EObject eObject = parentProxy.getEObject(); + if (eReference.isMany()) { + result = getMultiValuedReferenceChildren(eReference, eObject, referenceProxy); + } else { + final Object child = getSingleValuedReferenceChild(eReference, eObject, referenceProxy); + if (child == null) { + result = Collections.emptyList(); + } else { + result = Collections.singletonList(child); + } + } + return result.toArray(); + } + + private TreeElement getSingleValuedReferenceChild(final EReference eReference, + final EObject eObject, final EReferenceTreeElement parent) { + TreeElement child = null; + if (parent.getReferedEObjectTE() == null || parent.getReferedEObjectTE().size() == 0) { + try { + final IFacetManager facetManager = this.customManager + .getFacetManager(); + final EObject referedEObject = facetManager.getOrInvoke( + eObject, eReference, EObject.class); + if (referedEObject != null) { + child = getEObjectProxy(referedEObject, parent); + } + } catch (final FacetManagerException e) { + Logger.logError(e, Activator.getDefault()); + } + } else { + child = parent.getReferedEObjectTE().get(0); + } + return child; + } + + private List<EObjectTreeElement> getMultiValuedReferenceChildren( + final EReference eReference, final EObject eObject, + final EReferenceTreeElement parent) { + List<EObjectTreeElement> children = new ArrayList<EObjectTreeElement>(); + if (parent.getReferedEObjectTE() == null || parent.getReferedEObjectTE().size() == 0) { + try { + final IFacetManager facetManager = this.customManager + .getFacetManager(); + final List<Object> result = facetManager + .getOrInvokeMultiValued(eObject, eReference, null); + for (final Object object : result) { + if (object instanceof EObject) { + final EObject childEObject = (EObject) object; + children.add(getEObjectProxy(childEObject, parent)); + } + } + } catch (final FacetManagerException e) { + Logger.logError(e, Activator.getDefault()); + } + } else { + children = parent.getReferedEObjectTE(); + } + return children; + } + + public Object getParent(final Object element) { + Object result = null; + if (element instanceof TreeElement) { + final TreeElement treeElement = (TreeElement) element; + result = treeElement.getParent(); + } + return result; + } + + public boolean hasChildren(final Object element) { + return getChildren(element).length > 0; + } + + + + public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { + if (oldInput != newInput) { + cache.clear(); + } + } + + public ICustomizationManager getCustomizationManager() { + return this.customManager; + } + + public boolean isVisible(final Object object, final ETypedElement eTypedElement) { + Boolean result = Boolean.TRUE; + if (object instanceof EObject) { + final EObject eObject = (EObject) object; + try { + result = this.customManager.getCustomValueOf(eObject, eTypedElement, this.contentHandler.getIsVisible(), Boolean.class); + } catch (final CustomizationException e) { + Logger.logError(e, Activator.getDefault()); + } + } + return result.booleanValue(); + } + + private boolean collapseLink(final Object object, final EReference eTypedElement) { + Boolean result = Boolean.TRUE; + if (object instanceof EObject) { + final EObject eObject = (EObject) object; + try { + result = this.customManager.getCustomValueOf(eObject, eTypedElement, this.contentHandler.getCollapseLink(), Boolean.class); + } catch (final CustomizationException e) { + Logger.logError(e, Activator.getDefault()); + } + } + return result.booleanValue(); + } + + + + private void createReferences(final EObjectTreeElement treeElement, Collection<EStructuralFeature> facetFeatures, Collection<Object> children) { + final EObject eObject = treeElement.getEObject(); + + for (EReference next : eObject.eClass().getEAllReferences()) { + createReference(treeElement, eObject, next, children); + } + for (EStructuralFeature next : facetFeatures) { + if (next instanceof EReference) { + createReference(treeElement, eObject, (EReference) next, children); + } + } + } + + private void createReference(EObjectTreeElement treeElement, EObject eObject, EReference eReference, Collection<Object> children) { + if (isVisible(eObject, eReference)) { + if (collapseLink(eObject, eReference)) { + if (eReference.getUpperBound() != 1) { + collectMultiValuedReferenceChildren(eReference, eObject, treeElement, children); + } else { + Object child = getSingleValuedReferenceChild(eReference, eObject, treeElement); + if (child != null) { + children.add(child); + } + } + } else { + children.add(getEReferenceProxy(eReference, treeElement)); + } + } + } + + private void createAttributes(final EObjectTreeElement treeElement, Collection<EStructuralFeature> facetFeatures, Collection<? super TreeElement> children) { + final EObject eObject = treeElement.getEObject(); + + for (EAttribute next : eObject.eClass().getEAllAttributes()) { + createAttribute(treeElement, eObject, next, children); + } + for (EStructuralFeature next : facetFeatures) { + if (next instanceof EAttribute) { + createAttribute(treeElement, eObject, (EAttribute) next, children); + } + } + } + + private void createAttribute(EObjectTreeElement treeElement, EObject eObject, EAttribute eAttribute, Collection<? super TreeElement> children) { + if (isVisible(eObject, eAttribute)) { + TreeElement eAttributeTreeElement = getEAttributeProxy(eAttribute, treeElement); + if (eAttributeTreeElement != null) { + children.add(eAttributeTreeElement); + } + } + } + + + private EReferenceTreeElement createReferenceProxy(final EReference reference, final EObjectTreeElement parent) { + final EObject eObject = parent.getEObject(); + if (isVisible(eObject, reference)) { + final EReferenceTreeElement referenceProxy = TreeproxyFactory.eINSTANCE.createEReferenceTreeElement(); + referenceProxy.setEReference(reference); + referenceProxy.setParent(parent); + return referenceProxy; + } + return null; + } + + private EAttributeTreeElement createAttributeProxy(final EAttribute attribute, final EObjectTreeElement parent) { + final EObject eObject = parent.getEObject(); + if (isVisible(eObject, attribute)) { + final EAttributeTreeElement attributeProxy = TreeproxyFactory.eINSTANCE.createEAttributeTreeElement(); + attributeProxy.setEAttribute(attribute); + attributeProxy.setParent(parent); + return attributeProxy; + } + return null; + } + + private Object getSingleValuedReferenceChild(final EReference eReference, final EObject eObject, final TreeElement parent) { + Object child = null; + try { + final IFacetManager facetManager = this.customManager.getFacetManager(); + final Object result = facetManager.getOrInvoke(eObject, eReference, null); + if (result instanceof EObject) { + final EObject childEObject = (EObject) result; + child = getEObjectProxy(childEObject, parent); + } + } catch (final FacetManagerException e) { + Logger.logError(e, Activator.getDefault()); + } + return child; + } + + private void collectMultiValuedReferenceChildren(final EReference eReference, final EObject eObject, final TreeElement parent, Collection<Object> children) { + try { + final IFacetManager facetManager = this.customManager.getFacetManager(); + final List<Object> result = facetManager.getOrInvokeMultiValued(eObject, eReference, null); + for (final Object object : result) { + if (object instanceof EObject) { + final EObject childEObject = (EObject) object; + children.add(getEObjectProxy(childEObject, parent)); + } + } + } catch (final FacetManagerException e) { + Logger.logError(e, Activator.getDefault()); + } + } + + protected EObjectTreeElement getEObjectProxy(final Object element, final TreeElement parent) { + EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent); + if (!(cache.containsKey(cacheElement))) { + cache.put(cacheElement, createEObjectProxy(element, parent)); + } + return (EObjectTreeElement) cache.get(cacheElement); + } + + protected EAttributeTreeElement getEAttributeProxy(final Object element, final TreeElement parent) { + EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent); + if (!(cache.containsKey(cacheElement))) { + cache.put(cacheElement, createAttributeProxy((EAttribute) element, (EObjectTreeElement) parent)); + } + return (EAttributeTreeElement) cache.get(cacheElement); + } + + protected EReferenceTreeElement getEReferenceProxy(final Object element, final EObjectTreeElement parent) { + EObjectCacheElement cacheElement = new EObjectCacheElement((EObject) element, parent); + if (!(cache.containsKey(cacheElement))) { + cache.put(cacheElement, createReferenceProxy((EReference) element, parent)); + } + return (EReferenceTreeElement) cache.get(cacheElement); + } + + public void dispose() { + cache.clear(); + } }
\ No newline at end of file |