/******************************************************************************* * Copyright (c) 2003, 2013 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.j2ee.project.facet; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jem.util.UIContextDetermination; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; import org.eclipse.jst.j2ee.application.internal.operations.AddComponentToEnterpriseApplicationDataModelProvider; import org.eclipse.jst.j2ee.application.internal.operations.IAddComponentToEnterpriseApplicationDataModelProperties; import org.eclipse.jst.j2ee.internal.J2EEConstants; import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin; import org.eclipse.jst.j2ee.internal.project.ManifestFileCreationAction; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.internal.emf.resource.RendererFactory; import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework; import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.runtime.IRuntime; import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent; import org.eclipse.wst.web.internal.facet.RuntimePresetMappingRegistry; public abstract class J2EEFacetInstallDelegate { protected static void addToClasspath(final IJavaProject jproj, final IClasspathEntry entry) throws CoreException { final IClasspathEntry[] existingEntries = jproj.getRawClasspath(); for(IClasspathEntry existingEntry : existingEntries){ if(existingEntry.getPath().equals(entry.getPath())){ // see bug 423742 return; } } final IClasspathEntry[] updated = new IClasspathEntry[existingEntries.length + 1]; System.arraycopy(existingEntries, 0, updated, 0, existingEntries.length); updated[existingEntries.length] = entry; jproj.setRawClasspath(updated, null); } protected void installEARFacet( final String j2eeVersionText, final String earProjectName, final IRuntime runtime, final IProgressMonitor monitor ) { IProject project = ProjectUtilities.getProject(earProjectName); if( project.exists()) return; IFacetedProjectWorkingCopy fpjwc = null; try { fpjwc = FacetedProjectFramework.createNewProject(); fpjwc.setProjectName( earProjectName ); if( runtime != null ) { fpjwc.setTargetedRuntimes( Collections.singleton( runtime ) ); } fpjwc.setFixedProjectFacets( Collections.singleton( IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET ) ); fpjwc.setSelectedPreset( FacetedProjectFramework.DEFAULT_CONFIGURATION_PRESET_ID ); if( j2eeVersionText != null ) { final IProjectFacetVersion defaultEarFacetVersion = fpjwc.getProjectFacetVersion( IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET ); if( ! defaultEarFacetVersion.getVersionString().equals( j2eeVersionText ) ) { String presetId = null; if( runtime != null ) { for( IRuntimeComponent rc : runtime.getRuntimeComponents() ) { presetId = RuntimePresetMappingRegistry.INSTANCE.getPresetID ( rc.getRuntimeComponentType().getId(), rc.getRuntimeComponentVersion().getVersionString(), IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET.getId(), j2eeVersionText ); if( presetId != null ) { break; } } } final IProjectFacetVersion earFacetVersion = IJ2EEFacetConstants.ENTERPRISE_APPLICATION_FACET.getVersion( j2eeVersionText ); // Note that the next call is necessary even if a preset is going to be selected // later since it allows the dynamic preset to adjust for the ear facet version. fpjwc.setProjectFacets( Collections.singleton( earFacetVersion ) ); if( presetId != null ) { fpjwc.setSelectedPreset( presetId ); } } } try { fpjwc.commitChanges( null ); } catch( CoreException e ) { J2EEPlugin.logError( e ); } }finally { if(fpjwc != null){ fpjwc.dispose(); } } } protected void createManifest(IProject project, IContainer aFolder, IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException { IFile file = aFolder.getFile(new Path(J2EEConstants.MANIFEST_URI)); if (file.exists()) return; try { ManifestFileCreationAction.createManifestFile(file, project); } catch (CoreException e) { J2EEPlugin.logError(e); } catch (IOException e) { J2EEPlugin.logError(e); } } protected void addToEar(IVirtualComponent earComp, IVirtualComponent j2eeComp, String moduleURI ){ final IDataModel dataModel = DataModelFactory.createDataModel(new AddComponentToEnterpriseApplicationDataModelProvider()); Map map = (Map)dataModel.getProperty(IAddComponentToEnterpriseApplicationDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP); map.put(j2eeComp, moduleURI); dataModel.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, earComp); List modList = (List) dataModel.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST); modList.add(j2eeComp); dataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modList); try { dataModel.getDefaultOperation().execute(null, null); } catch (ExecutionException e) { J2EEPlugin.logError(e); } } protected void installAndAddModuletoEAR( String j2eeVersionText, String earProjectName, IRuntime runtime, IProject moduleProject, String moduleURI, IProgressMonitor monitor ){ installEARFacet(j2eeVersionText, earProjectName, runtime, monitor); final IVirtualComponent c = ComponentCore.createComponent( moduleProject ); final IProject earProject = ProjectUtilities.getProject( earProjectName ); final IVirtualComponent earComp = ComponentCore.createComponent( earProject ); if( UIContextDetermination.getCurrentContext() == UIContextDetermination.HEADLESS_CONTEXT ){ boolean isValidating = RendererFactory.getDefaultRendererFactory().isValidating(); try{ if( isValidating ){ RendererFactory.getDefaultRendererFactory().setValidating(false); } addToEar( earComp, c, moduleURI ); }finally{ RendererFactory.getDefaultRendererFactory().setValidating(isValidating); } } else addToEar( earComp, c, moduleURI ); } /** * This method will set the output property on the model element for the given component. * * @param model * @param component */ protected void setOutputFolder(IDataModel model, IVirtualComponent component) { IJavaProject javaProject = JavaCore.create(component.getProject()); IPath currentDefaultOutput = null; try { currentDefaultOutput = javaProject.getOutputLocation(); component.setMetaProperty("java-output-path", currentDefaultOutput.toString() ); //$NON-NLS-1$ } catch (JavaModelException e) { org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.logError(e); } } }