package com.farata.cleardatabuilder.extjs.builder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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.resources.IResourceDelta;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.JavaProject;
import com.farata.cleardatabuilder.extjs.migration.CDBMigration;
public class ClearBuilder extends IncrementalProjectBuilder {
@SuppressWarnings("unchecked")
@Override
protected IProject[] build(final int kind, final Map args, final IProgressMonitor monitor) throws CoreException {
createBuildProperties(monitor);
try {
if (!CDBMigration.checkProjectVersion(getProject(), monitor, true)) {
return new IProject[0];
}
} catch (Exception e1) {
e1.printStackTrace();
}
IResourceDelta delta = getDelta(getProject());
if (delta != null) {
ClearResourceDeltaVisitor visitor = new ClearResourceDeltaVisitor(getProject());
delta.accept(visitor);
if (visitor.serviceFound) {
IFile flag = getProject().getFile("cdb_build/.flag");
if (flag.exists()) {
flag.touch(monitor);
} else {
File file = flag.getLocation().toFile();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
flag = getProject().getFile("cdb_build/.flag");
flag.refreshLocal(IResource.DEPTH_INFINITE, monitor);
// getProject().refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
}
return new IProject[0];
}
private void createBuildProperties(final IProgressMonitor monitor) {
IProject project = getProject();
List<IJavaElement> folders = getSourceFolders();
Properties props = new Properties();
try {
if (folders.size() > 0) {
IFile ifile = project.getFile("cdb_build/build.properties");
if (!ifile.exists()) {
return;
}
props.load(new FileReader(new File(ifile.getLocation().toOSString())));
String javaSrcProp = props.getProperty("java-src");
String javaSrcPropNew = "";
String javaSrcGeneratedPropNew = "";
for (IJavaElement e : folders) {
IPath path = e.getPath();
path = path.removeFirstSegments(1).makeRelative();
String s = "${project-root}" + path.toString();
javaSrcPropNew = javaSrcPropNew + s + ':';
if (javaSrcGeneratedPropNew.length() == 0) {
javaSrcGeneratedPropNew = s;
}
}
if (javaSrcPropNew.length() > 0) {
javaSrcPropNew = javaSrcPropNew.substring(0, javaSrcPropNew.length() - 1);
if (!javaSrcPropNew.equals(javaSrcProp)) {
props.setProperty("java-src", javaSrcPropNew);
props.setProperty("java-src-generated", javaSrcGeneratedPropNew);
props.store(new FileWriter(ifile.getLocation().toOSString()), null);
ifile.refreshLocal(IResource.DEPTH_INFINITE, monitor);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private List<IJavaElement> getSourceFolders() {
IProject project = getProject();
if (project == null)
return null;
List<IJavaElement> ret = new ArrayList<IJavaElement>();
IJavaProject javaProject = JavaCore.create(project);
try {
IPackageFragmentRoot[] packageFragmentRoot = javaProject.getAllPackageFragmentRoots();
for (int i = 0; i < packageFragmentRoot.length; i++) {
if (packageFragmentRoot[i].getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT && !packageFragmentRoot[i].isArchive())
ret.add(packageFragmentRoot[i]);
}
} catch (JavaModelException e) {
e.printStackTrace();
return null;
}
return ret;
}
}