blob: 9c20db9b17d21875d4695c6af6b69623aee7418b [file] [log] [blame]
package org.eclipse.jst.j2ee.ejb.annotations.internal.xdoclet;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IParent;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.emf.workbench.JavaProjectUtilities;
import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.wst.common.componentcore.StructureEdit;
import org.eclipse.wst.common.componentcore.UnresolveableURIException;
import org.eclipse.wst.common.componentcore.internal.ComponentResource;
import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
public class XDocletEjbAntProjectBuilder extends XDocletAntProjectBuilder {
IProject clientProject;
public XDocletEjbAntProjectBuilder() {
super();
templateUrl = Platform.getBundle(XDocletAnnotationPlugin.PLUGINID).getEntry("/templates/builder/xdoclet.xml"); //$NON-NLS-1$
}
/**
* @return
*/
protected String getTaskName() {
return "ejbdoclet"; //$NON-NLS-1$
}
/**
* @param beanPath
* @return
*/
protected HashMap createTemplates(String beanPath) {
HashMap templates = new HashMap();
templates.put("@beans@", beanPath); //$NON-NLS-1$
templates.put("@jboss@", addJbossTask()); //$NON-NLS-1$
templates.put("@jonas@", addJonasTask()); //$NON-NLS-1$
templates.put("@weblogic@", addWeblogicTask()); //$NON-NLS-1$
templates.put("@websphere@", addWebSphereTask()); //$NON-NLS-1$
templates.put("@deploymentdescriptor@", addDeploymentDescriptorTask()); //$NON-NLS-1$
return templates;
}
/**
* @param resource
* @param javaProject
* @param packageFragmentRoot
* @param beanPath
* @return
* @throws JavaModelException
*/
public Properties createAntBuildProperties(IResource resource, IJavaProject javaProject, IPackageFragmentRoot packageFragmentRoot, String beanPath) {
Properties properties = new Properties();
StructureEdit core= null;
EJBArtifactEdit ejbEdit = null;
try {
core = StructureEdit.getStructureEditForRead(javaProject.getProject());
List ejbs = new ArrayList();
getAllAnnotatedEjbs(packageFragmentRoot, ejbs);
properties.put("ejb", resource.getProject().getName()); //$NON-NLS-1$
properties.put("ejb.project.dir", resource.getProject().getLocation().toString()); //$NON-NLS-1$
properties.put("ejb.project.classpath", asClassPath(javaProject)); //$NON-NLS-1$
properties.put("ejb.module.src", packageFragmentRoot.getResource().getProjectRelativePath().toString()); //$NON-NLS-1$
properties.put("ejb.module.gen", packageFragmentRoot.getResource().getProjectRelativePath().toString()); //$NON-NLS-1$
properties.put("ejb.bin.dir", this.getJavaProjectOutputContainer(javaProject).toString()); //$NON-NLS-1$
properties.put("ejb.bin.dir", this.getJavaProjectOutputContainer(javaProject).toString()); //$NON-NLS-1$
properties.put("xdoclet.home", XDocletPreferenceStore.getProperty(XDocletPreferenceStore.XDOCLETHOME)); //$NON-NLS-1$
URL url = Platform.getBundle("org.apache.ant").getEntry("/"); //$NON-NLS-1$ //$NON-NLS-2$
url = Platform.asLocalURL(url);
File file = new File(url.getFile());
properties.put("ant.home", file.getAbsolutePath()); //$NON-NLS-1$
WorkbenchComponent ejbModule = null;
ComponentResource[] moduleResources = core.findResourcesBySourcePath(resource.getFullPath());
for (int i = 0; i < moduleResources.length; i++) {
ComponentResource moduleResource = moduleResources[i];
if (moduleResource != null)
ejbModule = moduleResource.getComponent();
if (ejbModule != null)
break;
}
ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(ejbModule);
int j2eeVersion = 0;
if (ejbEdit != null) {
j2eeVersion = ejbEdit.getJ2EEVersion();
}
String ejbLevel = J2EEVersionConstants.VERSION_2_0_TEXT;
if (j2eeVersion == J2EEVersionConstants.J2EE_1_3_ID)
ejbLevel = J2EEVersionConstants.VERSION_2_0_TEXT;
else if (j2eeVersion == J2EEVersionConstants.J2EE_1_4_ID)
ejbLevel = J2EEVersionConstants.VERSION_2_1_TEXT;
setEjbClientJarProperties(properties, core, ejbModule);
properties.put("ejb.spec.version", ejbLevel); //$NON-NLS-1$
properties.put("java.class.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
properties.put("project.class.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
properties.put("project.path", ""); //$NON-NLS-1$ //$NON-NLS-2$
properties.put("ejb.dd.displayname", ejbModule.getName()); //$NON-NLS-1$
properties.put("ejb.dd.description", ejbModule.getName() + " generated by eclipse wtp xdoclet extension."); //$NON-NLS-1$
} catch (Exception e) {
Logger.logException(e);
}finally{
if(core != null)
core.dispose();
if(ejbEdit != null)
ejbEdit.dispose();
}
return properties;
}
private void setEjbClientJarProperties(Properties properties, StructureEdit core, WorkbenchComponent ejbModule) throws UnresolveableURIException {
clientProject = null;
Iterator refComps = ejbModule.getReferencedComponents().iterator();
if (refComps.hasNext()) {
ReferencedComponent refedComp = (ReferencedComponent) refComps.next();
WorkbenchComponent clientEjbJarComp = core.findComponentByURI(refedComp.getHandle());
if( clientEjbJarComp.getComponentType().getComponentTypeId().equals(IModuleConstants.JST_UTILITY_MODULE)){
IFolder folder = StructureEdit.getOutputContainerRoot(clientEjbJarComp);
properties.put("ejb.dd.clientjar", clientEjbJarComp.getName() + ".jar"); //$NON-NLS-1$
setClientJarSourcepath(properties, ejbModule, clientEjbJarComp);
}
}
}
private void setClientJarSourcepath(Properties properties, WorkbenchComponent ejbModule, WorkbenchComponent ejbClientJarComp) {
// TODO: THIS API DOES NOT WORK YET
//IProject clientProj = StructureEdit.getContainingProject(component);
//ComponentResource[] sourceContainers = core.getSourceContainers(component);
Iterator clientHarResources = ejbClientJarComp.getResources().iterator();
clientProject = StructureEdit.getContainingProject(ejbClientJarComp);
List sourcePaths = JavaProjectUtilities.getSourceContainers(clientProject);
while (clientHarResources.hasNext()) {
ComponentResource res = (ComponentResource) clientHarResources.next();
IPath sPath = res.getSourcePath();
Iterator projSPaths = sourcePaths.iterator();
while (projSPaths.hasNext()) {
IFolder pSPath = (IFolder) projSPaths.next();
if( sPath.equals(pSPath.getFullPath())){
properties.put("ejb.client.module.src", pSPath.getLocation().toString()); //$NON-NLS-1$
return;
}
}
}
}
/**
*
* XDoclet ejb task requires the names of the files in the fileset to be
* relative to the source folder (i.e. root of the classpath) Se wee need to
* find porvide them relative to the package fragment root
*
* @param changedBean
* @return
*/
protected String constructAnnotatedClassList(IPackageFragmentRoot root, IResource changedBean) {
List ejbs = new ArrayList();
getAllAnnotatedEjbs(root, ejbs);
String beans = ""; //$NON-NLS-1$
try {
Iterator iterator = ejbs.iterator();
while (iterator.hasNext()) {
ICompilationUnit cu = (ICompilationUnit) iterator.next();
IResource bean;
bean = cu.getCorrespondingResource();
IPath path = bean.getProjectRelativePath();
path = makeRelativeTo(path, root);
beans += "\t<include name=\"" + path.toString() + "\" />\n"; //$NON-NLS-1$ //$NON-NLS-2$
}
} catch (JavaModelException e) {
Logger.logException(e);
}
return beans;
}
/**
* @param root
* @return
*/
private void getAllAnnotatedEjbs(IParent root, List list) {
IJavaElement[] elements = null;
try {
elements = root.getChildren();
if (elements == null)
return;
for (int i = 0; i < elements.length; i++) {
IJavaElement element = elements[i];
if (XDoxletAnnotationUtil.isXDocletAnnotatedEjbClass(element)) {
list.add(element);
} else if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
getAllAnnotatedEjbs((IPackageFragment) element, list);
}
}
} catch (JavaModelException e) {
Logger.logException(e);
}
}
private String addWeblogicTask() {
if (!XDocletPreferenceStore.isPropertyActive(XDocletPreferenceStore.EJB_WEBLOGIC))
return ""; //$NON-NLS-1$
return "<weblogic version=\"" + XDocletPreferenceStore.getProperty(XDocletPreferenceStore.EJB_WEBLOGIC + "_VERSION") + "\"" + " xmlencoding=\"UTF-8\"" + " destdir=\"\\${ejb.dd.dir}\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ " validatexml=\"false\"" + " datasource=\"\\${data.source.name}\"" + " mergedir=\"\\${ejb.dd.dir}\"" + " persistence=\"weblogic\" />"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
private String addJbossTask() {
if (!XDocletPreferenceStore.isPropertyActive(XDocletPreferenceStore.EJB_JBOSS))
return ""; //$NON-NLS-1$
return "<jboss version=\"" + XDocletPreferenceStore.getProperty(XDocletPreferenceStore.EJB_JBOSS + "_VERSION") + "\"" + " unauthenticatedPrincipal=\"nobody\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ " xmlencoding=\"UTF-8\"" + " destdir=\"\\${ejb.dd.dir}\"" + " validatexml=\"false\"" + " datasource=\"\\${data.source.name}\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ " datasourcemapping=\"PLEASE_MODIFY_THIS\"" + " preferredrelationmapping=\"PLEASE_MODIFY_THIS\" />"; //$NON-NLS-1$ //$NON-NLS-2$
}
private String addJonasTask() {
if (!XDocletPreferenceStore.isPropertyActive(XDocletPreferenceStore.EJB_JONAS))
return ""; //$NON-NLS-1$
return "<jonas version=\"" + XDocletPreferenceStore.getProperty(XDocletPreferenceStore.EJB_JONAS + "_VERSION") + "\"" + " xmlencoding=\"UTF-8\"" + " destdir=\"\\${ejb.dd.dir}\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+ " validatexml=\"false\"" + " mergedir=\"\\${ejb.dd.dir}\" />"; //$NON-NLS-1$ //$NON-NLS-2$
}
private String addDeploymentDescriptorTask() {
if (clientProject == null)
return "<deploymentdescriptor destdir=\"\\${ejb.dd.dir}\" "+
"displayname=\"\\${ejb.dd.displayname}\" "+
"description=\"\\${ejb.dd.description}\" "+
"validatexml=\"false\" "+
"mergedir=\"\\${ejb.dd.dir}\" />";
else
return "<deploymentdescriptor destdir=\"\\${ejb.dd.dir}\" "+
"displayname=\"\\${ejb.dd.displayname}\" "+
"description=\"\\${ejb.dd.description}\" "+
"validatexml=\"false\" "+
"clientjar=\"\\${ejb.dd.clientjar}\" "+
"mergedir=\"\\${ejb.dd.dir}\" />";
}
private String addWebSphereTask() {
if (!XDocletPreferenceStore.isPropertyActive(XDocletPreferenceStore.EJB_WEBSPHERE))
return ""; //$NON-NLS-1$
return "<webSphere destdir=\"\\${ejb.dd.dir}\"/>"; //$NON-NLS-1$
}
protected void refreshProjects(IProject project, IProgressMonitor monitor) throws CoreException {
project.refreshLocal(
IResource.DEPTH_INFINITE,
monitor);
if(clientProject != null)
clientProject.refreshLocal(
IResource.DEPTH_INFINITE,
monitor);
}
}