| 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.workbench.utility.JemProjectUtilities; |
| import org.eclipse.jst.j2ee.ejb.componentcore.util.EJBArtifactEdit; |
| import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; |
| import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; |
| 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.StructureEdit; |
| import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent; |
| |
| 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$ |
| templates.put("@remoteinterfaces@", addRemoteTask()); |
| templates.put("@localinterfaces@", addLocalTask()); |
| templates.put("@utilobject@", addUtilObject()); |
| 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", getPreferenceStore().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.getProjectRelativePath()); |
| for (int i = 0; i < moduleResources.length; i++) { |
| ComponentResource moduleResource = moduleResources[i]; |
| if (moduleResource != null) |
| ejbModule = moduleResource.getComponent(); |
| if (ejbModule != null) |
| break; |
| } |
| |
| // For deleted resources we cannot find the module |
| // So assume the first module in the project (currently) |
| // there is only one anyway... |
| IProject proj = javaProject.getProject(); |
| if (ejbModule == null) { |
| ejbModule = core.getComponent(); |
| } |
| |
| ejbEdit = EJBArtifactEdit.getEJBArtifactEditForRead(proj); |
| int j2eeVersion = 0; |
| if (ejbEdit != null) { |
| j2eeVersion = ejbEdit.getJ2EEVersion(); |
| } |
| |
| int ejbLevelI = ejbEdit.getEJBJarXmiResource().getModuleVersionID(); |
| String ejbLevel = J2EEProjectUtilities.getJ2EEProjectVersion(proj); |
| if (ejbLevelI == J2EEVersionConstants.EJB_2_0_ID) |
| ejbLevel = J2EEVersionConstants.VERSION_2_0_TEXT; |
| else if (ejbLevelI == J2EEVersionConstants.EJB_2_1_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()); |
| IProject project = StructureEdit.getContainingProject(clientEjbJarComp); |
| if (J2EEProjectUtilities.isUtilityProject(project)) { |
| 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 = JemProjectUtilities.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.makeRelative().equals(pSPath.getProjectRelativePath())) { |
| 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 (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.EJB_WEBLOGIC)) |
| return ""; //$NON-NLS-1$ |
| String version = getPreferenceStore().getProperty(XDocletPreferenceStore.EJB_WEBLOGIC + "_VERSION"); |
| String createtables = "False"; // < 8.1 True | False |
| if ("8.1".equals(version)) |
| createtables = "Disabled"; // >= 8.1 Disabled | ... |
| return "<weblogic version=\"" + version + "\"" + " xmlencoding=\"UTF-8\"" + " destdir=\"\\${ejb.dd.dir}\"" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ |
| + " createtables=\"" + createtables + "\"" + " 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 (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.EJB_JBOSS)) |
| return ""; //$NON-NLS-1$ |
| return "<jboss version=\"" + getPreferenceStore().getProperty(XDocletPreferenceStore.EJB_JBOSS + "_VERSION") + "\"" |
| + " xmlencoding=\"UTF-8\"" + " destdir=\"\\${ejb.dd.dir}\"" + " validatexml=\"false\" />"; //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| } |
| |
| private String addJonasTask() { |
| if (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.EJB_JONAS)) |
| return ""; //$NON-NLS-1$ |
| return "<jonas version=\"" + getPreferenceStore().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 useIds=\"true\" destdir=\"\\${ejb.dd.dir}\" " + "displayname=\"\\${ejb.dd.displayname}\" " |
| + "description=\"\\${ejb.dd.description}\" " + "validatexml=\"false\" " + "mergedir=\"\\${ejb.dd.dir}\" />"; |
| else |
| return "<deploymentdescriptor useIds=\"true\" 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 (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.EJB_WEBSPHERE)) |
| return ""; //$NON-NLS-1$ |
| return "<webSphere destdir=\"\\${ejb.dd.dir}\"/>"; //$NON-NLS-1$ |
| } |
| |
| private String addLocalTask() { |
| if (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.XDOCLETGENERATELOCAL)) |
| return ""; //$NON-NLS-1$ |
| return "<localinterface/>\n <localhomeinterface/>"; //$NON-NLS-1$ |
| } |
| |
| private String addRemoteTask() { |
| if (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.XDOCLETGENERATEREMOTE)) |
| return ""; //$NON-NLS-1$ |
| return "<remoteinterface/> \n <homeinterface />"; //$NON-NLS-1$ |
| } |
| |
| private String addUtilObject() { |
| if (!getPreferenceStore().isPropertyActive(XDocletPreferenceStore.XDOCLETGENERATEUTIL)) |
| return ""; //$NON-NLS-1$ |
| return "<utilobject cacheHomes=\"true\" includeGUID=\"true\" kind=\"physical\"/>"; //$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); |
| |
| } |
| |
| } |