/******************************************************************************* * Copyright (c) 2008, 2010 Spring IDE Developers * 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: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.ajdt.ui.actions; import java.util.regex.Pattern; import org.eclipse.ajdt.core.AspectJCorePreferences; import org.eclipse.ajdt.internal.ui.editor.AspectJEditor; import org.eclipse.ajdt.internal.ui.lazystart.Utils; import org.eclipse.ajdt.internal.utils.AJDTUtils; import org.eclipse.core.internal.content.ContentTypeManager; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IClasspathContainer; 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.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IFileEditorMapping; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.registry.EditorDescriptor; import org.eclipse.ui.internal.registry.EditorRegistry; import org.eclipse.ui.internal.registry.FileEditorMapping; import org.springframework.ide.eclipse.core.SpringCore; /** * @author Christian Dupuis * @author Andrew Eisenberg * @since 2.2.1 */ @SuppressWarnings("restriction") public class SpringAspectsToolingEnabler { // the stand alone spring aspects jar name final private static Pattern SPRING_ASPECTS_JAR_PATTERN = Pattern .compile(".*spring-aspects.*\\.jar"); final private static String SPRING_ASPECTS_JAR_NAME = "spring-aspects.jar"; // part of the name for the spring aspects jar included in BRITS. // the full name includes a version number at the end final private static Pattern SPRING_ASPECTS_PATTERN = Pattern .compile(".*org\\.springframework\\.aspects-.*\\.jar"); final private IProject project; final private IJavaProject jProject; final private Shell shell; final private boolean askToChangeDefaultEditor; public SpringAspectsToolingEnabler(IProject project, Shell shell) { this(project, shell, false); } public SpringAspectsToolingEnabler(IProject project, Shell shell, boolean askToChangeDefaultEditor) { this.project = project; this.jProject = JavaCore.create(project); this.askToChangeDefaultEditor = askToChangeDefaultEditor; this.shell = shell; } boolean run() { boolean isAJEditorDefault = false; try { if (hasSpringAspectsJar(jProject.getRawClasspath())) { if (!hasAJNature()) { AJDTUtils.addAspectJNature(project, false); } if (!isJarOnAspectPath(jProject.getRawClasspath())) { IClasspathEntry springAspectsEntry = findSpringAspectsJar(jProject .getRawClasspath()); AspectJCorePreferences.addToAspectPath(project, springAspectsEntry); } if (askToChangeDefaultEditor) { if (!isAJEditorDefault()) { isAJEditorDefault = MessageDialog .openQuestion( shell, "Make AspectJ editor default?", "Do you want to make the AspectJ editor the default editor for editing Java files?\n\n" + "This option can be changed by going to Preferences -> General-> Editors -> File Associations"); if (isAJEditorDefault) { makeAJEditorDefault(); } } else { isAJEditorDefault = true; } } } else { // can't do anything unless // spring jar is on build path MessageDialog .openInformation(shell, "Add " + SPRING_ASPECTS_JAR_NAME + " to build path", "Please add a version of " + SPRING_ASPECTS_JAR_NAME + "\nto build path of " + project.getName() + " and run this command again."); } } catch (CoreException e) { SpringCore.log("Error adding Spring tools to project " + project, e); } return isAJEditorDefault; } private void makeAJEditorDefault() { EditorRegistry registry = (EditorRegistry) PlatformUI.getWorkbench().getEditorRegistry(); IFileEditorMapping[] mappings = registry.getFileEditorMappings(); for (IFileEditorMapping mapping : mappings) { if (mapping.getExtension().equals("java")) { if (mapping instanceof FileEditorMapping) { IEditorDescriptor desc = registry.findEditor(AspectJEditor.ASPECTJ_EDITOR_ID); ((FileEditorMapping) mapping).setDefaultEditor((EditorDescriptor) desc); } } } registry.setFileEditorMappings((FileEditorMapping[]) mappings); registry.saveAssociations(); } private IClasspathEntry findSpringAspectsJar(IClasspathEntry[] entries) throws JavaModelException { for (IClasspathEntry entry : entries) { if (isSpringAspectsEntry(entry)) { return entry; } else if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { IClasspathEntry containedEntry = findSpringAspectsJar(extractEntriesFomContainer(entry)); if (containedEntry != null) { return containedEntry; } } } return null; } private boolean hasSpringAspectsJar(IClasspathEntry[] entries) throws JavaModelException { for (IClasspathEntry entry : entries) { if (isSpringAspectsEntry(entry)) { return true; } else if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { if (hasSpringAspectsJar(extractEntriesFomContainer(entry))) { return true; } } } return false; } private boolean isJarOnAspectPath(IClasspathEntry[] entries) throws JavaModelException { for (IClasspathEntry entry : entries) { if (isSpringAspectsEntry(entry)) { if (AspectJCorePreferences.isOnAspectpath(entry)) { return true; } } else if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) { if (isJarOnAspectPath(extractEntriesFomContainer(entry))) { return true; } } } return false; } private boolean hasAJNature() { return Utils.isAJProject(project); } private boolean isSpringAspectsEntry(IClasspathEntry entry) { String path = entry.getPath().toOSString(); return SPRING_ASPECTS_JAR_PATTERN.matcher(path).matches() || SPRING_ASPECTS_PATTERN.matcher(path).matches(); } private IClasspathEntry[] extractEntriesFomContainer(IClasspathEntry containerEntry) { try { IClasspathContainer container = JavaCore.getClasspathContainer( containerEntry.getPath(), jProject); return container.getClasspathEntries(); } catch (JavaModelException e) { SpringCore.log("Error accessing classpath container " + containerEntry.getPath() + " from project " + project, e); return new IClasspathEntry[0]; } } private boolean isAJEditorDefault() { IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor( ".java", ContentTypeManager.getInstance().getContentType(JavaCore.JAVA_SOURCE_CONTENT_TYPE)); return desc.getId().equals(AspectJEditor.ASPECTJ_EDITOR_ID); } }