blob: a7f68ab227717202c4fe9fc54a57bb6066173113 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.uima.pear.nature;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.uima.pear.PearException;
import org.apache.uima.pear.insd.edit.PearInstallationDescriptor;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.apache.uima.pear.tools.InstallationDescriptor;
/**
*
* A util class to handle customization of IProject with the UIMA nature
*
*
*
*/
public class ProjectCustomizer {
public static final String UIMA_NATURE_ID = "org.apache.uima.pear.UimaNature";
// public static final String STORE_PATH = "metadata/store.xml";
/**
* Customizes an IProject with the UIMA nature using an InstallationDescriptor instance
*
* @param container
* An IProject
* @param insd
* An InstallationDescriptor
* @throws PearException
* If a problem occurs
*/
public static void customizeProject(IContainer container, InstallationDescriptor insd)
throws PearException {
createPearFolderStructure(container);
PearInstallationDescriptor.createInstallationDescriptor(container, insd, false);
// only add UIMA Nature to projects
if (container.getType() == IResource.PROJECT) {
addUIMANature((IProject) container);
}
}
/**
* Customizes an IProject with the UIMA nature using an empty installation descriptor.
*
* @param project
* An IProject
* @throws PearException
* If a problem occurs
*/
public static void customizeProject(IProject project) throws PearException {
InstallationDescriptor insd = new InstallationDescriptor();
customizeProject(project, insd);
}
/**
* Adds the UIMA nature to a project
*
* @param project
* an IProject
* @throws PearException
* If a problem occurs
*/
public static void addUIMANature(IProject project) throws PearException {
try {
if (!project.hasNature(UIMA_NATURE_ID)) {
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
newNatures[natures.length] = UIMA_NATURE_ID;
description.setNatureIds(newNatures);
project.setDescription(description, null);
project.close(null);
project.open(null);
}
} catch (Throwable e) {
PearException subEx = new PearException("The UIMA Nature could not be added properly.", e);
throw subEx;
}
}
/**
* Creates the PEAR folder structure
*
* @param container
* an IProject
* @throws PearException
* if a problem occurs
*/
public static void createPearFolderStructure(IContainer container) throws PearException {
try {
// Create PEAR Folder Structure - Required Elements always
ProjectCustomizer.createFolder(container, "metadata");
// Create PEAR Folder Structure - Optional Elements only for projects
if (container.getType() == IResource.PROJECT) {
ProjectCustomizer.createFolder(container, "src");
ProjectCustomizer.createFolder(container, "bin");
ProjectCustomizer.createFolder(container, "desc");
ProjectCustomizer.createFolder(container, "lib");
ProjectCustomizer.createFolder(container, "data");
ProjectCustomizer.createFolder(container, "doc");
ProjectCustomizer.createFolder(container, "conf");
ProjectCustomizer.createFolder(container, "resources");
}
} catch (Throwable e) {
PearException subEx = new PearException(
"The PEAR folder structure could not be created properly.", e);
throw subEx;
}
}
/**
* Creates a folder, if it does not exist, in a given container
*
* @param container
* an IContainer
* @param folderName
* The folder name
* @return the handle (IFolder) to the folder
* @throws PearException
* If a problem occurs
*/
public static IFolder createFolder(IContainer container, String folderName) throws PearException {
try {
IFolder folder = container.getFolder(new Path(folderName));
// If the folder does not exist, create and return, failure returns null
if (!folder.exists()) {
folder.create(true, true, null);
return folder;
} else {
// return what already exisited
return folder;
}
} catch (Throwable e) {
PearException subEx = new PearException("folderName could not be created properly.", e);
throw subEx;
}
}
/**
* Creates a file in a project with a string as content
*
* @param project
* an IProject
* @param fileName
* pathname relative to the project
* @param s
* A string representing the content
* @param overrideContentIfExist
* if true, overrides existing file
* @return a handle to the file (IFile)
* @throws PearException
* If a problem occurs
*/
public static IFile createFile(IProject project, String fileName, String s,
boolean overrideContentIfExist) throws PearException {
InputStream is = null;
try {
is = new ByteArrayInputStream(s.getBytes("UTF-8"));
return createFile(project, fileName, is, overrideContentIfExist);
} catch (Throwable e) {
PearException subEx = new PearException(fileName + " could not be created/saved properly.", e);
throw subEx;
}
}
/**
* Creates a file in a project with an InputStream for the content
*
* @param container
* an IProject
* @param fileName
* pathname relative to the project
* @param is
* An inputStream for the the content
* @param overrideContentIfExist
* if true, overrides existing file
* @return a handle to the file (IFile)
* @throws PearException
* If a problem occurs
*/
public static IFile createFile(IContainer container, String fileName, InputStream is,
boolean overrideContentIfExist) throws PearException {
try {
createPearFolderStructure(container);
// if we have a container
if (container.exists()) {
IFile newFile = container.getFile(new Path(fileName));
// If the file does not exist, create with content, mark, and return
if (!newFile.exists()) {
newFile.create(is, false, null);
return newFile;
} else {
if (overrideContentIfExist)
newFile.setContents(is, true, true, null);
// return what already exisited
return newFile;
}
} else
// return null as there is no container to place a file in
return null;
} catch (Throwable e) {
PearException subEx = new PearException(fileName + " could not be created/saved properly.", e);
throw subEx;
}
}
}