[jbosstools-commits] JBoss Tools SVN: r17476 - in trunk: as/plugins/org.jboss.ide.eclipse.as.wtp.core/src/org/jboss/ide/eclipse/as/wtp/core/vcf and 2 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Tue Sep 8 11:53:22 EDT 2009


Author: rob.stryker at jboss.com
Date: 2009-09-08 11:53:22 -0400 (Tue, 08 Sep 2009)
New Revision: 17476

Added:
   trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/src/org/jboss/ide/eclipse/as/wtp/core/vcf/ModuleExportOperation.java
Modified:
   trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/META-INF/MANIFEST.MF
   trunk/esb/plugins/org.jboss.tools.esb.project.ui/META-INF/MANIFEST.MF
   trunk/esb/plugins/org.jboss.tools.esb.project.ui/src/org/jboss/tools/esb/project/ui/wizards/export/ESBComponentExportOperation.java
Log:
JBIDE-4854

Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/META-INF/MANIFEST.MF
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/META-INF/MANIFEST.MF	2009-09-08 15:33:00 UTC (rev 17475)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/META-INF/MANIFEST.MF	2009-09-08 15:53:22 UTC (rev 17476)
@@ -15,7 +15,12 @@
  org.eclipse.jst.j2ee;bundle-version="1.1.300",
  org.eclipse.wst.common.project.facet.core;bundle-version="1.4.0",
  org.eclipse.jem.util;bundle-version="2.0.200",
- org.eclipse.wst.web;bundle-version="1.1.300"
+ org.eclipse.wst.web;bundle-version="1.1.300",
+ org.eclipse.wst.common.frameworks;bundle-version="1.1.300",
+ org.eclipse.jst.common.frameworks;bundle-version="1.1.300",
+ org.eclipse.core.commands;bundle-version="3.5.0",
+ org.eclipse.jst.server.core;bundle-version="1.2.0",
+ org.eclipse.jdt.core;bundle-version="3.5.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.jboss.ide.eclipse.as.wtp.core.modules,

Added: trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/src/org/jboss/ide/eclipse/as/wtp/core/vcf/ModuleExportOperation.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/src/org/jboss/ide/eclipse/as/wtp/core/vcf/ModuleExportOperation.java	                        (rev 0)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.wtp.core/src/org/jboss/ide/eclipse/as/wtp/core/vcf/ModuleExportOperation.java	2009-09-08 15:53:22 UTC (rev 17476)
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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.jboss.ide.eclipse.as.wtp.core.vcf;
+
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.ARCHIVE_DESTINATION;
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.COMPONENT;
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.EXPORT_SOURCE_FILES;
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.OPTIMIZE_FOR_SPECIFIC_RUNTIME;
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.RUNTIME_SPECIFIC_PARTICIPANTS;
+import static org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.RUN_BUILD;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceRuleFactory;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.MultiRule;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
+import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentExportDataModelProperties.IArchiveExportParticipantData;
+import org.eclipse.jst.j2ee.internal.archive.operations.EJBArchiveOpsResourceHandler;
+import org.eclipse.jst.j2ee.internal.plugin.LibCopyBuilder;
+import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
+import org.eclipse.jst.jee.archive.ArchiveSaveFailureException;
+import org.eclipse.jst.jee.archive.internal.ArchiveUtil;
+import org.eclipse.jst.server.core.IEnterpriseApplication;
+import org.eclipse.jst.server.core.IJ2EEModule;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.ServerUtil;
+import org.eclipse.wst.server.core.model.IModuleFile;
+import org.eclipse.wst.server.core.model.IModuleFolder;
+import org.eclipse.wst.server.core.model.IModuleResource;
+import org.eclipse.wst.server.core.model.ModuleDelegate;
+
+public abstract class ModuleExportOperation extends AbstractDataModelOperation {
+
+	protected IProgressMonitor progressMonitor;
+	private IVirtualComponent component;
+	private IModule module;
+	private IPath destinationPath;
+	private boolean exportSource = false;
+
+	public ModuleExportOperation() {
+		super();
+	}
+
+	public ModuleExportOperation(IDataModel model) {
+		super(model);
+	}
+	
+	protected final int REFRESH_WORK = 100;
+	protected final int JAVA_BUILDER_WORK = 100;
+	protected final int LIB_BUILDER_WORK = 100;
+	protected final int EXPORT_WORK = 1000;
+	protected final int CLOSE_WORK = 10;
+	protected final int SINGLE_PARTICIPANT_WORK = 200;
+	
+	protected int computeTotalWork() {
+		int totalWork = REFRESH_WORK;
+		if (model.getBooleanProperty(RUN_BUILD)) {
+			totalWork += JAVA_BUILDER_WORK + LIB_BUILDER_WORK;
+		}
+		totalWork += EXPORT_WORK + CLOSE_WORK;
+		
+		final IDataModel dm = getDataModel();
+		
+		if( dm.getProperty( OPTIMIZE_FOR_SPECIFIC_RUNTIME ) == Boolean.TRUE ) {
+    		final List<IArchiveExportParticipantData> extensions
+    		    = (List<IArchiveExportParticipantData>) dm.getProperty( RUNTIME_SPECIFIC_PARTICIPANTS );
+    		totalWork += extensions.size() * SINGLE_PARTICIPANT_WORK;
+		}
+		    
+		return totalWork;
+	}
+	
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		setComponent((IVirtualComponent) model.getProperty(COMPONENT));
+		setDestinationPath(new Path(model.getStringProperty(ARCHIVE_DESTINATION)));
+//		setExportSource(model.getBooleanProperty(EXPORT_SOURCE_FILES));
+		
+		try
+		{
+		    monitor.beginTask(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Exporting_archive, new Object [] { getDestinationPath().lastSegment() }), computeTotalWork());
+            setProgressMonitor(monitor);
+
+    		try {
+    			// defect 240999
+    			component.getProject().refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, REFRESH_WORK));
+    			if (model.getBooleanProperty(RUN_BUILD)) {
+    				runNecessaryBuilders(component, new SubProgressMonitor(monitor, JAVA_BUILDER_WORK + LIB_BUILDER_WORK));
+    			}
+    			export();
+    		} catch (Exception e) {
+    			monitor.worked(CLOSE_WORK);
+    			throw new ExecutionException(EJBArchiveOpsResourceHandler.Error_exporting__UI_ + archiveString(), e);
+    		}
+    		
+            final IDataModel dm = getDataModel();
+            
+            if( dm.getProperty( OPTIMIZE_FOR_SPECIFIC_RUNTIME ) == Boolean.TRUE )
+            {
+                for( IArchiveExportParticipantData extData 
+                     : (List<IArchiveExportParticipantData>) dm.getProperty( RUNTIME_SPECIFIC_PARTICIPANTS ) )
+                {
+                    final IDataModelOperation op 
+                        = extData.getParticipant().createOperation( extData.getDataModel() );
+                    
+                    op.execute( null, null );
+                    monitor.worked( SINGLE_PARTICIPANT_WORK );
+                }
+            }
+		}
+		finally
+		{
+		    monitor.done();
+		}
+		
+		return OK_STATUS;
+	}
+
+	protected abstract String archiveString();
+
+	protected void setProgressMonitor(IProgressMonitor newProgressMonitor) {
+		progressMonitor = newProgressMonitor;
+	}
+
+	protected IProgressMonitor getProgressMonitor() {
+		return progressMonitor;
+	}
+
+	private void setComponent(IVirtualComponent newComponent) {
+		component = newComponent;
+		setModule();
+	}
+
+	protected IVirtualComponent getComponent() {
+		if (component == null)
+			component = (IVirtualComponent) model.getProperty(COMPONENT);
+		return component;
+	}
+
+	protected IPath getDestinationPath() {
+		return destinationPath;
+	}
+
+	protected void setDestinationPath(IPath newDestinationPath) {
+		destinationPath = newDestinationPath;
+	}
+
+//	protected boolean isExportSource() {
+//		return exportSource;
+//	}
+//
+//	protected void setExportSource(boolean newExportSource) {
+//		exportSource = newExportSource;
+//	}
+
+	protected void setModule() {
+		String moduleType = getModuleTypeID();
+		if( component != null && component.getProject() != null && moduleType != null) {
+			IModule[] modules = ServerUtil.getModules(component.getProject());
+			for( int i = 0; i < modules.length; i++ ) {
+				if( modules[i].getModuleType().getId().equals(moduleType)) {
+					module = modules[i];
+					return;
+				}
+			}
+		}
+		module = null;
+	}
+	
+	protected abstract String getModuleTypeID();
+	
+	
+	/* Return null to skip this child */
+	protected /* abstract */ String getChildURI(IModule parent, IModule child) {
+		IEnterpriseApplication app = (IEnterpriseApplication)parent.loadAdapter(IEnterpriseApplication.class, new NullProgressMonitor());
+		if( app != null ) {
+			return app.getURI(child);
+		}
+		return null;
+	}
+	
+	protected void runNecessaryBuilders(IVirtualComponent component, IProgressMonitor monitor) throws CoreException {
+		try{
+			monitor.beginTask(null, JAVA_BUILDER_WORK + LIB_BUILDER_WORK);
+			if(!component.isBinary()){
+				IProject project = component.getProject();
+				IProjectDescription description = project.getDescription();
+				ICommand javaBuilder = getJavaCommand(description);
+				if (javaBuilder != null) {
+					project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, JavaCore.BUILDER_ID, javaBuilder.getArguments(), new SubProgressMonitor(monitor, JAVA_BUILDER_WORK));
+				}
+				ICommand libCopyBuilder = getLibCopyBuilder(description);
+				if (null != libCopyBuilder) {
+					project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, LibCopyBuilder.BUILDER_ID, libCopyBuilder.getArguments(), new SubProgressMonitor(monitor, LIB_BUILDER_WORK));
+				}
+			}
+		} finally {
+			monitor.done();
+		}
+	}
+
+	/**
+	 * Find the specific Java command amongst the build spec of a given description
+	 */
+	protected ICommand getJavaCommand(IProjectDescription description) throws CoreException {
+		if (description == null) {
+			return null;
+		}
+
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(JavaCore.BUILDER_ID)) {
+				return commands[i];
+			}
+		}
+		return null;
+	}
+
+	protected ICommand getLibCopyBuilder(IProjectDescription description) throws CoreException {
+		if (description == null) {
+			return null;
+		}
+
+		ICommand[] commands = description.getBuildSpec();
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(LibCopyBuilder.BUILDER_ID)) {
+				return commands[i];
+			}
+		}
+		return null;
+
+	}
+
+	public ISchedulingRule getSchedulingRule() {
+		Set projs = gatherDependentProjects(getComponent(), new HashSet());
+		ISchedulingRule combinedRule = null;
+		IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+		for (Iterator iter = projs.iterator(); iter.hasNext();) {
+			IProject proj = (IProject) iter.next();
+			ISchedulingRule rule = ruleFactory.createRule(proj);
+			combinedRule = MultiRule.combine(rule, combinedRule);
+		}
+		combinedRule = MultiRule.combine(ruleFactory.buildRule(), combinedRule);
+
+		return combinedRule;
+	}
+
+	/* Only used by getSchedulingRule() as of now */
+	private Set gatherDependentProjects(IVirtualComponent comp, Set projs) {
+		if (!projs.contains(comp.getProject())) {
+			projs.add(comp.getProject());
+			IVirtualReference[] refs = comp.getReferences();
+			for (int i = 0; i < refs.length; i++) {
+				IVirtualReference refComp = refs[i];
+				projs.addAll(gatherDependentProjects(refComp.getReferencedComponent(), projs));
+			}
+		}
+		return projs;
+	}
+	
+	
+
+	protected void export() throws SaveFailureException, CoreException, InvocationTargetException, InterruptedException {
+		if( module == null )
+			throw new SaveFailureException(); // TODO add some real message
+		try {
+			File dest = getDestinationPath().toFile();
+			File parent = dest.getParentFile(); 
+			
+			/* Prepare the streams */
+			if (dest.exists() && dest.isDirectory()) {
+				throw new IOException("The specified file: " + dest.getAbsolutePath() + " exists and is a directory");
+			}
+			if (parent != null)
+				parent.mkdirs();
+			java.io.OutputStream out = new java.io.FileOutputStream(dest);
+			ZipStreamModuleSaveAdapterImpl saver = new ZipStreamModuleSaveAdapterImpl(out);
+			
+			
+			/* 
+			 * If we were to create a dual underlying model that would work for
+			 * export and publish, this is where we'd do that and incorporate 
+			 * preferences from the calling class
+			 */
+			
+			ModuleDelegate moduleDelegate = (ModuleDelegate)module.loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+			addResources(saver, moduleDelegate.members());
+			addChildren(saver, module, moduleDelegate.getChildModules());
+			saver.finish();
+		} catch( Exception e ) {
+			e.printStackTrace();
+			throw new SaveFailureException();
+		}
+	}
+	
+	protected void addChildren(ZipStreamModuleSaveAdapterImpl saver, IModule parent, IModule[] children ) throws IOException, ArchiveSaveFailureException, CoreException {
+		if( children != null ) {
+			for( int i = 0; i < children.length; i++ ) {
+				String path = getChildURI(parent, children[i]);
+				ModuleDelegate childDelegate = (ModuleDelegate)children[i].
+						loadAdapter(ModuleDelegate.class, new NullProgressMonitor());
+				IJ2EEModule tempMod = (IJ2EEModule)children[i].loadAdapter(IJ2EEModule.class, new NullProgressMonitor());
+				boolean isBinary = tempMod.isBinary();
+				if( path != null ) {
+					if( isBinary ) {
+						addResources(saver, childDelegate.members());
+					} else {
+						ZipStreamModuleSaveAdapterImpl childSaver = saver.createNestedSaveAdapter(path);
+						addResources(childSaver, childDelegate.members());
+						addChildren(childSaver, children[i], childDelegate.getChildModules());
+						childSaver.finish();
+					}
+				}
+			}
+		}
+	}
+	
+	protected void addResources(ZipStreamModuleSaveAdapterImpl saver, IModuleResource[] resources) throws ArchiveSaveFailureException {
+		for( int i = 0; i < resources.length; i++ ) {
+			if( resources[i] instanceof IModuleFile ) {
+				saver.save(resources[i]);
+			} else if( resources[i] instanceof IModuleFolder ) {
+				addResources(saver, ((IModuleFolder)resources[i]).members());
+			}
+		}
+	}
+	
+
+	public static class ZipStreamModuleSaveAdapterImpl {
+		protected OutputStream destinationStream;
+		/** Used internally */
+		protected ZipOutputStream zipOutputStream;
+
+		public ZipStreamModuleSaveAdapterImpl(OutputStream out) {
+			destinationStream = out;
+			zipOutputStream = new ZipOutputStream(out);
+		}
+
+		public void close() throws IOException {
+			getDestinationStream().close();
+		}
+
+		protected ZipStreamModuleSaveAdapterImpl createNestedSaveAdapter(String entry) throws IOException {
+			ZipEntry nest = new ZipEntry(entry);
+			getZipOutputStream().putNextEntry(nest);
+			return new ZipStreamModuleSaveAdapterImpl(getZipOutputStream());
+		}
+
+		public void finish() throws IOException {
+			getZipOutputStream().finish();
+			//If this is not nested, close the stream to free up the resource
+			//otherwise, don't close it because the parent may not be done
+			if (!(getDestinationStream() instanceof ZipOutputStream))
+				getDestinationStream().close();
+		}
+
+		public java.io.OutputStream getDestinationStream() {
+			return destinationStream;
+		}
+
+		protected java.util.zip.ZipOutputStream getZipOutputStream() {
+			return zipOutputStream;
+		}
+
+		protected void save(IModuleResource resource) throws ArchiveSaveFailureException {
+			if( resource instanceof IModuleFile ) {
+				File f = (File)((IModuleFile)resource).getAdapter(File.class);
+				if( f == null ) {
+					IFile ifile = (IFile)((IModuleFile)resource).getAdapter(IFile.class);
+					if( ifile != null ) 
+						f = ifile.getLocation().toFile();
+				}
+				saveFile(f, resource.getModuleRelativePath().append(resource.getName()));
+			}
+		}
+		
+		protected void saveFile(File f, IPath entryPath) throws ArchiveSaveFailureException{
+			try {
+				ZipEntry entry = new ZipEntry(entryPath.toString());
+				if (f.lastModified() > 0)
+					entry.setTime(f.lastModified());
+				getZipOutputStream().putNextEntry(entry);
+				ArchiveUtil.copy(new FileInputStream(f), getZipOutputStream());
+				getZipOutputStream().closeEntry();
+			} catch (IOException e) {
+				throw new ArchiveSaveFailureException(e);
+			}
+		}
+	}
+	
+}

Modified: trunk/esb/plugins/org.jboss.tools.esb.project.ui/META-INF/MANIFEST.MF
===================================================================
--- trunk/esb/plugins/org.jboss.tools.esb.project.ui/META-INF/MANIFEST.MF	2009-09-08 15:33:00 UTC (rev 17475)
+++ trunk/esb/plugins/org.jboss.tools.esb.project.ui/META-INF/MANIFEST.MF	2009-09-08 15:53:22 UTC (rev 17476)
@@ -32,7 +32,8 @@
  org.eclipse.jdt.core;bundle-version="3.4.0",
  org.jboss.tools.esb.project.core;bundle-version="1.0.0",
  org.eclipse.jdt.ui;bundle-version="3.4.1",
- org.jboss.ide.eclipse.as.ui;bundle-version="1.0.0"
+ org.jboss.ide.eclipse.as.ui;bundle-version="1.0.0",
+ org.jboss.ide.eclipse.as.wtp.core;bundle-version="1.0.0"
 Eclipse-LazyStart: true
 Bundle-Vendor: %Bundle-Vendor.0
 Export-Package: org.jboss.tools.esb.project.ui

Modified: trunk/esb/plugins/org.jboss.tools.esb.project.ui/src/org/jboss/tools/esb/project/ui/wizards/export/ESBComponentExportOperation.java
===================================================================
--- trunk/esb/plugins/org.jboss.tools.esb.project.ui/src/org/jboss/tools/esb/project/ui/wizards/export/ESBComponentExportOperation.java	2009-09-08 15:33:00 UTC (rev 17475)
+++ trunk/esb/plugins/org.jboss.tools.esb.project.ui/src/org/jboss/tools/esb/project/ui/wizards/export/ESBComponentExportOperation.java	2009-09-08 15:53:22 UTC (rev 17476)
@@ -11,10 +11,10 @@
 package org.jboss.tools.esb.project.ui.wizards.export;
 
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.jboss.tools.as.wst.server.ui.xpl.J2EEModuleExportOperation;
+import org.jboss.ide.eclipse.as.wtp.core.vcf.ModuleExportOperation;
 import org.jboss.tools.esb.core.ESBProjectConstant;
 
-public class ESBComponentExportOperation extends J2EEModuleExportOperation {
+public class ESBComponentExportOperation extends ModuleExportOperation {
 	public ESBComponentExportOperation() {
 		super();
 	}



More information about the jbosstools-commits mailing list