You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by to...@apache.org on 2010/09/27 17:31:46 UTC

svn commit: r1001780 - in /incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator: ./ src/main/java/org/apache/clerezza/uima/metadatagenerator/ src/main/java/org/apache/clerezza/uima/met...

Author: tommaso
Date: Mon Sep 27 15:31:45 2010
New Revision: 1001780

URL: http://svn.apache.org/viewvc?rev=1001780&view=rev
Log:
[CLEREZZA-182] - integrated Apache Tika as MediaTypeTextExtractor implementation, applied patch from Davide Palmisano

Added:
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractor.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractorTest.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractorTest.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/clerezza-homepage.html
Modified:
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/pom.xml
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/UIMABaseMetadataGenerator.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/MediaTypeTextExtractor.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractor.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/UnsupportedMediaTypeException.java

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/pom.xml?rev=1001780&r1=1001779&r2=1001780&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/pom.xml (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/pom.xml Mon Sep 27 15:31:45 2010
@@ -53,6 +53,18 @@
       <artifactId>org.apache.clerezza.jaxrs.testutils</artifactId>
       <scope>test</scope>
     </dependency>
+    <!-- BEGIN: Tika -->
+    <dependency>
+        <groupId>org.apache.tika</groupId>
+        <artifactId>tika-core</artifactId>
+        <version>0.7</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.tika</groupId>
+        <artifactId>tika-parsers</artifactId>
+        <version>0.7</version>
+    </dependency>
+    <!-- END: Tika -->
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimaj-ep-runtime</artifactId>
@@ -92,4 +104,4 @@
       </plugin>
     </plugins>
   </build>
-</project>
\ No newline at end of file
+</project>

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/UIMABaseMetadataGenerator.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/UIMABaseMetadataGenerator.java?rev=1001780&r1=1001779&r2=1001780&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/UIMABaseMetadataGenerator.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/UIMABaseMetadataGenerator.java Mon Sep 27 15:31:45 2010
@@ -50,7 +50,6 @@ public class UIMABaseMetadataGenerator i
     this.textExtractors = new TreeSet<MediaTypeTextExtractor>();
   }
 
-  @Override
   public void generate(GraphNode node, byte[] data, MediaType mediaType) {
     if (textExtractors.isEmpty()) {
       initializeExtractors();

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/MediaTypeTextExtractor.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/MediaTypeTextExtractor.java?rev=1001780&r1=1001779&r2=1001780&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/MediaTypeTextExtractor.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/MediaTypeTextExtractor.java Mon Sep 27 15:31:45 2010
@@ -3,12 +3,25 @@ package org.apache.clerezza.uima.metadat
 import javax.ws.rs.core.MediaType;
 
 /**
- * A MediaTypeTextExtractor should extract text from a (list of) specified {@link javax.ws.rs.core.MediaType}
+ * A MediaTypeTextExtractor extracts text from a (list of) specified {@link javax.ws.rs.core.MediaType}.
  */
 public interface MediaTypeTextExtractor {
 
+  /**
+   * Check if the provided {@link javax.ws.rs.core.MediaType} is supported by this extractor.
+   * 
+   * @param mediaType to be checked.
+   * @return <code>true</code> if the provided {@link javax.ws.rs.core.MediaType} as input is supported.
+   */
   public boolean supports(MediaType mediaType);
 
+  /**
+   * Extract the text from the provided input if its <i>Media Type</i> is supported.
+   *
+   * @param bytes an array of <code>byte</code> representing the input.
+   * @return a {@link String} with the extracted text.
+   * @throws UnsupportedMediaTypeException if the input implicit <i>Media type</i> is not supported.
+   */
   public String extract(byte[] bytes)  throws UnsupportedMediaTypeException;
 
 }

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractor.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractor.java?rev=1001780&r1=1001779&r2=1001780&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractor.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractor.java Mon Sep 27 15:31:45 2010
@@ -6,13 +6,18 @@ import javax.ws.rs.core.MediaType;
  * Base implementation of {@link javax.ws.rs.core.MediaType}
  */
 public class PlainTextExtractor implements MediaTypeTextExtractor {
-  @Override
+
+  /**
+   * {@inheritDoc}
+   */
   public boolean supports(MediaType mediaType) {
     return mediaType != null && mediaType.getType().equals(MediaType.TEXT_PLAIN_TYPE.getType()) &&
             mediaType.getSubtype().equals(MediaType.TEXT_PLAIN_TYPE.getSubtype());
   }
 
-  @Override
+  /**
+   * {@inheritDoc}
+   */
   public String extract(byte[] bytes) throws UnsupportedMediaTypeException {
     return new String(bytes);
   }

Added: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractor.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractor.java?rev=1001780&view=auto
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractor.java (added)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractor.java Mon Sep 27 15:31:45 2010
@@ -0,0 +1,117 @@
+package org.apache.clerezza.uima.metadatagenerator.mediatype;
+
+import org.apache.tika.Tika;
+import org.apache.tika.config.TikaConfig;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MimeTypes;
+
+import javax.ws.rs.core.MediaType;
+import java.io.*;
+
+/**
+ * An implementation based on <a href="http://tika.apache.org">Apache Tika</a>.
+ *
+ * @author Davide Palmisano
+ */
+public class TikaTextExtractor implements MediaTypeTextExtractor {
+
+  private Tika tika;
+
+  private TikaConfig config;
+
+  private MimeTypes types;
+
+  /**
+   * Construct an instance using the default {@link org.apache.tika.Tika} configuration.
+   */
+  public TikaTextExtractor() {
+    try {
+      config = TikaConfig.getDefaultConfig();
+    } catch (Exception e) {
+      throw new RuntimeException("Error while loading Tika configuration.", e);
+    }
+    types = config.getMimeRepository();
+    tika = new Tika(config);
+  }
+
+  /**
+   * Construct an instance using a custom <i>tika-config.xml</i> configuration file.
+   *
+   * @param tikaConfigPath the path to the <i>tika-config.xml</i> configuration file.
+   */
+  public TikaTextExtractor(String tikaConfigPath) {
+    InputStream inputStream = getResourceAsStream(tikaConfigPath);
+    try {
+      config = new TikaConfig(inputStream);
+      inputStream.close();
+    } catch (Exception e) {
+      throw new RuntimeException("Error while loading Tika configuration.", e);
+    }
+    types = config.getMimeRepository();
+    tika = new Tika(config);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean supports(MediaType mediaType) {
+    return this.types.getMimeType(mediaType.getType()) != null;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public String extract(byte[] bytes) throws UnsupportedMediaTypeException {
+    InputStream inputStream = new ByteArrayInputStream(bytes);
+    String mimeType = null;
+    try {
+      mimeType = this.tika.detect(inputStream);
+    } catch (IOException e) {
+      throw new RuntimeException("Error while detecting mime type", e);
+    }
+    if (this.types.getMimeType(mimeType) == null) {
+      throw new UnsupportedMediaTypeException(
+              String.format("[%s] mime type is not supported", mimeType)
+      );
+    }
+    Metadata metadata = new Metadata();
+    metadata.set(Metadata.CONTENT_TYPE, mimeType);
+    Reader reader = null;
+    try {
+      reader = this.tika.parse(inputStream, metadata);
+    } catch (IOException e) {
+      throw new RuntimeException("Error while parsing the provided input");
+    }
+    BufferedReader in
+            = new BufferedReader(reader);
+    String line;
+    String result = null;
+    try {
+      line = in.readLine();
+      while (line != null) {
+        result = line;
+        line = in.readLine();
+      }
+    } catch (IOException e) {
+      throw new RuntimeException("Error while parsing the provided input");
+    }
+    return result;
+  }
+
+  /**
+   * Loads the <code>Tika</code> configuration file.
+   *
+   * @return the input stream containing the configuration.
+   */
+  private InputStream getResourceAsStream(String tikaConfigFile) {
+    InputStream result;
+    result = TikaTextExtractor.class.getResourceAsStream(tikaConfigFile);
+    if (result == null) {
+      result = TikaTextExtractor.class.getClassLoader().getResourceAsStream(tikaConfigFile);
+      if (result == null) {
+        result = ClassLoader.getSystemResourceAsStream(tikaConfigFile);
+      }
+    }
+    return result;
+  }
+}

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/UnsupportedMediaTypeException.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/UnsupportedMediaTypeException.java?rev=1001780&r1=1001779&r2=1001780&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/UnsupportedMediaTypeException.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/main/java/org/apache/clerezza/uima/metadatagenerator/mediatype/UnsupportedMediaTypeException.java Mon Sep 27 15:31:45 2010
@@ -8,6 +8,14 @@ import javax.ws.rs.core.MediaType;
 public class UnsupportedMediaTypeException extends Exception {
   private static final String UNSUPPORTED = " is not supported";
 
+  public UnsupportedMediaTypeException(String message) {
+      super(message);
+  }
+
+  public UnsupportedMediaTypeException(String message, Exception e) {
+      super(message, e);
+  }
+
   public UnsupportedMediaTypeException(MediaType mediaType) {
     super(new StringBuilder(mediaType.getType()).append(UNSUPPORTED).toString());
   }

Added: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractorTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractorTest.java?rev=1001780&view=auto
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractorTest.java (added)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/PlainTextExtractorTest.java Mon Sep 27 15:31:45 2010
@@ -0,0 +1,22 @@
+package org.apache.clerezza.uima.metadatagenerator.mediatype;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Reference test case for {@link org.apache.clerezza.uima.metadatagenerator.mediatype.PlainTextExtractor} class.
+ *
+ * @author Davide Palmisano
+ */
+public class PlainTextExtractorTest {
+
+  @Test
+  public void testExtract() throws UnsupportedMediaTypeException {
+    final String TEXT = "just a simple test string";
+    MediaTypeTextExtractor extractor = new PlainTextExtractor();
+    String extracted = extractor.extract(TEXT.getBytes());
+    Assert.assertNotNull(extracted);
+    Assert.assertEquals(extracted, TEXT);
+  }
+
+}

Added: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractorTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractorTest.java?rev=1001780&view=auto
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractorTest.java (added)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/java/org/apache/clerezza/uima/metadatagenerator/mediatype/TikaTextExtractorTest.java Mon Sep 27 15:31:45 2010
@@ -0,0 +1,60 @@
+package org.apache.clerezza.uima.metadatagenerator.mediatype;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+
+/**
+ * Reference test for {@link org.apache.clerezza.uima.metadatagenerator.mediatype.TikaTextExtractor} class.
+ *
+ * @author Davide Palmisano
+ */
+public class TikaTextExtractorTest {
+
+  private TikaTextExtractor tikaTextExtractor;
+
+  @Before
+  public void setUp() {
+    this.tikaTextExtractor = new TikaTextExtractor();
+  }
+
+  @After
+  public void tearDown() {
+    this.tikaTextExtractor = null;
+  }
+
+  @Test
+  public void testExtract() throws UnsupportedMediaTypeException, IOException {
+    InputStream inputStream = TikaTextExtractorTest.class.getResourceAsStream("clerezza-homepage.html");
+    byte[] bytes = new byte[inputStream.available()];
+    inputStream.read(bytes);
+    String extracted = this.tikaTextExtractor.extract(bytes);
+    Assert.assertNotNull(extracted);
+    Assert.assertTrue(extracted.length() > 0);
+  }
+
+  /**
+   * Tests the if all the {@link javax.ws.rs.core.MediaType}s already defined could be recognized.
+   *
+   * @throws UnsupportedMediaTypeException
+   * @throws IllegalAccessException
+   */
+  @Test
+  public void testSupports() throws UnsupportedMediaTypeException, IllegalAccessException {
+    Class mediaTypeClass = MediaType.class;
+    for (Field field : mediaTypeClass.getFields()) {
+      if (field.getType().equals(MediaType.class)) {
+        MediaType objectInstance = new MediaType();
+        MediaType value = (MediaType) field.get(objectInstance);
+        Assert.assertTrue(tikaTextExtractor.supports(value));
+      }
+    }
+  }
+
+}

Added: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/clerezza-homepage.html
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/clerezza-homepage.html?rev=1001780&view=auto
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/clerezza-homepage.html (added)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.uima/org.apache.clerezza.uima.metadata-generator/src/test/resources/org/apache/clerezza/uima/metadatagenerator/mediatype/clerezza-homepage.html Mon Sep 27 15:31:45 2010
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en">
+	
+		
+			<head>
+				<link type="text/css" href="/clerezza/style/style.css" rel="stylesheet" />
+				<title>Welcome to Apache Clerezza</title>
+			</head>
+		
+	
+		
+	
+	<body>
+		<h1>Welcome to Apache Clerezza</h1>
+<div class='tx-content'>
+
+	<div>ApachClerezza is an OSGi-based modular application and set of components (bundles) for building RESTFul Semantic Web applications and services.<br xmlns="http://www.w3.org/1999/xhtml"></br></div>
+
+	<div><h2>Features</h2>
+<div class='tx-content'>
+
+	<div>Apache Clerezza allows to easily develop semantic web application by providing the following:<ul xmlns="http://www.w3.org/1999/xhtml"><li>An API to access RDF Graphs</li><li>A Jax RS implementation</li><li>TypeHandlers: Jax-RS resources bound to an RDF type</li><li>Renderlets to create various represenattions from RDF resources, ScalaServerPages allow to easily write renderlets in Scala</li></ul></div>
+
+</div>
+</div>
+
+	<div><h2>Documentation</h2>
+<div class='tx-content'>
+
+	<div><div xmlns="http://www.w3.org/1999/xhtml">Clerezza documentation is available on every clerezza instance for the active bundles at http://host:port/documentation, a copy is also available on this server: <a href="/clerezza/documentation">documentation</a></div>
+<div xmlns="http://www.w3.org/1999/xhtml">Maven generated site: <a href="http://incubator.apache.org/clerezza/mvn-site">http://incubator.apache.org/clerezza/mvn-site/</a></div>
+</div>
+
+</div>
+</div>
+
+	<div><h2>Resources</h2>
+<div class='tx-content'>
+
+	<div><div xmlns="http://www.w3.org/1999/xhtml">
+Subversion:  <a href="http://svn.apache.org/repos/asf/incubator/clerezza/">http://svn.apache.org/repos/asf/incubator/clerezza/</a></div>
+<div xmlns="http://www.w3.org/1999/xhtml">Clerezza proposal: <a href="http://wiki.apache.org/incubator/ClerezzaProposal">http://wiki.apache.org/incubator/ClerezzaProposal</a></div>
+<div xmlns="http://www.w3.org/1999/xhtml">Status page: <a href="http://incubator.apache.org/projects/clerezza.html">http://incubator.apache.org/projects/clerezza.html</a></div></div>
+
+</div>
+</div>
+
+	<div><img xmlns="http://www.w3.org/1999/xhtml" src="/clerezza/images/sw-horz-w3c.png"></img></div>
+
+</div>
+
+	</body>
+</html>