--- /dev/null
+package net.sourceforge.phpeclipse.wiki.builder;
+
+import java.io.IOException;
+import java.util.Map;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.export.WikiExporter;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.internal.resources.Folder;
+import org.eclipse.core.resources.ICommand;
+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.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+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.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+public class WikiBuilder extends IncrementalProjectBuilder {
+
+ class WikiVisitor implements IResourceDeltaVisitor {
+ String fBinBasePath;
+
+ String fSrcBasePath;
+
+ public WikiVisitor(String binBasePath, String srcBasePath) {
+ fBinBasePath = binBasePath;
+ fSrcBasePath = srcBasePath;
+ }
+
+ public boolean visit(IResourceDelta delta) {
+ IResource resource = delta.getResource();
+ if (DEBUG) {
+ System.out.println(resource.toString());
+ }
+ if (delta.getKind() == IResourceDelta.REMOVED && resource.getType() == IResource.FILE) {
+ // remove this file from the wiki publishing directory
+ String htmlName = Util.getHTMLFileName((IFile) resource, fBinBasePath, fSrcBasePath);
+ if (htmlName != null) {
+ java.io.File file = new java.io.File(htmlName);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ return true;
+ }
+ //only interested in changed resources at this point (not added or removed)
+ if (delta.getKind() != IResourceDelta.CHANGED)
+ return true;
+ //only interested in content changes
+ if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)
+ return true;
+ if (resource.getType() == IResource.FILE) {
+ CreatePageAction.createPage((IFile) resource);
+ }
+ return true;
+ }
+ }
+
+ public static final String BUILDER_ID = "net.sourceforge.phpeclipse.wiki.wikibuilder";
+
+ private static final boolean DEBUG = false;
+
+ private IProject fProject;
+
+ private IWorkbench workbench;
+
+ public WikiBuilder() {
+ workbench = PlatformUI.getWorkbench();
+ fProject = null;
+ }
+
+ protected IProject[] build(int kind, Map args, IProgressMonitor _monitor) {
+ try {
+ fProject = getProject();
+ ICommand[] commands = fProject.getDescription().getBuildSpec();
+ boolean found = false;
+ for (int i = 0; i < commands.length; i++) {
+ if (commands[i].getBuilderName().equals(BUILDER_ID)) {
+ found = true;
+ break;
+ }
+ }
+ // fProject.hasNature()
+ if (found && fProject != null && fProject.isAccessible()) {
+
+ if (_monitor == null)
+ _monitor = new NullProgressMonitor();
+ switch (kind) {
+ case INCREMENTAL_BUILD:
+ if (DEBUG) {
+ System.out.println("INCREMENTAL_BUILD requested");
+ }
+ incrementalBuild();
+ break;
+ // we don't need auto build, because on every save we create a new *.html file ?
+ case AUTO_BUILD:
+ if (DEBUG) {
+ System.out.println("AUTO_BUILD requested");
+ }
+ incrementalBuild();
+ break;
+ case FULL_BUILD:
+ if (DEBUG) {
+ System.out.println("FULL_BUILD requested");
+ }
+ fullBuild(_monitor);
+ break;
+ default:
+ // unknown build kind requested;
+ }
+ // fProject.refreshLocal(1,_monitor);
+ }
+ } catch (Exception x) {
+
+ }
+ return new IProject[0];
+ }
+
+ private void fullBuild(IProgressMonitor monitor) throws CoreException, IOException {
+ try {
+ WikiExporter wikiExporter = new WikiExporter();
+ String srcBasePath = Util.getProjectsWikiTextsPath(fProject);
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ wikiExporter.export(fProject, basePath, srcBasePath, monitor);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (CoreException e) {
+ e.printStackTrace();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void incrementalBuild() throws CoreException, IOException {
+ IResourceDelta delta = getDelta(fProject);
+ String srcBasePath = Util.getProjectsWikiTextsPath(fProject);
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ IResourceDeltaVisitor visitor = new WikiVisitor(basePath, srcBasePath);
+ if (delta != null)
+ delta.accept(visitor);
+ }
+
+}
\ No newline at end of file