blob: 65bc76aea17d7943a077fd38fbd6628802b97846 [file] [log] [blame]
/**
* Copyright (c) 2010 Ed Merks 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:
* Ed Merks - Initial API and implementation
*/
package org.eclipse.emf.codegen.ecore.gwt;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
public class GWTBuilder extends IncrementalProjectBuilder
{
protected static IPath[] CONTAINER_PATHS = new IPath[] { new Path("org.eclipse.pde.core.requiredPlugins"), new Path("com.google.appengine.eclipse.core.GAE_CONTAINER"), new Path("com.google.gwt.eclipse.core.GWT_CONTAINER")};
@SuppressWarnings("rawtypes")
@Override
protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException
{
Set<IProject> result = new HashSet<IProject>();
final IProject project = getProject();
if (project.exists())
{
IWorkspaceRoot root = project.getWorkspace().getRoot();
IJavaProject javaProject = JavaCore.create(project);
IClasspathContainer gaeClasspathContainer = JavaCore.getClasspathContainer(new Path("com.google.appengine.eclipse.core.GAE_CONTAINER"), javaProject);
if (gaeClasspathContainer != null)
{
for (IClasspathEntry classpathEntry : gaeClasspathContainer.getClasspathEntries())
{
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY &&
classpathEntry.getContentKind() == IPackageFragmentRoot.K_BINARY)
{
IPath path = classpathEntry.getPath();
int segmentCount = path.segmentCount();
if (segmentCount >= 4)
{
if (path.segment(segmentCount - 2).equals("user") || path.segment(segmentCount - 3).equals("user"))
{
copy(URI.createFileURI(path.toOSString()), URI.createPlatformResourceURI(project.getName() + "/war/WEB-INF/lib/" + path.lastSegment(), true));
}
}
}
}
}
IClasspathContainer gwtClasspathContainer = JavaCore.getClasspathContainer(new Path("com.google.gwt.eclipse.core.GWT_CONTAINER"), javaProject);
if (gwtClasspathContainer != null)
{
for (IClasspathEntry classpathEntry : gwtClasspathContainer.getClasspathEntries())
{
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY &&
classpathEntry.getContentKind() == IPackageFragmentRoot.K_BINARY)
{
IPath path = classpathEntry.getPath();
int segmentCount = path.segmentCount();
if (segmentCount >= 2)
{
path = path.removeLastSegments(1).append("gwt-servlet.jar");
URI fileURI = URI.createFileURI(path.toOSString());
if (URIConverter.INSTANCE.exists(fileURI, null))
{
copy(fileURI, URI.createPlatformResourceURI(project.getName() + "/war/WEB-INF/lib/" + path.lastSegment(), true));
}
}
}
}
}
IClasspathContainer pdeClasspathContainer = JavaCore.getClasspathContainer(new Path("org.eclipse.pde.core.requiredPlugins"), javaProject);
if (pdeClasspathContainer != null)
{
for (IClasspathEntry classpathEntry : pdeClasspathContainer.getClasspathEntries())
{
if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_PROJECT)
{
IProject requiredProject = root.getProject(classpathEntry.getPath().segment(0));
IJavaProject requiredJavaProject = JavaCore.create(requiredProject);
IPath outputLocation = requiredJavaProject.getOutputLocation();
final int depth = outputLocation.segmentCount();
IFolder folder = root.getFolder(outputLocation);
folder.accept
(new IResourceVisitor()
{
public boolean visit(IResource resource) throws CoreException
{
if (resource.getType() == IResource.FILE)
{
IPath fullPath = resource.getFullPath();
copy
(URI.createPlatformResourceURI(fullPath.toString(), true),
URI.createPlatformResourceURI(project.getName() + "/war/WEB-INF/classes/" + fullPath.removeFirstSegments(depth), true));
}
return true;
}
},
IResource.DEPTH_INFINITE,
0);
result.add(requiredProject);
}
else if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY && classpathEntry.getContentKind() == IPackageFragmentRoot.K_BINARY)
{
IPath path = classpathEntry.getPath();
copy(URI.createFileURI(path.toOSString()), URI.createPlatformResourceURI(project.getName() + "/war/WEB-INF/lib/" + path.lastSegment(), true));
}
}
}
}
return result.toArray(new IProject[result.size()]);
}
protected void copy(URI sourceURI, URI targetURI)
{
Map<Object, Object> options = new HashMap<Object, Object>();
options.put(URIConverter.OPTION_REQUESTED_ATTRIBUTES, Collections.singleton(URIConverter.ATTRIBUTE_TIME_STAMP));
Long sourceTimeStamp = (Long)URIConverter.INSTANCE.getAttributes(sourceURI, options).get(URIConverter.ATTRIBUTE_TIME_STAMP);
Long targetTimeStamp = (Long)URIConverter.INSTANCE.getAttributes(targetURI, options).get(URIConverter.ATTRIBUTE_TIME_STAMP);
if (targetTimeStamp == null || targetTimeStamp.compareTo(sourceTimeStamp) < 0)
{
try
{
OutputStream out = URIConverter.INSTANCE.createOutputStream(targetURI);
InputStream in = URIConverter.INSTANCE.createInputStream(sourceURI);
byte[] bytes = new byte[4048];
for (int length = in.read(bytes); length > 0; length = in.read(bytes))
{
out.write(bytes, 0, length);
}
in.close();
out.close();
}
catch (IOException exception)
{
CodeGenEcorePlugin.INSTANCE.log(exception);
}
}
try
{
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(targetURI.toPlatformString(true)));
if (file.exists() && !file.isDerived())
{
setDerived(file);
}
}
catch (CoreException exception)
{
CodeGenEcorePlugin.INSTANCE.log(exception);
}
}
@SuppressWarnings("deprecation")
private void setDerived(IFile file) throws CoreException
{
file.setDerived(false);
}
@Override
protected void clean(final IProgressMonitor monitor) throws CoreException
{
final IProject project = getProject();
if (project.exists())
{
IFolder folder = project.getFolder(new Path("/war/WEB-INF/lib/"));
if (folder.exists())
{
final List<IFile> filesToDelete = new ArrayList<IFile>();
folder.accept
(new IResourceVisitor()
{
public boolean visit(IResource resource) throws CoreException
{
if (resource.getType() == IResource.FILE && resource.isDerived())
{
filesToDelete.add((IFile)resource);
return false;
}
else
{
return true;
}
}
});
monitor.beginTask("", filesToDelete.size());
for (IFile file : filesToDelete)
{
file.delete(true, BasicMonitor.subProgress(monitor, 1));
}
}
}
super.clean(monitor);
}
}