blob: 3dbedd48dda2fab433238760467c6392518f1077 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*
* </copyright>
*/
package org.eclipse.egf.pattern.ecore;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.egf.pattern.Activator;
import org.eclipse.egf.pattern.Messages;
import org.eclipse.egf.pattern.ecore.EPackageHelper.RegistrationException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.core.search.SearchParticipant;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.SearchRequestor;
import org.eclipse.jdt.core.search.TypeReferenceMatch;
import org.eclipse.jdt.internal.core.search.JavaSearchParticipant;
/**
* This class aims at filling the ecore model registry with model from workspace
* projects.
*
* @author Thomas Guiu
*
*/
public class RegistryReader {
public void load() {
List<IJavaProject> projects = new ArrayList<IJavaProject>();
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
try {
if (project.isAccessible() && project.hasNature(JavaCore.NATURE_ID)) {
projects.add(JavaCore.create(project));
}
} catch (CoreException e) {
Activator.getDefault().logError(e);
}
}
if (projects.isEmpty())
return;
try {
IType ePackageType = null;
for (IJavaProject javaProject : projects) {
ePackageType = javaProject.findType("org.eclipse.emf.ecore.EPackage"); //$NON-NLS-1$
if (ePackageType != null) {
break;
}
}
if (ePackageType == null) {
return;
}
IJavaSearchScope scope = SearchEngine.createJavaSearchScope(projects.toArray(new IJavaProject[projects.size()]), IJavaSearchScope.SOURCES | IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.REFERENCED_PROJECTS | IJavaSearchScope.REFERENCED_PROJECTS);
SearchPattern pattern = SearchPattern.createPattern(ePackageType, IJavaSearchConstants.IMPLEMENTORS);
SearchRequestor requestor = new SearchRequestor() {
@Override
public void acceptSearchMatch(SearchMatch match) throws CoreException {
if (match instanceof TypeReferenceMatch) {
TypeReferenceMatch refMatch = (TypeReferenceMatch) match;
IType type = (IType) refMatch.getElement();
try {
EPackageHelper.registerPackage(type.getJavaProject().getProject(), type.getFullyQualifiedName());
} catch (RegistrationException e) {
Activator.getDefault().logError(Messages.registration_error1, e);
}
}
}
};
new SearchEngine().search(pattern, new SearchParticipant[] { new JavaSearchParticipant() }, scope, requestor, null);
} catch (Exception e) {
Activator.getDefault().logError(Messages.registration_error1, e);
}
}
}