/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.operation;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;
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.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryProviderFramework;
import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
import org.eclipse.jst.jsf.core.internal.project.facet.JSFFacetInstallDataModelProvider;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties.FacetDataModelMap;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.jboss.tools.common.model.XModelConstants;
import org.jboss.tools.common.model.filesystems.FileSystemsHelper;
import org.jboss.tools.common.model.filesystems.impl.FileSystemImpl;
import org.jboss.tools.common.model.project.IModelNature;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.util.FileUtil;
import org.jboss.tools.jsf.JSFModelPlugin;
import org.jboss.tools.jsf.project.JSFAutoLoad;
import org.jboss.tools.jsf.project.JSFNature;
import org.jboss.tools.jsf.ui.JsfUiPlugin;
import org.jboss.tools.jsf.web.JSFTemplate;
import org.jboss.tools.jst.web.WebModelPlugin;
import org.jboss.tools.jst.web.WebUtils;
import org.jboss.tools.jst.web.context.RegisterServerContext;
import org.jboss.tools.jst.web.kb.IKbProject;
import org.jboss.tools.jst.web.kb.internal.KbBuilder;
import org.jboss.tools.jst.web.project.helpers.IWebProjectTemplate;
import org.jboss.tools.jst.web.project.helpers.NewWebProjectContext;
import org.jboss.tools.jst.web.ui.operation.WebProjectCreationOperation;
public class JSFProjectCreationOperation extends WebProjectCreationOperation {
public JSFProjectCreationOperation(IProject project, IPath projectLocation, RegisterServerContext registry, Properties properties) {
super(project, projectLocation, registry, properties);
}
public JSFProjectCreationOperation(NewWebProjectContext context) {
super(context);
}
protected String getNatureID() {
return JSFNature.NATURE_ID;
}
protected void configFacets(IDataModel dataModel, String projectLocation) {
super.configFacets(dataModel, projectLocation);
FacetDataModelMap map = (FacetDataModelMap) dataModel.getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP);
IDataModel configJSF = (IDataModel) map.get("jst.jsf"); //$NON-NLS-1$
if(configJSF == null) {
configJSF = DataModelFactory.createDataModel(new JSFFacetInstallDataModelProvider());
map.add(configJSF);
}
configJSF = (IDataModel) map.get("jst.jsf"); //$NON-NLS-1$
if(configJSF != null) {
String template = getProperty(TEMPLATE_VERSION_ID);
String version = template.indexOf("1.1") >= 0 ? "1.1"
: template.indexOf("1.2") >= 0 ? "1.2"
: template.indexOf("2.0") >= 0 ? "2.0"
: template.indexOf("2.1") >= 0 ? "2.1"
: template.indexOf("2.2") >= 0 ? "2.2"
: null;
if(version != null) {
configJSF.setProperty(IFacetDataModelProperties.FACET_VERSION_STR, version);
}
IProjectFacet facet = ProjectFacetsManager.getProjectFacet("jst.jsf"); //$NON-NLS-1$
try {
IFacetedProject fproj = ProjectFacetsManager.create(getProject(), true, new NullProgressMonitor());
LibraryInstallDelegate libraryDelegate = new LibraryInstallDelegate(fproj, facet.getDefaultVersion());
ILibraryProvider provider = LibraryProviderFramework.getProvider("jsf-no-op-library-provider"); //$NON-NLS-1$
libraryDelegate.setLibraryProvider(provider);
configJSF.setProperty(IJSFFacetInstallDataModelProperties.LIBRARY_PROVIDER_DELEGATE, libraryDelegate);
} catch (CoreException e) {
JsfUiPlugin.getDefault().logError(e);
}
}
}
protected IWebProjectTemplate createTemplate() {
return new JSFTemplate();
}
protected String getLibLocation() {
FileSystemImpl fs = (FileSystemImpl)FileSystemsHelper.getFileSystem(templateModel, "lib"); //$NON-NLS-1$
if(fs != null) {
return fs.getAbsoluteLocation();
}
fs = (FileSystemImpl)FileSystemsHelper.getWebInf(templateModel);
return fs.getAbsoluteLocation() + "/lib"; //$NON-NLS-1$
}
protected void copyTemplate() throws Exception {
String location = getProject().getLocation().toString();
String location2 = location;
String templateLocation = getTemplateLocation();
String version = getProperty(TEMPLATE_VERSION_ID);
File templateFile = new File(templateLocation);
templateLocation = templateFile.getCanonicalPath().replace('\\', '/');
File targetDir = new File(location);
File targetDir2 = new File(location2);
FileUtil.copyDir(templateFile, targetDir2, true, true);
preprocessTemplate(templateFile, targetDir2);
adjustProjectFile(targetDir, targetDir2);
String jars[] = template.getLibraries(version);
String libDir = getLibLocation();
libDir = location2 + libDir.substring(templateLocation.length());
for (int i = 0; i < jars.length; i++) {
File source = new File(jars[i]);
FileUtil.copyFile(source, new File(libDir, source.getName()), true);
}
String servletVersion = getProperty(SERVLET_VERSION_ID);
String[] servletJars = WebUtils.getServletLibraries(template.getTemplatesBase(), servletVersion);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < servletJars.length; sb.append(servletJars[i++]).append(';'));
Properties buildProperties = new Properties();
buildProperties.setProperty("classpath.external", sb.toString()); //$NON-NLS-1$
File antDir = new File(location2 + "/ant"); //$NON-NLS-1$
if(!antDir.exists()) antDir.mkdirs();
OutputStream propFile = new BufferedOutputStream(new FileOutputStream(location2 + "/ant/build.properties")); //$NON-NLS-1$
try {
buildProperties.store(propFile, ""); //$NON-NLS-1$
} finally {
propFile.close();
}
getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
}
private void adjustProjectFile(File targetDir, File targetDir2) {
File f2 = getProjectFile(targetDir2);
if(f2 != null) f2.delete();
}
private File getProjectFile(File targetDir2) {
File f = new File(targetDir2, IModelNature.PROJECT_FILE);
if(f.exists()) return f;
return null;
}
protected void postCreateWebNature() {
if(projectFile != null) {
if(projectFile.isFile()) {
IFile f = EclipseResourceUtil.getFile(projectFile.getAbsolutePath());
if(f != null && f.exists()) {
try {
f.delete(true, new NullProgressMonitor());
} catch (CoreException e) {
JSFModelPlugin.getPluginLog().logError(e);
projectFile.delete();
}
} else {
projectFile.delete();
}
}
projectFile = null;
}
model.getProperties().put(XModelConstants.AUTOLOAD, new JSFAutoLoad());
try {
// EclipseResourceUtil.addNatureToProject(getProject(), IKbProject.NATURE_ID);
WebModelPlugin.addNatureToProjectWithValidationSupport(getProject(), KbBuilder.BUILDER_ID, IKbProject.NATURE_ID);
} catch (CoreException e) {
JSFModelPlugin.getPluginLog().logError(e);
}
}
}