/***************************************************************************************************
 * Copyright (c) 2005 Eteration A.S. and Gorkem Ercan. 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: Gorkem Ercan - initial API and implementation
 *               
 **************************************************************************************************/
package org.eclipse.jst.server.generic.core.internal.publishers;
			
import java.io.IOException;
import org.eclipse.core.resources.IFile;
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.Status;
import org.eclipse.jst.server.core.IWebModule;
import org.eclipse.jst.server.core.PublishUtil;
import org.eclipse.jst.server.generic.core.internal.CorePlugin;
import org.eclipse.jst.server.generic.servertype.definition.ServerRuntime;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IModuleType;
import org.eclipse.wst.server.core.model.IModuleFolder;
import org.eclipse.wst.server.core.model.IModuleResource;
import org.eclipse.wst.server.core.util.ProjectModule;

public abstract class AbstractModuleAssembler {

	protected ServerRuntime fServerdefinition;
	protected IModule fModule; 
	
	/**
	 * Assemble the module.
	 * 
	 * @param monitor
	 * @throws CoreException
	 */
	protected abstract void assemble(IProgressMonitor monitor) throws CoreException;

	
	public static class Factory {		
		public static AbstractModuleAssembler getModuleAssembler(IModule module, ServerRuntime serverdefinition)
		{
			if(isModuleType(module, "jst.web"))
				return new WarModuleAssembler(module,serverdefinition);
			if(isModuleType(module, "jst.ear"))
				return new EarModuleAssembler(module,serverdefinition);
			return new DefaultModuleAssembler(module,serverdefinition);
		}
		
		private static boolean isModuleType(IModule module, String moduleTypeId){	
			if(module.getModuleType()!=null && moduleTypeId.equals(module.getModuleType().getId()))
				return true;
			return false;
		}
	}
	
	protected void packModule(IModule module, IPath destination)throws CoreException {
		String name = getDUName(module);
	
		String dest = destination.append(name).toString();
		ModulePackager packager = null;
		try {
			packager = new ModulePackager(dest, false);
			ProjectModule pm = (ProjectModule) module.loadAdapter(ProjectModule.class, null);
			IModuleResource[] resources = pm.members();
			for (int i = 0; i < resources.length; i++) {
				doPackModule(resources[i], packager);
			}
		} catch (IOException e) {
			IStatus status = new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, 0,
					"unable to assemble module", e);
			throw new CoreException(status);
		}
		finally{
			try{
				packager.finished();
			}
			catch(IOException e){
				//unhandled
			}
		}
	}

	private String getDUName(IModule module){
		IModuleType moduleType = module.getModuleType();
		if(moduleType==null)
			return module.getName()+".jar";		
		if("jst.web".equals(moduleType.getId())){
			IWebModule webmodule = (IWebModule)module.loadAdapter(IWebModule.class, null);
			String contextRoot = webmodule.getContextRoot();
			if(contextRoot.charAt(0) == '/')
				return contextRoot.substring(1)+".war";
			return contextRoot+".war";
		}
		if("jst.ear".equals(moduleType.getId()))
			return module.getName()+".ear";
		if("jst.connector".equals(moduleType.getId()))
			return module.getName()+".rar";
		
		return module.getName()+".jar";
	}
	
	private void doPackModule(IModuleResource resource, ModulePackager packager) throws CoreException, IOException{
			if (resource instanceof IModuleFolder) {
				packager.writeFolder(resource.getModuleRelativePath().append(resource.getName()).toString());
				IModuleFolder mFolder = (IModuleFolder)resource;
				IModuleResource[] resources = mFolder.members();
				for (int i = 0; i < resources.length; i++) {
					doPackModule(resources[i], packager);
				}
			} else {
				IFile file = (IFile) resource.getAdapter(IFile.class);
				String destination = resource.getModuleRelativePath().append(resource.getName()).toString();
				packager.write(file, destination);
			}
	}
	
	protected IPath copyModule(IModule module,IProgressMonitor monitor)throws CoreException{
		ProjectModule pm =(ProjectModule)module.loadAdapter(ProjectModule.class, monitor);
		IPath to = getProjectWorkingLocation().append(pm.getId());
		PublishUtil.smartCopy(pm.members(), to, monitor);
		return to;
	}
	
	private IPath getProjectWorkingLocation(){
		String pluginId = fServerdefinition.getConfigurationElementNamespace();
		return fModule.getProject().getWorkingLocation(pluginId);
	}
	
}
