blob: 2cf5db5448418a472bf5ffea93e4f834ded4ac86 [file] [log] [blame]
/***************************************************************************************************
* Copyright (c) 2005 Eteration A.S. 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: Eteration A.S. - initial API and implementation
**************************************************************************************************/
package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
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.ejb.annotations.internal.xdoclet.util.AntLauncherUtility;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
public abstract class XDocletAntProjectBuilder {
protected URL templateUrl;
XDocletPreferenceStore preferenceStore = null;
IProject project;
IResource resource;
Properties properties;
public static class Factory {
public static XDocletAntProjectBuilder newInstance(IResource resource) {
IVirtualResource[] vResources = ComponentCore.createResources(resource);
XDocletAntProjectBuilder antProjectBuilder = null;
if (vResources.length == 0)
return null;
if (J2EEProjectUtilities.isEJBProject(vResources[0].getComponent().getProject()))
antProjectBuilder = new XDocletEjbAntProjectBuilder();
else if (J2EEProjectUtilities.isDynamicWebProject(vResources[0].getComponent().getProject()))
antProjectBuilder = new XDocletWebAntProjectBuilder();
antProjectBuilder.setProject(vResources[0].getComponent().getProject());
antProjectBuilder.setResource(resource);
return antProjectBuilder;
}
}
public XDocletAntProjectBuilder() {
super();
}
private XDocletPreferenceStore initPreferenceStore(IProject project) {
if (preferenceStore == null) {
preferenceStore = XDocletPreferenceStore.forProject(project);
}
return preferenceStore;
}
protected String asClassPath(IJavaProject project) throws CoreException {
String[] cp = createClassPath(project);
StringBuffer buf = new StringBuffer(256);
for (int i = 0; i < cp.length; i++) {
String string = cp[i];
buf.append(string);
if (i != cp.length - 1)
buf.append(File.pathSeparatorChar);
}
return buf.toString();
}
protected String[] createClassPath(IJavaProject project) throws CoreException {
String[] cp = JavaRuntime.computeDefaultRuntimeClassPath(project);
return cp;
}
public void buildUsingAnt(final IResource beanClass,final IProgressMonitor monitor) throws CoreException {
initPreferenceStore(beanClass.getProject());
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor aMonitor) throws CoreException {
IJavaProject javaProject = JavaCore.create(beanClass.getProject());
try {
IPackageFragmentRoot packageFragmentRoot = getPackageFragmentRootOrFirst(beanClass);
String beanPath = constructAnnotatedClassList(packageFragmentRoot, beanClass);
Properties properties = createAntBuildProperties(beanClass, javaProject, packageFragmentRoot, beanPath);
XDocletAntProjectBuilder.this.setProperties(properties);
HashMap templates = createTemplates(beanPath);
AntLauncherUtility antLauncher = new AntLauncherUtility(templateUrl, beanClass.getParent().getLocation(), properties,
templates);
antLauncher.setUseLauncher(true);
antLauncher.launch(getTaskName(), aMonitor);
XDocletAntProjectBuilder.this.refreshProjects(beanClass.getProject(), aMonitor);
} catch (Exception e) {
Logger.logException(e);
}
}
};
ResourcesPlugin.getWorkspace().run(runnable, null, IWorkspace.AVOID_UPDATE, monitor);
}
private IPackageFragmentRoot getPackageFragmentRootOrFirst(IResource beanClass) throws JavaModelException {
try {
ICompilationUnit compilationUnit = JavaCore.createCompilationUnitFrom((IFile) beanClass);
return this.getPackageFragmentRoot(compilationUnit);
} catch (RuntimeException e) {
}
IContainer container = J2EEProjectUtilities.getSourceFolderOrFirst(beanClass.getProject(), "ejbModule");
return JavaCore.create(beanClass.getProject()).findPackageFragmentRoot(container.getFullPath());
}
protected abstract String getTaskName();
protected abstract void refreshProjects(IProject project, IProgressMonitor monitor) throws CoreException;
protected abstract HashMap createTemplates(String beanPath);
protected abstract Properties createAntBuildProperties(IResource resource, IJavaProject javaProject,
IPackageFragmentRoot packageFragmentRoot, String beanPath);
protected abstract String constructAnnotatedClassList(IPackageFragmentRoot root, IResource changedBean);
/**
* @param path2
* @param root
* @return
*/
protected IPath makeRelativeTo(IPath path, IPackageFragmentRoot root) {
if (root == null)
return path;
try {
IPath rpath = root.getCorrespondingResource().getProjectRelativePath();
if (rpath.isPrefixOf(path))
return path.removeFirstSegments(rpath.matchingFirstSegments(path));
} catch (JavaModelException e) {
Logger.logException(e);
}
return path;
}
protected IPackageFragmentRoot getPackageFragmentRoot(ICompilationUnit res) {
IJavaElement current = res;
do {
if (current instanceof IPackageFragmentRoot)
return (IPackageFragmentRoot) current;
current = current.getParent();
} while (current != null);
return null;
}
protected IPath getJavaProjectOutputContainer(IJavaProject proj) throws JavaModelException {
IPath path = proj.getOutputLocation();
if (path == null)
return null;
if (path.segmentCount() == 1)
return path;
return ((IContainer) proj.getProject()).getFolder(path.removeFirstSegments(1)).getProjectRelativePath();
}
public XDocletPreferenceStore getPreferenceStore() {
return preferenceStore;
}
public IProject getProject() {
return project;
}
public void setProject(IProject project) {
this.project = project;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public IResource getResource() {
return resource;
}
public void setResource(IResource resource) {
this.resource = resource;
}
}