/******************************************************************************* * Copyright (c) 2003, 2006 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ /* * Created on Mar 17, 2004 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package org.eclipse.jst.j2ee.internal.project; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.emf.codegen.CodeGenPlugin; import org.eclipse.emf.codegen.jet.JETCompiler; import org.eclipse.emf.codegen.jet.JETEmitter; import org.eclipse.emf.codegen.jet.JETException; import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants; import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; import org.eclipse.jst.j2ee.internal.plugin.J2EEPluginResourceHandler; import org.eclipse.osgi.util.ManifestElement; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; import org.osgi.service.prefs.BackingStoreException; /** * @author schacher, mdelder * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class WTPJETEmitter extends JETEmitter { public static final String PROJECT_NAME = ".JETEmitters"; //$NON-NLS-1$ private Map variables; private boolean intelligentLinkingEnabled = false; private JETCompiler jetCompiler; /** * @param templateURI */ public WTPJETEmitter(String templateURI) { super(templateURI); } /** * @param templateURIPath * @param relativeTemplateURI */ public WTPJETEmitter(String[] templateURIPath, String relativeTemplateURI) { super(templateURIPath, relativeTemplateURI); } /** * @param templateURI * @param classLoader */ public WTPJETEmitter(String templateURI, ClassLoader classLoader) { super(templateURI, classLoader); try { initialize(new NullProgressMonitor()); } catch (JETException e) { J2EEPlugin.logError(e); } } /** * @param templateURIPath * @param relativeTemplateURI * @param classLoader */ public WTPJETEmitter(String[] templateURIPath, String relativeTemplateURI, ClassLoader classLoader) { super(templateURIPath, relativeTemplateURI, classLoader); } /** * @param templateURIPath * @param relativeTemplateURI * @param classLoader * @param encoding */ public WTPJETEmitter(String[] templateURIPath, String relativeTemplateURI, ClassLoader classLoader, String encoding) { super(templateURIPath, relativeTemplateURI, classLoader, encoding); } /* * (non-Javadoc) * * @see org.eclipse.emf.codegen.jet.JETEmitter#initialize(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void initialize(IProgressMonitor progressMonitor) throws JETException { progressMonitor.beginTask("", 10); //$NON-NLS-1$ progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_GeneratingJETEmitterFor_message", new Object[]{templateURI})); //$NON-NLS-1$ try { // This ensures that the JRE variables are initialized. try { JavaRuntime.getDefaultVMInstall(); } catch (Throwable throwable) { // This is kind of nasty to come here. URL jreURL = Platform.find(Platform.getBundle("org.eclipse.emf.codegen"),new Path("plugin.xml")); //$NON-NLS-1$ //$NON-NLS-2$ IPath jrePath = new Path(Platform.asLocalURL(jreURL).getFile()); jrePath = jrePath.removeLastSegments(1).append(new Path("../../jre/lib/rt.jar")); //$NON-NLS-1$ if (!jrePath.equals(JavaCore.getClasspathVariable(JavaRuntime.JRELIB_VARIABLE))) { JavaCore.setClasspathVariable(JavaRuntime.JRELIB_VARIABLE, jrePath, null); } } /* * final JETCompiler jetCompiler = templateURIPath == null ? new * MyJETCompiler(templateURI, encoding) : */ getJetCompiler(); progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETParsing_message", new Object[]{jetCompiler.getResolvedTemplateURI()})); //$NON-NLS-1$ jetCompiler.parse(); progressMonitor.worked(1); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); jetCompiler.generate(outputStream); final InputStream contents = new ByteArrayInputStream(outputStream.toByteArray()); final IWorkspace workspace = ResourcesPlugin.getWorkspace(); IJavaModel javaModel = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()); if (!javaModel.isOpen()) { javaModel.open(new SubProgressMonitor(progressMonitor, 1)); } else { progressMonitor.worked(1); } final IProject project = workspace.getRoot().getProject(getProjectName()); progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETPreparingProject_message", new Object[]{project.getName()})); //$NON-NLS-1$ IJavaProject javaProject; if (!project.exists()) { javaProject = createJavaProject(progressMonitor, workspace, project); initializeJavaProject(progressMonitor, project, javaProject); javaProject.close(); } else { project.open(new SubProgressMonitor(progressMonitor, 5)); javaProject = JavaCore.create(project); List rawClassPath = Arrays.asList(javaProject.getRawClasspath()); for (int i=0; i<rawClassPath.size(); i++) { IClasspathEntry entry = (IClasspathEntry) rawClassPath.get(i); if (entry.getEntryKind()==IClasspathEntry.CPE_LIBRARY) classpathEntries.add(entry); } } IPackageFragmentRoot sourcePackageFragmentRoot = openJavaProjectIfNecessary(progressMonitor, project, javaProject); String packageName = jetCompiler.getSkeleton().getPackageName(); StringTokenizer stringTokenizer = new StringTokenizer(packageName, "."); //$NON-NLS-1$ IProgressMonitor subProgressMonitor = new SubProgressMonitor(progressMonitor, 1); subProgressMonitor.beginTask("", stringTokenizer.countTokens() + 4); //$NON-NLS-1$ subProgressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_CreateTargetFile_message")); //$NON-NLS-1$ IContainer sourceContainer = (IContainer) sourcePackageFragmentRoot.getCorrespondingResource(); while (stringTokenizer.hasMoreElements()) { String folderName = stringTokenizer.nextToken(); sourceContainer = sourceContainer.getFolder(new Path(folderName)); if (!sourceContainer.exists()) { ((IFolder) sourceContainer).create(false, true, new SubProgressMonitor(subProgressMonitor, 1)); } } IFile targetFile = sourceContainer.getFile(new Path(jetCompiler.getSkeleton().getClassName() + ".java")); //$NON-NLS-1$ if (!targetFile.exists()) { subProgressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETCreating_message", new Object[]{targetFile.getFullPath()})); //$NON-NLS-1$ targetFile.create(contents, true, new SubProgressMonitor(subProgressMonitor, 1)); } else { subProgressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETUpdating_message", new Object[]{targetFile.getFullPath()})); //$NON-NLS-1$ targetFile.setContents(contents, true, true, new SubProgressMonitor(subProgressMonitor, 1)); } boolean errors = performBuild(project, subProgressMonitor, targetFile); if (!errors) { loadClass(workspace, project, javaProject, packageName, subProgressMonitor); } subProgressMonitor.done(); } catch (CoreException exception) { throw new JETException(exception); } catch (Exception exception) { throw new JETException(exception); } finally { progressMonitor.done(); } } /** * @param progressMonitor * @param project * @param javaProject * @return * @throws JavaModelException */ protected IPackageFragmentRoot openJavaProjectIfNecessary(IProgressMonitor progressMonitor, final IProject project, IJavaProject javaProject) throws JavaModelException { progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETOpeningJavaProject_message", new Object[]{project.getName()})); //$NON-NLS-1$ javaProject.open(new SubProgressMonitor(progressMonitor, 1)); IPackageFragmentRoot[] packageFragmentRoots = javaProject.getPackageFragmentRoots(); IPackageFragmentRoot sourcePackageFragmentRoot = null; for (int j = 0; j < packageFragmentRoots.length; ++j) { IPackageFragmentRoot packageFragmentRoot = packageFragmentRoots[j]; if (packageFragmentRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { sourcePackageFragmentRoot = packageFragmentRoot; break; } } return sourcePackageFragmentRoot; } /** * @param progressMonitor * @param project * @param javaProject * @throws CoreException * @throws JavaModelException * @throws BackingStoreException */ protected void initializeJavaProject(IProgressMonitor progressMonitor, final IProject project, IJavaProject javaProject) throws CoreException, JavaModelException, BackingStoreException { progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETInitializingProject_message", new Object[]{project.getName()})); //$NON-NLS-1$ IClasspathEntry classpathEntry = JavaCore.newSourceEntry(new Path("/" + project.getName() + "/src")); //$NON-NLS-1$ //$NON-NLS-2$ //IClasspathEntry jreClasspathEntry = JavaCore.newVariableEntry(new Path(JavaRuntime.JRELIB_VARIABLE), new Path(JavaRuntime.JRESRC_VARIABLE), new Path(JavaRuntime.JRESRCROOT_VARIABLE)); IClasspathEntry jreClasspathEntry = JavaRuntime.getDefaultJREContainerEntry(); List classpath = new ArrayList(); classpath.add(classpathEntry); classpath.add(jreClasspathEntry); classpath.addAll(classpathEntries); IFolder sourceFolder = project.getFolder(new Path("src")); //$NON-NLS-1$ if (!sourceFolder.exists()) { sourceFolder.create(false, true, new SubProgressMonitor(progressMonitor, 1)); } IFolder runtimeFolder = project.getFolder(new Path("runtime")); //$NON-NLS-1$ if (!runtimeFolder.exists()) { runtimeFolder.create(false, true, new SubProgressMonitor(progressMonitor, 1)); } IClasspathEntry[] classpathEntryArray = (IClasspathEntry[]) classpath.toArray(new IClasspathEntry[classpath.size()]); javaProject.setRawClasspath(classpathEntryArray, new SubProgressMonitor(progressMonitor, 1)); javaProject.setOutputLocation(new Path("/" + project.getName() + "/runtime"), new SubProgressMonitor(progressMonitor, 1)); //$NON-NLS-1$ //$NON-NLS-2$ // appended from previous implementation createClasspathEntries(project); IScopeContext context = new ProjectScope( project ); IEclipsePreferences prefs = context.getNode( JavaCore.PLUGIN_ID ); prefs.put( JavaCore.COMPILER_PB_RAW_TYPE_REFERENCE, JavaCore.IGNORE ); prefs.put( JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE ); // set Java compiler compliance level to 1.5 prefs.put( JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5 ); prefs.put( JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_5 ); prefs.put( JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5 ); prefs.put( JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR ); prefs.put( JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR ); // set Javadoc validation to the default ignore level prefs.put( JavaCore.COMPILER_PB_INVALID_JAVADOC, JavaCore.IGNORE ); prefs.put( JavaCore.COMPILER_PB_INVALID_JAVADOC_TAGS, JavaCore.DISABLED ); prefs.put( JavaCore.COMPILER_PB_INVALID_JAVADOC_TAGS__DEPRECATED_REF, JavaCore.DISABLED ); prefs.put( JavaCore.COMPILER_PB_INVALID_JAVADOC_TAGS__NOT_VISIBLE_REF, JavaCore.DISABLED ); prefs.put( JavaCore.COMPILER_PB_INVALID_JAVADOC_TAGS_VISIBILITY, JavaCore.PUBLIC ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_TAG_DESCRIPTION, JavaCore.COMPILER_PB_MISSING_JAVADOC_TAG_DESCRIPTION_RETURN_TAG ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS, JavaCore.IGNORE ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS_VISIBILITY, JavaCore.PUBLIC ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS_OVERRIDING, JavaCore.DISABLED ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, JavaCore.IGNORE ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY, JavaCore.PUBLIC ); prefs.put( JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING, JavaCore.DISABLED ); // store changed properties permanently prefs.flush(); } /** * @param progressMonitor * @param workspace * @param project * @return * @throws CoreException */ private IJavaProject createJavaProject(IProgressMonitor progressMonitor, final IWorkspace workspace, final IProject project) throws CoreException { IJavaProject javaProject; progressMonitor.subTask("JET creating project " + project.getName()); //$NON-NLS-1$ project.create(new SubProgressMonitor(progressMonitor, 1)); progressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETCreatingProject_message", new Object[]{project.getName()})); //$NON-NLS-1$ IProjectDescription description = workspace.newProjectDescription(project.getName()); description.setNatureIds(new String[]{JavaCore.NATURE_ID}); description.setLocation(null); project.open(new SubProgressMonitor(progressMonitor, 1)); project.setDescription(description, new SubProgressMonitor(progressMonitor, 1)); javaProject = JavaCore.create(project); return javaProject; } /** * @param workspace * @param project * @param javaProject * @param packageName * @param subProgressMonitor * @throws JavaModelException * @throws MalformedURLException * @throws ClassNotFoundException * @throws SecurityException */ protected void loadClass(final IWorkspace workspace, final IProject project, IJavaProject javaProject, String packageName, IProgressMonitor subProgressMonitor) throws JavaModelException, MalformedURLException, ClassNotFoundException, SecurityException { //IContainer targetContainer = // workspace.getRoot().getFolder(javaProject.getOutputLocation()); subProgressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETLoadingClass_message", new Object[]{jetCompiler.getSkeleton().getClassName() + ".class"})); //$NON-NLS-1$ //$NON-NLS-2$ // Construct a proper URL for relative lookup. // URL url = new File(project.getLocation() + "/" + javaProject.getOutputLocation().removeFirstSegments(1) + "/").toURL(); //$NON-NLS-1$ //$NON-NLS-2$ URLClassLoader theClassLoader = new URLClassLoader(new URL[]{url}, classLoader); Class theClass = theClassLoader.loadClass((packageName.length() == 0 ? "" : packageName + ".") + jetCompiler.getSkeleton().getClassName()); //$NON-NLS-1$ //$NON-NLS-2$ String methodName = jetCompiler.getSkeleton().getMethodName(); Method[] methods = theClass.getDeclaredMethods(); for (int i = 0; i < methods.length; ++i) { if (methods[i].getName().equals(methodName)) { setMethod(methods[i]); break; } } } /** * @param project * @param subProgressMonitor * @param targetFile * @return * @throws CoreException */ protected boolean performBuild(final IProject project, IProgressMonitor subProgressMonitor, IFile targetFile) throws CoreException { subProgressMonitor.subTask(CodeGenPlugin.getPlugin().getString("_UI_JETBuilding_message", new Object[]{project.getName()})); //$NON-NLS-1$ project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new SubProgressMonitor(subProgressMonitor, 1)); IMarker[] markers = targetFile.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); boolean errors = false; for (int i = 0; i < markers.length; ++i) { IMarker marker = markers[i]; if (marker.getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO) == IMarker.SEVERITY_ERROR) { errors = true; subProgressMonitor.subTask(marker.getAttribute(IMarker.MESSAGE) + " : " + (CodeGenPlugin.getPlugin().getString("jet.mark.file.line", new Object[]{targetFile.getLocation(), marker.getAttribute(IMarker.LINE_NUMBER)}))); //$NON-NLS-1$ //$NON-NLS-2$ } } return errors; } /** * Create the correct classpath entries for the given project * * @param project */ protected void createClasspathEntries(IProject project) { Assert.isNotNull(project, "A valid project is required in order to append to a classpath"); //$NON-NLS-1$ String variableName = null; String pluginId = null; for (Iterator variablesKeyIterator = getVariables().keySet().iterator(); variablesKeyIterator.hasNext();) { variableName = (String) variablesKeyIterator.next(); pluginId = (String) getVariables().get(variableName); if (hasOutputDirectory(pluginId)) addLinkedFolderAsLibrary(project, variableName, pluginId); else addRuntimeJarsAsLibrary(project, pluginId); } } /** * @param pluginId * @return */ protected boolean hasOutputDirectory(String pluginId) { Bundle bundle = Platform.getBundle(pluginId); URL outputDirectory = Platform.find(bundle,new Path("bin")); //$NON-NLS-1$ if (outputDirectory == null) return false; URL installLocation = null; try { installLocation = Platform.asLocalURL(outputDirectory); File outputDirectoryFile = new File(installLocation.getPath());// new File(location); return outputDirectoryFile.canRead() && outputDirectoryFile.isDirectory() && outputDirectoryFile.listFiles().length > 0; } catch (IOException e) { J2EEPlugin.logWarning(J2EEPluginResourceHandler.getString("Install_Location_Error_", new Object[]{installLocation}) + e); //$NON-NLS-1$ } return false; } /** * @param project * @param variableName * @param pluginId */ protected void addRuntimeJarsAsLibrary(IProject project, String pluginId) { ManifestElement[] elements = null; Bundle bundle = Platform.getBundle(pluginId); try { String requires = bundle.getHeaders().get(Constants.BUNDLE_CLASSPATH); elements = ManifestElement.parseHeader(Constants.BUNDLE_CLASSPATH, requires); } catch (Exception e) { J2EEPlugin.logError(e); elements = new ManifestElement[0]; } IPath runtimeLibFullPath = null; URL fullurl = null; if (elements == null) { if (bundle.getLocation().endsWith(IJ2EEModuleConstants.JAR_EXT)) try { runtimeLibFullPath = getJarredPluginPath(bundle); } catch (IOException e) { J2EEPlugin.logError(e); } appendToClassPath(runtimeLibFullPath,project); return; } for (int i = 0; i < elements.length; i++) { String value = elements[i].getValue(); if (".".equals(value)) //$NON-NLS-1$ value = "/"; //$NON-NLS-1$ fullurl = Platform.getBundle(pluginId).getEntry(value); // fix the problem with leading slash that caused dup classpath entries if (fullurl==null) continue; try { runtimeLibFullPath = new Path(Platform.asLocalURL(fullurl).getPath()); } catch (Exception e) { J2EEPlugin.logError(e); } //TODO handle jar'ed plugins, this is a hack for now, need to find proper bundle API if (bundle.getLocation().endsWith(IJ2EEModuleConstants.JAR_EXT)) try { runtimeLibFullPath = getJarredPluginPath(bundle); } catch (IOException e) { J2EEPlugin.logError(e); } if (runtimeLibFullPath != null && !"jar".equals(runtimeLibFullPath.getFileExtension()) && !"zip".equals(runtimeLibFullPath.getFileExtension())) //$NON-NLS-1$ //$NON-NLS-2$ continue; appendToClassPath(runtimeLibFullPath,project); } } private void appendToClassPath(IPath runtimeLibFullPath, IProject project) { IClasspathEntry entry = null; entry = JavaCore.newLibraryEntry(runtimeLibFullPath, null,null,null,new IClasspathAttribute[]{},false); try { if (!classpathEntries.contains(entry)) classpathEntries.add(entry); //J2EEProjectUtilities.appendJavaClassPath(project, entry); } catch (Exception e) { J2EEPlugin.logError("Problem appending \"" + entry.getPath() + "\" to classpath of Project \"" + project.getName() + "\"."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ J2EEPlugin.logError(e); } } private IPath getJarredPluginPath(Bundle bundle) throws IOException { Path runtimeLibFullPath = null; String jarPluginLocation = FileLocator.getBundleFile(bundle).getPath(); Path jarPluginPath = new Path(jarPluginLocation); // handle case where jars are installed outside of eclipse installation if (jarPluginPath.isAbsolute()) runtimeLibFullPath = jarPluginPath; // handle normal case where all plugins under eclipse install else { String installPath = Platform.getInstallLocation().getURL().getPath(); runtimeLibFullPath = new Path(installPath+"/"+jarPluginLocation); //$NON-NLS-1$ } return runtimeLibFullPath; } /** * @param progressMonitor */ protected void updateProgress(IProgressMonitor progressMonitor, String key) { progressMonitor.subTask(getMessage(key)); } /** * @param progressMonitor */ protected void updateProgress(IProgressMonitor progressMonitor, String key, Object[] args) { progressMonitor.subTask(getMessage(key, args)); } protected String getMessage(String key) { return CodeGenPlugin.getPlugin().getString(key); } protected String getMessage(String key, Object[] args) { return CodeGenPlugin.getPlugin().getString(key, args); } /* * (non-Javadoc) * * @see org.eclipse.emf.codegen.jet.JETEmitter#addVariable(java.lang.String, java.lang.String) */ @Override public void addVariable(String variableName, String pluginID) throws JETException { if (!isIntelligentLinkingEnabled()) super.addVariable(variableName, pluginID); else { getVariables().put(variableName, pluginID); IWorkspace workspace = ResourcesPlugin.getWorkspace(); IProject project = workspace.getRoot().getProject(getProjectName()); if (project != null && project.exists()) createClasspathEntries(project); } } /** * @return */ private boolean isIntelligentLinkingEnabled() { return intelligentLinkingEnabled; } /** * @return */ private Map getVariables() { if (variables == null) variables = new HashMap(); return variables; } protected void addLinkedFolderAsLibrary(IProject project, String variableName, String pluginID) { try { URL outputDirectory = Platform.find(Platform.getBundle(pluginID),new Path("bin")); //$NON-NLS-1$ // IPluginDescriptor pluginDescriptor = Platform.getPlugin(pluginID).getDescriptor(); // URL outputDirectory = pluginDescriptor.find(new Path("bin")); //$NON-NLS-1$ String pathString = Platform.asLocalURL(outputDirectory).getPath(); if (pathString.endsWith("/")) //$NON-NLS-1$ pathString = pathString.substring(0, pathString.length() - 1); if (pathString.startsWith("/")) //$NON-NLS-1$ pathString = pathString.substring(1, pathString.length()); IPath path = new Path(pathString).makeAbsolute(); String binDirectoryVariable = variableName + "_BIN"; //$NON-NLS-1$ IFolder linkedDirectory = project.getFolder(binDirectoryVariable); if (!linkedDirectory.exists()) { linkedDirectory.createLink(path, IResource.ALLOW_MISSING_LOCAL, null); linkedDirectory.setDerived(true); project.refreshLocal(IResource.DEPTH_INFINITE, null); } IClasspathEntry entry = JavaCore.newLibraryEntry(linkedDirectory.getFullPath(), null,null,null,new IClasspathAttribute[]{},false); if (!classpathEntries.contains(entry)) classpathEntries.add(entry); //J2EEProjectUtilities.appendJavaClassPath(project, entry); } catch (Exception e) { J2EEPlugin.logError(e); } } /** * @param intelligentLinkingEnabled * The intelligentLinkingEnabled to set. */ public void setIntelligentLinkingEnabled(boolean intelligentLinkingEnabled) { this.intelligentLinkingEnabled = intelligentLinkingEnabled; } protected JETCompiler getJetCompiler() { try { if (jetCompiler == null) { jetCompiler = templateURIPath == null ? new MyJETCompiler(templateURI, encoding) : new MyJETCompiler(templateURIPath, templateURI, encoding); } } catch (JETException e) { J2EEPlugin.logError(e); } return jetCompiler; } }