You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by cu...@apache.org on 2006/06/07 23:56:29 UTC

svn commit: r412574 [1/4] - in /lucene/java/trunk: ./ contrib/gdata-server/ contrib/gdata-server/lib/ contrib/gdata-server/src/ contrib/gdata-server/src/java/ contrib/gdata-server/src/java/org/ contrib/gdata-server/src/java/org/apache/ contrib/gdata-se...

Author: cutting
Date: Wed Jun  7 14:56:25 2006
New Revision: 412574

URL: http://svn.apache.org/viewvc?rev=412574&view=rev
Log:
LUCENE-578.  First version of gdata-server.  Contributed by Simon Willnauer.

Added:
    lucene/java/trunk/contrib/gdata-server/
    lucene/java/trunk/contrib/gdata-server/build.xml
    lucene/java/trunk/contrib/gdata-server/lib/
    lucene/java/trunk/contrib/gdata-server/lib/commons-logging-1.1.jar   (with props)
    lucene/java/trunk/contrib/gdata-server/lib/easymock.jar   (with props)
    lucene/java/trunk/contrib/gdata-server/lib/gdata-client-1.0.jar   (with props)
    lucene/java/trunk/contrib/gdata-server/lib/log4j-1.2.13.jar   (with props)
    lucene/java/trunk/contrib/gdata-server/lib/servlet-api.jar   (with props)
    lucene/java/trunk/contrib/gdata-server/src/
    lucene/java/trunk/contrib/gdata-server/src/java/
    lucene/java/trunk/contrib/gdata-server/src/java/lucenestorage.properties.xml
    lucene/java/trunk/contrib/gdata-server/src/java/org/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/FeedNotFoundException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataEntityBuilder.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequest.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequestException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataResponse.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataService.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/Service.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceFactory.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/DataBuilderException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/FeedInstanceConfigurator.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/GDataServerRegistry.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryBuilder.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryContextListener.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/AbstractGdataServlet.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/RequestControllerServlet.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/AbstractGdataRequestHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/DefaultDeleteHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/DefaultGetHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/DefaultInsertHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/DefaultRequestHandlerFactory.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/DefaultUpdateHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/GDataRequestHandler.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/GDataRequestHandlerException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/RequestHandlerFactory.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/handler/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/servlet/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/IDGenerator.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/Storage.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/StorageController.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/StorageException.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/StorageFactory.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/ModifiedEntryFilter.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageBuffer.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageCoreController.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageEntryWrapper.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageImplementation.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageModifier.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/StorageQuery.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/configuration/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/configuration/StorageConfigurator.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/configuration/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/util/
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/util/ReferenceCounter.java
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/lucenestorage/util/package.html
    lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/storage/package.html
    lucene/java/trunk/contrib/gdata-server/src/test/
    lucene/java/trunk/contrib/gdata-server/src/test/org/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/TestGDataRequest.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/TestGDataResponse.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/registry/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/registry/TestEntityBuilderIncomingEntry.xml
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/registry/TestEntityBuilderIncomingFeed.xml
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/registry/TestFeedRegistry.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/server/registry/TestGDataEntityBuilder.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/servlet/TestAbstractGdataServlet.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/TestIDGenerator.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/TestModifiedEntryFilter.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/TestStorageModifier.java
    lucene/java/trunk/contrib/gdata-server/src/test/org/apache/lucene/gdata/storage/lucenestorage/TestStorageQuery.java
    lucene/java/trunk/contrib/gdata-server/webroot/
    lucene/java/trunk/contrib/gdata-server/webroot/WEB-INF/
    lucene/java/trunk/contrib/gdata-server/webroot/WEB-INF/classes/
    lucene/java/trunk/contrib/gdata-server/webroot/WEB-INF/classes/lucenestorage.properties.xml
    lucene/java/trunk/contrib/gdata-server/webroot/WEB-INF/web.xml
Modified:
    lucene/java/trunk/build.xml

Modified: lucene/java/trunk/build.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/build.xml?rev=412574&r1=412573&r2=412574&view=diff
==============================================================================
--- lucene/java/trunk/build.xml (original)
+++ lucene/java/trunk/build.xml Wed Jun  7 14:56:25 2006
@@ -379,6 +379,7 @@
         <packageset dir="contrib/surround/src/java"/>
         <packageset dir="contrib/swing/src/java"/>
         <packageset dir="contrib/wordnet/src/java"/>
+    <packageset dir="contrib/gdata-server/src/java"/> 
 
         <group title="Core" packages="org.apache.*:org.apache.lucene.analysis:org.apache.lucene.analysis.standard*"/>
 

Added: lucene/java/trunk/contrib/gdata-server/build.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/build.xml?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/build.xml (added)
+++ lucene/java/trunk/contrib/gdata-server/build.xml Wed Jun  7 14:56:25 2006
@@ -0,0 +1,50 @@
+<?xml version="1.0"?> 
+ 
+<project name="gdata-server" default="default"> 
+ 
+    <description> 
+    Serverside Google Data API implementation 
+  </description> 
+     
+    <property name="gdata.war.name" value="gdata-server"/> 
+    <property name="gdata.lib.dir" value="lib"/> 
+     
+    <path id="additional.dependencies"> 
+        <pathelement location="lib/servlet-api.jar" /> 
+        <!-- easymock version 1.2 for java 1.3 --> 
+        <pathelement location="lib/easymock.jar" /> 
+        <pathelement location="lib/gdata-client-1.0.jar" /> 
+        <pathelement location="lib/commons-logging-1.1.jar" /> 
+        <pathelement location="lib/commons-jxpath-1.2.jar" /> 
+        <pathelement location="lib/je.jar" /> 
+         
+         
+    </path> 
+     
+ 
+    <pathconvert property="project.classpath" targetos="unix" refid="additional.dependencies" /> 
+ 
+       <property name="javac.source" value="1.5"/> 
+       <property name="javac.target" value="1.5"/> 
+    <import file="../contrib-build.xml" /> 
+ 
+    <target name="prepare-dist" depends="jar-core"> 
+        <echo>Prepare dist directory</echo> 
+        <delete dir="${dist.dir}"/> 
+        <mkdir dir="${dist.dir}"/> 
+    </target> 
+     <target name="war-gdata" depends="prepare-dist"> 
+         <echo>Distributing GData War </echo> 
+        <war destfile="${dist.dir}/${gdata.war.name}.war" 
+             webxml="webroot/WEB-INF/web.xml"> 
+        <fileset dir="webroot" excludes="WEB-INF/web.xml"/> 
+ 
+            <lib dir="${gdata.lib.dir}" includes="commons-logging-1.1.jar"/> 
+            <lib dir="${gdata.lib.dir}" includes="gdata-client-1.0.jar"/> 
+ 
+        <lib dir="${build.dir}" includes="${final.name}.jar"/> 
+        <lib file="${lucene.jar}" /> 
+        </war> 
+      </target> 
+ 
+</project> 
\ No newline at end of file

Added: lucene/java/trunk/contrib/gdata-server/lib/commons-logging-1.1.jar
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/lib/commons-logging-1.1.jar?rev=412574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lucene/java/trunk/contrib/gdata-server/lib/commons-logging-1.1.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lucene/java/trunk/contrib/gdata-server/lib/easymock.jar
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/lib/easymock.jar?rev=412574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lucene/java/trunk/contrib/gdata-server/lib/easymock.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lucene/java/trunk/contrib/gdata-server/lib/gdata-client-1.0.jar
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/lib/gdata-client-1.0.jar?rev=412574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lucene/java/trunk/contrib/gdata-server/lib/gdata-client-1.0.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lucene/java/trunk/contrib/gdata-server/lib/log4j-1.2.13.jar
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/lib/log4j-1.2.13.jar?rev=412574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lucene/java/trunk/contrib/gdata-server/lib/log4j-1.2.13.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lucene/java/trunk/contrib/gdata-server/lib/servlet-api.jar
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/lib/servlet-api.jar?rev=412574&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lucene/java/trunk/contrib/gdata-server/lib/servlet-api.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lucene/java/trunk/contrib/gdata-server/src/java/lucenestorage.properties.xml
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/lucenestorage.properties.xml?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/lucenestorage.properties.xml (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/lucenestorage.properties.xml Wed Jun  7 14:56:25 2006
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
+<properties> 
+<comment>Lucene Storage Properties</comment> 
+<entry key="gdata.server.storage.lucene.buffersize">20</entry> 
+<entry key="gdata.server.storage.lucene.optimizeInterval">20</entry> 
+<entry key="gdata.server.storage.lucene.persistFactor">20</entry> 
+<entry key="gdata.server.storage.lucene.directory">/tmp/storage/</entry> 
+<entry key="gdata.server.storage.lucene.recover">true</entry> 
+<entry key="gdata.server.storage.lucene.recover.keepFiles">false</entry> 
+</properties> 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/package.html
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/package.html?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/package.html (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/data/package.html Wed Jun  7 14:56:25 2006
@@ -0,0 +1,10 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> 
+<html> 
+<head> 
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
+   <meta name="Author" content="Simon Willnauer"> 
+</head> 
+<body> 
+Contains classes for the internal representation of GData feeds and entries. 
+</body> 
+</html> 
\ No newline at end of file

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/package.html
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/package.html?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/package.html (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/package.html Wed Jun  7 14:56:25 2006
@@ -0,0 +1 @@
+<html><body>Top-level package.</body></html> 
\ No newline at end of file

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/FeedNotFoundException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/FeedNotFoundException.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/FeedNotFoundException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/FeedNotFoundException.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,52 @@
+package org.apache.lucene.gdata.server; 
+ 
+ 
+/** 
+ * Will be thrown if a requested feed could not be found or is not 
+ * registerd. 
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class FeedNotFoundException extends ServiceException { 
+ 
+    private static final long serialVersionUID = 1L; 
+ 
+    /** 
+     * Constructs a FeedNotFoundException 
+     */ 
+    public FeedNotFoundException() { 
+        super(); 
+ 
+    } 
+ 
+    /** 
+     * @param arg0 - 
+     *            message 
+     * @param arg1 - 
+     *            cause 
+     */ 
+    public FeedNotFoundException(String arg0, Throwable arg1) { 
+        super(arg0, arg1); 
+ 
+    } 
+ 
+    /** 
+     * @param arg0 - 
+     *            message 
+     */ 
+    public FeedNotFoundException(String arg0) { 
+        super(arg0); 
+ 
+    } 
+ 
+    /** 
+     * @param arg0 - 
+     *            cause 
+     */ 
+    public FeedNotFoundException(Throwable arg0) { 
+        super(arg0); 
+ 
+    } 
+ 
+} 
\ No newline at end of file

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataEntityBuilder.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataEntityBuilder.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataEntityBuilder.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataEntityBuilder.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,171 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server; 
+ 
+import java.io.IOException; 
+import java.io.Reader; 
+ 
+import org.apache.lucene.gdata.server.registry.DataBuilderException; 
+import org.apache.lucene.gdata.server.registry.FeedInstanceConfigurator; 
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry; 
+ 
+import com.google.gdata.data.BaseEntry; 
+import com.google.gdata.data.BaseFeed; 
+import com.google.gdata.data.ExtensionProfile; 
+import com.google.gdata.util.ParseException; 
+ 
+/** 
+ * {@link com.google.gdata.data.BaseFeed}, 
+ * {@link com.google.gdata.data.BaseEntry} instances have to be build from a 
+ * {@link java.io.Reader} instance as they come in from a client request or out 
+ * of a storage. 
+ * <p> 
+ * To provide a generic builder class the {@link GDataEntityBuilder} requests 
+ * the type of the feed / entry and the corresponding 
+ * {@link com.google.gdata.data.ExtensionProfile} form the global 
+ * {@link org.apache.lucene.gdata.server.registry.GDataServerRegistry} and builds the 
+ * instances from the provided reader. 
+ * </p> 
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class GDataEntityBuilder { 
+    private static final GDataServerRegistry REGISTRY = GDataServerRegistry.getRegistry(); // TODO find another way for getting the registered feeds 
+ 
+    /** 
+     * Builds a {@link BaseFeed} instance from the {@link Reader} provided by 
+     * the {@link GDataRequest} 
+     *  
+     * @param request - 
+     *            the request to build the instance from 
+     * @return - a BaseFeed instance 
+     * @throws FeedNotFoundException - 
+     *             if the feed is not registered 
+     * @throws IOException - 
+     *             if an I/O Exception occures on the provided reader 
+     * @throws ParseException - 
+     *             if the feed could not be parsed 
+     */ 
+    public static BaseFeed buildFeed(final GDataRequest request) 
+            throws FeedNotFoundException, IOException, ParseException { 
+        if (request == null) 
+            throw new IllegalArgumentException("request must not be null"); 
+        return buildFeed(request.getFeedId(), request.getReader(),request.getExtensionProfile()); 
+    } 
+ 
+    /** 
+     * Builds a {@link BaseFeed} from the provided {@link Reader} 
+     *  
+     * @param feedId - 
+     *            the feed ID to request the feed type from the registry 
+     * @param reader - 
+     *            the reader to build the feed from 
+     * @param profile - extension profile to parse the resource 
+     * @return - a BaseFeed instance 
+     * @throws FeedNotFoundException - 
+     *             if the feed is not registered 
+     * @throws IOException - 
+     *             if an I/O Exception occures on the provided reader 
+     * @throws ParseException - 
+     *             if the feed could not be parsed 
+     */ 
+    public static BaseFeed buildFeed(final String feedId, final Reader reader,final ExtensionProfile profile) 
+            throws FeedNotFoundException, ParseException, IOException { 
+ 
+        BaseFeed retVal = null; 
+        try { 
+            retVal = (BaseFeed) createEntityInstance(feedId); 
+        } catch (FeedNotFoundException e) { 
+            throw e; 
+        } catch (Exception e) { 
+            DataBuilderException ex = new DataBuilderException( 
+                    "Could not build Feed for Feed class ", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+        retVal.parseAtom(profile, reader); 
+ 
+        return retVal; 
+    } 
+ 
+    /** 
+     * Builds a {@link BaseEntry} instance from the {@link Reader} provided by 
+     * the {@link GDataRequest} 
+     *  
+     * @param request - 
+     *            the request to build the instance from 
+     * @return - a BaseEntry instance 
+     * @throws FeedNotFoundException - 
+     *             if the feed, requested by the client is not registered 
+     * @throws IOException - 
+     *             if an I/O Exception occures on the provided reader 
+     * @throws ParseException - 
+     *             if the entry could not be parsed 
+     */ 
+    public static BaseEntry buildEntry(final GDataRequest request) 
+            throws FeedNotFoundException, IOException, ParseException { 
+        if (request == null) 
+            throw new IllegalArgumentException("request must not be null"); 
+        return buildEntry(request.getFeedId(), request.getReader(),request.getExtensionProfile()); 
+    } 
+ 
+    /** 
+     * Builds a {@link BaseFeed} instance from the {@link Reader} provided by 
+     * the {@link GDataRequest} 
+     * @param feedId - 
+     *            the feed ID to request the feed type from the registry 
+     * @param reader - 
+     *            the reader to build the feed from  
+     * @param profile - extension profile to parse the resource 
+     * @return - a BaseFeed instance 
+     * @throws FeedNotFoundException - 
+     *             if the feed is not registered 
+     * @throws IOException - 
+     *             if an I/O Exception occures on the provided reader 
+     * @throws ParseException - 
+     *             if the entry could not be parsed 
+     */ 
+    public static BaseEntry buildEntry(final String feedId, final Reader reader,final ExtensionProfile profile) 
+            throws FeedNotFoundException, ParseException, IOException { 
+ 
+        BaseEntry retVal = null; 
+        try { 
+            retVal = ((BaseFeed) createEntityInstance(feedId)).createEntry(); 
+        } catch (FeedNotFoundException e) { 
+            throw e; 
+        } catch (Exception e) { 
+            DataBuilderException ex = new DataBuilderException( 
+                    "Could not build Entry for Entry class ", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+        retVal.parseAtom(new ExtensionProfile(), reader); 
+        return retVal; 
+    } 
+ 
+    private static Object createEntityInstance(String feedId) 
+            throws FeedNotFoundException, InstantiationException, 
+            IllegalAccessException { 
+        FeedInstanceConfigurator config = REGISTRY.getFeedConfigurator(feedId); 
+        if (config == null) 
+            throw new FeedNotFoundException( 
+                    "No feed for requested feed ID found - " + feedId); 
+        Class feedClass = config.getFeedType(); 
+        return feedClass.newInstance(); 
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequest.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequest.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequest.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequest.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,442 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+ 
+package org.apache.lucene.gdata.server; 
+ 
+import java.io.IOException; 
+import java.io.Reader; 
+import java.util.Enumeration; 
+import java.util.Map; 
+import java.util.StringTokenizer; 
+ 
+import javax.servlet.http.HttpServletRequest; 
+ 
+import org.apache.commons.logging.Log; 
+import org.apache.commons.logging.LogFactory; 
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry; 
+ 
+import com.google.gdata.data.ExtensionProfile; 
+ 
+/** 
+ * The GDataRequest Class wraps the incoming HttpServletRequest. Needed 
+ * information coming with the HttpServletRequest can be accessed directly. It 
+ * represents an abstraction on the plain HttpServletRequest. Every GData 
+ * specific data coming from the client will be availiable and can be accessed 
+ * via the GDataRequest. 
+ * <p> 
+ * GDataRequest instances will be passed to any action requested by the client. 
+ * This class also holds the logic to retrieve important information like 
+ * response format, the reqeusted feed instance and query parameters. 
+ *  
+ * </p> 
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+/* this class might be extracted as an interface in later development */ 
+public class GDataRequest { 
+ 
+    private static final Log LOG = LogFactory.getLog(GDataRequest.class); 
+ 
+    private static final String RESPONSE_FORMAT_PARAMETER = "alt"; 
+ 
+    private static final String RESPONSE_FORMAT_PARAMETER_RSS = "rss"; 
+ 
+    private static final int DEFAULT_ITEMS_PER_PAGE = 25; 
+ 
+    private static final int DEFAULT_START_INDEX = 1; 
+ 
+    private static final String START_INDEX_NEXT_PAGE_PARAMETER = "start-index"; 
+ 
+    private static final String ITEMS_PER_PAGE_PARAMETER = "max-results"; 
+ 
+    private String contextPath; 
+ 
+    @SuppressWarnings("unused") 
+    private static final String RESPONSE_FORMAT_PARAMETER_ATOM = "atom"; 
+ 
+    // Atom is the default resopnse format 
+    private OutputFormat responseFormat = OutputFormat.ATOM; 
+ 
+    private final HttpServletRequest request; 
+ 
+    private String feedId = null; 
+ 
+    private String entryId = null; 
+     
+    private ExtensionProfile extensionProfile= null; 
+ 
+    private String entryVersion = null; 
+ 
+    private GDataRequestType type; 
+ 
+    /** 
+     * Creates a new FeedRequest 
+     *  
+     * @param requst - 
+     *            the incoming HttpServletReqeust 
+     * @param type - 
+     *            the request type 
+     *  
+     */ 
+    public GDataRequest(final HttpServletRequest requst, 
+            final GDataRequestType type) { 
+        if (requst == null) 
+            throw new IllegalArgumentException("request must not be null "); 
+        if (type == null) 
+            throw new IllegalArgumentException("request type must not be null "); 
+        this.request = requst; 
+        this.type = type; 
+         
+    } 
+ 
+    /** 
+     * Initialize the GDataRequest. This will initialize all needed values / 
+     * attributes in this request. 
+     *  
+     * @throws GDataRequestException 
+     */ 
+    public void initializeRequest() throws GDataRequestException { 
+        generateIdentificationProperties(); 
+        setOutputFormat(); 
+        /* 
+         * ExtensionProfile is used for building the Entry / Feed Instances from an inputstream or reader 
+         */ 
+        this.extensionProfile = GDataServerRegistry.getRegistry().getExtensionProfile(this.feedId); 
+        if(this.extensionProfile == null) 
+            throw new GDataRequestException("feed is not registered or extension profile could not be created"); 
+    } 
+ 
+    /** 
+     * @return - the id of the requested feed 
+     */ 
+    public String getFeedId() { 
+ 
+        return this.feedId; 
+    } 
+ 
+    /** 
+     * @return - the entry id of the requested Entry if specified, otherwise 
+     *         <code>null</code> 
+     */ 
+    public String getEntryId() { 
+ 
+        return this.entryId; 
+    } 
+ 
+    /** 
+     * @return the version Id of the requested Entry if specified, otherwise 
+     *         <code>null</code> 
+     */ 
+    public String getEntryVersion() { 
+        return this.entryVersion; 
+    } 
+ 
+    /** 
+     * A Reader instance to read form the client input stream 
+     *  
+     * @return - the HttpServletRequest {@link Reader} 
+     * @throws IOException - 
+     *             if an I/O Exception occures 
+     */ 
+    public Reader getReader() throws IOException { 
+        return this.request.getReader(); 
+    } 
+ 
+    /** 
+     * Returns the {@link HttpServletRequest} parameter map containig all <i>GET</i> 
+     * request parameters. 
+     *  
+     * @return the parameter map 
+     */ 
+    @SuppressWarnings("unchecked") 
+    public Map<String, String[]> getQueryParameter() { 
+        return this.request.getParameterMap(); 
+    } 
+ 
+    /** 
+     * The {@link HttpServletRequest} request parameter names 
+     *  
+     * @return parameter names enumeration 
+     */ 
+    @SuppressWarnings("unchecked") 
+    public Enumeration<String> getQueryParameterNames() { 
+        return this.request.getParameterNames(); 
+    } 
+ 
+    /** 
+     * Either <i>Atom</i> or <i>RSS</i> 
+     *  
+     * @return - The output format requested by the client 
+     */ 
+    public OutputFormat getRequestedResponseFormat() { 
+ 
+        return this.responseFormat; 
+    } 
+ 
+    private void generateIdentificationProperties() 
+            throws GDataRequestException { 
+        /* generate all needed data to identify the requested feed/entry */ 
+        String pathInfo = this.request.getPathInfo(); 
+        /* 
+         * TODO this has to be changed to support the category queries. Category 
+         * queries could also be rewrited in the Servlet. 
+         */ 
+        if (pathInfo.length() <= 1) 
+            throw new GDataRequestException( 
+                    "No feed or entry specified for this request"); 
+        StringTokenizer tokenizer = new StringTokenizer(pathInfo, "/"); 
+        this.feedId = tokenizer.nextToken(); 
+        this.entryId = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : ""; 
+        this.entryVersion = tokenizer.hasMoreTokens() ? tokenizer.nextToken() 
+                : ""; 
+ 
+    } 
+ 
+    private void setOutputFormat() { 
+        String formatParameter = this.request 
+                .getParameter(RESPONSE_FORMAT_PARAMETER); 
+        if (formatParameter == null) 
+            return; 
+        if (formatParameter.equalsIgnoreCase(RESPONSE_FORMAT_PARAMETER_RSS)) 
+            this.responseFormat = OutputFormat.RSS; 
+ 
+    } 
+ 
+    /** 
+     * @return - the number of returned items per page 
+     */ 
+    public int getItemsPerPage() { 
+ 
+        if (this.request.getParameter(ITEMS_PER_PAGE_PARAMETER) == null) 
+            return DEFAULT_ITEMS_PER_PAGE; 
+        int retval = -1; 
+        try { 
+            retval = new Integer(this.request 
+                    .getParameter(ITEMS_PER_PAGE_PARAMETER)).intValue(); 
+        } catch (Exception e) { 
+            LOG.warn("Intems per page could not be parsed - " + e.getMessage(), 
+                    e); 
+        } 
+        return retval < 0 ? DEFAULT_ITEMS_PER_PAGE : retval; 
+    } 
+ 
+    /** 
+     * Start index represents the number of the first entry of the query - 
+     * result. The order depends on the query. Is the query a search query the 
+     * this value will be assinged to the score in a common feed query the value 
+     * will be assigned to the update time of the entries. 
+     *  
+     * @return - the requested start index 
+     */ 
+    public int getStartIndex() { 
+        if (this.request.getParameter(START_INDEX_NEXT_PAGE_PARAMETER) == null) 
+            return DEFAULT_START_INDEX; 
+        int retval = -1; 
+        try { 
+            retval = new Integer(this.request 
+                    .getParameter(START_INDEX_NEXT_PAGE_PARAMETER)).intValue(); 
+        } catch (Exception e) { 
+            LOG.warn("Start-index could not be parsed - " + e.getMessage(), e); 
+        } 
+        return retval < 0 ? DEFAULT_START_INDEX : retval; 
+    } 
+ 
+    /** 
+     * The selfid is <i>href</i> pointing to the requested resource 
+     *  
+     * @return - the self id 
+     */ 
+    public String getSelfId() { 
+        StringBuilder builder = new StringBuilder(); 
+        builder.append(buildRequestIDString(false)); 
+ 
+        builder.append(getQueryString()); 
+ 
+        return builder.toString(); 
+    } 
+ 
+    /** 
+     * The <i>href</i> id of the next page of the requested resource. 
+     *  
+     * @return the id of the next page 
+     */ 
+    public String getNextId() { 
+        // StringBuilder builder = new StringBuilder(); 
+        // builder.append(buildRequestIDString()); 
+        //         
+        // builder.append(getQueryString()); 
+        //         
+        // if(this.request.getParameter(START_INDEX_NEXT_PAGE_PARAMETER)== 
+        // null){ 
+        // builder.append("&").append(START_INDEX_NEXT_PAGE_PARAMETER).append("="); 
+        // builder.append(DEFAULT_ITEMS_PER_PAGE+1); 
+        // } 
+        // else{ 
+        //             
+        // int next = 0; 
+        // try{ 
+        // next = 
+        // Integer.parseInt(this.request.getParameter(START_INDEX_NEXT_PAGE_PARAMETER)); 
+        // }catch (Exception e) { 
+        // // 
+        // } 
+        //             
+        // if(next < 0) 
+        // builder.append(DEFAULT_ITEMS_PER_PAGE+1); 
+        // else 
+        // builder.append(next+DEFAULT_ITEMS_PER_PAGE); 
+        // int pos = builder.indexOf(START_INDEX_NEXT_PAGE_PARAMETER); 
+        // boolean end = builder.lastIndexOf("&",pos) < pos; 
+        // builder.replace(pos+START_INDEX_NEXT_PAGE_PARAMETER.length()+1,pos+START_INDEX_NEXT_PAGE_PARAMETER.length()+3,""+next); 
+        //             
+        //             
+        // System.out.println(end); 
+        // } 
+        //             
+        //         
+        //         
+        // return builder.toString(); 
+        return buildRequestIDString(false); 
+ 
+    } 
+ 
+    private String buildRequestIDString(boolean endingSlash) { 
+        StringBuilder builder = new StringBuilder("http://"); 
+        builder.append(this.request.getHeader("Host")); 
+        builder.append(this.request.getRequestURI()); 
+        if (endingSlash && !this.request.getRequestURI().endsWith("/")) 
+            builder.append("/"); 
+ 
+        return builder.toString(); 
+    } 
+ 
+    /** 
+     * This will return the current query string including all parameters. 
+     * Additionaly the <code>max-resul</code> parameter will be added if not 
+     * specified. 
+     * <p> 
+     * <code>max-resul</code> indicates the number of results returned to the 
+     * client. The default value is 25. 
+     * </p> 
+     *  
+     * @return - the query string incluing all parameters 
+     */ 
+    public String getQueryString() { 
+        String retVal = this.request.getQueryString(); 
+ 
+        if (this.request.getParameter(ITEMS_PER_PAGE_PARAMETER) != null) 
+            return retVal; 
+        String tempString = (retVal == null ? "?" + ITEMS_PER_PAGE_PARAMETER 
+                + "=" + DEFAULT_ITEMS_PER_PAGE : "&" + ITEMS_PER_PAGE_PARAMETER 
+                + "=" + DEFAULT_ITEMS_PER_PAGE); 
+ 
+        return retVal == null ? tempString : retVal + tempString; 
+ 
+    } 
+ 
+    /** 
+     * This enum represents the OutputFormat of the GDATA Server 
+     *  
+     * @author Simon Willnauer 
+     *  
+     */ 
+    public static enum OutputFormat { 
+        /** 
+         * Output format ATOM. ATOM is the default response format. 
+         */ 
+        ATOM, 
+        /** 
+         * Output format RSS 
+         */ 
+        RSS 
+    } 
+ 
+    /** 
+     * Returns the requested path including the domain name and the requested 
+     * resource <i>http://www.apache.org/path/resource/</i> 
+     *  
+     * @return the context path 
+     */ 
+    public String getContextPath() { 
+        if (this.contextPath == null) 
+            this.contextPath = buildRequestIDString(true); 
+        return this.contextPath; 
+    } 
+ 
+    /** 
+     * Indicates the request type 
+     *  
+     * @author Simon Willnauer 
+     *  
+     */ 
+    public enum GDataRequestType { 
+        /** 
+         * Type FeedRequest 
+         */ 
+        GET, 
+        /** 
+         * Type UpdateRequest 
+         */ 
+        UPDATE, 
+        /** 
+         * Type DeleteRequest 
+         */ 
+        DELETE, 
+        /** 
+         * Type InsertRequest 
+         */ 
+        INSERT 
+    } 
+ 
+    /** 
+     * {@link GDataRequestType} 
+     *  
+     * @return the current request type 
+     */ 
+    public GDataRequestType getType() { 
+        return this.type; 
+    } 
+ 
+    /** 
+     * If the reuquest is a {@link GDataRequestType#GET} request and there is 
+     * no entry id specified, the requested resource is a feed. 
+     *  
+     * @return - <code>true</code> if an only if the requested resource is a feed 
+     */ 
+    public boolean isFeedRequested() { 
+ 
+        return (this.type.equals(GDataRequestType.GET) && (this.entryId == null|| this.entryId.length() == 0|| (this.entryId.equals('/')))); 
+    } 
+ 
+    /** 
+     * * If the reuquest is a {@link GDataRequestType#GET} request and there is 
+     * an entry id specified, the requested resource is an entry. 
+     *  
+     * @return - <code>true</code> if an only if the requested resource is an entry 
+     */ 
+    public boolean isEntryRequested() { 
+        return !this.isFeedRequested(); 
+    } 
+ 
+    /** 
+     * @return - the extensionProfile for the requested resource 
+     */ 
+    public ExtensionProfile getExtensionProfile() { 
+        return this.extensionProfile; 
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequestException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequestException.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequestException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataRequestException.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,67 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+ 
+package org.apache.lucene.gdata.server; 
+ 
+/** 
+ * This exception wraps all exceptions occure inside the {@link org.apache.lucene.gdata.server.GDataRequest} 
+ * @author Simon Willnauer 
+ * 
+ */ 
+public class GDataRequestException extends Exception { 
+ 
+    /** 
+     * Serial version ID. -> Implements Serializable 
+     */ 
+    private static final long serialVersionUID = -4440777051466950723L; 
+ 
+    /** 
+     * Constructs a new GDataException 
+     */ 
+    public GDataRequestException() { 
+        super(); 
+         
+    } 
+ 
+    /** 
+     * Constructs a new GDataException with a given message string 
+     * @param arg0 - the excpetion message  
+     */ 
+    public GDataRequestException(String arg0) { 
+        super(arg0); 
+         
+    } 
+ 
+    /** 
+     * Constructs a new GDataException with a given message string and cause 
+     * @param arg0 - the exception message 
+     * @param arg1 - the exception who caused this exception 
+     */ 
+    public GDataRequestException(String arg0, Throwable arg1) { 
+        super(arg0, arg1); 
+         
+    } 
+ 
+    /** 
+     * Constructs a new GDataException with a given cause 
+     * @param arg0 - exception cause 
+     */ 
+    public GDataRequestException(Throwable arg0) { 
+        super(arg0); 
+         
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataResponse.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataResponse.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataResponse.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataResponse.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,242 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+ 
+package org.apache.lucene.gdata.server; 
+ 
+import java.io.IOException; 
+import java.io.Writer; 
+ 
+import javax.servlet.http.HttpServletResponse; 
+ 
+import org.apache.lucene.gdata.server.GDataRequest.OutputFormat; 
+ 
+import com.google.gdata.data.BaseEntry; 
+import com.google.gdata.data.BaseFeed; 
+import com.google.gdata.data.ExtensionProfile; 
+import com.google.gdata.util.common.xml.XmlWriter; 
+import com.google.gdata.util.common.xml.XmlWriter.Namespace; 
+ 
+/** 
+ * The FeedRequest Class wraps the curren HttpServletResponse. Any action on the 
+ * HttpServletRequest will be executed via this class. This represents an 
+ * abstraction on the plain {@link HttpServletResponse}. Any action which has 
+ * to be performed on the underlaying {@link HttpServletResponse} will be 
+ * executed within this class. 
+ * <p> 
+ * The GData basicly writes two different kinds ouf reponse to the output 
+ * stream. 
+ * <ol> 
+ * <li>update, delete or insert requests will respond with a statuscode and if 
+ * successful the feed entry modified or created</li> 
+ * <li>get requests will respond with a statuscode and if successful the 
+ * requested feed</li> 
+ * </ol> 
+ *  
+ * For this purpose the {@link GDataResponse} class provides the overloaded 
+ * method 
+ * {@link org.apache.lucene.gdata.server.GDataResponse#sendResponse(BaseEntry, ExtensionProfile)} 
+ * which sends the entry e.g feed to the output stream. 
+ * </p> 
+ *  
+ *  
+ *  
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class GDataResponse { 
+    private int error; 
+ 
+    private boolean isError = false; 
+ 
+    private String encoding; 
+ 
+    private OutputFormat outputFormat; 
+ 
+    private final HttpServletResponse response; 
+ 
+    private static final String DEFAUL_NAMESPACE_URI = "http://www.w3.org/2005/Atom"; 
+ 
+    private static final Namespace DEFAULT_NAMESPACE = new Namespace("", 
+            DEFAUL_NAMESPACE_URI); 
+ 
+    /** 
+     * Creates a new GDataResponse 
+     *  
+     * @param response - 
+     *            The underlaying {@link HttpServletResponse} 
+     */ 
+    public GDataResponse(HttpServletResponse response) { 
+        if (response == null) 
+            throw new IllegalArgumentException("response must not be null"); 
+        this.response = response; 
+        this.response.setContentType("text/xml"); 
+    } 
+ 
+    /** 
+     * Sets an error code to this FeedResponse. 
+     *  
+     * @param errorCode - 
+     *            {@link HttpServletResponse} error code 
+     */ 
+    public void setError(int errorCode) { 
+        this.isError = true; 
+        this.error = errorCode; 
+    } 
+    /** 
+     * Sets the status of the underlaying response 
+     * @see HttpServletResponse 
+     * @param responseCode - the status of the response 
+     */ 
+    public void setResponseCode(int responseCode){ 
+        this.response.setStatus(responseCode); 
+    } 
+    /** 
+     * This method sends the specified error to the user if set 
+     *  
+     * @throws IOException - 
+     *             if an I/O Exception occures 
+     */ 
+    public void sendError() throws IOException { 
+        if (this.isError) 
+            this.response.sendError(this.error); 
+    } 
+ 
+    /** 
+     * @return - the {@link HttpServletResponse} writer 
+     * @throws IOException - 
+     *             If an I/O exception occures 
+     */ 
+    public Writer getWriter() throws IOException { 
+        return this.response.getWriter(); 
+    } 
+ 
+    /** 
+     * Sends a response for a get e.g. query request. This method must not 
+     * invoked in a case of an error performing the requeste action. 
+     *  
+     * @param feed - 
+     *            the feed to respond to the client 
+     * @param profile - 
+     *            the extension profil for the feed to write 
+     * @throws IOException - 
+     *             if an I/O exception accures, often caused by an already 
+     *             closed Writer or OutputStream 
+     *  
+     */ 
+    public void sendResponse(BaseFeed feed, ExtensionProfile profile) 
+            throws IOException { 
+        if (feed == null) 
+            throw new IllegalArgumentException("feed must not be null"); 
+        if(profile == null) 
+            throw new IllegalArgumentException("extension profil must not be null"); 
+        XmlWriter writer = createWriter(); 
+         
+        if (this.outputFormat.equals(OutputFormat.ATOM)) 
+            feed.generateAtom(writer, profile); 
+        else 
+            feed.generateRss(writer, profile); 
+ 
+    } 
+ 
+    /** 
+     *  
+     * Sends a response for an update, insert or delete request. This method 
+     * must not invoked in a case of an error performing the requeste action. 
+     * If the specified response format is ATOM the default namespace will be set to ATOM. 
+     * @param entry - 
+     *            the modified / created entry to send 
+     * @param profile - 
+     *            the entries extension profile 
+     * @throws IOException - 
+     *             if an I/O exception accures, often caused by an already 
+     *             closed Writer or OutputStream 
+     */ 
+    public void sendResponse(BaseEntry entry, ExtensionProfile profile) 
+            throws IOException { 
+        if (entry == null) 
+            throw new IllegalArgumentException("entry must not be null"); 
+        if(profile == null) 
+            throw new IllegalArgumentException("extension profil must not be null"); 
+        XmlWriter writer = createWriter(); 
+        if (this.outputFormat.equals(OutputFormat.ATOM)) 
+            entry.generateAtom(writer, profile); 
+        else 
+            entry.generateRss(writer, profile); 
+    } 
+ 
+    private XmlWriter createWriter() throws IOException { 
+        XmlWriter writer = new XmlWriter(getWriter(), this.encoding); 
+        // set the default namespace to Atom if Atom is the response format 
+        if(this.outputFormat.equals(OutputFormat.ATOM)) 
+            writer.setDefaultNamespace(DEFAULT_NAMESPACE); 
+        return writer; 
+    } 
+ 
+    /** 
+     * This encoding will be used to encode the xml representation of feed or 
+     * entry written to the {@link HttpServletResponse} output stream. 
+     *  
+     * @return - the entry / feed encoding 
+     */ 
+    public String getEncoding() { 
+        return this.encoding; 
+    } 
+ 
+    /** 
+     * This encoding will be used to encode the xml representation of feed or 
+     * entry written to the {@link HttpServletResponse} output stream. <i>UTF-8</i> 
+     * <i>ISO-8859-1</i> 
+     *  
+     * @param encoding - 
+     *            string represents the encoding 
+     */ 
+    public void setEncoding(String encoding) { 
+        this.encoding = encoding; 
+    } 
+ 
+    /** 
+     * @return - the response 
+     *         {@link org.apache.lucene.gdata.server.GDataRequest.OutputFormat} 
+     */ 
+    public OutputFormat getOutputFormat() { 
+        return this.outputFormat; 
+    } 
+ 
+    /** 
+     * @param outputFormat - 
+     *            the response 
+     *            {@link org.apache.lucene.gdata.server.GDataRequest.OutputFormat} 
+     */ 
+    public void setOutputFormat(OutputFormat outputFormat) { 
+        this.outputFormat = outputFormat; 
+    } 
+    /** 
+     * @see Object#toString() 
+     */ 
+    @Override 
+    public String toString(){ 
+        StringBuilder builder = new StringBuilder(" GDataResponse: "); 
+        builder.append("Error: ").append(this.error); 
+        builder.append(" outputFormat: ").append(getOutputFormat()); 
+        builder.append(" encoding: ").append(this.encoding); 
+         
+        return builder.toString(); 
+         
+         
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataService.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataService.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataService.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/GDataService.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,275 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server; 
+ 
+import java.io.IOException; 
+import java.util.List; 
+ 
+import org.apache.commons.logging.Log; 
+import org.apache.commons.logging.LogFactory; 
+import org.apache.lucene.gdata.server.registry.GDataServerRegistry; 
+import org.apache.lucene.gdata.storage.Storage; 
+import org.apache.lucene.gdata.storage.StorageException; 
+import org.apache.lucene.gdata.storage.StorageFactory; 
+ 
+import com.google.gdata.data.BaseEntry; 
+import com.google.gdata.data.BaseFeed; 
+import com.google.gdata.data.DateTime; 
+import com.google.gdata.data.Generator; 
+import com.google.gdata.data.Link; 
+import com.google.gdata.util.ParseException; 
+ 
+/** 
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class GDataService extends Service { 
+    private static final Log LOGGER = LogFactory.getLog(GDataService.class); 
+ 
+    private Storage storage; 
+ 
+    private GDataServerRegistry registry = GDataServerRegistry.getRegistry(); 
+ 
+    private static final Generator generator; 
+ 
+    private static final String generatorName = "Lucene GData-Server"; 
+ 
+    private static final String generatorURI = "http://lucene.apache.org"; 
+    static { 
+        generator = new Generator(); 
+        generator.setName(generatorName); 
+        generator.setUri(generatorURI); 
+        generator.setVersion("0.1"); 
+    } 
+ 
+    protected GDataService() throws ServiceException { 
+        try { 
+            this.storage = StorageFactory.getStorage(); 
+             
+        } catch (StorageException e) { 
+            LOGGER 
+                    .fatal( 
+                            "Can't get Storage Instance -- can't serve any requests", 
+                            e); 
+            ServiceException ex = new ServiceException( 
+                    "Can't get Storage instance" + e.getMessage(), e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+    } 
+ 
+    /** 
+     * @see org.apache.lucene.gdata.server.Service#createEntry(org.apache.lucene.gdata.server.GDataRequest, 
+     *      org.apache.lucene.gdata.server.GDataResponse) 
+     */ 
+    @Override 
+    public BaseEntry createEntry(GDataRequest request, GDataResponse response) 
+            throws ServiceException { 
+ 
+        checkFeedIsRegisterd(request); 
+        if (LOGGER.isInfoEnabled()) 
+            LOGGER.info("create Entry for feedId: " + request.getFeedId()); 
+        BaseEntry entry = buildEntry(request); 
+        setUpdateTime(entry); 
+        try { 
+ 
+            this.storage.storeEntry(entry, request.getFeedId()); 
+        } catch (Exception e) { 
+            ServiceException ex = new ServiceException("Could not store entry", 
+                    e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+        return entry; 
+    } 
+ 
+    /** 
+     * @see org.apache.lucene.gdata.server.Service#deleteEntry(org.apache.lucene.gdata.server.GDataRequest, 
+     *      org.apache.lucene.gdata.server.GDataResponse) 
+     */ 
+    @Override 
+    public BaseEntry deleteEntry(GDataRequest request, GDataResponse response) 
+            throws ServiceException { 
+        checkFeedIsRegisterd(request); 
+        String entryid = request.getEntryId(); 
+        String feedid = request.getFeedId(); 
+        try { 
+            this.storage.deleteEntry(entryid, feedid); 
+        } catch (Exception e) { 
+            ServiceException ex = new ServiceException( 
+                    "Could not delete entry", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+        return null; 
+    } 
+ 
+    /** 
+     * @see org.apache.lucene.gdata.server.Service#updateEntry(org.apache.lucene.gdata.server.GDataRequest, 
+     *      org.apache.lucene.gdata.server.GDataResponse) 
+     */ 
+    @Override 
+    public BaseEntry updateEntry(GDataRequest request, GDataResponse response) 
+            throws ServiceException { 
+        checkFeedIsRegisterd(request); 
+ 
+        BaseEntry entry = buildEntry(request); 
+        String feedid = request.getFeedId(); 
+        if (LOGGER.isInfoEnabled()) 
+            LOGGER.info("update Entry" + entry.getId() + " for feedId: " 
+                    + feedid); 
+        setUpdateTime(entry); 
+        try { 
+            this.storage.updateEntry(entry, feedid); 
+        } catch (StorageException e) { 
+            ServiceException ex = new ServiceException( 
+                    "Could not update entry", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+        return entry; 
+    } 
+ 
+    /** 
+     * @see org.apache.lucene.gdata.server.Service#getFeed(org.apache.lucene.gdata.server.GDataRequest, 
+     *      org.apache.lucene.gdata.server.GDataResponse) 
+     */ 
+    @SuppressWarnings("unchecked") 
+    @Override 
+    public BaseFeed getFeed(GDataRequest request, GDataResponse response) 
+            throws ServiceException { 
+        checkFeedIsRegisterd(request); 
+ 
+        try { 
+            // TODO remove when storing feeds is implemented just for 
+            // development 
+            BaseFeed feed = this.storage.getFeed(request.getFeedId(), request 
+                    .getStartIndex(), request.getItemsPerPage()); 
+            buildDynamicFeedElements(request, feed); 
+            List<BaseEntry> list = feed.getEntries(); 
+            addContextPath(list, request.getContextPath()); 
+            return feed; 
+        } catch (StorageException e) { 
+            ServiceException ex = new ServiceException("Could not get feed", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+ 
+    } 
+ 
+    /* 
+     * build the dynamic elements like self link and next link 
+     */ 
+    private void buildDynamicFeedElements(final GDataRequest request, 
+            final BaseFeed feed) { 
+        feed.setGenerator(generator); 
+        feed.setItemsPerPage(request.getItemsPerPage()); 
+        feed.getLinks().add( 
+                buildLink(Link.Rel.SELF, Link.Type.ATOM, request.getSelfId())); 
+        // TODO add next link 
+    } 
+ 
+    private Link buildLink(String rel, String type, String href) { 
+        Link retVal = new Link(); 
+        retVal.setHref(href); 
+        retVal.setRel(rel); 
+        retVal.setType(type); 
+        return retVal; 
+    } 
+ 
+    /* 
+     * every entry has an ID which has to have a prefix. The prefix is the 
+     * context path of the requested feed. This will be used to request the 
+     * entry directly 
+     */ 
+    private void addContextPath(List<BaseEntry> list, final String contextPath) { 
+        for (BaseEntry entry : list) { 
+            addcontextPath(entry, contextPath); 
+        } 
+    } 
+ 
+    @SuppressWarnings("unchecked") 
+    private BaseEntry addcontextPath(final BaseEntry entry, 
+            final String contextPath) { 
+        String id = contextPath + entry.getId(); 
+        entry.setId(id); 
+        Link self = new Link(); 
+        self.setRel("self"); 
+        self.setHref(id); 
+        self.setType("application/atom+xml"); 
+        entry.getLinks().add(self); 
+        return entry; 
+    } 
+ 
+    private BaseEntry buildEntry(final GDataRequest request) 
+            throws ServiceException { 
+        try { 
+            return GDataEntityBuilder.buildEntry(request); 
+ 
+        } catch (ParseException e) { 
+            ServiceException ex = new ServiceException( 
+                    "Could not parse entry from incoming request", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } catch (IOException e) { 
+            ServiceException ex = new ServiceException( 
+                    "Could not read or open input stream", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+    } 
+ 
+    /* 
+     * checks whether the reqeuested feed is registered 
+     */ 
+    private void checkFeedIsRegisterd(final GDataRequest request) 
+            throws FeedNotFoundException { 
+        if (!this.registry.isFeedRegistered(request.getFeedId())) 
+            throw new FeedNotFoundException( 
+                    "Feed could not be found - is not registed - Feed ID:" 
+                            + request.getFeedId()); 
+        this.storage.setExtensionProfile(request.getExtensionProfile()); 
+    } 
+ 
+    private BaseEntry setUpdateTime(final BaseEntry entry) { 
+        entry.setUpdated(DateTime.now()); 
+        return entry; 
+    } 
+ 
+    /** 
+     * @see org.apache.lucene.gdata.server.Service#getSingleEntry(org.apache.lucene.gdata.server.GDataRequest, 
+     *      org.apache.lucene.gdata.server.GDataResponse) 
+     */ 
+    @Override 
+    public BaseEntry getSingleEntry(GDataRequest request, GDataResponse response) 
+            throws ServiceException { 
+        checkFeedIsRegisterd(request); 
+ 
+        try { 
+            BaseEntry entry = this.storage.getEntry(request.getEntryId(), 
+                    request.getFeedId()); 
+            if(entry == null) 
+                return null; 
+            addcontextPath(entry, request.getContextPath()); 
+            return entry; 
+        } catch (StorageException e) { 
+            ServiceException ex = new ServiceException("Could not get feed", e); 
+            ex.setStackTrace(e.getStackTrace()); 
+            throw ex; 
+        } 
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/Service.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/Service.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/Service.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/Service.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,139 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+ 
+package org.apache.lucene.gdata.server; 
+ 
+import com.google.gdata.data.BaseEntry; 
+import com.google.gdata.data.BaseFeed; 
+ 
+ 
+/** 
+ * The Service class represents an interface to access the GData service 
+ * componentes of the GData-Server. It encapsulates all interactions with the 
+ * GData client. 
+ * <p> 
+ * This class provides the base level common functionality required to access 
+ * the GData components. It is also designed to act as a base class that can be 
+ * extended for specific types of underlaying server components as different 
+ * indexing or storage components. 
+ * </p> 
+ * <p> 
+ * It could also encapsulate caching mechanismn build on top of the storage to 
+ * reduce load on the storage component 
+ * </p> 
+ *  
+ * @author Simon Willnauer 
+ *  
+ *  
+ */ 
+public abstract class Service { 
+ 
+    /** 
+     * Service method to create an entry in an already created and existing 
+     * feed. This method will create the entry and passes the entry to the 
+     * indexing component to make the new entry accessable via <i>get-queries</i>. 
+     * The response and the corresponding http status code will be added to the 
+     * given <code>FeedResponse</code>. 
+     *  
+     * @param request - 
+     *            the current FeedRequest 
+     * @param response - 
+     *            the current FeedResponse 
+     * @return - the entry which has been created  
+     * @throws ServiceException - 
+     *             if the corresponding feed does not exist or the storage can 
+     *             not be accessed 
+     */ 
+    public abstract BaseEntry createEntry(final GDataRequest request, 
+            final GDataResponse response) throws ServiceException; 
+ 
+    /** 
+     * Service Method to delete an entry specified in the given FeedRequest. 
+     * This method will remove the entry permanently. There will be no 
+     * possiblity to restore the entry. The response and the corresponding http 
+     * status code will be added to the given <code>FeedResponse</code>. 
+     *  
+     * @param request - 
+     *            the current FeedRequest 
+     * @param response - 
+     *            the current FeedResponse 
+     * @return - the entry wich has been deleted 
+     * @throws ServiceException - 
+     *             if the entry does not exist or the storage can not be 
+     *             accessed 
+     */ 
+    public abstract BaseEntry deleteEntry(GDataRequest request, final GDataResponse response) 
+            throws ServiceException; 
+ 
+    /** 
+     * Service method to update an existing entry in a existing feed context. 
+     * The entry version will be checked and a <code>ServiceException</code> 
+     * will be thrown if the version to update is outdated. The new entry will 
+     * be passed to the indexing component to make the version accessable via 
+     * <i>get-queries</i>. 
+     *  
+     * @param request - 
+     *            the current FeedRequest 
+     * @param response - 
+     *            the current FeedResponse 
+     * @return - the entry wich has been updated 
+     * @throws ServiceException - 
+     *             if the corresponding feed does not exist, the storage can not 
+     *             be accessed or the version to update is out of date. 
+     */ 
+    public abstract BaseEntry  updateEntry(final GDataRequest request, 
+            final GDataResponse response) throws ServiceException; 
+ 
+    /** 
+     * Service method to retrieve a requested Feed. The feed will also be added to 
+     * the given <code>FeedResponse</code> instance and can also be accessed 
+     * via the <code>FeedResponse</code> object. 
+     *  
+     * @param request - 
+     *            the current FeedRequest 
+     * @param response - 
+     *            the current FeedResponse 
+     * @return - the requested feed 
+     *  
+     * @throws ServiceException - 
+     *             If the storage can not be accessed or the requested feed does 
+     *             not exist. 
+     */ 
+    public abstract BaseFeed getFeed(final GDataRequest request, final GDataResponse response) 
+            throws ServiceException; 
+ 
+    /** 
+     * Service method to retrieve a requested entry. The entry will also be added to 
+     * the given <code>FeedResponse</code> instance and can also be accessed 
+     * via the <code>FeedResponse</code> object. 
+     *  
+     * @param request - 
+     *            the current FeedRequest 
+     * @param response - 
+     *            the current FeedResponse 
+     * @return - the requested entry 
+     *  
+     * @throws ServiceException - 
+     *             If the storage can not be accessed or the requested entry does 
+     *             not exist. 
+     */ 
+    public abstract BaseEntry getSingleEntry(final GDataRequest request, final GDataResponse response) 
+            throws ServiceException; 
+     
+     
+ 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceException.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceException.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,63 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+ 
+package org.apache.lucene.gdata.server; 
+ 
+/** 
+ * @author Simon Willnauer 
+ * 
+ */ 
+public class ServiceException extends Exception { 
+ 
+    /** 
+     *  
+     */ 
+    private static final long serialVersionUID = -7099825107871876584L; 
+ 
+    /** 
+     *  
+     */ 
+    public ServiceException() { 
+        super(); 
+       
+    } 
+ 
+    /** 
+     * @param arg0 
+     */ 
+    public ServiceException(String arg0) { 
+        super(arg0); 
+       
+    } 
+ 
+    /** 
+     * @param arg0 
+     * @param arg1 
+     */ 
+    public ServiceException(String arg0, Throwable arg1) { 
+        super(arg0, arg1); 
+       
+    } 
+ 
+    /** 
+     * @param arg0 
+     */ 
+    public ServiceException(Throwable arg0) { 
+        super(arg0); 
+       
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceFactory.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceFactory.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceFactory.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/ServiceFactory.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,57 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server; 
+ 
+ 
+/** 
+ * The {@link ServiceFactory} creates {@link Service} implementations to access 
+ * the GData - Server components. 
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class ServiceFactory { 
+ 
+    private static ServiceFactory INSTANCE = null; 
+ 
+    /** 
+     * @return - a Singleton Instance of the factory 
+     */ 
+    public static synchronized ServiceFactory getInstance() { 
+        if (INSTANCE == null) 
+            INSTANCE = new ServiceFactory(); 
+        return INSTANCE; 
+ 
+    } 
+ 
+    private ServiceFactory() { 
+        // private constructor --> singleton 
+    } 
+ 
+    /** 
+     * Creates a {@link Service} implementation. 
+     *  
+     * @return a Service Implementation 
+     */ 
+    public Service getService() { 
+        try{ 
+        return new GDataService(); 
+        }catch (Exception e) { 
+            // 
+        } 
+        return null; 
+    } 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/package.html
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/package.html?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/package.html (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/package.html Wed Jun  7 14:56:25 2006
@@ -0,0 +1,10 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> 
+<html> 
+<head> 
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
+   <meta name="Author" content="Simon Willnauer"> 
+</head> 
+<body> 
+GData-Server classes encapsulation all protocol-level interactions and underlaying GData components. 
+</body> 
+</html> 
\ No newline at end of file

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/DataBuilderException.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/DataBuilderException.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/DataBuilderException.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/DataBuilderException.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,62 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server.registry; 
+ 
+/** 
+ * @author Simon Willnauer 
+ * 
+ */ 
+public class DataBuilderException extends RuntimeException { 
+ 
+    /** 
+     *  
+     */ 
+    private static final long serialVersionUID = -3802958802500735198L; 
+ 
+    /** 
+     *  
+     */ 
+    public DataBuilderException() { 
+        super(); 
+        // TODO Auto-generated constructor stub 
+    } 
+ 
+    /** 
+     * @param message 
+     */ 
+    public DataBuilderException(String message) { 
+        super(message); 
+        // TODO Auto-generated constructor stub 
+    } 
+ 
+    /** 
+     * @param message 
+     * @param cause 
+     */ 
+    public DataBuilderException(String message, Throwable cause) { 
+        super(message, cause); 
+        // TODO Auto-generated constructor stub 
+    } 
+ 
+    /** 
+     * @param cause 
+     */ 
+    public DataBuilderException(Throwable cause) { 
+        super(cause); 
+        // TODO Auto-generated constructor stub 
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/FeedInstanceConfigurator.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/FeedInstanceConfigurator.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/FeedInstanceConfigurator.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/FeedInstanceConfigurator.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,66 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server.registry; 
+ 
+/** 
+ * @author Simon Willnauer 
+ * 
+ */ 
+public class FeedInstanceConfigurator { 
+    private Class feedType; 
+    private String feedId; 
+    private Class extensionProfileClass; 
+    /** 
+     * @return Returns the feedType. 
+     */ 
+    public Class getFeedType() { 
+        return this.feedType; 
+    } 
+    /** 
+     * @param feedType The feedType to set. 
+     */ 
+    public void setFeedType(Class feedType) { 
+        this.feedType = feedType; 
+    } 
+    /** 
+     * @return Returns the feedURL. 
+     */ 
+    public String getFeedId() { 
+        return this.feedId; 
+    } 
+    /** 
+     * @param feedURL The feedURL to set. 
+     */ 
+    public void setFeedId(String feedURL) { 
+        this.feedId = feedURL; 
+    } 
+     
+    /** 
+     * @return - the extension profile for this feed 
+     */ 
+    public Class getExtensionProfilClass(){ 
+        return this.extensionProfileClass; 
+    } 
+     
+    /** 
+     * @param extensionProfilClass 
+     */ 
+    public void setExtensionProfileClass(Class extensionProfilClass){ 
+        this.extensionProfileClass = extensionProfilClass; 
+    } 
+     
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/GDataServerRegistry.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/GDataServerRegistry.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/GDataServerRegistry.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/GDataServerRegistry.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,154 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server.registry; 
+ 
+import java.util.HashMap; 
+import java.util.Map; 
+ 
+import org.apache.commons.logging.Log; 
+import org.apache.commons.logging.LogFactory; 
+import org.apache.lucene.gdata.storage.StorageController; 
+ 
+import com.google.gdata.data.ExtensionProfile; 
+ 
+/** 
+ *  
+ * The FeedRegistry represents the registry component of the GData Server. All 
+ * feed configurations will be registered here. Feed configurations contain 
+ * several informationsa about GData feed like: 
+ * <ol> 
+ * <li>the feed id - where the feed can be accessed via http methodes</li> 
+ * <li>the feed type - feed types are implementations of the abstract 
+ * {@link com.google.gdata.data.BaseFeed}</li> 
+ * </ol> 
+ * The registry will be set up at start up of the server application and can be 
+ * accessed from other components to get configurations according to incoming 
+ * requests. 
+ *  
+ * @author Simon Willnauer 
+ *  
+ */ 
+public class GDataServerRegistry { 
+    private static GDataServerRegistry INSTANCE; 
+ 
+    private StorageController storageInstance; 
+ 
+    private static final Log LOGGER = LogFactory 
+            .getLog(GDataServerRegistry.class); 
+ 
+    private final Map<String, FeedInstanceConfigurator> feedTypMap = new HashMap<String, FeedInstanceConfigurator>(); 
+ 
+    private GDataServerRegistry() { 
+        // private - singleton 
+    } 
+ 
+    /** 
+     * @return a Sinleton registry instance 
+     */ 
+    public static synchronized GDataServerRegistry getRegistry() { 
+        if (INSTANCE == null) 
+            INSTANCE = new GDataServerRegistry(); 
+        return INSTANCE; 
+    } 
+ 
+    /** 
+     * Registers a {@link FeedInstanceConfigurator} 
+     *  
+     * @param configurator - 
+     *            the configurator to register in the registry 
+     */ 
+    public void registerFeed(FeedInstanceConfigurator configurator) { 
+        if (configurator == null) { 
+            LOGGER.warn("Feedconfigurator is null -- skip registration"); 
+            return; 
+        } 
+        this.feedTypMap.put(configurator.getFeedId(), configurator); 
+    } 
+ 
+    /** 
+     * Looks up the {@link FeedInstanceConfigurator} by the given feed id. 
+     *  
+     * @param feedId 
+     * @return - the {@link FeedInstanceConfigurator} or <code>null</code> if 
+     *         the no configuration for this feed has been registered 
+     */ 
+    public FeedInstanceConfigurator getFeedConfigurator(String feedId) { 
+        if (feedId == null) 
+            throw new IllegalArgumentException( 
+                    "Feed URL is null - must not be null to get registered feedtype"); 
+        return this.feedTypMap.get(feedId); 
+    } 
+ 
+    protected void flushRegistry() { 
+        this.feedTypMap.clear(); 
+    } 
+ 
+    /** 
+     * @param feedId - 
+     *            the id of the feed as the feed is registered 
+     * @return - <code>true</code> if and only if the feed is registered, 
+     *         otherwise <code>false</code>. 
+     */ 
+    public boolean isFeedRegistered(String feedId) { 
+        return this.feedTypMap.containsKey(feedId); 
+ 
+    } 
+ 
+    /** 
+     * @param storage 
+     */ 
+    public void registerStorage(StorageController storage) { 
+        if (this.storageInstance != null) 
+            throw new IllegalStateException( 
+                    "Storage already registered -- Instance of " 
+                            + this.storageInstance.getClass()); 
+        this.storageInstance = storage; 
+    } 
+ 
+    /** 
+     * Destroys the registry and release all resources 
+     */ 
+    public void destroy() { 
+        flushRegistry(); 
+        this.storageInstance.destroy(); 
+        this.storageInstance = null; 
+ 
+    } 
+ 
+    /** 
+     * Creates the  {@link ExtensionProfile} for a registered feed 
+     * @param feedId - the feed id  
+     * @return - the extension profil for this feed of <code>null</code> if 
+     *         the feed is not registered or the extension profile could not be 
+     *         instanciated 
+     */ 
+    public ExtensionProfile getExtensionProfile(final String feedId) { 
+        FeedInstanceConfigurator configurator = this.feedTypMap.get(feedId); 
+        if (configurator == null) 
+            return null; 
+        Class clazz = configurator.getExtensionProfilClass(); 
+        try { 
+            return (ExtensionProfile) clazz.newInstance(); 
+        } catch (Exception e) { 
+            LOGGER 
+                    .error("Can not create instance of ExtensionProfil for class: " 
+                            + clazz + " -- feedId: " + feedId); 
+ 
+        } 
+        return null; 
+    } 
+ 
+} 

Added: lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryBuilder.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryBuilder.java?rev=412574&view=auto
==============================================================================
--- lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryBuilder.java (added)
+++ lucene/java/trunk/contrib/gdata-server/src/java/org/apache/lucene/gdata/server/registry/RegistryBuilder.java Wed Jun  7 14:56:25 2006
@@ -0,0 +1,41 @@
+/** 
+ * Copyright 2004 The Apache Software Foundation 
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License. 
+ */ 
+package org.apache.lucene.gdata.server.registry; 
+ 
+import com.google.gdata.data.ExtensionProfile; 
+import com.google.gdata.data.Feed; 
+ 
+/** 
+ * @author Simon Willnauer 
+ * 
+ */ 
+public class RegistryBuilder { 
+ 
+    /** 
+     *  
+     */ 
+    public static void buildRegistry(){ 
+        // TODO Implement this!! -- just for develping purposes 
+        GDataServerRegistry reg = GDataServerRegistry.getRegistry(); 
+        FeedInstanceConfigurator configurator = new FeedInstanceConfigurator(); 
+        configurator.setFeedType(Feed.class); 
+        configurator.setFeedId("weblog"); 
+        configurator.setExtensionProfileClass(ExtensionProfile.class); 
+        reg.registerFeed(configurator); 
+         
+    } 
+     
+}