org.obeonetwork.jdt2uml.core.api.Utils.java Source code

Java tutorial

Introduction

Here is the source code for org.obeonetwork.jdt2uml.core.api.Utils.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Hugo Marchadour (Obeo).
 * 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:
 *    Hugo Marchadour - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.obeonetwork.jdt2uml.core.api;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.emf.common.util.URI;
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.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Component;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Namespace;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.PackageImport;
import org.eclipse.uml2.uml.PackageableElement;
import org.eclipse.uml2.uml.PrimitiveType;
import org.eclipse.uml2.uml.UMLFactory;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.resource.UMLResource;
import org.obeonetwork.jdt2uml.core.CoreActivator;

public final class Utils {

    public static boolean isClass(IType type) {
        boolean result = false;
        try {
            result = type.isClass();
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return result;
    }

    public static boolean isInterface(IType type) {
        boolean result = false;
        try {
            result = type.isInterface();
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return result;
    }

    public static boolean isAnnotation(IType type) {
        boolean result = false;
        try {
            result = type.isAnnotation();
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return result;
    }

    public static boolean isEnum(IType type) {
        boolean result = false;
        try {
            result = type.isEnum();
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return result;
    }

    public static Set<IType> resolveType(IType currentType, String typeIdent) {
        Set<IType> types = new HashSet<IType>();
        if (typeIdent != null) {

            String fullQualifiedName = resolveFullQualifiedName(currentType, typeIdent);
            if (fullQualifiedName != null && !fullQualifiedName.isEmpty()) {
                Set<IType> retrieveTypes = retrieveTypes(currentType.getJavaProject(), fullQualifiedName);
                for (IType retrieveType : retrieveTypes) {
                    types.add(retrieveType);
                }
            }
        }
        return types;
    }

    public static Set<IType> retrieveTypes(IJavaProject javaProject, String qualifiedName) {
        Set<IType> types = new HashSet<IType>();
        try {
            IType findType = javaProject.findType(qualifiedName);
            if (findType != null) {
                types.add(findType);
            } else {
                System.out.println(qualifiedName + " not retrieve in this project");
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return types;
    }

    public static Set<String> getQualifiedNames(IField field) {
        Set<String> qualifiedNames = new HashSet<String>();
        try {
            String typeIdent = Signature.getSimpleName(Signature.toString(field.getTypeSignature()));
            String fullQualifiedName = resolveFullQualifiedName(field.getDeclaringType(), typeIdent);
            if (fullQualifiedName != null && !fullQualifiedName.isEmpty()) {
                qualifiedNames.add(fullQualifiedName);
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return qualifiedNames;
    }

    public static Set<String> getQualifiedNames(IMethod method) {
        Set<String> qualifiedNames = new HashSet<String>();
        IType declaringType = method.getDeclaringType();
        try {
            String typeIdent = Signature.getSimpleName(Signature.toString(method.getReturnType()));
            String fullQualifiedName = resolveFullQualifiedName(declaringType, typeIdent);
            if (fullQualifiedName != null && !fullQualifiedName.isEmpty()) {
                qualifiedNames.add(fullQualifiedName);
            }
            for (String parameterType : method.getParameterTypes()) {
                String typeParamIdent = Signature.getSimpleName(Signature.toString(parameterType));

                String fullQualifiedName2 = resolveFullQualifiedName(declaringType, typeParamIdent);
                if (fullQualifiedName2 != null && !fullQualifiedName2.isEmpty()) {
                    qualifiedNames.add(fullQualifiedName2);
                }
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return qualifiedNames;
    }

    public static boolean isExternal(IType type) {
        return getPackageFragmentRoot(type).isExternal();
    }

    public static IPackageFragmentRoot getPackageFragmentRoot(IType type) {
        IJavaElement currentParent = type;
        do {
            currentParent = currentParent.getParent();
        } while (currentParent != null && !(currentParent instanceof IPackageFragmentRoot));

        return (IPackageFragmentRoot) currentParent;
    }

    public static String getPath(IJavaElement javaElement) {
        List<String> segments = new ArrayList<String>();
        IJavaElement currentParent = javaElement;
        segments.add(currentParent.getElementName());
        do {
            currentParent = currentParent.getParent();
            if (currentParent != null) {
                segments.add(currentParent.getElementName());
            }
        } while (currentParent != null && !(currentParent instanceof IPackageFragmentRoot));
        Collections.reverse(segments);
        StringBuilder strBuilder = new StringBuilder();
        for (String segment : segments) {
            strBuilder.append(segment);
            strBuilder.append('/');
        }
        return strBuilder.toString();
    }

    public static String resolveFullQualifiedName(IType type, String typeIdent) {
        StringBuilder builder = new StringBuilder();
        try {
            String[][] resolveType = type.resolveType(typeIdent);
            builder.append(resolveQualifiedName(resolveType));
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return builder.toString();
    }

    private static String resolveQualifiedName(String[][] resolveType) {

        StringBuilder builder = new StringBuilder();
        boolean first = true;
        if (resolveType != null) {
            for (String[] l1 : resolveType) {
                for (String l2 : l1) {
                    if (first) {
                        first = false;
                    } else {
                        builder.append('.');
                    }
                    builder.append(l2);
                }
            }
        }
        return builder.toString();
    }

    /**
     * Loads & import library into the {@link Namespace}.
     * 
     * @param namespace
     *            the {@link Namespace} context
     * @param libraryUri
     *            the URI of the library to load.
     */
    public static void importUMLResource(Namespace namespace, String libraryUri) {
        importUMLResource(namespace, URI.createURI(libraryUri));
    }

    public static void importUMLResource(Namespace namespace, URI libraryUri) {
        final ResourceSet resourceSet = namespace.eResource().getResourceSet();
        final Resource resource = resourceSet.getResource(libraryUri, true);

        final Package root = (Package) EcoreUtil.getObjectByType(resource.getContents(),
                UMLPackage.Literals.PACKAGE);
        // We check if a package import already exists
        if (!namespace.getImportedPackages().contains(root)) {
            namespace.createPackageImport(root);
        }
    }

    public static List<Component> searchAllImportedComponents(Package pack) {
        List<Component> components = new ArrayList<Component>();
        List<PackageImport> packageImports = pack.getPackageImports();
        for (PackageImport packageImport : packageImports) {
            Package importedPackage = packageImport.getImportedPackage();
            if (importedPackage != null) {
                List<PackageableElement> packagedElements = importedPackage.getPackagedElements();
                for (PackageableElement packageableElement : packagedElements) {
                    if (packageableElement instanceof Component) {
                        components.add((Component) packageableElement);
                    }
                }
                components.addAll(searchAllImportedComponents(importedPackage));
            }
        }
        return components;
    }

    public static PrimitiveType searchPrimiveTypeInModels(Namespace namespace, String primitiveTypeName) {
        PrimitiveType result = null;
        final ResourceSet resourceSet = namespace.eResource().getResourceSet();
        final Resource resource = resourceSet
                .getResource(URI.createURI(UMLResource.JAVA_PRIMITIVE_TYPES_LIBRARY_URI), true);

        final Package root = (Package) EcoreUtil.getObjectByType(resource.getContents(),
                UMLPackage.Literals.PACKAGE);

        NamedElement member = root.getMember(primitiveTypeName);
        if (member instanceof PrimitiveType) {
            result = (PrimitiveType) member;
        }
        return result;
    }

    public static Component searchComponentInModels(Namespace namespace, String componentName) {
        Component result = null;

        List<EObject> contents = namespace.eResource().getContents();
        List<Component> components = new ArrayList<Component>();
        for (EObject content : contents) {
            if (content instanceof Package) {
                Package rootPackage = (Package) content;
                List<PackageableElement> packagedElements = rootPackage.getPackagedElements();
                for (PackageableElement packageableElement : packagedElements) {
                    if (packageableElement instanceof Component) {
                        components.add((Component) packageableElement);
                    }
                }
                components.addAll(searchAllImportedComponents(rootPackage));
            }
        }
        for (Component component : components) {
            if (componentName.equals(component.getName())) {
                result = component;
                break;
            }
        }
        return result;
    }

    public static Classifier searchClassifierInModel(Namespace namespace, String qualifiedName) {
        Model model = namespace.getModel();

        List<NamedElement> contents = model.getMembers();
        List<Component> components = new ArrayList<Component>();
        for (EObject content : contents) {
            if (content instanceof Component) {
                components.add((Component) content);
            }
        }

        Classifier result = searchClassifierInComponents(components, qualifiedName);
        return result;
    }

    public static Classifier searchClassifierInModels(Namespace namespace, String qualifiedName) {
        Classifier result = null;

        result = searchClassifierInModel(namespace, qualifiedName);
        if (result == null) {
            // search in imported packages
            Resource eResource = namespace.eResource();
            if (eResource != null) {
                List<EObject> contents = eResource.getContents();
                List<Component> components = new ArrayList<Component>();
                for (EObject content : contents) {
                    if (content instanceof Package) {
                        Package rootPackage = (Package) content;
                        components.addAll(searchAllImportedComponents(rootPackage));
                    }
                }
                result = searchClassifierInComponents(components, qualifiedName);
            } else {
                throw new IllegalStateException("Should not appended");
            }
        }
        return result;
    }

    protected static Classifier searchClassifierInComponents(List<Component> components, String qualifiedName) {
        Classifier result = null;
        String[] subpackages = qualifiedName.split("\\.");
        for (Component component : components) {
            Namespace member = component;
            for (int i = 0; i < subpackages.length; i++) {
                member = (Namespace) member.getMember(subpackages[i]);
                if (member == null) {
                    break;
                }
            }
            if (member != null && member instanceof Classifier) {
                result = (Classifier) member;
                break;
            }
        }
        return result;
    }

    public static org.eclipse.uml2.uml.Package handlePackage(Component parent, IPackageFragment packageFragment) {
        String[] subpackages = packageFragment.getElementName().split("\\.");
        org.eclipse.uml2.uml.Package current = null;
        for (String subpackage : subpackages) {
            if (subpackage == null || subpackage.length() == 0) {
                break;
            }
            if (current == null) {
                List<PackageableElement> packagedElements = parent.getPackagedElements();
                for (PackageableElement packageableElement : packagedElements) {
                    if (packageableElement instanceof org.eclipse.uml2.uml.Package) {
                        if (subpackage.equals(packageableElement.getName())) {
                            current = (org.eclipse.uml2.uml.Package) packageableElement;
                            break;
                        }
                    }
                }
                if (current == null) {
                    Package createPackage = UMLFactory.eINSTANCE.createPackage();
                    createPackage.setName(subpackage);
                    parent.getPackagedElements().add(createPackage);
                    current = createPackage;
                }
            } else {
                org.eclipse.uml2.uml.Package nextPackage = current.getNestedPackage(subpackage);
                if (nextPackage == null) {
                    nextPackage = current.createNestedPackage(subpackage);
                }
                current = nextPackage;
            }
        }
        return current;
    }

    public static int countJavaItems(IJavaProject javaElement) {
        int count = 0;
        try {
            IJavaElement[] children = javaElement.getChildren();
            for (IJavaElement iJavaElement : children) {
                if (iJavaElement instanceof IPackageFragmentRoot) {
                    count += countJavaItems((IPackageFragmentRoot) iJavaElement);
                } else {
                    System.out.println(iJavaElement);
                }
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return count;
    }

    public static int countJavaItems(IPackageFragmentRoot javaElement) {
        int count = 0;
        try {
            IJavaElement[] children = javaElement.getChildren();
            for (IJavaElement iJavaElement : children) {
                if (iJavaElement instanceof IPackageFragment) {
                    count += countJavaItems((IPackageFragment) iJavaElement);
                }
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return count;
    }

    public static int countJavaItems(IPackageFragment javaElement) {
        int count = 0;
        try {
            IJavaElement[] children = javaElement.getChildren();
            for (IJavaElement iJavaElement : children) {
                if (iJavaElement instanceof IPackageFragment) {
                    count += countJavaItems((IPackageFragment) iJavaElement);
                } else if (iJavaElement instanceof ICompilationUnit) {
                    count += 1;
                }
            }
        } catch (JavaModelException e) {
            CoreActivator.logUnexpectedError(e);
        }
        return count;
    }

    public static String getModelFileName(IJavaProject javaProject) {
        return javaProject.getElementName() + ".model";
    }

    public static String getLibrariesFileName(IJavaProject javaProject) {
        return javaProject.getElementName() + ".libraries";
    }

    public static String createModelPath(IJavaProject javaProject, String fileName) {
        return '/' + javaProject.getElementName() + "/target/uml/" + fileName + ".uml";
    }

    public static Set<Model> getModel(IJavaProject javaProject) {
        Set<Model> result = new HashSet<Model>();
        URI resourceURI = URI.createPlatformResourceURI(
                Utils.createModelPath(javaProject, Utils.getModelFileName(javaProject)), true);
        if (resourceURI.isFile()) {
            Resource resource = new ResourceSetImpl().getResource(resourceURI, true);
            if (resource != null) {
                List<EObject> contents = resource.getContents();
                for (EObject eObject : contents) {
                    if (eObject instanceof Model) {
                        result.add((Model) eObject);
                    }
                }
            }
        }
        return result;
    }

    public static Set<Model> getLibraries(IJavaProject javaProject) {
        Set<Model> result = new HashSet<Model>();
        URI resourceURI = URI.createPlatformResourceURI(
                Utils.createModelPath(javaProject, Utils.getLibrariesFileName(javaProject)), true);
        Resource resource = new ResourceSetImpl().getResource(resourceURI, true);
        if (resource != null) {
            List<EObject> contents = resource.getContents();
            for (EObject eObject : contents) {
                if (eObject instanceof Model) {
                    result.add((Model) eObject);
                }
            }
        }
        return result;
    }
}