/*
* Copyright (c) 2006 Borland Software Corporation
*
* 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:
* Michael Golubev (Borland) - initial API and implementation
* Tatiana Fesenko (Borland) - initial API and implementation
*/
package org.eclipse.uml2.diagram.common.parser;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.PackageableElement;
public class ElementProvider {
private final SortedMap<String, NamedElement> myNamesMap;
private final SortedSet<String> myCaseInsensitiveNames;
private final SortedSet<String> myCaseInsensitiveNamesRO;
private ResourceSet myResourceSet;
private EObject myContext;
private boolean myIsCaching;
public ElementProvider() {
this(false);
}
public ElementProvider(boolean isCaching) {
myIsCaching = isCaching;
myNamesMap = new TreeMap<String, NamedElement>();
myCaseInsensitiveNames = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
myCaseInsensitiveNamesRO = Collections.unmodifiableSortedSet(myCaseInsensitiveNames);
}
public Iterable<NamedElement> getElements(EObject eObject) {
setContext(eObject);
return myNamesMap.values();
}
public SortedSet<String> getElementNames(EObject eObject) {
setContext(eObject);
return myCaseInsensitiveNamesRO;
}
public NamedElement findElement(EObject context, String name) {
setContext(context);
return myNamesMap.get(name.trim());
}
protected void setContext(EObject context) {
myContext = context;
ResourceSet resourceSet = context.eResource().getResourceSet();
if (myIsCaching && myResourceSet != null && myResourceSet.equals(resourceSet) && !moreResourcesWereLoaded(resourceSet)) {
return;
}
myNamesMap.clear();
myCaseInsensitiveNames.clear();
myResourceSet = resourceSet;
for (NamedElement element : loadAllElements(resourceSet)) {
String displayName = getDisplayProposal(element);
if (displayName == null) {
continue;
}
myCaseInsensitiveNames.add(displayName);
myNamesMap.put(displayName, element);
}
}
protected String getDisplayProposal(NamedElement element) {
return element.getName();
}
protected List<NamedElement> loadAllElements(ResourceSet resourceSet) {
EList<Resource> resources = resourceSet.getResources();
List<NamedElement> allElements = new LinkedList<NamedElement>();
for (Resource metamodel : resources) {
for (Iterator<EObject> contents = metamodel.getAllContents(); contents.hasNext();) {
EObject next = contents.next();
if (isSuitable(next)) {
allElements.add((NamedElement) next);
}
}
}
return allElements;
}
protected boolean isSuitable(Object object) {
return object instanceof PackageableElement && ((PackageableElement) object).getName() != null;
}
protected EObject getContext() {
return myContext;
}
private boolean moreResourcesWereLoaded(ResourceSet resourceSet) {
return !myResourceSet.getResources().equals(resourceSet.getResources());
}
}