[jboss-cvs] jbosside/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/publishers ...

Robert Stryker rawblem at gmail.com
Mon Dec 11 10:43:39 EST 2006


  User: rawb    
  Date: 06/12/11 10:43:39

  Added:       as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/publishers 
                        JstPackagesPublisher.java
  Log:
  Switched publishing for JST artifacts to a JSTPackagesePublisher, which uses the packages infrastructure to build the project. 
  
  Revision  Changes    Path
  1.1      date: 2006/12/11 15:43:39;  author: rawb;  state: Exp;jbosside/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/publishers/JstPackagesPublisher.java
  
  Index: JstPackagesPublisher.java
  ===================================================================
  /**
   * JBoss, a Division of Red Hat
   * Copyright 2006, Red Hat Middleware, LLC, and individual contributors as indicated
   * by the @authors tag. See the copyright.txt in the distribution for a
   * full listing of individual contributors.
   *
  * This is free software; you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as
   * published by the Free Software Foundation; either version 2.1 of
   * the License, or (at your option) any later version.
   *
   * This software is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this software; if not, write to the Free
   * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
   * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
   */
  package org.jboss.ide.eclipse.as.core.publishers;
  
  import org.eclipse.core.resources.IContainer;
  import org.eclipse.core.resources.IProject;
  import org.eclipse.core.runtime.Assert;
  import org.eclipse.core.runtime.CoreException;
  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.Status;
  import org.eclipse.jdt.core.IJavaProject;
  import org.eclipse.jdt.core.JavaCore;
  import org.eclipse.jdt.core.JavaModelException;
  import org.eclipse.jst.server.core.IEnterpriseApplication;
  import org.eclipse.jst.server.core.IWebModule;
  import org.eclipse.wst.server.core.IModule;
  import org.eclipse.wst.server.core.IServer;
  import org.eclipse.wst.server.core.internal.DeletedModule;
  import org.eclipse.wst.server.core.model.ServerBehaviourDelegate;
  import org.jboss.ide.eclipse.as.core.JBossServerCorePlugin;
  import org.jboss.ide.eclipse.as.core.server.JBossServer;
  import org.jboss.ide.eclipse.packages.core.Trace;
  import org.jboss.ide.eclipse.packages.core.model.IPackage;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFileSetWorkingCopy;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFolder;
  import org.jboss.ide.eclipse.packages.core.model.IPackageFolderWorkingCopy;
  import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
  import org.jboss.ide.eclipse.packages.core.model.IPackageWorkingCopy;
  import org.jboss.ide.eclipse.packages.core.model.PackagesCore;
  import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
  import org.jboss.ide.eclipse.packages.core.model.types.JARPackageType;
  
  /**
   *  This class provides a default implementation for packaging different types of projects
   * @author rob.stryker at jboss.com
   */
  public class JstPackagesPublisher implements IJBossServerPublisher {
  
  	private static final String METAINF = "META-INF";
  	private static final String WEBINF = "WEB-INF";
  	private static final String LIB = "lib";
  	private static final String WEBCONTENT = "WebContent";
  	private static final String EARCONTENT = "EarContent";
  	
  	private int state;
  	private JBossServer server;
  	
  	public JstPackagesPublisher(JBossServer server) {
  		this.server = server;
  		state = IServer.PUBLISH_STATE_NONE;
  	}
  	public int getPublishState() {
  		return state;
  	}
  
  
  	public void publishModule(int kind, int deltaKind, int modulePublishState,
  			IModule[] module, IProgressMonitor monitor) throws CoreException {
      	checkClosed(module);
          if(ServerBehaviourDelegate.REMOVED == deltaKind){
          	JstPackagesAssembler publisher = new JstPackagesAssembler();
              publisher.initialize(module,server);
              publisher.unpublish(monitor);
          } else if( ServerBehaviourDelegate.NO_CHANGE != deltaKind || kind == IServer.PUBLISH_FULL || kind == IServer.PUBLISH_CLEAN ){
          	// if there's no change, do nothing. Otherwise, on change or add, re-publish
          	JstPackagesAssembler publisher = new JstPackagesAssembler();
              publisher.initialize(module,server);
              publisher.publish(monitor);
          }
  	}
      private void checkClosed(IModule[] module) throws CoreException {
      	for(int i=0;i<module.length;i++) {
      		if(module[i] instanceof DeletedModule) {	
                  IStatus status = new Status(IStatus.ERROR,JBossServerCorePlugin.PLUGIN_ID,0, "Failure", null);
                  throw new CoreException(status);
      		}
      	}
      }
      
      public static class JstPackagesAssembler {
  		public static final int WAR = 1;
  		public static final int EAR = 2;
  		public static final int SAR = 3;
  		public static final int OTHER = 4;
  		
  		
  		private IModule[] module;
  		private JBossServer jbServer;
  
  		private int assembleType;
  				
  	    public void initialize(IModule[] module, JBossServer server) {
  			this.module = module;
  			this.jbServer = server;
  			if( module.length == 1 ) {
  				if(isModuleType(module[0], "jst.web")) {
  					assembleType = WAR;
  				} else if(isModuleType(module[0], "jst.ear")) {
  					assembleType = EAR;
  				} else {
  					assembleType = OTHER;
  				}
  			}
  	    }
  	    
  		private boolean isModuleType(IModule module, String moduleTypeId){	
  			if(module.getModuleType()!=null && moduleTypeId.equals(module.getModuleType().getId()))
  				return true;
  			return false;
  		}
  
  		public IPackage[] getPackages() {
  			IProject proj = module[0].getProject();
  			if( proj != null) {
  				IPackage[] projPackages = PackagesCore.getProjectPackages(proj, new NullProgressMonitor());
  				if( projPackages.length > 0 ) {
  					return projPackages;
  				}
  			}
  			
  			return new IPackage[] { createTopPackage(new NullProgressMonitor())};
  		}
  		
  		public IPackage createTopPackage(IProgressMonitor monitor) {
  			IPackage topLevel = null;
  			switch( assembleType ) {
  			case WAR:
  				topLevel = createWarPackages(module[0], monitor); break;
  			case EAR:
  				topLevel = createEarPackages(module[0], monitor); break;
  			case OTHER:
  				topLevel = createOtherPackages(module[0], monitor); break;
  			default: break;
  			}
  			return topLevel;
  		}
  		
  		public IStatus[] publish(IProgressMonitor monitor) throws CoreException {
  			IPackage topLevel = createTopPackage(monitor);
  			if( topLevel != null ) {
  				PackagesCore.buildPackage(topLevel, new NullProgressMonitor());
  				PackagesModel.instance().removePackage((IPackage)topLevel);
  			}
  			return null;
  		}
  		
  		public static IPackage createGenericIPackage(IModule module, String deployDirectory, String packageName) {
  			try {
  
  				IProject project = module.getProject();
  				Assert.isNotNull(project);
  				
  				IJavaProject javaProject = JavaCore.create(project);
  				Assert.isNotNull(javaProject);
  				
  				IPath outputPath;
  				try {
  					outputPath = javaProject.getOutputLocation();
  				} catch (JavaModelException e) {
  					e.printStackTrace();
  					return null;
  				}
  				outputPath = outputPath.removeFirstSegments(1);
  				IContainer outputContainer = project.getFolder(outputPath);
  				return createGenericIPackage(module, deployDirectory, packageName, outputContainer);
  			} catch( Exception e ) {
  				e.printStackTrace();
  			}
  			return null;
  		} 
  		
  		public static IPackage createGenericIPackage(IModule module, String deployDirectory, String packageName, IContainer sourceContainer) {
  			IProject project = module.getProject();
  			Assert.isNotNull(project);
  			IPackage jar = PackagesCore.createPackage(project, true);
  			IPackageWorkingCopy jarWC = jar.createPackageWorkingCopy();
  				
  			if( deployDirectory != null ) {
  				jarWC.setDestinationFolder(new Path(deployDirectory));
  				jarWC.setExploded(false);
  			}
  			jarWC.setName(packageName);
  			jar = jarWC.savePackage();
  				
  			IPackageFileSet classes = PackagesCore.createPackageFileSet(project);
  			IPackageFileSetWorkingCopy classesWC = classes.createFileSetWorkingCopy();
  			classesWC.setIncludesPattern("**/*");
  			classesWC.setSourceContainer(sourceContainer);
  			classes = classesWC.saveFileSet();
  			jar.addChild(classes);
  			return jar;
  		}
  		
  		public IPackage createWarPackages(IModule module, IProgressMonitor monitor) {
  			try {
  				IProject proj = module.getProject();
  				IPackage topLevel = createGenericIPackage(module, jbServer.getDeployDirectory(), proj.getName() + ".war");
  				IPackageFolder webinf = addFolder(proj, topLevel, WEBINF);
  				IPackageFolder metainf = addFolder(proj, topLevel, METAINF);
  				IPackageFolder lib = addFolder(proj, metainf, LIB);
  				addFileset(proj, metainf, WEBCONTENT + Path.SEPARATOR + METAINF, null);
  				addFileset(proj, webinf, WEBCONTENT + Path.SEPARATOR + WEBINF, null);
  				
  				IWebModule webModule = (IWebModule)module.loadAdapter(IWebModule.class, monitor);
  				IModule[] childModules = webModule.getModules();
  				
  				for (int i = 0; i < childModules.length; i++) {
  					IModule child = childModules[i];
  					JstPackagesAssembler assembler = new JstPackagesAssembler();
  					assembler.initialize(new IModule[] {child}, jbServer);
  					IPackage[] childPackages = assembler.getPackages();
  					if( childPackages.length > 0 ) {
  						for( int j = 0; j < childPackages.length; j++ ) {
  							lib.addChild(childPackages[j]);
  						}
  					} else {
  						lib.addChild(createGenericIPackage(child, null, child.getProject().getName() + ".jar"));
  					}
  				}
  				return topLevel;
  			} catch( Exception e ) {
  				e.printStackTrace();
  			}
  			return null;
  		}
  		public IPackage createEarPackages(IModule module, IProgressMonitor monitor) {
  			IProject proj = module.getProject();
  			IContainer outputContainer = proj.getFolder(EARCONTENT);
  
  			IPackage topLevel = createGenericIPackage(module, jbServer.getDeployDirectory(), proj.getName() + ".ear", outputContainer);
  			addFileset(proj, topLevel, EARCONTENT, "**/*.*");
  			
  			// now add children
  			IEnterpriseApplication earModule = (IEnterpriseApplication)module.loadAdapter(IEnterpriseApplication.class, monitor);
  			IModule[] childModules = earModule.getModules();
  			for( int i = 0; i < childModules.length; i++ ) {
  				IModule child = childModules[i];
  				JstPackagesAssembler assembler = new JstPackagesAssembler();
  				assembler.initialize(new IModule[] {child}, jbServer);
  				IPackage[] childPackages = assembler.getPackages();
  				if( childPackages.length > 0 ) {
  					for( int j = 0; j < childPackages.length; j++ ) {
  						topLevel.addChild(childPackages[j]);
  					}
  				} else {
  					topLevel.addChild(createGenericIPackage(child, null, child.getProject().getName() + ".jar"));
  				}
  			}
  			
  			PackagesCore.buildPackage(topLevel, new NullProgressMonitor());
  			PackagesModel.instance().removePackage((IPackage)topLevel);
  			return null;
  		}
  		public IPackage createOtherPackages(IModule module, IProgressMonitor monitor) {
  			return null;
  		}
  
  		public IStatus[] unpublish(IProgressMonitor monitor) throws CoreException {
  			String deployDir = jbServer.getDeployDirectory();
  			String fileName = module[0].getProject().getName();
  			String ext = ".jar";
  			switch( assembleType ) {
  				case WAR: ext = ".war"; break;
  				case EAR: ext = ".ear"; break;
  				case SAR: ext = ".sar"; break;
  				case OTHER: ext = ".jar"; break;
  				default: ext = ".jar"; break;
  			}
  			
  			IPath filePath = new Path(deployDir).append(fileName + ext);
  			filePath.toFile().delete();
  			return null;
  		}
  		
  		
  		protected static IPackageFolder addFolder(IProject project, IPackageNode parent, String name) {
  			IPackageFolder folder = PackagesCore.createPackageFolder(project);
  			IPackageFolderWorkingCopy folderWC = folder.createFolderWorkingCopy();
  			folderWC.setName(name);
  			folder = folderWC.saveFolder();
  			parent.addChild(folder);
  			return folder;
  		}
  		protected static IPackageFileSet addFileset(IProject project, IPackageNode parent, String sourcePath, String includePattern) {
  			IPackageFileSet fs = PackagesCore.createPackageFileSet(project);
  			IPackageFileSetWorkingCopy fswc = fs.createFileSetWorkingCopy();
  			Assert.isNotNull(project);
  			IJavaProject javaProject = JavaCore.create(project);
  			Assert.isNotNull(javaProject);
  			IContainer sourceContainer = project.getFolder(new Path(sourcePath));
  
  			fswc.setSourceContainer(sourceContainer);
  			fswc.setIncludesPattern(  includePattern == null ?  "**/*" : includePattern );
  			fs = fswc.saveFileSet();
  			parent.addChild(fs);
  			return fs;
  		}
  }
  
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list