/***************************************************************************************************
 * 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.File;
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.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.server.core.PublishUtil;
import org.eclipse.jst.server.generic.core.internal.CorePlugin;
import org.eclipse.jst.server.generic.core.internal.GenericServer;
import org.eclipse.jst.server.generic.servertype.definition.ServerRuntime;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.internal.ServerPlugin;
import org.eclipse.wst.server.core.model.IModuleFolder;
import org.eclipse.wst.server.core.model.IModuleResource;
import org.eclipse.wst.server.core.util.ProjectModule;

/**
 * Base class for module assemblers
 * 
 * @author Gorkem Ercan
 */
public abstract class AbstractModuleAssembler {

	protected ServerRuntime fServerdefinition;
	protected IModule fModule; 
	protected GenericServer fServer;
	protected IPath fAssembleRoot;
	
	protected AbstractModuleAssembler(IModule module, GenericServer server, IPath assembleRoot)
	{
		fModule=module;
		fServerdefinition=server.getServerDefinition();
		fServer=server;
		fAssembleRoot = assembleRoot;
	}
	
	/**
	 * Assemble the module.
	 * 
	 * @param monitor
	 * @throws CoreException
	 */
	public abstract IPath assemble(IProgressMonitor monitor) throws CoreException;

	
	/**
	 * Factory for creating concrete module assemblers for 
	 * corressponding module types.
	 *
	 */
	public static class Factory {		
		
		public static IPath getDefaultAssembleRoot(IModule module, GenericServer server) {
			ProjectModule pm =(ProjectModule)module.loadAdapter(ProjectModule.class, new NullProgressMonitor());
			return ServerPlugin.getInstance().getTempDirectory(server.getServer().getId()).append(pm.getId());
		}
		
		/**
		 * Returns a concrete module assembler
		 * 
		 * @param module
		 * @param server
		 * @return assembler
		 */
		public static AbstractModuleAssembler getModuleAssembler(IModule module, GenericServer server)
		{
			return getModuleAssembler(module, server, getDefaultAssembleRoot(module, server));
		}
		
		/**
		 * Returns a concrete module assembler that assembles under the specified root path
		 * 
		 * @param module
		 * @param server
		 * @param assembleRoot
		 * @return assembler
		 */
		public static AbstractModuleAssembler getModuleAssembler(IModule module, GenericServer server, IPath assembleRoot)
		{
			if(isModuleType(module, "jst.web")) //$NON-NLS-1$
				return new WarModuleAssembler(module,server,assembleRoot);
			if(isModuleType(module, "jst.ear")) //$NON-NLS-1$
				return new EarModuleAssembler(module,server,assembleRoot);
			return new DefaultModuleAssembler(module,server,assembleRoot);
		}
		
		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, String deploymentUnitName, IPath destination)throws CoreException {
		
	
		String dest = destination.append(deploymentUnitName).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); //$NON-NLS-1$
			throw new CoreException(status);
		}
		finally{
			try{
				packager.finished();
			}
			catch(IOException e){
				//unhandled
			}
		}
	}

	private void doPackModule(IModuleResource resource, ModulePackager packager) throws CoreException, IOException{
			if (resource instanceof IModuleFolder) {
				IModuleFolder mFolder = (IModuleFolder)resource;
				IModuleResource[] resources = mFolder.members();

				packager.writeFolder(resource.getModuleRelativePath().append(resource.getName()).toPortableString());

				for (int i = 0; resources!= null && i < resources.length; i++) {
					doPackModule(resources[i], packager);
				}
			} else {
				String destination = resource.getModuleRelativePath().append(resource.getName()).toPortableString();
				IFile file = (IFile) resource.getAdapter(IFile.class);
				if (file != null)
					packager.write(file, destination);
				else {
					File file2 = (File) resource.getAdapter(File.class);
					packager.write(file2, destination);
				}
			}
	}

	protected IPath copyModule(IModule module, IProgressMonitor monitor) throws CoreException {
		ProjectModule pm =(ProjectModule)module.loadAdapter(ProjectModule.class, monitor);
		PublishUtil.smartCopy(pm.members(), fAssembleRoot, monitor);
		return fAssembleRoot;
	}
}
