Java tutorial
/* * Copyright (c) 2011, Municipiality of Vienna, Austria * * Licensed under the EUPL, Version 1.1 or as soon they * will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the * Licence. * * For convenience a plain text copy of the English version * of the Licence can be found in the file LICENCE.txt in * the top-level directory of this software distribution. * * You may obtain a copy of the Licence in any of 22 European * Languages at: * * http://www.osor.eu/eupl * * Unless required by applicable law or agreed to in * writing, software distributed under the Licence is * distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the Licence for the specific language governing * permissions and limitations under the Licence. */ package org.azzyzt.jee.tools.project; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.azzyzt.jee.tools.common.Common; import org.azzyzt.jee.tools.common.Util; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; 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.jst.common.project.facet.core.JavaFacetInstallConfig; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; public class JavaProject extends FacetedProject { public static final String GENERATED_SRC_FOLDER_NAME = "generated"; public static final String DWP_SRC_FOLDER_NAME = "src"; private IJavaProject jp; private List<String> sourceFolderNames; protected JavaProject() { } public static IJavaProject asIJavaProject(Project p) throws CoreException { return asIJavaProject(p.getP()); } public static IJavaProject asIJavaProject(IProject p) throws CoreException { return (IJavaProject) p.getNature(JavaCore.NATURE_ID); } protected static JavaProject asJavaProject(FacetedProject p) throws CoreException { JavaProject jp = new JavaProject(); jp.setP(p.getP()); jp.setFp(p.getFp()); jp.setName(p.getName()); jp.setContext(p.getContext()); jp.setJp(asIJavaProject(p)); return jp; } public JavaProject(String name, Context context, List<String> sourceFolderNames) throws CoreException { super(name, context); if (isNewlyCreated()) { this.sourceFolderNames = sourceFolderNames; installJavaFacet(); } jp = asIJavaProject(this); } protected void installJavaFacet() throws CoreException { JavaFacetInstallConfig config = (JavaFacetInstallConfig) FacetedProject .createConfigObject(getContext().getFacets().javaFacetVersion); List<IPath> sourceFolderPaths = new ArrayList<IPath>(); for (String sourceFolderName : sourceFolderNames) { sourceFolderPaths.add((IPath) new Path(sourceFolderName)); } config.setSourceFolders(sourceFolderPaths); installFacet(getContext().getFacets().javaFacetVersion, config); } protected void installJpaFacet() throws CoreException { IDataModel config = (IDataModel) FacetedProject .createConfigObject(getContext().getFacets().jpaFacetVersion); installFacet(getContext().getFacets().jpaFacetVersion, config); /* * TODO make sure we get the highest EclipseLink 2.1 ??? * Sometimes we get it, sometimes we just get Generic 2.0. Find out why. */ //JpaProject jpaProject = JptCorePlugin.getJpaProject(getP()); //JptCorePlugin.setJpaPlatformId(getP(), "eclipselink2_1"); //jpaProject.update(); } protected void addProjectsToBuildPath(List<JavaProject> projectsOnBuildPath) throws CoreException { if (projectsOnBuildPath == null) return; for (JavaProject p : projectsOnBuildPath) { ProjectUtil.appendProjectToClassPath(jp, p.getJp()); } } protected void addFolderToClassPath(Path path) throws CoreException, JavaModelException { IClasspathEntry classpathEntry = JavaCore.newSourceEntry(getP().getFullPath().append(path)); addEntryToClassPath(classpathEntry); } protected void addJarToClassPath(Path jar) throws CoreException, JavaModelException { IClasspathEntry classpathEntry = JavaCore.newLibraryEntry(getP().getFullPath().append(jar), null, null); addEntryToClassPath(classpathEntry); } private void addEntryToClassPath(IClasspathEntry classpathEntry) throws JavaModelException { IClasspathEntry[] rawClasspath = jp.getRawClasspath(); IClasspathEntry[] newClasspath = new IClasspathEntry[rawClasspath.length + 1]; newClasspath[0] = classpathEntry; System.arraycopy(rawClasspath, 0, newClasspath, 1, rawClasspath.length); jp.setRawClasspath(newClasspath, getContext().getSubMonitor()); } protected void moveJreToEndOfClassPath() throws JavaModelException { IClasspathEntry[] rawClasspath = jp.getRawClasspath(); IClasspathEntry[] newRawClassPath = new IClasspathEntry[rawClasspath.length]; for (int i = 0, offset = 0; i < rawClasspath.length; i++) { IClasspathEntry cpe = rawClasspath[i]; if (cpe.getEntryKind() == IClasspathEntry.CPE_CONTAINER && cpe.getPath().toString().startsWith("org.eclipse.jdt.launching.JRE_CONTAINER")) { if (newRawClassPath[rawClasspath.length - 1] == null) { newRawClassPath[rawClasspath.length - 1] = cpe; offset = 1; } else { Common.getDefault().log( "FacetedProject " + getP().getName() + " has more than one JRE class path entry!!"); newRawClassPath[i - offset] = cpe; } } else { newRawClassPath[i - offset] = cpe; } } jp.setRawClasspath(newRawClassPath, null); } protected void createSourceFolderIfNeededAndAddToProject(String folderName) throws CoreException, JavaModelException { addFolderToClassPath(createFolderPathIfNeeded(folderName)); } protected void createSubpackages(String srcFolderName, String... pkgNames) throws CoreException, JavaModelException { IPath absEjbSrcPath = getP().getFolder(srcFolderName).getFullPath(); IPackageFragmentRoot ejbPackageFragmentRoot = jp.findPackageFragmentRoot(absEjbSrcPath); for (String subPackage : Arrays.asList(pkgNames)) { String pkgName = String.format("%s.%s", getContext().getPackageName(), subPackage); ejbPackageFragmentRoot.createPackageFragment(pkgName, true, getContext().getSubMonitor()); } } protected void buildJavaClass(String srcFolderName, String projectBaseName, String pkgName, String fqBuilder, String jobTitle, List<URL> extraUrls) throws InterruptedException, CoreException { IFolder srcFolder = getP().getFolder(srcFolderName); IPath srcFolderPath = srcFolder.getLocation(); URL[] classPathEntries = ProjectUtil.classPathURLsForToolMainClass(getP(), extraUrls); String fqMainClassName = "org.azzyzt.jee.tools.mwe.GenericGenerator"; String[] args = { srcFolderPath.toString(), projectBaseName, pkgName, fqBuilder }; Util.callExternalMainClass(jobTitle, classPathEntries, fqMainClassName, args); } public void setJp(IJavaProject jp) { this.jp = jp; } public IJavaProject getJp() { return jp; } public List<String> getSourceFolderNames() { return sourceFolderNames; } }