blob: befd46b06a8cdfffd836154d3e06f3852e303f50 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Oracle Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Cameron Bateman/Oracle - initial API and implementation
*
********************************************************************************/
package org.eclipse.jst.jsf.test.util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.common.project.facet.JavaProjectFacetCreationDataModelProvider;
import org.eclipse.jst.common.project.facet.core.JavaFacet;
import org.eclipse.jst.j2ee.internal.web.archive.operations.WebFacetProjectCreationDataModelProvider;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
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.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.internal.FacetedProjectNature;
import org.osgi.framework.Bundle;
/**
* Test environment for dynamic web projects
* @author cbateman
*
*/
public class WebProjectTestEnvironment extends ProjectTestEnvironment {
private final IProjectFacetVersion _javaFacetVersion;
private final IProjectFacetVersion _webFacetVersion;
/**
* @param projectName
*/
public WebProjectTestEnvironment(String projectName) {
this(projectName, JavaFacet.VERSION_1_5, ProjectFacetsManager.getProjectFacet( "jst.web" ).getVersion("2.4"));
}
/**
* @param projectName
* @param javaVersion
* @param webVersion
*/
public WebProjectTestEnvironment(String projectName, IProjectFacetVersion javaVersion, IProjectFacetVersion webVersion)
{
super(projectName);
_javaFacetVersion = javaVersion;
_webFacetVersion = webVersion;
}
/**
* Use forCase to try and create a project name unique to the current
* class and test name being run.
*
* @param forCase
* @param javaVersion
* @param webVersion
*/
public WebProjectTestEnvironment(TestCase forCase,
IProjectFacetVersion javaVersion, IProjectFacetVersion webVersion)
{
this(forCase.getClass().getName() + "_" + forCase.getName(),
javaVersion, webVersion);
}
/**
* NOTE: behaviour override compared to super. This method doesn't
* delete existing
*
* Create the web project. If this method completes successfully
* without throwing RuntimeExceptions, this test environment will
* point to an IProject with Java and Web facets set as configured
* in the constructor.
*
* NOTE: create behaviour is significantly altered by the ignoreExisting
* flag
*
* @param ignoreProjectExists -- only has impact if _projectName already
* exists in the workspace. In this case, if set to true, then createProject
* will return without error if the project exists and is properly faceted, but
* throw a RuntimeException if faceting doesn't match what is expected.
*
* If set to false and the project exists, a runtime exception will be thrown
* @return true if project was created
*/
@Override
public boolean createProject(boolean ignoreProjectExists)
{
boolean doCreate = true;
try
{
_project = ResourcesPlugin.getWorkspace().getRoot().getProject(_projectName);
if (_project.isAccessible())
{
if (ignoreProjectExists)
{
if (hasFacets(_project))
{
doCreate = false;
}
}
else
{
throw new RuntimeException("Project was not expected to exist but does: "+_project.getName());
}
}
if (doCreate)
{
_project = createWebProject(_projectName);
}
_projectCreated = true;
return doCreate;
} catch (Exception t) {
throw new RuntimeException(t);
}
}
@SuppressWarnings("unchecked")
private boolean hasFacets(IProject project) throws CoreException
{
boolean javaInstalled = false;
boolean webInstalled = false;
IFacetedProject facetedProject = ProjectFacetsManager.create(project);
IProjectFacetVersion version =
facetedProject.getInstalledVersion(_javaFacetVersion.getProjectFacet());
if (version != null)
{
if (version.compareTo(_javaFacetVersion) == 0)
{
javaInstalled = true;
}
else
{
throw new RuntimeException("Wrong Java version already installed. Has: "+version.getVersionString()+" but was expecting: "+_javaFacetVersion.getVersionString());
}
}
version = facetedProject.getInstalledVersion(_webFacetVersion.getProjectFacet());
if (version != null)
{
if (version.compareTo(_webFacetVersion) == 0)
{
webInstalled = true;
}
else
{
throw new RuntimeException("Wrong web version already installed. Has: "+version.getVersionString()+" but was expecting: "+_javaFacetVersion.getVersionString());
}
}
if (javaInstalled && webInstalled)
{
return true;
}
return false;
}
/**
* @param projectName
* @return the web project
* @throws Exception
*/
private IProject createWebProject(String projectName) throws Exception
{
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if(!isProjectCreated())
{
if (!project.exists())
{
project.create(null);
project.open(null);
ProjectUtilities.addNatureToProject(project, FacetedProjectNature.NATURE_ID);
}
Set<Action> actions = new HashSet<Action>();
IDataModel dataModel = DataModelFactory.createDataModel(new JavaProjectFacetCreationDataModelProvider());
dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
actions.add(new IFacetedProject.Action(Action.Type.INSTALL,_javaFacetVersion,null));
// dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_ACTION_MAP, actions);
// dataModel.getDefaultOperation().execute(new NullProgressMonitor(), null);
// dataModel.dispose();
dataModel = DataModelFactory.createDataModel(new WebFacetProjectCreationDataModelProvider());
dataModel.setProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME, projectName);
actions.add(new IFacetedProject.Action(Action.Type.INSTALL,_webFacetVersion,null));
IFacetedProject facetedProject = ProjectFacetsManager.create(project);
facetedProject.modify(actions, null);
}
return project;
}
/**
* @param create
* @param force
* @return the web root container for the project
*/
public IVirtualContainer getWebRoot(boolean create, boolean force)
{
IVirtualContainer webRoot =
ComponentCore.createComponent(getTestProject()).getRootFolder();
if (!webRoot.exists() && create)
{
try
{
webRoot.create(force ? IVirtualResource.FORCE : 0, new NullProgressMonitor());
}
catch (CoreException ce)
{
Activator.log("Error creating web root", ce);
ce.printStackTrace();
}
}
return webRoot;
}
/**
* Creates or overwrites destFileName with the contents of srcFileName in bundle
*
* @param bundle
* @param srcFileName
* @param destDirName
* @param destFileName
* @return the IResource for the newly loaded resource
* @throws IOException
* @throws CoreException
*/
public IResource loadResourceInWebRoot(Bundle bundle, String srcFileName, String destFileName) throws IOException, CoreException
{
final TestFileResource resource = new TestFileResource();
resource.load(bundle, srcFileName);
IFile file = getWebRoot(true, true).getFile(new Path(destFileName)).getUnderlyingFile();
if (!file.exists())
{
file.create(new ByteArrayInputStream(resource.toBytes()), true, null);
}
else
{
file.setContents(new ByteArrayInputStream(resource.toBytes()), true, true, null);
}
return file;
}
}