package org.objectstyle.wolips.jdt; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.objectstyle.woenvironment.frameworks.FrameworkModel; import org.objectstyle.wolips.core.resources.types.project.ProjectAdapter; import org.objectstyle.wolips.jdt.classpath.model.IEclipseFramework; import org.objectstyle.wolips.variables.BuildProperties; public class ProjectFrameworkAdapter { private IProject _project; public ProjectFrameworkAdapter(IProject project) { _project = project; } public IProject getProject() { return _project; } public IEclipseFramework getFramework() { FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(_project); IEclipseFramework framework = frameworkModel.getApplicationWithName(_project.getName()); if (framework == null) { framework = frameworkModel.getFrameworkWithName(_project.getName()); } return framework; } public void addFrameworkNamed(String frameworkName) throws JavaModelException { addFrameworksNamed(frameworkName); } public void addFrameworksNamed(List<String> frameworkNames) throws JavaModelException { addFrameworksNamed(frameworkNames.toArray(new String[frameworkNames.size()])); } public void addFrameworksNamed(String... frameworkNames) throws JavaModelException { IProject project = getProject(); FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(project); List<IEclipseFramework> frameworks = new LinkedList<IEclipseFramework>(); for (String frameworkName : frameworkNames) { IEclipseFramework framework = frameworkModel.getFrameworkWithName(frameworkName); if (framework == null) { throw new NoSuchElementException("There is no framework named '" + frameworkName + "'."); } frameworks.add(framework); } IJavaProject javaProject = JavaCore.create(project); IEclipseFramework.Utility.addFrameworksToProject(frameworks, javaProject, true); } public void addFrameworks(IEclipseFramework... frameworks) throws JavaModelException { List<IEclipseFramework> frameworksList = new LinkedList<IEclipseFramework>(); for (IEclipseFramework framework : frameworks) { frameworksList.add(framework); } IProject project = getProject(); IJavaProject javaProject = JavaCore.create(project); IEclipseFramework.Utility.addFrameworksToProject(frameworksList, javaProject, true); } public void removeFrameworkNamed(String frameworkName) throws JavaModelException { removeFrameworksNamed(frameworkName); } public void removeFrameworksNamed(List<String> frameworkNames) throws JavaModelException { removeFrameworksNamed(frameworkNames.toArray(new String[frameworkNames.size()])); } public void removeFrameworksNamed(String... frameworkNames) throws JavaModelException { IProject project = getProject(); IJavaProject javaProject = JavaCore.create(project); FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(project); List<IEclipseFramework> frameworks = new LinkedList<IEclipseFramework>(); for (String frameworkName : frameworkNames) { IEclipseFramework framework = frameworkModel.getFrameworkWithName(frameworkName); if (framework == null) { throw new NoSuchElementException("There is no framework named '" + frameworkName + "'."); } frameworks.add(framework); } IEclipseFramework.Utility.removeFrameworksFromProject(frameworks, javaProject, true); } public List<IEclipseFramework> getLinkedFrameworks() throws JavaModelException { IProject project = getProject(); IJavaProject javaProject = JavaCore.create(project); return IEclipseFramework.Utility.getFrameworks(javaProject); } public Set<String> getLinkedFrameworkNames() throws JavaModelException { Set<String> frameworkNames = new HashSet<String>(); for (IEclipseFramework framework : getLinkedFrameworks()) { frameworkNames.add(framework.getName()); } return frameworkNames; } public boolean isLinkedToFrameworkNamed(String frameworkName) throws JavaModelException { return getLinkedFrameworkNames().contains(frameworkName); } public IEclipseFramework getLinkedFrameworkNamed(String frameworkName) throws JavaModelException { for (IEclipseFramework linkedFramework : getLinkedFrameworks()) { if (linkedFramework.getName().equals(frameworkName)) { return linkedFramework; } } FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(getProject()); IEclipseFramework framework = frameworkModel.getFrameworkWithName(frameworkName); return framework; } public Map<String, IEclipseFramework> getPluginFrameworks() { Map<String, IEclipseFramework> pluginFrameworks = new TreeMap<String, IEclipseFramework>(); Pattern pluginPattern = Pattern.compile("(.*)PlugIn"); FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(getProject()); for (IEclipseFramework framework : frameworkModel.getAllFrameworks()) { String frameworkName = framework.getName(); Matcher matcher = pluginPattern.matcher(frameworkName); if (matcher.matches()) { String pluginName = matcher.group(1); pluginFrameworks.put(pluginName, framework); } } return pluginFrameworks; } public Map<String, IEclipseFramework> getAdaptorFrameworks() { Map<String, IEclipseFramework> adaptorFrameworks = new TreeMap<String, IEclipseFramework>(); Pattern adaptorPattern = Pattern.compile("Java(.*)Adaptor"); FrameworkModel<IEclipseFramework> frameworkModel = JdtPlugin.getDefault().getFrameworkModel(getProject()); for (IEclipseFramework framework : frameworkModel.getAllFrameworks()) { String frameworkName = framework.getName(); Matcher matcher = adaptorPattern.matcher(frameworkName); if (matcher.matches()) { String adaptorName = matcher.group(1); adaptorFrameworks.put(adaptorName, framework); } } return adaptorFrameworks; } /** OLD FRAMEWORK API'S -- SHOULD BE REWRITTEN USING NEW FRAMEWORK API'S **/ public List<IPath> getFrameworkPaths() { // for (IEclipseFramework framework : getFrameworks()) { // // } ArrayList<IPath> list = new ArrayList<IPath>(); IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); for (int i = 0; i < projects.length; i++) { if (isFrameworkReference(projects[i])) { list.add(projects[i].getLocation()); } } try { IJavaProject javaProject = JavaCore.create(getProject()); list.addAll(toFrameworkPaths(javaProject.getResolvedClasspath(false))); } catch (JavaModelException e) { JdtPlugin.getDefault().getPluginLogger().log(e); } return list; } private List<IPath> toFrameworkPaths(IClasspathEntry[] classpathEntries) { ArrayList<IPath> arrayList = new ArrayList<IPath>(); for (int i = 0; i < classpathEntries.length; i++) { IPath path = classpathEntries[i].getPath(); IPath choppedFrameworkPath = null; int count = path.segmentCount(); for (int pathElementNum = 0; pathElementNum < count && choppedFrameworkPath == null; pathElementNum++) { String segment = path.segment(pathElementNum); if (segment.endsWith("." + "framework")) { choppedFrameworkPath = path.removeLastSegments(count - pathElementNum - 1); } } if (choppedFrameworkPath != null && !choppedFrameworkPath.lastSegment().startsWith("JavaVM")) { arrayList.add(choppedFrameworkPath); } } return arrayList; } public boolean isFrameworkReference(IProject iProject) { boolean isFrameworkReference; IJavaProject javaProject = null; try { javaProject = JavaCore.create(getProject()); if (javaProject == null) { isFrameworkReference = false; } else { ProjectAdapter project = (ProjectAdapter) iProject.getAdapter(ProjectAdapter.class); isFrameworkReference = project != null && project.isFramework() && ProjectFrameworkAdapter.isProjectReferencedByProject(iProject, javaProject.getProject()); } } catch (Exception e) { JdtPlugin.getDefault().getPluginLogger().log(e); isFrameworkReference = false; } return isFrameworkReference; } public static boolean isProjectReferencedByProject(IProject child, IProject mother) { IProject[] projects; try { projects = mother.getReferencedProjects(); } catch (Exception e) { JdtPlugin.getDefault().getPluginLogger().log(e); return false; } for (IProject project : projects) { if (project.equals(child)) { return true; } } return false; } public void initializeProject() { // MS: Touching build props is enough to initialize them ... _project.getAdapter(BuildProperties.class); // MS: I can't decide if we should save dirty ones or not ... If you touch something in build // props, it will resave, so maybe that's enough. // try { // buildProperties.save(); // } catch (Exception e) { // e.printStackTrace(); // } } }