blob: 483470baded4026daba49a8559b1317161932340 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.ide.test.impl.helpers;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.jar.Manifest;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
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.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.m2e.core.MavenPlugin;
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.IProjectFacetVersion;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
/**
* The <tt>ProjectAdapter</tt> adapts the Eclipse project and resource APIs to make them simpler to use for testing
* purposes
*
*/
public class ProjectAdapter {
private final IProject project;
private IJavaProject javaProject;
public ProjectAdapter(IProject project) {
this.project = project;
}
public void addNatures(String... naturesToAdd) throws CoreException {
IProjectDescription desc = project.getDescription();
String[] natures = desc.getNatureIds();
String[] newNatures = new String[natures.length + naturesToAdd.length];
System.arraycopy(natures, 0, newNatures, 0, natures.length);
for (int i = 0; i < naturesToAdd.length; i++) {
newNatures[natures.length + i] = naturesToAdd[i];
}
desc.setNatureIds(newNatures);
project.setDescription(desc, new NullProgressMonitor());
}
public void configureAsJavaProject(MavenDependency... dependencies) throws CoreException {
// get dependency to required artifacts
List<Artifact> resolvedArtifacts = new ArrayList<>(dependencies.length);
for (MavenDependency d : dependencies) {
resolvedArtifacts.add(MavenPlugin.getMaven().resolve(d.getGroupId(), d.getArtifactId(), d.getVersion(),
"jar", "", MavenPlugin.getMaven().getArtifactRepositories(), new NullProgressMonitor()));
}
// create java project
javaProject = JavaCore.create(project);
Set<IClasspathEntry> entries = new HashSet<>();
entries.add(JavaRuntime.getDefaultJREContainerEntry());
for (Artifact artifact : resolvedArtifacts) {
entries.add(JavaCore.newLibraryEntry(Path.fromOSString(artifact.getFile().getAbsolutePath()), null, null));
}
IFolder src = project.getFolder("src");
src.create(true, true, new NullProgressMonitor());
entries.add(JavaCore.newSourceEntry(src.getFullPath()));
javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), new NullProgressMonitor());
IFolder bin = project.getFolder("bin");
if (!bin.exists()) { // TODO - not sure why this exists...
bin.create(true, true, new NullProgressMonitor());
}
javaProject.setOutputLocation(bin.getFullPath(), new NullProgressMonitor());
}
/**
* Creates or updates an existing file
*
* @param fileLocation the path where the resource will be created or updated
* @param contents the contents to write to the file. This stream will be closed after being used
* @throws CoreException
*/
public void createOrUpdateFile(IPath fileLocation, InputStream contents) throws CoreException {
if (contents == null) {
throw new IllegalArgumentException("resourceAsStream may not be null");
}
try {
IContainer holder = ensureDirectoryExists(fileLocation.removeLastSegments(1));
IPath fileName = Path.fromPortableString(fileLocation.lastSegment());
IFile file = holder.getFile(fileName);
if (file.exists()) {
file.setContents(contents, true, true, new NullProgressMonitor());
} else {
file.create(contents, true, new NullProgressMonitor());
}
} finally {
IOUtils.closeQuietly(contents);
}
}
/**
* Ensures that the specified directory exists
*
* @param path the path where the directory should exist
* @return the created or existing directory
* @throws CoreException
*/
public IContainer ensureDirectoryExists(IPath path) throws CoreException {
IContainer current = project;
for (int i = 0; i < path.segmentCount(); i++) {
String currentSegment = path.segment(i);
IResource container = current.findMember(currentSegment);
if (container != null) {
if (container.getType() != IContainer.FOLDER) {
throw new IllegalArgumentException("Resource " + container
+ " exists and is not a folder; unable to create file at path " + path);
}
current = (IContainer) container;
} else {
IFolder newFolder = ((IContainer) current).getFolder(Path.fromPortableString(currentSegment));
newFolder.create(true, true, new NullProgressMonitor());
current = newFolder;
}
}
return current;
}
public void createVltFilterWithRoots(String... roots) throws CoreException {
StringBuilder builder = new StringBuilder();
builder.append("<workspaceFilter vesion=\"1.0\">\n");
for (String root : roots) {
builder.append(" <filter root=\"").append(root).append("\"/>\n");
}
builder.append("</workspaceFilter>\n");
createOrUpdateFile(Path.fromPortableString("META-INF/vault/filter.xml"), new ByteArrayInputStream(builder
.toString().getBytes()));
}
public void createOsgiBundleManifest(OsgiBundleManifest osgiManifest) throws CoreException, IOException {
Manifest m = new Manifest();
for (Map.Entry<String, String> entry : osgiManifest.getAttributes().entrySet()) {
m.getMainAttributes().putValue(entry.getKey(), entry.getValue());
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
m.write(out);
createOrUpdateFile(Path.fromPortableString("src/META-INF/MANIFEST.MF"), new ByteArrayInputStream(out.toByteArray()));
}
public void installFacet(String facetId, String facetVersion) throws CoreException {
IFacetedProject facetedProject = ProjectFacetsManager.create(project);
IProjectFacet slingBundleFacet = ProjectFacetsManager.getProjectFacet(facetId);
IProjectFacetVersion projectFacetVersion = slingBundleFacet.getVersion(facetVersion);
facetedProject.installProjectFacet(projectFacetVersion, null, new NullProgressMonitor());
}
public void deleteMember(IPath path) throws CoreException {
IResource member = project.findMember(path);
if (member != null) {
member.delete(true, new NullProgressMonitor());
}
}
protected IProject getProject() {
return project;
}
}