blob: c173740138663387c37198e7ab55f570567e41fa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Angelo Zerr 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:
* Angelo Zerr <angelo.zerr@gmail.com> - Initial API and implementation
*******************************************************************************/
package org.eclipse.jst.server.jetty.core.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
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.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.server.core.IWebModule;
import org.eclipse.jst.server.core.internal.ProgressUtil;
import org.eclipse.jst.server.jetty.core.IJettyConfiguration;
import org.eclipse.jst.server.jetty.core.IJettyConfigurationWorkingCopy;
import org.eclipse.jst.server.jetty.core.IJettyServer;
import org.eclipse.jst.server.jetty.core.JettyPlugin;
import org.eclipse.jst.server.jetty.core.WebModule;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.ServerPort;
public abstract class JettyConfiguration implements IJettyConfiguration, IJettyConfigurationWorkingCopy
{
private IFolder configPath;
/**
* JettyConfiguration constructor.
*
* @param path
* a path
*/
public JettyConfiguration(IFolder path)
{
super();
this.configPath = path;
}
protected IFolder getFolder()
{
return configPath;
}
/**
* Return the port number.
*
* @return int
*/
public ServerPort getMainPort()
{
Collection<ServerPort> serverPorts = getServerPorts();
for (ServerPort serverPort : serverPorts)
{
// Return only an HTTP port from the selected Service
if (serverPort.getProtocol().toLowerCase().equals("http") && serverPort.getId().indexOf('/') < 0)
return serverPort;
}
return null;
}
/**
* Returns the partial URL applicable to this module.
*
* @param webModule
* a web module
* @return the partial URL
*/
public String getWebModuleURL(IModule webModule)
{
WebModule module = getWebModule(webModule);
if (module != null)
return module.getPath();
IWebModule webModule2 = (IWebModule)webModule.loadAdapter(IWebModule.class,null);
return "/" + webModule2.getContextRoot();
}
/**
* Returns the given module from the config.
*
* @param module
* a web module
* @return a web module
*/
public WebModule getWebModule(IModule module)
{
if (module == null)
return null;
String memento = module.getId();
List<WebModule> modules = getWebModules();
int size = modules.size();
for (int i = 0; i < size; i++)
{
WebModule webModule = modules.get(i);
if (memento.equals(webModule.getMemento()))
{
return webModule;
}
}
return null;
}
/**
* Returns the prefix that is used in front of the web module path property. (e.g. "webapps")
*
* @return java.lang.String
*/
public String getDocBasePrefix()
{
return "";
}
/**
* Copies all files from the given directory in the workbench to the given location. Can be overridden by version specific class to modify or enhance what
* publish does.
*
* @param jettyDir
* Destination Jetty directory. Equivalent to catalina.base for Jetty 4.x and up.
* @param doBackup
* Backup existing configuration files (true if not test mode).
* @param monitor
* Progress monitor to use
* @return result of operation
*/
public IStatus backupAndPublish(IPath jettyDir, boolean doBackup, IProgressMonitor monitor)
{
MultiStatus ms = new MultiStatus(JettyPlugin.PLUGIN_ID,0,Messages.publishConfigurationTask,null);
if (Trace.isTraceEnabled())
Trace.trace(Trace.FINER,"Backup and publish");
monitor = ProgressUtil.getMonitorFor(monitor);
try
{
IPath backup = null;
if (doBackup)
{
// create backup directory
backup = jettyDir.append("backup");
if (!backup.toFile().exists())
backup.toFile().mkdir();
}
backupFolder(getFolder(),jettyDir,backup,ms,monitor);
}
catch (Exception e)
{
Trace.trace(Trace.SEVERE,"backupAndPublish() error",e);
IStatus s = new Status(IStatus.ERROR,JettyPlugin.PLUGIN_ID,0,NLS.bind(Messages.errorPublishConfiguration,new String[]
{ e.getLocalizedMessage() }),e);
ms.add(s);
}
monitor.done();
return ms;
}
protected void backupFolder(IFolder folder, IPath confDir, IPath backup, MultiStatus ms, IProgressMonitor monitor) throws CoreException
{
IResource[] children = folder.members();
if (children == null)
return;
IResource resource = null;
int size = children.length;
monitor.beginTask(Messages.publishConfigurationTask,size * 100);
for (int i = 0; i < size; i++)
{
resource = children[i];
switch (resource.getType())
{
case IResource.FILE:
try
{
IFile file = (IFile)resource;
String name = file.getName();
monitor.subTask(NLS.bind(Messages.publisherPublishTask,new String[]
{ name }));
if (Trace.isTraceEnabled())
Trace.trace(Trace.FINEST,"Publishing " + name);
// backup and copy file
boolean copy = true;
if (backup != null && !(backup.append(name).toFile().exists()))
{
IStatus status = FileUtil.copyFile(confDir.append(name).toOSString(),backup + File.separator + name);
ms.add(status);
if (!status.isOK())
copy = false;
}
if (copy)
{
String destPath = confDir.append(name).toOSString();
String destContents = null;
String srcContents = null;
File dest = new File(destPath);
if (dest.exists())
{
InputStream fis = new FileInputStream(destPath);
destContents = FileUtil.getFileContents(fis);
if (destContents != null)
{
fis = file.getContents();
srcContents = FileUtil.getFileContents(fis);
}
}
if (destContents == null || srcContents == null || !srcContents.equals(destContents))
{
InputStream in = file.getContents();
ms.add(FileUtil.copyFile(in,destPath));
}
}
}
catch (Exception e)
{
Trace.trace(Trace.SEVERE,"backupAndPublish() error",e);
ms.add(new Status(IStatus.ERROR,JettyPlugin.PLUGIN_ID,0,NLS.bind(Messages.errorPublishConfiguration,new String[]
{ e.getLocalizedMessage() }),e));
}
break;
case IResource.FOLDER:
IFolder childFolder = (IFolder)resource;
backupFolder(childFolder,confDir.append(childFolder.getName()),(backup != null?backup.append(childFolder.getName()):null),ms,monitor);
break;
}
monitor.worked(100);
}
}
protected void backupPath(IPath path, IPath confDir, IPath backup, MultiStatus ms, IProgressMonitor monitor)
{
File[] files = path.toFile().listFiles();
if (files == null)
return;
int size = files.length;
monitor.beginTask(Messages.publishConfigurationTask,size * 100);
for (int i = 0; i < size; i++)
{
try
{
File file = files[i];
String name = file.getName();
monitor.subTask(NLS.bind(Messages.publisherPublishTask,new String[]
{ name }));
if (Trace.isTraceEnabled())
Trace.trace(Trace.FINEST,"Publishing " + name);
// backup and copy file
boolean copy = true;
if (backup != null && !(backup.append(name).toFile().exists()))
{
IStatus status = FileUtil.copyFile(confDir.append(name).toOSString(),backup + File.separator + name);
ms.add(status);
if (!status.isOK())
copy = false;
}
if (copy)
ms.add(FileUtil.copyFile(file.getAbsolutePath(),confDir.append(name).toOSString()));
}
catch (Exception e)
{
Trace.trace(Trace.SEVERE,"backupAndPublish() error",e);
ms.add(new Status(IStatus.ERROR,JettyPlugin.PLUGIN_ID,0,NLS.bind(Messages.errorPublishConfiguration,new String[]
{ e.getLocalizedMessage() }),e));
}
monitor.worked(100);
}
}
public IStatus cleanupServer(IPath confDir, IPath installDir, IProgressMonitor monitor)
{
// Default implementation assumes nothing to clean
return Status.OK_STATUS;
}
public IStatus localizeConfiguration(IPath confDir, IPath serverDeployDirectory, IJettyServer jettyServer, IProgressMonitor subMonitorFor)
{
return Status.OK_STATUS;
}
}