1 package net.sourceforge.phpeclipse.wiki.builder;
 
   3 import java.io.BufferedInputStream;
 
   5 import java.io.FileNotFoundException;
 
   6 import java.io.FileOutputStream;
 
   7 import java.io.FileWriter;
 
   8 import java.io.IOException;
 
   9 import java.io.InputStream;
 
  10 import java.io.InputStreamReader;
 
  11 import java.util.Iterator;
 
  13 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
 
  14 import net.sourceforge.phpeclipse.wiki.preferences.Util;
 
  15 import net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer;
 
  16 import net.sourceforge.phpeclipse.wiki.renderer.RendererFactory;
 
  18 import org.eclipse.core.resources.IFile;
 
  19 import org.eclipse.core.resources.IResource;
 
  20 import org.eclipse.core.runtime.CoreException;
 
  21 import org.eclipse.jface.action.IAction;
 
  22 import org.eclipse.jface.viewers.ISelection;
 
  23 import org.eclipse.jface.viewers.ISelectionProvider;
 
  24 import org.eclipse.jface.viewers.StructuredSelection;
 
  25 import org.eclipse.ui.IActionDelegate;
 
  26 import org.eclipse.ui.IObjectActionDelegate;
 
  27 import org.eclipse.ui.IWorkbenchPart;
 
  30  * Create a static HTML page
 
  32 public class CreatePageAction implements IObjectActionDelegate {
 
  34    * Constant for an empty char array
 
  36   public static final char[] NO_CHAR = new char[0];
 
  38   private static final int DEFAULT_READING_SIZE = 8192;
 
  40   private IWorkbenchPart workbenchPart;
 
  45   public CreatePageAction() {
 
  50    * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
 
  52   public void setActivePart(IAction action, IWorkbenchPart targetPart) {
 
  53     workbenchPart = targetPart;
 
  56   public void run(IAction action) {
 
  57     ISelectionProvider selectionProvider = null;
 
  58     selectionProvider = workbenchPart.getSite().getSelectionProvider();
 
  60     StructuredSelection selection = null;
 
  61     selection = (StructuredSelection) selectionProvider.getSelection();
 
  64     Iterator iterator = null;
 
  65     iterator = selection.iterator();
 
  66     while (iterator.hasNext()) {
 
  67       //  obj => selected object in the view
 
  68       Object obj = iterator.next();
 
  71       if (obj instanceof IResource) {
 
  72         IResource resource = (IResource) obj;
 
  74         // check if it's a file resource
 
  75         switch (resource.getType()) {
 
  78           createPage((IFile) resource);
 
  85    * @see IActionDelegate#selectionChanged(IAction, ISelection)
 
  87   public void selectionChanged(IAction action, ISelection selection) {
 
  90   public static void createPage(IFile file) {
 
  91     String templateFileName = Util.getLocalTemplate(file);
 
  92     String cssUrl = Util.getLocalCssUrl(file);
 
  93     String srcBasePath = Util.getWikiTextsPath(file);
 
  94     String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH);
 
  95     createPage(templateFileName, file, binBasePath, srcBasePath);
 
  98   public static void createPage(String templateFileName, IFile file, String binBasepath, String srcBasePath) {
 
  99     //          only interested in files with the "wp" extension
 
 100     if ("wp".equalsIgnoreCase(file.getFileExtension())) {
 
 102         IContentRenderer renderer = RendererFactory.createContentRenderer(file.getProject());
 
 103         convertWikiFile(templateFileName, file, binBasepath, srcBasePath, renderer);
 
 104       } catch (InstantiationException e) {
 
 105         // TODO Auto-generated catch block
 
 107       } catch (IllegalAccessException e) {
 
 108         // TODO Auto-generated catch block
 
 110       } catch (ClassNotFoundException e) {
 
 111         // TODO Auto-generated catch block
 
 113       } catch (CoreException e1) {
 
 114         // TODO Auto-generated catch block
 
 115         e1.printStackTrace();
 
 116       } catch (Exception e) {
 
 117         // TODO Auto-generated catch block 
 
 121       String fname = file.getName().toLowerCase();
 
 122       if ((fname.charAt(0) == '.') || "project.index".equals(fname) || "cvs".equals(fname) || "entries".equals(fname)
 
 123           || "repository".equals(fname) || "root".equals(fname)) {
 
 124         // ignore meta information
 
 128       FileOutputStream output = null;
 
 129       InputStream contentStream = null;
 
 132         String filename = Util.getHTMLFileName(file, binBasepath, srcBasePath);
 
 133         if (filename != null) {
 
 134           int index = filename.lastIndexOf('/');
 
 136             File ioFile = new File(filename.substring(0, index));
 
 137             if (!ioFile.isDirectory()) {
 
 141           output = new FileOutputStream(filename);
 
 143           contentStream = file.getContents(false);
 
 144           int chunkSize = contentStream.available();
 
 145           byte[] readBuffer = new byte[chunkSize];
 
 146           int n = contentStream.read(readBuffer);
 
 149             output.write(readBuffer);
 
 150             n = contentStream.read(readBuffer);
 
 153       } catch (Exception e) {
 
 159           if (contentStream != null)
 
 160             contentStream.close();
 
 161         } catch (IOException e1) {
 
 167   public static void convertWikiFile(String templateFileName, IFile file, String binBasePath, String srcBasePath, IContentRenderer renderer)
 
 168       throws CoreException {
 
 169     StringBuffer htmlBuffer = new StringBuffer();
 
 170     convertWikiBuffer(templateFileName, htmlBuffer, file, renderer, true);
 
 171     String htmlName = Util.getHTMLFileName(file, binBasePath, srcBasePath);
 
 172     if (htmlName != null) {
 
 173       writeHTMLFile(htmlBuffer, htmlName);
 
 177   public static void getWikiBuffer(StringBuffer htmlBuffer, IFile file) throws CoreException {
 
 178     BufferedInputStream stream = new BufferedInputStream(file.getContents());
 
 180       htmlBuffer.append(getInputStreamAsCharArray(stream, -1, null));
 
 182       //new String(getInputStreamAsCharArray(stream, -1, null));
 
 183     } catch (IOException e) {
 
 187         if (stream != null) {
 
 190       } catch (IOException e) {
 
 196   public static void convertWikiBuffer(String templateFileName, StringBuffer htmlBuffer, IFile file, IContentRenderer renderer, boolean completeHTML)
 
 197       throws CoreException {
 
 198     BufferedInputStream stream = new BufferedInputStream(file.getContents());
 
 200       String content = new String(getInputStreamAsCharArray(stream, -1, null));
 
 201       String srcPath = Util.getWikiTextsPath(file);
 
 202       String filePath = file.getLocation().toString(); // file.getProjectRelativePath().toString()
 
 203       if (filePath.startsWith(srcPath)) {
 
 204         filePath = filePath.substring(srcPath.length()+1);
 
 206       createWikiBuffer(templateFileName, htmlBuffer, filePath, content, renderer, completeHTML);
 
 207     } catch (IOException e) {
 
 211         if (stream != null) {
 
 214       } catch (IOException e) {
 
 225   public static void createWikiBuffer(String templateFileName, StringBuffer htmlBuffer, String fileName, String content, IContentRenderer renderer,
 
 226       boolean completeHTML) {
 
 227     // calculate the <i>depth</i> of the file (i.e. ../../../ as much as needed)
 
 231       index = fileName.indexOf('/', index);
 
 237     renderer.render(templateFileName, content, htmlBuffer, level, completeHTML);
 
 240   public static void writeHTMLFile(StringBuffer buffer, String filename) {
 
 241     int index = filename.lastIndexOf('/');
 
 243       File file = new File(filename.substring(0, index));
 
 244       if (!file.isDirectory()) {
 
 248     FileWriter fileWriter;
 
 250       fileWriter = new FileWriter(filename);
 
 251       fileWriter.write(buffer.toString());
 
 253     } catch (FileNotFoundException e) {
 
 254       // ignore exception; project is deleted by fUser
 
 255     } catch (IOException e) {
 
 256       // TODO Auto-generated catch block
 
 262    * Returns the given input stream's contents as a character array. If a length is specified (ie. if length != -1), only length
 
 263    * chars are returned. Otherwise all chars in the stream are returned. Note this doesn't close the stream.
 
 265    * @throws IOException
 
 266    *           if a problem occured reading the stream.
 
 268   public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding) throws IOException {
 
 269     InputStreamReader reader = null;
 
 270     reader = encoding == null ? new InputStreamReader(stream) : new InputStreamReader(stream, encoding);
 
 274       int contentsLength = 0;
 
 277         int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE); // read at least 8K
 
 279         // resize contents if needed
 
 280         if (contentsLength + amountRequested > contents.length) {
 
 281           System.arraycopy(contents, 0, contents = new char[contentsLength + amountRequested], 0, contentsLength);
 
 284         // read as many chars as possible
 
 285         amountRead = reader.read(contents, contentsLength, amountRequested);
 
 287         if (amountRead > 0) {
 
 288           // remember length of contents
 
 289           contentsLength += amountRead;
 
 291       } while (amountRead != -1);
 
 293       // resize contents if necessary
 
 294       if (contentsLength < contents.length) {
 
 295         System.arraycopy(contents, 0, contents = new char[contentsLength], 0, contentsLength);
 
 298       contents = new char[length];
 
 301       while ((readSize != -1) && (len != length)) {
 
 303         // We record first the read size. In this case len is the actual
 
 306         readSize = reader.read(contents, len, length - len);
 
 309       // Now we need to resize in case the default encoding used more than
 
 313         System.arraycopy(contents, 0, (contents = new char[len]), 0, len);