aboutsummaryrefslogtreecommitdiffstats
path: root/tools/src/SitemapTool.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/SitemapTool.java')
-rw-r--r--tools/src/SitemapTool.java363
1 files changed, 363 insertions, 0 deletions
diff --git a/tools/src/SitemapTool.java b/tools/src/SitemapTool.java
new file mode 100644
index 0000000000..23a5f7caca
--- /dev/null
+++ b/tools/src/SitemapTool.java
@@ -0,0 +1,363 @@
+
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2002 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache POI" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache POI", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import java.io.*;
+
+import java.util.*;
+
+import org.apache.tools.ant.*;
+import org.apache.tools.ant.taskdefs.*;
+import org.apache.tools.ant.types.*;
+
+/**
+ * Add components to the sitemap
+ *
+ * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
+ * @version CVS $Revision$ $Date$
+ */
+
+public final class SitemapTool
+ extends Task
+{
+ private String sitemap;
+ private String directory;
+ private String extension;
+
+ public void setSitemap(String sitemap)
+ {
+ this.sitemap = sitemap;
+ }
+
+ public void setDirectory(String directory)
+ {
+ this.directory = directory;
+ }
+
+ public void setExtension(String extension)
+ {
+ this.extension = extension;
+ }
+
+ public void execute()
+ throws BuildException
+ {
+ if (this.sitemap == null)
+ {
+ throw new BuildException("sitemap attribute is required",
+ location);
+ }
+ if (this.extension == null)
+ {
+ throw new BuildException("extension attribute is required",
+ location);
+ }
+ if (this.directory == null)
+ {
+ throw new BuildException("directory attribute is required",
+ location);
+ }
+ try
+ {
+
+ // process recursive
+ this.process(new File(this.directory), this.extension,
+ this.sitemap);
+ }
+ catch (IOException ioe)
+ {
+ throw new BuildException("IOException: " + ioe);
+ }
+ }
+
+ /**
+ * Scan recursive
+ */
+
+ private void process(final File directoryFile, final String ext,
+ final String sitemapLocation)
+ throws IOException, BuildException
+ {
+ final File[] files = directoryFile.listFiles();
+
+ for (int i = 0; i < files.length; i++)
+ {
+ if (files[ i ].isDirectory() == true)
+ {
+ this.process(files[ i ], ext, sitemapLocation);
+ }
+ else
+ {
+ if (files[ i ].getName().endsWith("." + ext) == true)
+ {
+ System.out.println("Reading: "
+ + files[ i ].getAbsolutePath());
+ final String data =
+ this.load(files[ i ].getAbsolutePath());
+
+ // separate the data by lines
+ final StringTokenizer st = new StringTokenizer(data);
+
+ while (st.hasMoreElements() == true)
+ {
+
+ // now get the properties of a line. These are separated by a "|"
+ final String line =
+ ( String ) st.nextElement();
+ final StringTokenizer prop =
+ new StringTokenizer(line, "|");
+ String category = null;
+ String componentName = null;
+ String className = null;
+ String configuration = null;
+ String label = null;
+ String mimeType = null;
+
+ while (prop.hasMoreElements() == true)
+ {
+ final String property =
+ ( String ) prop.nextElement();
+ final int pos = property.indexOf(":");
+ final String propName =
+ property.substring(0, pos);
+ final String propVal = property.substring(pos
+ + 1);
+
+ if (propName.equals("category"))
+ {
+ category = propVal;
+ }
+ else if (propName.equals("componentName"))
+ {
+ componentName = propVal;
+ }
+ else if (propName.equals("componentClass"))
+ {
+ className = propVal;
+ }
+ else if (propName.equals("configuration"))
+ {
+ configuration = propVal;
+ }
+ else if (propName.equals("label"))
+ {
+ label = propVal;
+ }
+ else if (propName.equals("mimeType"))
+ {
+ mimeType = propVal;
+ }
+ else
+ {
+ throw new BuildException(
+ "Unknown property " + propName
+ + " in file "
+ + files[ i ].getAbsolutePath());
+ }
+ }
+
+ // Test for required values
+ if (category == null)
+ {
+ throw new BuildException(
+ "category property is required in file "
+ + files[ i ].getAbsolutePath(), location);
+ }
+ if (componentName == null)
+ {
+ throw new BuildException(
+ "componentName property is required in file "
+ + files[ i ].getAbsolutePath(), location);
+ }
+ if (className == null)
+ {
+ throw new BuildException(
+ "componentClass property is required in file "
+ + files[ i ].getAbsolutePath(), location);
+ }
+ this.add(sitemapLocation, category, componentName,
+ className, configuration, label, mimeType);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Add entry to sitemap
+ */
+
+ private void add(final String sitemapLocation, final String category,
+ final String componentName, final String className,
+ final String configuration, final String label,
+ final String mimeType)
+ throws IOException
+ {
+ final String data = load(sitemapLocation);
+ final String searchString =
+ new StringBuffer("</map:").append(category).append(">")
+ .toString();
+ final int pos = data.indexOf(searchString);
+ int categoryStartPos =
+ data
+ .indexOf(new StringBuffer("<map:").append(category).append(">")
+ .toString());
+
+ if (categoryStartPos == -1)
+ {
+ categoryStartPos =
+ data
+ .indexOf(new StringBuffer("<map:").append(category)
+ .append(" ").toString());
+ }
+ if ((categoryStartPos != -1) && (categoryStartPos < pos)
+ && (pos != -1))
+ {
+
+ // the category exists, now search if a component
+ // with the name already exists
+ int componentPos =
+ data.substring(categoryStartPos, pos)
+ .indexOf(new StringBuffer("name=\"").append(componentName)
+ .append("\"").toString());
+
+ if (componentPos == -1)
+ {
+ StringBuffer buffer =
+ new StringBuffer(data.substring(0, pos)).append("<map:")
+ .append(category.substring(0, category.length() - 1))
+ .append(" name=\"").append(componentName)
+ .append("\" src=\"").append(className).append("\"")
+ .append(" logger=\"sitemap.")
+ .append(category.substring(0, category.length() - 1))
+ .append('.').append(componentName).append('\"');
+
+ if ((null != mimeType) && (mimeType.length() > 0))
+ {
+ buffer.append(" mime-type=\"").append(mimeType)
+ .append("\"");
+ }
+ if ((null != label) && (label.length() > 0))
+ {
+ buffer.append(" label=\"").append(label).append("\"");
+ }
+ if (null != configuration)
+ {
+ buffer.append(">\n").append(configuration).append("\n")
+ .append("</map:")
+ .append(category.substring(0, category.length() - 1))
+ .append(">\n");
+ }
+ else
+ {
+ buffer.append("/>\n");
+ }
+ buffer.append(data.substring(pos)).toString();
+ this.save(sitemapLocation, buffer.toString());
+ }
+ }
+ }
+
+ /**
+ * Load a file and return the content as a string.
+ */
+
+ public String load(String filename)
+ throws IOException
+ {
+ FileInputStream fis;
+
+ fis = new FileInputStream(filename);
+ int available;
+ byte[] data = null;
+ byte[] tempData;
+ byte[] copyData;
+
+ do
+ {
+ available = 1024;
+ tempData = new byte[ available ];
+ available = fis.read(tempData, 0, available);
+ if (available > 0)
+ {
+ copyData = new byte[ ((data == null) ? 0
+ : data.length) + available ];
+ if (data != null)
+ {
+ System.arraycopy(data, 0, copyData, 0, data.length);
+ }
+ System.arraycopy(tempData, 0, copyData, ((data == null) ? 0
+ : data.length), available);
+ data = copyData;
+ }
+ }
+ while (available > 0);
+ fis.close();
+ return ((data != null) ? new String(data)
+ : "");
+ }
+
+ /**
+ * Save the string to a file
+ */
+
+ public void save(String filename, String data)
+ throws IOException
+ {
+ FileWriter fw = new FileWriter(filename);
+
+ fw.write(data);
+ fw.close();
+ }
+}