/*******************************************************************************
* Copyright (c) 2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.internal.core.project.facet;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.IRuntimeType;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.IServerType;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.ServerUtil;
import org.eclipse.wst.server.core.internal.ChainedJob;
import org.jboss.ide.eclipse.as.core.modules.SingleDeployableFactory;
import org.jboss.tools.jst.web.server.RegistrationHelper;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.project.facet.SeamRuntime;
import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager;
/**
* @author Alexey Kazakov
*/
public class Seam23FacetInstallDelegate extends Seam2FacetInstallDelegate {
private static String RICHFACES_SKIN = "org.richfaces.skin"; //$NON-NLS-1$
public static AntCopyUtils.FileSet JBOOS_WAR_WEBINF_SET = new AntCopyUtils.FileSet()
.include("WEB-INF") //$NON-NLS-1$
.include("WEB-INF/pages\\.xml") //$NON-NLS-1$
.include("WEB-INF/componets\\.xml") //$NON-NLS-1$
.include("WEB-INF/jboss-deployment-structure\\.xml"); //$NON-NLS-1$
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#copyFilesToWarProject(org.eclipse.core.resources.IProject, org.eclipse.wst.common.project.facet.core.IProjectFacetVersion, org.eclipse.wst.common.frameworks.datamodel.IDataModel, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected void copyFilesToWarProject(IProject project, IProjectFacetVersion fv, IDataModel model, IProgressMonitor monitor) throws CoreException {
super.copyFilesToWarProject(project, fv, model, monitor);
if(!shouldCopyLibrariesAndTemplates(model)) {
return;
}
if(isWarConfiguration(model)) {
File destFolder = new File(project.getLocation().toFile(), "resources"); //$NON-NLS-1$
copyDBDriverToProject(project, model, destFolder);
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#getProjectCreator(org.eclipse.wst.common.frameworks.datamodel.IDataModel, org.eclipse.core.resources.IProject)
*/
@Override
protected SeamProjectCreator getProjectCreator(IDataModel model, IProject project, SeamFacetAbstractInstallDelegate seamFacetInstallDelegate) {
return new Seam23ProjectCreator(model, project, seamFacetInstallDelegate);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.SeamFacetAbstractInstallDelegate#getJBossWarWebinfSet()
*/
@Override
protected AntCopyUtils.FileSet getJBossWarWebinfSet() {
return JBOOS_WAR_WEBINF_SET;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#getEarLibFileSet()
*/
@Override
public AntCopyUtils.FileSet getEarLibFileSet() {
return getEarLibFileSet(facetModel);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#getWarLibFileSet()
*/
@Override
public AntCopyUtils.FileSet getWarLibFileSet() {
return getWarLibFileSet(facetModel);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#getWarLibFileSetForEar()
*/
@Override
public AntCopyUtils.FileSet getWarLibFileSetForEar() {
return getWarLibFileSetForEar(facetModel);
}
public static AntCopyUtils.FileSet getEarLibFileSet(IDataModel model) {
SeamRuntime runtime = getSeamRuntime(model);
return getEarLibFileSet(runtime);
}
public static AntCopyUtils.FileSet getWarLibFileSet(IDataModel model) {
SeamRuntime runtime = getSeamRuntime(model);
return getWarLibFileSet(runtime);
}
public static AntCopyUtils.FileSet getWarLibFileSetForEar(IDataModel model) {
SeamRuntime runtime = getSeamRuntime(model);
return getWarLibFileSetForEar(runtime);
}
public static AntCopyUtils.FileSet getEarLibFileSet(SeamRuntime runtime) {
String path = runtime.getDeployedJarsEarListFile();
return getFileSetOfJars(path);
}
public static AntCopyUtils.FileSet getWarLibFileSet(SeamRuntime runtime) {
String path = runtime.getDeployedJarsWarListFile();
return getFileSetOfJars(path);
}
public static AntCopyUtils.FileSet getWarLibFileSetForEar(SeamRuntime runtime) {
String path = runtime.getDeployedJarsEarWarListFile();
return getFileSetOfJars(path);
}
private static AntCopyUtils.FileSet getFileSetOfJars(String path) {
AntCopyUtils.FileSet fileSet = new AntCopyUtils.FileSet();
File listFile = new File(path);
if(listFile.exists()) {
FileInputStream fis = null;
try {
Properties list = new Properties();
fis = new FileInputStream(listFile);
list.load(fis);
Set<String> jarList = list.stringPropertyNames();
for (String jar : jarList) {
fileSet.include(jar);
}
} catch (FileNotFoundException e) {
SeamCorePlugin.getDefault().logError(e);
} catch (IOException e) {
SeamCorePlugin.getDefault().logError(e);
} finally {
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
}
}
}
} else {
SeamCorePlugin.getDefault().logError(path + " doesn't exist. Can't get the list of the JARs to copy to the project.");
}
return fileSet;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.internal.core.project.facet.Seam2FacetInstallDelegate#getSkinParamName()
*/
@Override
protected String getSkinParamName() {
return RICHFACES_SKIN;
}
private static SeamRuntime getSeamRuntime(IDataModel model) {
Object runtimeName = model.getProperty(ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME);
SeamRuntime runtime = SeamRuntimeManager.getInstance().findRuntimeByName(runtimeName.toString());
return runtime;
}
/**
* Copies and deploys the driver jar from connection profile to the server.
* @param project
* @param model
* @param destFolder
*/
public static void copyDBDriverToProject(IProject project, IDataModel model, File destFolder) {
Object drvrs = model.getProperty(ISeamFacetDataModelProperties.JDBC_DRIVER_JAR_PATHS_ARRAY);
if(drvrs!=null) {
String[] drvrsStrings = (String[])drvrs;
if(drvrsStrings.length>0) {
File driver = new File(drvrsStrings[0]);
if(driver.exists()) {
File dest = new File(destFolder, driver.getName());
AntCopyUtils.copyFileToFile(driver, dest, null, false);
IFile resource = null;
IFile[] files = project.getWorkspace().getRoot().findFilesForLocationURI(dest.toURI());
for (IFile file : files) {
if(project.equals(file.getProject())) {
resource = file;
break;
}
}
if(resource != null) {
try {
resource.refreshLocal(IResource.DEPTH_ZERO, null);
} catch (CoreException e) {
SeamCorePlugin.getDefault().logError(e);
}
try {
if (FacetedProjectFramework.isFacetedProject(project)) {
IFacetedProject fProj = ProjectFacetsManager.create(project);
org.eclipse.wst.common.project.facet.core.runtime.IRuntime facetRuntime = fProj.getPrimaryRuntime();
IRuntime runtime = getRuntime(facetRuntime);
IServer server = getServer(runtime);
if (server != null && serverSupportsSingleFileModule(server)) {
ChainedJob dsJob = new ResourceDeployer(project, server, resource.getFullPath().removeFirstSegments(1));
dsJob.setNextJob(RegistrationHelper.getRegisterInServerJob(project, new IServer[]{server}, null));
dsJob.schedule();
}
}
} catch (CoreException e) {
SeamCorePlugin.getDefault().logError(e);
}
}
}
}
}
}
private static IServer getServer(IRuntime runtime) {
if (runtime == null) {
return null;
}
IRuntimeType runtimeType = runtime.getRuntimeType();
if (runtimeType == null || runtimeType.getId() == null) {
return null;
}
IServer[] servers = ServerCore.getServers();
for (IServer server:servers) {
IServerType serverType = server.getServerType();
if (serverType == null) {
continue;
}
IRuntimeType serverRuntimeType = serverType.getRuntimeType();
if (serverRuntimeType == null) {
continue;
}
if (runtimeType.getId().equals(serverRuntimeType.getId())) {
return server;
}
}
return null;
}
private static IRuntime getRuntime(
org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime) {
if (runtime == null)
throw new IllegalArgumentException();
String id = runtime.getProperty("id"); //$NON-NLS-1$
if (id == null)
return null;
IRuntime[] runtimes = ServerCore.getRuntimes();
for (IRuntime r : runtimes) {
if (id.equals(r.getId()))
return r;
}
return null;
}
private static boolean serverSupportsSingleFileModule(IServer s) {
IRuntimeType rt = s.getServerType().getRuntimeType();
if (ServerUtil.isSupportedModule(rt.getModuleTypes(),
SingleDeployableFactory.MODULE_TYPE, SingleDeployableFactory.VERSION)) {
return true;
}
return false;
}
}