Java tutorial
/** * Copyright (c) 2006-2011 Floggy Open Source Group. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sourceforge.floggy.eclipse; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.Arrays; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IAccessRule; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.action.IAction; import org.eclipse.ui.console.ConsolePlugin; /** * DOCUMENT ME! * * @author <a href="mailto:thiago.moreira@floggy.org">Thiago Moreira</a> * @version $Revision$ */ public class ToggleNatureAction extends AbstractFloggyAction { /** * Toggles sample nature on a project * * @param project to have sample nature added or removed * @param action */ public void run(IProject project, IAction action) { try { IProjectDescription description = project.getDescription(); String[] natures = description.getNatureIds(); for (int i = 0; i < natures.length; ++i) { if (FloggyNature.NATURE_ID.equals(natures[i])) { String[] newNatures = new String[natures.length - 1]; System.arraycopy(natures, 0, newNatures, 0, i); System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1); description.setNatureIds(newNatures); project.setDescription(description, null); return; } } String[] newNatures = new String[natures.length + 1]; System.arraycopy(natures, 0, newNatures, 0, natures.length); newNatures[natures.length] = FloggyNature.NATURE_ID; description.setNatureIds(newNatures); project.setDescription(description, null); reorderCommands(project); updateClasspath(project); setDefaultPersistentProperties(project); } catch (Exception e) { String message = e.getMessage(); if (message == null) { message = e.getClass().getName(); } IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, IStatus.ERROR, message, e); ConsolePlugin.log(status); } } private String getVersion(String path) { String version = null; int endIndex = path.lastIndexOf(".jar"); int startIndex = path.indexOf("work-") + 5; if ((startIndex != 4) && (endIndex != -1) && (startIndex < endIndex)) { version = path.substring(startIndex, endIndex); } return version; } private void reorderCommands(IProject project) throws CoreException { IProjectDescription description = project.getDescription(); ICommand[] commands = description.getBuildSpec(); ICommand[] newOrder = new ICommand[commands.length]; int floggyIndex = -1; for (int i = 0; i < commands.length; i++) { if (commands[i].getBuilderName().equals(JavaCore.BUILDER_ID)) { newOrder[i] = commands[i]; floggyIndex = i + 1; } else if (commands[i].getBuilderName().equals(FloggyBuilder.BUILDER_ID)) { newOrder[floggyIndex] = commands[i]; } else { if (floggyIndex != -1) { newOrder[i + 1] = commands[i]; } else { newOrder[i] = commands[i]; } } } description.setBuildSpec(newOrder); project.setDescription(description, null); } private void setDefaultPersistentProperties(IProject project) throws CoreException { project.setPersistentProperty(SetGenerateSourceAction.PROPERTY_NAME, String.valueOf(false)); project.setPersistentProperty(SetAddDefaultConstructorAction.PROPERTY_NAME, String.valueOf(true)); project.setPersistentProperty(ConfigurationFileAction.PROPERTY_NAME, "floggy.xml"); } private void updateClasspath(IProject project) throws Exception { IJavaProject javaProject = JavaCore.create(project); List rawClasspath = new LinkedList(Arrays.asList(javaProject.getRawClasspath())); boolean contains = false; for (int i = 0; i < rawClasspath.size(); i++) { IClasspathEntry classpath = (IClasspathEntry) rawClasspath.get(i); if (classpath.getPath().toOSString().indexOf("floggy-persistence-framework") != -1) { contains = true; break; } } if (!contains) { Enumeration e = Activator.findEntries("/", "*.jar", true); while (e.hasMoreElements()) { URL url = (URL) e.nextElement(); String path = FileLocator.toFileURL(url).getPath(); if (path.indexOf("floggy-persistence-framework") != -1) { String javadocURL = "http://floggy.sourceforge.net/modules/floggy-persistence-framework/apidocs/"; String version = getVersion(path); if (version != null) { javadocURL = "http://floggy.sourceforge.net/modules/floggy-persistence-framework/" + version + "/floggy-persistence-framework/apidocs/"; } IClasspathAttribute attribute = JavaCore.newClasspathAttribute("javadoc_location", javadocURL); IClasspathEntry varEntry = JavaCore.newLibraryEntry(new Path(path), null, null, null, new IClasspathAttribute[] { attribute }, true); rawClasspath.add(varEntry); javaProject.setRawClasspath( (IClasspathEntry[]) rawClasspath.toArray(new IClasspathEntry[rawClasspath.size()]), null); break; } } if (Activator.isMTJAvailble()) { IFile implJar = project.getFile("floggy-persistence-framework-impl.jar"); if (!implJar.exists()) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); JarOutputStream out = new JarOutputStream(baos, new Manifest()); out.close(); implJar.create(new ByteArrayInputStream(baos.toByteArray()), IResource.DERIVED, null); } IPath filePatternImpl = new Path("net/sourceforge/floggy/persistence/impl/*"); IPath filePatternImplMigration = new Path("net/sourceforge/floggy/persistence/impl/migration/*"); IAccessRule[] accessRules = new IAccessRule[2]; accessRules[0] = JavaCore.newAccessRule(filePatternImpl, IAccessRule.K_NON_ACCESSIBLE); accessRules[1] = JavaCore.newAccessRule(filePatternImplMigration, IAccessRule.K_NON_ACCESSIBLE); IClasspathEntry entry = JavaCore.newLibraryEntry(implJar.getLocation(), null, null, accessRules, null, true); rawClasspath.add(entry); javaProject.setRawClasspath( (IClasspathEntry[]) rawClasspath.toArray(new IClasspathEntry[rawClasspath.size()]), null); } } } }