blob: a5327c3f87ace64e42d736ace915a245f227f6ca [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 David A Carlson 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:
* David A Carlson (XMLmodeling.com) - initial API and implementation
*
* $Id$
*******************************************************************************/
package org.eclipse.mdht.uml.common.search;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ElementImport;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.PackageImport;
import org.eclipse.uml2.uml.Profile;
import org.eclipse.uml2.uml.ProfileApplication;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.eclipse.uml2.uml.util.UMLUtil;
/**
*
* @version $Id: $
*/
public class ModelSearch {
/**
*
*/
private ModelSearch() {
}
private static boolean implementsInterface(Object object, Class<?> anInterface) {
Class<?>[] interfaces = object.getClass().getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
if (interfaces[i] == anInterface) {
return true;
}
}
return false;
}
public static List<EObject> findStereotypeApplications(ResourceSet resourceSet, Stereotype stereotype) {
List<EObject> elementList = new ArrayList<EObject>();
for (Resource resource : resourceSet.getResources()) {
String uri = resource.getURI().toString();
if (uri.equals(UMLResource.UML_METAMODEL_URI) || uri.equals(UMLResource.ECORE_METAMODEL_URI)) {
continue;
}
elementList.addAll(findStereotypeApplications(resource, stereotype));
}
return elementList;
}
public static List<EObject> findStereotypeApplications(Resource resource, Stereotype stereotype) {
List<EObject> elementList = new ArrayList<EObject>();
for (EObject eObject : resource.getContents()) {
if (stereotype.equals(UMLUtil.getStereotype(eObject))) {
elementList.add(eObject);
}
}
return elementList;
}
public static List<Element> findAllOf(ResourceSet resourceSet, IElementFilter filter) {
List<Element> elementList = new ArrayList<Element>();
TreeIterator<EObject> iterator = EcoreUtil.getAllProperContents(resourceSet.getResources(), true);
while (iterator != null && iterator.hasNext()) {
Object element = iterator.next();
if (Resource.class.isInstance(element)) {
continue;
} else if (ProfileApplication.class.isInstance(element)) {
// ignore the the applied profiles
iterator.prune();
} else if (Profile.class.isInstance(element)) {
// ignore the the applied profiles
iterator.prune();
} else if (EAnnotation.class.isInstance(element)) {
iterator.prune();
}
else if (Package.class.isInstance(element)) {
// if ("uml2".equals(((Package)element).getQualifiedName()))
// iterator.prune();
if (UMLResource.UML_METAMODEL_URI.equals(((Package) element).eResource().getURI().toString())) {
iterator.prune();
} else if (UMLResource.ECORE_METAMODEL_URI.equals(
((Package) element).eResource().getURI().toString())) {
iterator.prune();
// else if (UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
// else if (UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
// else if (UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
}
}
else if (element instanceof Element && filter.accept((Element) element)) {
elementList.add((Element) element);
} else if (!Package.class.isInstance(element)) {
iterator.prune();
}
}
return elementList;
}
public static List<Element> findAllOf(Package umlPackage, IElementFilter filter) {
List<Element> elementList = new ArrayList<Element>();
TreeIterator<EObject> iterator = umlPackage.eAllContents();
while (iterator != null && iterator.hasNext()) {
EObject element = iterator.next();
if (element instanceof ElementImport) {
element = ((ElementImport) element).getImportedElement();
// exclude metaclasses
if (UMLResource.UML_METAMODEL_URI.equals(element.eResource().getURI().toString())) {
continue;
}
} else if (element instanceof PackageImport) {
Package importedPackage = ((PackageImport) element).getImportedPackage();
// exclude metaclasses
if (importedPackage != null && !importedPackage.eIsProxy() &&
!UMLResource.UML_METAMODEL_URI.equals(importedPackage.eResource().getURI().toString())) {
element = importedPackage;
elementList.addAll(findAllOf(importedPackage, filter));
} else {
continue;
}
}
if (element instanceof Element && filter.accept((Element) element)) {
elementList.add((Element) element);
} else if (!Package.class.isInstance(element)) {
iterator.prune();
}
}
return elementList;
}
// TODO include source object in params, also test Classifier::conformsTo
public static List<Element> findAllOf(Package umlPackage, Class<?> type) {
List<Element> elementList = new ArrayList<Element>();
TreeIterator<EObject> iterator = umlPackage.eAllContents();
while (iterator != null && iterator.hasNext()) {
EObject element = iterator.next();
if (element instanceof ElementImport) {
element = ((ElementImport) element).getImportedElement();
if (!UMLResource.UML_METAMODEL_URI.equals(element.eResource().getURI().toString())) {
// exclude metaclasses
elementList.add((Element) element);
}
} else if (element instanceof PackageImport) {
Package importedPackage = ((PackageImport) element).getImportedPackage();
// exclude metaclasses
if (!UMLResource.UML_METAMODEL_URI.equals(importedPackage.eResource().getURI().toString())) {
elementList.addAll(findAllOf(importedPackage, type));
}
continue;
}
if (element instanceof Element && implementsInterface(element, type)) {
elementList.add((Element) element);
} else if (!Package.class.isInstance(element)) {
iterator.prune();
}
}
return elementList;
}
public static List<Element> findAllOf(Resource resource, Class<?> type) {
List<Element> elementList = new ArrayList<Element>();
TreeIterator<EObject> iterator = EcoreUtil.getAllContents(resource, true);
while (iterator != null && iterator.hasNext()) {
EObject element = iterator.next();
if (type.isInstance(element) && element instanceof Element) {
elementList.add((Element) element);
} else if (!Package.class.isInstance(element)) {
iterator.prune();
}
}
return elementList;
}
public static List<org.eclipse.uml2.uml.Class> findUMLMetaclasses(ResourceSet resourceSet) {
List<org.eclipse.uml2.uml.Class> classList = new ArrayList<org.eclipse.uml2.uml.Class>();
Resource umlMetamodel = resourceSet.getResource(URI.createURI(UMLResource.UML_METAMODEL_URI), true);
if (umlMetamodel != null) {
TreeIterator<Object> iterator = EcoreUtil.getAllProperContents(umlMetamodel, true);
while (iterator != null && iterator.hasNext()) {
Object element = iterator.next();
if (element instanceof org.eclipse.uml2.uml.Class) {
classList.add((org.eclipse.uml2.uml.Class) element);
}
}
}
return classList;
}
public static List<Element> findAllOf(ResourceSet resourceSet, Class<?> type) {
List<Element> elementList = new ArrayList<Element>();
TreeIterator<Object> iterator = EcoreUtil.getAllProperContents(resourceSet.getResources(), true);
while (iterator != null && iterator.hasNext()) {
Object element = iterator.next();
if (Resource.class.isInstance(element)) {
continue;
}
// prune profile and metamodel contents
if (ProfileApplication.class.isInstance(element)) {
// ignore the the applied profiles
iterator.prune();
continue;
} else if (Profile.class.isInstance(element) && Stereotype.class != type) {
// ignore the the applied profiles
iterator.prune();
continue;
} else if (EAnnotation.class.isInstance(element)) {
iterator.prune();
continue;
} else if (Package.class.isInstance(element)) {
// if ("uml2".equals(((Package)element).getQualifiedName()))
// iterator.prune();
if (UMLResource.UML_METAMODEL_URI.equals(((Package) element).eResource().getURI().toString())) {
iterator.prune();
continue;
} else if (UMLResource.ECORE_METAMODEL_URI.equals(
((Package) element).eResource().getURI().toString())) {
iterator.prune();
continue;
// else if (UMLResource.ECORE_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
// else if (UMLResource.UML_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
// else if (UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI.equals(
// ((Package)element).eResource().getURI().toString()))
// iterator.prune();
}
}
// select based on filter
if (type.isInstance(element) && element instanceof Element) {
elementList.add((Element) element);
} else if (!Package.class.isInstance(element)) {
iterator.prune();
}
}
return elementList;
}
}