/*
* � Copyright IBM Corp. 2014, 2016
*
* 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 com.ibm.xsp.extlib.designer.relational.utils;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import com.ibm.commons.util.StringUtil;
import com.ibm.commons.util.io.StreamUtil;
/**
* @author Gary Marjoram
*
*/
public class ProjectUtils {
//
// Utility function to create a plugin project based on a projectDef
//
public static IProject createPluginProject(final ProjectDef projectDef) throws Exception {
IProject project = null;
try {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
project = root.getProject(projectDef.name + "_" + projectDef.version);
if (project.exists()) {
project.delete(true, true, null);
}
project.create(null);
project.open(null);
IProjectDescription description = project.getDescription();
description.setNatureIds(new String[] { "org.eclipse.pde.PluginNature", JavaCore.NATURE_ID }); // $NON-NLS-1$
project.setDescription(description, null);
IJavaProject javaProject = JavaCore.create(project);
// Contruct the classpath
List<IClasspathEntry> classpathList = new ArrayList<IClasspathEntry>();
// Source folders
for (String folderName : projectDef.srcFolders) {
IFolder folder = project.getFolder(folderName);
// Create the src folders in the project
if (!folder.exists()) {
folder.create(false, true, null);
}
IClasspathEntry srcClasspathEntry = JavaCore.newSourceEntry(folder.getFullPath());
classpathList.add(srcClasspathEntry);
}
// Add Lib Classpaths
if (!StringUtil.isEmpty(projectDef.libFolder)) {
IFolder folder = project.getFolder(projectDef.libFolder);
// Create the lib folder in the project
if (!folder.exists()) {
folder.create(true, true, null);
}
for (String lib : projectDef.libs) {
IClasspathEntry srcClasspathEntry = JavaCore.newLibraryEntry(
new Path(folder.getFullPath() + "/" + new File(lib).getName()), null, null, true);
classpathList.add(srcClasspathEntry);
}
}
classpathList.add(JavaCore.newContainerEntry(new Path("org.eclipse.jdt.launching.JRE_CONTAINER"))); // $NON-NLS-1$
classpathList.add(JavaCore.newContainerEntry(new Path("org.eclipse.pde.core.requiredPlugins"))); // $NON-NLS-1$
// Set the project classpath
javaProject.setRawClasspath(classpathList.toArray(new IClasspathEntry[classpathList.size()]), null);
} catch (Exception e) {
if (project != null) {
closeAndDeleteProject(project, true);
}
throw new Exception("Error creating temporary Plug-in project in the Workspace", e); // $NLX-ProjectUtils.ErrorcreatingtemporaryPluginproje-1$
}
return project;
}
//
// Utility function to write a file to the plugin project
//
public static void writeFile(final String name, final IContainer container, final String content) throws Exception {
InputStream is = null;
try {
IFile file = container.getFile(new Path(name));
is = new ByteArrayInputStream(content.getBytes(file.getCharset()));
file.create(is, true, null);
} catch (Exception e) {
String msg = StringUtil.format("Could not create the file \"{0}\"", name); // $NLX-ProjectUtils.Couldnotcreatethefile0-1$
throw new Exception(msg, e);
} finally {
StreamUtil.close(is);
}
}
//
// Utility function to write a Java file to the plugin project
//
public static void writeJavaFile(final IProject project, final String folder, final String packageName, final String name, final String content)
throws Exception {
try {
IJavaProject javaProject = JavaCore.create(project);
IFolder sourceFolder = project.getFolder(folder);
IPackageFragment pack = javaProject.getPackageFragmentRoot(sourceFolder).createPackageFragment(packageName, true, null);
pack.createCompilationUnit(name, content, true, null);
} catch (Exception e) {
String msg = StringUtil.format("Could not create the Java file \"{0}\"", name); // $NLX-ProjectUtils.CouldnotcreatetheJavafile0-1$
throw new Exception(msg, e);
}
}
//
// Utility function to create the build.properties file
//
public static void createBuildProperties(final IProject project, final ProjectDef projectDef) throws Exception {
try {
StringBuilder content = new StringBuilder("source.. = "); // $NON-NLS-1$
Iterator<String> iterator = projectDef.srcFolders.iterator();
while (iterator.hasNext()) {
content.append(iterator.next()).append('/');
if (iterator.hasNext()) {
content.append(",");
}
}
content.append("\r\n"); // $NON-NLS-1$
content.append("bin.includes = META-INF/,plugin.xml,.\r\n"); // $NON-NLS-1$
writeFile("build.properties", project, content.toString()); // $NON-NLS-1$
} catch (Exception e) {
throw new Exception("Error creating build.properties", e); // $NLX-ProjectUtils.Errorcreatingbuildproperties-1$
}
}
//
// Utility function to create the MANIFEST.MF file
//
public static void createManifest(final IProject project, final ProjectDef projectDef) throws Exception {
try {
StringBuilder content = new StringBuilder("Manifest-Version: 1.0\r\n"); // $NON-NLS-1$
content.append("Bundle-ManifestVersion: 2\r\n"); // $NON-NLS-1$
content.append("Bundle-Name: " + projectDef.name + "\r\n"); // $NON-NLS-1$ $NON-NLS-2$
content.append("Bundle-SymbolicName: " + projectDef.name + "; singleton:=true\r\n"); // $NON-NLS-1$ $NON-NLS-2$
content.append("Bundle-Version: " + projectDef.version + "\r\n"); // $NON-NLS-1$ $NON-NLS-2$
// Required Bundles
content.append("Require-Bundle: "); // $NON-NLS-1$
int i = 0;
for (String entry : projectDef.bundles) {
if (i++ > 0) {
content.append(",\r\n"); // $NON-NLS-1$
}
content.append(" " + entry);
}
content.append("\r\n"); // $NON-NLS-1$
// Exported Packages
content.append("Export-Package: "); // $NON-NLS-1$
i = 0;
for (String entry : projectDef.exports) {
if (i++ > 0) {
content.append(",\r\n"); // $NON-NLS-1$
}
content.append(" " + entry);
}
content.append("\r\n"); // $NON-NLS-1$
// Bundle ClassPath
content.append("Bundle-ClassPath: ."); // $NON-NLS-1$
if (!StringUtil.isEmpty(projectDef.libFolder)) {
for (String entry : projectDef.libs) {
content.append(",\r\n lib/" + new File(entry).getName()); // $NON-NLS-1$
}
}
content.append("\r\n"); // $NON-NLS-1$
content.append("Bundle-RequiredExecutionEnvironment: J2SE-1.5\r\n"); // $NON-NLS-1$
IFolder folder = project.getFolder("META-INF"); // $NON-NLS-1$
folder.create(true, true, null);
writeFile("MANIFEST.MF", folder, content.toString()); // $NON-NLS-1$
} catch (Exception e) {
throw new Exception("Error creating MANIFEST.MF", e); // $NLX-ProjectUtils.ErrorcreatingMANIFESTMF-1$
}
}
//
// Utility function to copy a list of files in to the plugin project
//
public static void copyFilesIntoProject(final IProject project, final String folder, final List<String> fileList) throws Exception {
try {
for (String file : fileList) {
FileInputStream fis = new FileInputStream(file);
try {
String libFile = new File(file).getName();
IFile libFileProj = project.getFile(folder + "/" + libFile);
libFileProj.create(fis, true, null);
} finally {
StreamUtil.close(fis);
}
}
} catch (Exception e) {
throw new Exception("Could not copy JARs into project", e); // $NLX-ProjectUtils.Couldnotcopyjarsintoproject-1$
}
}
//
// Utility function to build the project
//
public static void buildProject(final IProject project) throws Exception {
try {
project.build(IncrementalProjectBuilder.CLEAN_BUILD, null);
project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, null);
} catch (Exception e) {
throw new Exception("Could not build project", e); // $NLX-ProjectUtils.Couldnotbuildproject-1$
}
IMarker[] markers = project.findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
if (markers.length > 0) {
throw new Exception("Plug-in project did not compile. Ensure that the Class and JAR files are correct."); // $NLX-ProjectUtils.PluginprojectdidnotcompileEnsuret-1$
}
}
//
// Utility function to close and delete the plugin project
//
public static void closeAndDeleteProject(final IProject project, final boolean delete) throws Exception {
project.close(null);
if (delete) {
project.delete(true, true, null);
}
}
}