You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by lr...@apache.org on 2008/07/11 08:11:26 UTC

svn commit: r675836 [2/3] - in /tuscany/java/sca/modules/binding-gdata-runtime-gsoc: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/tuscany/ src/main/java/org/apache/tuscany/sca/ src/main/java/org...

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,724 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata.provider;
+
+import static org.apache.tuscany.sca.binding.gdata.provider.GdataBindingUtil.entry;
+import static org.apache.tuscany.sca.binding.gdata.provider.GdataBindingUtil.feedEntry;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.model.Collection;
+import org.apache.abdera.model.Document; // import
+                                            // org.apache.abdera.model.Feed;
+// import org.apache.abdera.model.Link;
+import org.apache.abdera.model.Service;
+import org.apache.abdera.model.Workspace;
+import org.apache.abdera.parser.ParseException;
+import org.apache.abdera.parser.Parser;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.tuscany.sca.data.collection.Entry;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.invocation.MessageFactory;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+
+import com.google.gdata.data.ExtensionProfile;
+import com.google.gdata.data.ParseSource;
+import com.google.gdata.data.PlainTextConstruct;
+import com.google.gdata.util.ServiceException;
+
+/**
+ * A resource collection binding listener, implemented as a Servlet and
+ * registered in a Servlet host provided by the SCA hosting runtime.
+ */
+class GdataBindingListenerServlet extends HttpServlet {
+    private static final Logger logger = Logger.getLogger(GdataBindingListenerServlet.class.getName());
+    private static final long serialVersionUID = 1L;
+
+    private static final Factory abderaFactory = Abdera.getNewFactory();
+    private static final Parser abderaParser = Abdera.getNewParser();
+
+    private RuntimeWire wire;
+    private Invoker getFeedInvoker;
+    private Invoker getAllInvoker;
+    private Invoker queryInvoker;
+    private Invoker getInvoker;
+    private Invoker postInvoker;
+    private Invoker postMediaInvoker;
+    private Invoker putInvoker;
+    private Invoker putMediaInvoker;
+    private Invoker deleteInvoker;
+    private MessageFactory messageFactory;
+    private String title;
+    private Mediator mediator;
+    private DataType<?> itemClassType;
+    private DataType<?> itemXMLType;
+    private boolean supportsFeedEntries;
+
+    /**
+     * Constructs a new binding listener.
+     * 
+     * @param wire
+     * @param messageFactory
+     * @param feedType
+     */
+    GdataBindingListenerServlet(RuntimeWire wire, MessageFactory messageFactory, Mediator mediator, String title) {
+        this.wire = wire;
+        this.messageFactory = messageFactory;
+        this.mediator = mediator;
+        this.title = title;
+
+        // Get the invokers for the supported operations
+        Operation getOperation = null;
+        for (InvocationChain invocationChain : this.wire.getInvocationChains()) {
+            invocationChain.setAllowsPassByReference(true);
+            Operation operation = invocationChain.getTargetOperation();
+            String operationName = operation.getName();
+            if (operationName.equals("getFeed")) {
+
+                System.out.println("[Debug Info]GdataBindingListenerServlet constructor --- operation: getFeed");
+
+                getFeedInvoker = invocationChain.getHeadInvoker();
+
+            } else if (operationName.equals("getAll")) {
+
+                getAllInvoker = invocationChain.getHeadInvoker();
+
+            } else if (operationName.equals("query")) {
+                queryInvoker = invocationChain.getHeadInvoker();
+            } else if (operationName.equals("get")) {
+                System.out.println("[Debug Info]GdataBindingListenerServlet Constructor --- opeartion: get");
+                getInvoker = invocationChain.getHeadInvoker();
+                getOperation = operation;
+            } else if (operationName.equals("put")) {
+                putInvoker = invocationChain.getHeadInvoker();
+            } else if (operationName.equals("putMedia")) {
+                putMediaInvoker = invocationChain.getHeadInvoker();
+            } else if (operationName.equals("post")) {
+
+                System.out.println("[Debug Info]GdataBindingListenerServlet Constructor --- opeartion: post");
+                postInvoker = invocationChain.getHeadInvoker();
+
+            } else if (operationName.equals("postMedia")) {
+                postMediaInvoker = invocationChain.getHeadInvoker();
+            } else if (operationName.equals("delete")) {
+                deleteInvoker = invocationChain.getHeadInvoker();
+            }
+        }
+
+        System.out.println("[Debug Info]GdataBindingListenerServlet constructor --- I am good here 00");
+
+        // Determine the collection item type
+        itemXMLType = new DataTypeImpl<Class<?>>(String.class.getName(), String.class, String.class);
+        Class<?> itemClass = getOperation.getOutputType().getPhysical();
+
+        // if (itemClass == org.apache.abdera.model.Entry.class) {
+        if (itemClass == com.google.gdata.data.Entry.class) {
+            supportsFeedEntries = true;
+        }
+        DataType<XMLType> outputType = getOperation.getOutputType();
+        QName qname = outputType.getLogical().getElementName();
+        qname = new QName(qname.getNamespaceURI(), itemClass.getSimpleName());
+        itemClassType = new DataTypeImpl<XMLType>("java:complexType", itemClass, new XMLType(qname, null));
+
+        System.out.println("[Debug Info]GdataBindingListenerServlet constructor --- initilized!");
+    }
+
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+        // No authentication required for a get request
+        System.out.println("[Debug Info]GdataBindingListenerServlet doGet() --- I am good here 00");
+
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+
+        System.out.println("[Debug Info]GdataBindingListenerServlet doGet() --- request.getRequestURI():  " + request
+            .getRequestURI());
+        System.out.println("[Debug Info]GdataBindingListenerServlet doGet()--- path: " + path);
+
+        // FIXME: Log this get http request, commented out for testing
+        logger.fine("get " + request.getRequestURI());
+
+        // Handle an Atom request
+        if (path != null && path.equals("/atomsvc")) {
+            /*
+             * <?xml version='1.0' encoding='UTF-8'?> <service
+             * xmlns="http://www.w3.org/2007/app"
+             * xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title
+             * type="text">resource</atom:title> <collection
+             * href="http://luck.ibm.com:8084/customer"> <atom:title
+             * type="text">entries</atom:title>
+             * <accept>application/atom+xml;type=entry</accept> <categories />
+             * </collection> </workspace> </service>
+             */
+
+            System.out.println("GdataBindingListenerServlet doGet(): I am good here brach 01");
+            // Return the Atom service document
+            response.setContentType("application/atomsvc+xml; charset=utf-8");
+
+            Service service = abderaFactory.newService();
+            // service.setText("service");
+
+            Workspace workspace = abderaFactory.newWorkspace();
+            workspace.setTitle("resource");
+
+            String href = request.getRequestURL().toString();
+            href = href.substring(0, href.length() - "/atomsvc".length());
+
+            Collection collection = workspace.addCollection("collection", "atom/feed");
+            collection.setTitle("entries");
+            collection.setAttributeValue("href", href);
+            collection.setAccept("entry");
+            collection.addCategories().setFixed(false);
+
+            workspace.addCollection(collection);
+
+            service.addWorkspace(workspace);
+
+            // FIXME add prettyPrint support
+            try {
+                service.getDocument().writeTo(response.getOutputStream());
+            } catch (IOException ioe) {
+                throw new ServletException(ioe);
+            }
+
+        } else if (path == null || path.length() == 0 || path.equals("/")) {
+
+            // get HTTP request asking for a feed
+
+            System.out.println("[Debug Info]GdataBindingListenerServlet doGet() --- I am good here brach 02");
+
+            // Return a feed containing the entries in the collection
+            com.google.gdata.data.Feed feed = null;
+
+            if (supportsFeedEntries) {
+
+                System.out
+                    .println("[Debug Info]GdataBindingListenerServlet doGet() --- supportsFeedEntries: " + supportsFeedEntries);
+
+                // The service implementation supports feed entries, invoke its
+                // getFeed operation
+                Message requestMessage = messageFactory.createMessage();
+                Message responseMessage;
+                if (request.getQueryString() != null) {
+                    System.out.println("getQueryString != null");
+                    requestMessage.setBody(new Object[] {request.getQueryString()});
+                    responseMessage = queryInvoker.invoke(requestMessage);
+                } else {
+                    System.out.println("getQueryString == null");
+                    responseMessage = getFeedInvoker.invoke(requestMessage);
+                }
+                if (responseMessage.isFault()) {
+                    throw new ServletException((Throwable)responseMessage.getBody());
+                }
+
+                System.out.println("response msg class:" + responseMessage.getBody().getClass());
+
+                feed = (com.google.gdata.data.Feed)responseMessage.getBody();
+
+                System.out.println("feed title: " + feed.getTitle().getPlainText());
+
+            } else {
+
+                System.out.println("GdataBindingListenerServlet doGet(): do not supportsFeedEntries");
+
+                // The service implementation does not support feed entries,
+                // invoke its getAll operation to get the data item collection,
+                // then create
+                // feed entries from the items
+                Message requestMessage = messageFactory.createMessage();
+                Message responseMessage;
+                if (request.getQueryString() != null) {
+                    requestMessage.setBody(new Object[] {request.getQueryString()});
+                    responseMessage = queryInvoker.invoke(requestMessage);
+                } else {
+                    responseMessage = getAllInvoker.invoke(requestMessage);
+
+                    System.out
+                        .println("GdataBindingListner.doGet(): get msg from getAllInvoker.invoke()" + responseMessage
+                            .getBody().toString());
+
+                }
+                if (responseMessage.isFault()) {
+                    throw new ServletException((Throwable)responseMessage.getBody());
+                }
+                Entry<Object, Object>[] collection = (Entry<Object, Object>[])responseMessage.getBody();
+                if (collection != null) {
+
+                    // Create the feed
+                    feed = new com.google.gdata.data.Feed();
+
+                    // Set the feed title
+                    if (title != null) {
+                        feed.setTitle(new PlainTextConstruct(title));
+                    } else {
+                        feed.setTitle(new PlainTextConstruct("Feed title"));
+                    }
+
+                    // Add entries to the feed
+                    ArrayList<com.google.gdata.data.Entry> entries = new ArrayList<com.google.gdata.data.Entry>();
+                    for (Entry<Object, Object> entry : collection) {
+                        com.google.gdata.data.Entry feedEntry = feedEntry(entry, itemClassType, itemXMLType, mediator);
+                        entries.add(feedEntry);
+                    }
+                    feed.setEntries(entries);
+
+                }
+            }
+            if (feed != null) {
+
+                // //System.out.println("feed(from the http response)is not
+                // null");
+
+                // Write a GData feed using Atom representation
+                response.setContentType("application/atom+xml; charset=utf-8");
+
+                // Generate the corresponding Atom representation of the feed
+                StringWriter stringWriter = new StringWriter();
+                com.google.gdata.util.common.xml.XmlWriter w =
+                    new com.google.gdata.util.common.xml.XmlWriter(stringWriter);
+                feed.generateAtom(w, new ExtensionProfile());
+                w.flush();
+
+                // Write the Atom representation(XML) into Http response content
+                OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
+                PrintWriter out = new PrintWriter(response.getOutputStream());
+                out.println(stringWriter.toString());
+                out.close();
+
+                System.out.println("Feed content in plain text:" + stringWriter.toString());
+            } else {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            }
+
+        } else if (path.startsWith("/")) {
+
+            // get HTTP request asking for an entry
+
+            // Return a specific entry in the collection
+            com.google.gdata.data.Entry feedEntry = null;
+
+            // Invoke the get operation on the service implementation
+            Message requestMessage = messageFactory.createMessage();
+            String id = path.substring(1);
+            requestMessage.setBody(new Object[] {id});
+            Message responseMessage = getInvoker.invoke(requestMessage);
+            if (responseMessage.isFault()) {
+                throw new ServletException((Throwable)responseMessage.getBody());
+            }
+
+            if (supportsFeedEntries) {
+                // The service implementation returns a feed entry
+                feedEntry = (com.google.gdata.data.Entry)responseMessage.getBody();
+
+                System.out.println("entry title: " + feedEntry.getTitle().getPlainText());
+
+            } else {
+                // The service implementation only returns a data item, create
+                // an entry
+                // from it
+                Entry<Object, Object> entry = new Entry<Object, Object>(id, responseMessage.getBody());
+                // FIXME The line below needs to be fixed
+                // feedEntry = feedEntry(entry, itemClassType, itemXMLType,
+                // mediator, abderaFactory);
+            }
+
+            // Write the Atom entry
+            if (feedEntry != null) {
+
+                // Write a GData entry using Atom representation
+                response.setContentType("application/atom+xml; charset=utf-8");
+
+                // Generate the corresponding Atom representation of the feed
+                StringWriter stringWriter = new StringWriter();
+                com.google.gdata.util.common.xml.XmlWriter w =
+                    new com.google.gdata.util.common.xml.XmlWriter(stringWriter);
+                feedEntry.generateAtom(w, new ExtensionProfile());
+                w.flush();
+
+                // Write the Atom representation(XML) into Http response content
+                OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
+                PrintWriter out = new PrintWriter(response.getOutputStream());
+                out.println(stringWriter.toString());
+                out.close();
+
+            } else {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            }
+        } else {
+            // Path doesn't match any known pattern
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        }
+
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+        IOException {
+
+        System.out.println("[Debug Info]GdataBindingListenerServlet doPost() --- reached");
+
+        // Authenticate the user
+        String user = processAuthorizationHeader(request);
+        if (user == null) {
+            unauthorized(response);
+            return;
+        }
+
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+
+        System.out.println("[Debug Info]GdataBindingListenerServlet path --- " + path);
+
+        if (path == null || path.length() == 0 || path.equals("/")) {
+            // Create a new Gdata entry
+            com.google.gdata.data.Entry createdFeedEntry = null;
+            String contentType = request.getContentType();
+
+            if (contentType != null && contentType.startsWith("application/atom+xml")) {
+
+                // Read the entry from the request
+                com.google.gdata.data.Entry feedEntry = null;
+                try {
+                    ParseSource source = new ParseSource(request.getReader());
+                    feedEntry = com.google.gdata.data.Entry.readEntry(source, com.google.gdata.data.Entry.class, null);
+
+                    /*
+                     * Document<org.apache.abdera.model.Entry> doc =
+                     * abderaParser.parse(request.getReader()); feedEntry =
+                     * doc.getRoot();
+                     */
+                } catch (ParseException pe) {
+                    throw new ServletException(pe);
+
+                } catch (com.google.gdata.util.ParseException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                } catch (ServiceException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+
+                // Let the component implementation create it
+                if (supportsFeedEntries) {
+
+                    // The service implementation supports feed entries, pass
+                    // the entry to it
+                    Message requestMessage = messageFactory.createMessage();
+
+                    requestMessage.setBody(new Object[] {feedEntry});
+
+                    Message responseMessage = postInvoker.invoke(requestMessage);
+                    if (responseMessage.isFault()) {
+                        throw new ServletException((Throwable)responseMessage.getBody());
+                    }
+                    createdFeedEntry = responseMessage.getBody();
+                } else {
+
+                    // The service implementation does not support feed entries,
+                    // pass the data item to it
+                    Message requestMessage = messageFactory.createMessage();
+                    Entry<Object, Object> entry = entry(feedEntry, itemClassType, itemXMLType, mediator);
+                    requestMessage.setBody(new Object[] {entry.getKey(), entry.getData()});
+                    Message responseMessage = postInvoker.invoke(requestMessage);
+                    if (responseMessage.isFault()) {
+                        throw new ServletException((Throwable)responseMessage.getBody());
+                    }
+                    entry.setKey(responseMessage.getBody());
+
+                    createdFeedEntry = feedEntry(entry, itemClassType, itemXMLType, mediator);
+                }
+
+            } else if (contentType != null) {
+
+                // Create a new media entry
+
+                // Get incoming headers
+                String title = request.getHeader("Title");
+                String slug = request.getHeader("Slug");
+
+                // Let the component implementation create the media entry
+                Message requestMessage = messageFactory.createMessage();
+                requestMessage.setBody(new Object[] {title, slug, contentType, request.getInputStream()});
+                Message responseMessage = postMediaInvoker.invoke(requestMessage);
+                if (responseMessage.isFault()) {
+                    throw new ServletException((Throwable)responseMessage.getBody());
+                }
+                createdFeedEntry = responseMessage.getBody();
+            } else {
+                response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+            }
+
+            // A new entry was created successfully
+            if (createdFeedEntry != null) {
+
+                // Set location of the created entry in the Location header
+                // Link link = createdFeedEntry.getSelfLink();
+                // if (link != null) {
+                // response.addHeader("Location", link.getHref().toString());
+                // }
+
+                // Write the created Atom entry
+                response.setStatus(HttpServletResponse.SC_CREATED);
+                response.setContentType("application/atom+xml; charset=utf-8");
+                try {
+
+                    // Generate the corresponding Atom representation of the
+                    // feed
+                    StringWriter stringWriter = new StringWriter();
+                    com.google.gdata.util.common.xml.XmlWriter w =
+                        new com.google.gdata.util.common.xml.XmlWriter(stringWriter);
+                    createdFeedEntry.generateAtom(w, new ExtensionProfile());
+                    w.flush();
+
+                    // Write the Atom representation(XML) into Http response
+                    // content
+                    OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
+                    PrintWriter out = new PrintWriter(response.getOutputStream());
+                    out.println(stringWriter.toString());
+                    out.close();
+
+                } catch (ParseException pe) {
+                    throw new ServletException(pe);
+                }
+
+            } else {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            }
+
+        } else {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        }
+    }
+
+    private Writer getWriter(HttpServletResponse response) throws UnsupportedEncodingException, IOException {
+        Writer writer = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
+        return writer;
+    }
+
+    @Override
+    protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+        // Authenticate the user
+        String user = processAuthorizationHeader(request);
+        if (user == null) {
+            unauthorized(response);
+            return;
+        }
+
+        // Get the request path
+        String path = request.getRequestURI().substring(request.getServletPath().length());
+
+        if (path != null && path.startsWith("/")) {
+            String id = path.substring(1);
+
+            // Update an Atom entry
+            String contentType = request.getContentType();
+            if (contentType != null && contentType.startsWith("application/atom+xml")) {
+
+                // Read the entry from the request
+                org.apache.abdera.model.Entry feedEntry;
+                try {
+                    Document<org.apache.abdera.model.Entry> doc = abderaParser.parse(request.getReader());
+                    feedEntry = doc.getRoot();
+                } catch (ParseException pe) {
+                    throw new ServletException(pe);
+                }
+
+                // Let the component implementation create it
+                if (supportsFeedEntries) {
+
+                    // The service implementation supports feed entries, pass
+                    // the entry to it
+                    Message requestMessage = messageFactory.createMessage();
+                    requestMessage.setBody(new Object[] {id, feedEntry});
+                    Message responseMessage = putInvoker.invoke(requestMessage);
+                    if (responseMessage.isFault()) {
+                        Object body = responseMessage.getBody();
+                        if (body.getClass().getName().endsWith(".NotFoundException")) {
+                            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                        } else {
+                            throw new ServletException((Throwable)responseMessage.getBody());
+                        }
+                    }
+                } else {
+
+                    // The service implementation does not support feed entries,
+                    // pass the data item to it
+                    Message requestMessage = messageFactory.createMessage();
+                    Entry<Object, Object> entry = entry(feedEntry, itemClassType, itemXMLType, mediator);
+                    requestMessage.setBody(new Object[] {entry.getKey(), entry.getData()});
+                    Message responseMessage = putInvoker.invoke(requestMessage);
+                    if (responseMessage.isFault()) {
+                        Object body = responseMessage.getBody();
+                        if (body.getClass().getName().endsWith(".NotFoundException")) {
+                            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                        } else {
+                            throw new ServletException((Throwable)responseMessage.getBody());
+                        }
+                    }
+                }
+
+            } else if (contentType != null) {
+
+                // Updated a media entry
+
+                // Let the component implementation create the media entry
+                Message requestMessage = messageFactory.createMessage();
+                requestMessage.setBody(new Object[] {id, contentType, request.getInputStream()});
+                Message responseMessage = putMediaInvoker.invoke(requestMessage);
+                Object body = responseMessage.getBody();
+                if (responseMessage.isFault()) {
+                    if (body.getClass().getName().endsWith(".NotFoundException")) {
+                        response.sendError(HttpServletResponse.SC_NOT_FOUND);
+                    } else {
+                        throw new ServletException((Throwable)responseMessage.getBody());
+                    }
+                }
+            } else {
+                response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+            }
+        } else {
+            response.sendError(HttpServletResponse.SC_NOT_FOUND);
+        }
+    }
+
+    @Override
+    protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException,
+        IOException {
+
+        // Authenticate the user
+        String user = processAuthorizationHeader(request);
+        if (user == null) {
+            unauthorized(response);
+            return;
+        }
+
+        // Get the request path
+        String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
+
+        String id;
+        if (path != null && path.startsWith("/")) {
+            id = path.substring(1);
+        } else {
+            id = "";
+        }
+
+        // Delete a specific entry from the collection
+        Message requestMessage = messageFactory.createMessage();
+        requestMessage.setBody(new Object[] {id});
+        Message responseMessage = deleteInvoker.invoke(requestMessage);
+        if (responseMessage.isFault()) {
+            Object body = responseMessage.getBody();
+            if (body.getClass().getName().endsWith(".NotFoundException")) {
+                response.sendError(HttpServletResponse.SC_NOT_FOUND);
+            } else {
+                throw new ServletException((Throwable)responseMessage.getBody());
+            }
+        }
+    }
+
+    /**
+     * Process the authorization header
+     * 
+     * @param request
+     * @return
+     * @throws ServletException
+     */
+    private String processAuthorizationHeader(HttpServletRequest request) throws ServletException {
+
+        // FIXME temporarily disabling this as it doesn't work with all browsers
+        if (true)
+            return "admin";
+
+        try {
+            String authorization = request.getHeader("Authorization");
+            if (authorization != null) {
+                StringTokenizer tokens = new StringTokenizer(authorization);
+                if (tokens.hasMoreTokens()) {
+                    String basic = tokens.nextToken();
+                    if (basic.equalsIgnoreCase("Basic")) {
+                        String credentials = tokens.nextToken();
+                        String userAndPassword = new String(Base64.decodeBase64(credentials.getBytes()));
+                        int colon = userAndPassword.indexOf(":");
+                        if (colon != -1) {
+                            String user = userAndPassword.substring(0, colon);
+                            String password = userAndPassword.substring(colon + 1);
+
+                            // Authenticate the User.
+                            if (authenticate(user, password)) {
+                                return user;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new ServletException(e);
+        }
+        return null;
+    }
+
+    /**
+     * Authenticate a user.
+     * 
+     * @param user
+     * @param password
+     * @return
+     */
+    private boolean authenticate(String user, String password) {
+        // TODO Handle this using SCA security policies
+        return ("admin".equals(user) && "admin".equals(password));
+    }
+
+    /**
+     * Reject an unauthorized request.
+     * 
+     * @param response
+     */
+    private void unauthorized(HttpServletResponse response) throws IOException {
+        response.setHeader("WWW-Authenticate", "BASIC realm=\"Tuscany\"");
+        response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+    }
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingListenerServlet.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata.provider;
+
+import org.apache.tuscany.sca.binding.gdata.GdataBinding;
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.databinding.TransformerExtensionPoint;
+import org.apache.tuscany.sca.databinding.impl.MediatorImpl;
+import org.apache.tuscany.sca.host.http.ServletHost;
+import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint;
+import org.apache.tuscany.sca.invocation.MessageFactory;
+import org.apache.tuscany.sca.provider.BindingProviderFactory;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+
+/**
+ * Implementation of a Binding provider factory for the Atom binding.
+ */
+public class GdataBindingProviderFactory implements BindingProviderFactory<GdataBinding> {
+
+    private MessageFactory messageFactory;
+    private Mediator mediator;
+    private ServletHost servletHost;
+
+    public GdataBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
+        ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class);
+        this.servletHost = servletHosts.getServletHosts().get(0);
+        ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
+        this.messageFactory = modelFactories.getFactory(MessageFactory.class);
+        this.mediator =
+            new MediatorImpl(extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class), extensionPoints
+                .getExtensionPoint(TransformerExtensionPoint.class));
+    }
+
+    public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component,
+                                                                   RuntimeComponentReference reference,
+                                                                   GdataBinding binding) {
+        return new GdataReferenceBindingProvider(component, reference, binding, mediator);
+    }
+
+    public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component,
+                                                               RuntimeComponentService service,
+                                                               GdataBinding binding) {
+        return new GdataServiceBindingProvider(component, service, binding, servletHost, messageFactory, mediator);
+    }
+
+    public Class<GdataBinding> getModelType() {
+        return GdataBinding.class;
+    }
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingProviderFactory.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,346 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata.provider;
+
+import java.util.Date;
+
+import org.apache.abdera.factory.Factory;
+import org.apache.abdera.model.Content;
+import org.apache.abdera.model.Link;
+
+// To-Change
+// import com.google.gdata.data.Entry;
+// import com.google.gdata.data.Feed;
+// import com.google.gdata.data.Link;
+
+import org.apache.tuscany.sca.data.collection.Entry;
+import org.apache.tuscany.sca.data.collection.Item;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
+
+import com.google.gdata.data.DateTime;
+import com.google.gdata.data.PlainTextConstruct;
+import com.google.gdata.data.TextContent;
+
+/**
+ * Utility methods used in this package.
+ * 
+ */
+class GdataBindingUtil {
+
+    /**
+     * Create a data item from an Atom entry.
+     * 
+     * @param feedEntry
+     * @param itemClassType
+     * @param itemXMLType
+     * @param mediator
+     * @return
+     */
+    // To-Change: org.apache.abdera.model.Entry --> com.google.gdata.data.Entry
+    static Entry<Object, Object> entry(org.apache.abdera.model.Entry feedEntry,
+                                       DataType<?> itemClassType,
+                                       DataType<?> itemXMLType,
+                                       Mediator mediator) {
+        if (feedEntry != null) {
+            if (itemClassType.getPhysical() == Item.class) {
+                String key = feedEntry.getId().toString();
+
+                Item item = new Item();
+                item.setTitle(feedEntry.getTitle());
+                item.setContents(feedEntry.getContent());
+
+                for (Link link : feedEntry.getLinks()) {
+                    if (link.getRel() == null || "self".equals(link.getRel())) {
+                        if (item.getLink() == null) {
+                            item.setLink(link.getHref().toString());
+                        }
+                    } else if ("related".equals(link.getRel())) {
+                        item.setRelated(link.getHref().toString());
+                    } else if ("alternate".equals(link.getRel())) {
+                        item.setAlternate(link.getHref().toString());
+                    }
+                }
+
+                item.setDate(feedEntry.getUpdated());
+                return new Entry<Object, Object>(key, item);
+
+                // To-change
+                // Get feed information from feedEntry and create a new Entry
+                // For GDtata, the corresponding methods are different such as
+                // getTitle(), getContent(), getUpdated() and getLinks()
+                // I am going to use Gdata Entry(com.google.gdata.data.Entry)
+                // and modify accordingly
+
+            } else {
+                String key = null;
+                if (feedEntry.getId() != null) {
+                    key = feedEntry.getId().toString();
+                }
+
+                // Create the item from XML
+                if (feedEntry.getContentElement().getElements().size() == 0) {
+                    return null;
+                }
+
+                String value = feedEntry.getContent();
+                Object data = mediator.mediate(value, itemXMLType, itemClassType, null);
+
+                return new Entry<Object, Object>(key, data);
+
+                // To-change
+                // For GDtata, feedEntry.getContent() will return a
+                // content(com.google.gdata.data.Content)
+                // mediator.mediate needs to be changed accordingly
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Create an Atom entry for a key and item from a collection.
+     * 
+     * @param entry
+     * @param itemClassType
+     * @param itemXMLType
+     * @param mediator
+     * @param factory
+     * @return
+     */
+
+    // To-Change: org.apache.abdera.model.Entry --> com.google.gdata.data.Entry
+    static org.apache.abdera.model.Entry feedEntry(Entry<Object, Object> entry,
+                                                   DataType<?> itemClassType,
+                                                   DataType<?> itemXMLType,
+                                                   Mediator mediator,
+                                                   Factory factory) {
+        Object key = entry.getKey();
+        Object data = entry.getData();
+        if (data instanceof Item) {
+            Item item = (Item)data;
+
+            org.apache.abdera.model.Entry feedEntry = factory.newEntry();
+            if (key != null) {
+                feedEntry.setId(key.toString());
+            }
+            feedEntry.setTitle(item.getTitle());
+            feedEntry.setContentAsHtml(item.getContents());
+
+            String href = item.getLink();
+            if (href == null && key != null) {
+                href = key.toString();
+            }
+
+            if (href != null) {
+                feedEntry.addLink(href);
+            }
+            String related = item.getRelated();
+            if (related != null) {
+                feedEntry.addLink(related, "related");
+            }
+            String alternate = item.getAlternate();
+            if (alternate != null) {
+                feedEntry.addLink(alternate, "alternate");
+            }
+
+            Date date = item.getDate();
+            if (date != null) {
+                feedEntry.setUpdated(date);
+            }
+            return feedEntry;
+
+            // To-change
+            // Get feed information from collection.item and create a new Gdata
+            // Entry
+            // For GDtata, the corresponding methods are quite different such as
+            // setTitle(), setContent(), setUpdated(), addLink()
+            //
+            // For example:
+            // entry.setTitle(new PlainTextConstruct("title_"));
+            // entry.setContent(new PlainTextConstruct("content_"));
+            // entry.setUpdated(DateTime.now());
+            // entry.addHtmlLink("http://www.google.com", "languageType",
+            // "title");
+            //
+            // I am going to use Gdata Entry(com.google.gdata.data.Entry) and
+            // modify accordingly
+
+        } else if (data != null) {
+            org.apache.abdera.model.Entry feedEntry = factory.newEntry();
+            feedEntry.setId(key.toString());
+            feedEntry.setTitle("item");
+
+            // Convert the item to XML
+            String value = mediator.mediate(data, itemClassType, itemXMLType, null).toString();
+
+            Content content = factory.newContent();
+            content.setContentType(Content.Type.XML);
+            content.setValue(value);
+
+            feedEntry.setContentElement(content);
+
+            feedEntry.addLink(key.toString());
+
+            return feedEntry;
+
+            // To-change
+            // Get feed information from XML data(item to XML first via
+            // mediator)
+            // and create a new Gdata Entry
+            // Modify GData Entry set methods accordingly
+
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Create a data item from an Gdata entry.
+     * 
+     * @param feedEntry
+     * @param itemClassType
+     * @param itemXMLType
+     * @param mediator
+     * @return
+     */
+    static Entry<Object, Object> entry(com.google.gdata.data.Entry feedEntry,
+                                       DataType<?> itemClassType,
+                                       DataType<?> itemXMLType,
+                                       Mediator mediator) {
+        if (feedEntry != null) {
+            if (itemClassType.getPhysical() == Item.class) {
+                String key = feedEntry.getId().toString();
+
+                Item item = new Item();
+                item.setTitle(feedEntry.getTitle().toString());
+                TextContent content = (TextContent)feedEntry.getContent();
+                item.setContents(content.getContent().getPlainText());
+
+                for (com.google.gdata.data.Link link : feedEntry.getLinks()) {
+                    if (link.getRel() == null || "self".equals(link.getRel())) {
+                        if (item.getLink() == null) {
+                            item.setLink(link.getHref().toString());
+                        }
+                    } else if ("related".equals(link.getRel())) {
+                        item.setRelated(link.getHref().toString());
+                    } else if ("alternate".equals(link.getRel())) {
+                        item.setAlternate(link.getHref().toString());
+                    }
+                }
+
+                Date date = new Date(feedEntry.getUpdated().getValue());
+                item.setDate(date);
+                return new Entry<Object, Object>(key, item);
+
+            } else {
+                String key = null;
+                if (feedEntry.getId() != null) {
+                    key = feedEntry.getId();
+                }
+
+                // Create the item from XML
+                if (feedEntry.getContent() == null) {
+                    return null;
+                }
+
+                TextContent content = (TextContent)feedEntry.getContent();
+                String value = content.getContent().getPlainText();
+                Object data = mediator.mediate(value, itemXMLType, itemClassType, null);
+                return new Entry<Object, Object>(key, data);
+            }
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Create an Gdata entry for a key and item from a collection.
+     * 
+     * @param entry
+     * @param itemClassType
+     * @param itemXMLType
+     * @param mediator
+     * @param factory
+     * @return
+     */
+    static com.google.gdata.data.Entry feedEntry(Entry<Object, Object> entry,
+                                                 DataType<?> itemClassType,
+                                                 DataType<?> itemXMLType,
+                                                 Mediator mediator) {
+
+        Object key = entry.getKey();
+        Object data = entry.getData();
+        if (data instanceof Item) {
+            Item item = (Item)data;
+
+            com.google.gdata.data.Entry feedEntry = new com.google.gdata.data.Entry();
+            if (key != null) {
+                feedEntry.setId(key.toString());
+            }
+            feedEntry.setTitle(new PlainTextConstruct(item.getTitle()));
+            feedEntry.setContent(new PlainTextConstruct(item.getContents()));
+
+            String href = item.getLink();
+            if (href == null && key != null) {
+                href = key.toString();
+            }
+
+            if (href != null) {
+                feedEntry.addHtmlLink(href, "", "");
+            }
+            String related = item.getRelated();
+            if (related != null) {
+                feedEntry.addHtmlLink(related, "", "related");
+            }
+            String alternate = item.getAlternate();
+            if (alternate != null) {
+                feedEntry.addHtmlLink(alternate, "", "alternate");
+            }
+
+            Date date = item.getDate();
+            if (date != null) {
+                DateTime datetime = new DateTime(date);
+                feedEntry.setUpdated(datetime);
+            }
+            return feedEntry;
+
+        } else if (data != null) {
+
+            com.google.gdata.data.Entry feedEntry = new com.google.gdata.data.Entry();
+            feedEntry.setId(key.toString());
+            feedEntry.setTitle(new PlainTextConstruct("item"));
+
+            // Convert the item to XML
+            String value = mediator.mediate(data, itemClassType, itemXMLType, null).toString();
+
+            // Might be wrong because the example uses XML datatype, I am using
+            // plainText here
+            feedEntry.setContent(new PlainTextConstruct(value));
+
+            feedEntry.addHtmlLink(key.toString(), "", "");
+            return feedEntry;
+
+        } else {
+            return null;
+        }
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataBindingUtil.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata.provider;
+
+import java.net.URI;
+
+import javax.xml.namespace.QName;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.httpclient.Credentials;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpConnectionManager;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.tuscany.sca.binding.gdata.GdataBinding;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.interfacedef.DataType;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.interfacedef.Operation;
+import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
+import org.apache.tuscany.sca.interfacedef.util.XMLType;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
+
+/**
+ * Implementation of the Atom binding provider.
+ * 
+ * @version $Rev$ $Date$
+ */
+class GdataReferenceBindingProvider implements ReferenceBindingProvider {
+
+    private RuntimeComponentReference reference;
+    private GdataBinding binding;
+    private String authorizationHeader;
+    private HttpClient httpClient;
+    private Mediator mediator;
+    private DataType<?> itemClassType;
+    private DataType<?> itemXMLType;
+    private boolean supportsFeedEntries;
+
+    /**
+     * Constructs a new AtomReferenceBindingProvider
+     * 
+     * @param component
+     * @param reference
+     * @param binding
+     * @param mediator
+     */
+    GdataReferenceBindingProvider(RuntimeComponent component,
+                                  RuntimeComponentReference reference,
+                                  GdataBinding binding,
+                                  Mediator mediator) {
+        this.reference = reference;
+        this.binding = binding;
+        this.mediator = mediator;
+
+        // Prepare authorization header
+        String authorization = "admin" + ":" + "admin";
+        authorizationHeader = "Basic " + new String(Base64.encodeBase64(authorization.getBytes()));
+
+        // Create an HTTP client
+        HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
+        connectionManager.getParams().setDefaultMaxConnectionsPerHost(10);
+        connectionManager.getParams().setConnectionTimeout(60000);
+        httpClient = new HttpClient(connectionManager);
+    }
+
+    public Invoker createInvoker(Operation operation) {
+
+        String operationName = operation.getName();
+
+        // //System.out.println("GdataReferenceBindingProvider.createInvoker---operationName:"
+        // + operationName);
+
+        if (operationName.equals("get")) {
+
+            // Determine the collection item type
+            itemXMLType = new DataTypeImpl<Class<?>>(String.class.getName(), String.class, String.class);
+            Class<?> itemClass = operation.getOutputType().getPhysical();
+            DataType<XMLType> outputType = operation.getOutputType();
+            QName qname = outputType.getLogical().getElementName();
+            qname = new QName(qname.getNamespaceURI(), itemClass.getSimpleName());
+            itemClassType = new DataTypeImpl<XMLType>("java:complexType", itemClass, new XMLType(qname, null));
+
+            // To-change
+            // org.apache.abdera.model.Entry --> com.google.gdata.data.Entry;
+
+            if (itemClassType.getPhysical() == com.google.gdata.data.Entry.class) {
+                supportsFeedEntries = true;
+            }
+
+            // //System.out.println("GdataReferenceBindingProvider.createInvoker---operation=get");
+            return new GdataBindingInvoker.GetInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                      this);
+
+        } else if (operationName.equals("post")) {
+
+            // //System.out.println("GdataReferenceBindingProvider CreateInvoker
+            // --- post");
+            return new GdataBindingInvoker.PostInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                       this);
+
+        } else if (operationName.equals("put")) {
+
+            return new GdataBindingInvoker.PutInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                      this);
+        } else if (operationName.equals("delete")) {
+            return new GdataBindingInvoker.DeleteInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                         this);
+        } else if (operationName.equals("getFeed") || operationName.equals("getAll")) {
+
+            // //System.out.println("GdataReferenceBindingProvider
+            // CreateInvoker: getFeed or getAll");
+
+            return new GdataBindingInvoker.GetAllInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                         this);
+
+        } else if (operationName.equals("postMedia")) {
+            return new GdataBindingInvoker.PostMediaInvoker(operation, binding.getURI(), httpClient,
+                                                            authorizationHeader, this);
+        } else if (operationName.equals("putMedia")) {
+            return new GdataBindingInvoker.PutMediaInvoker(operation, binding.getURI(), httpClient,
+                                                           authorizationHeader, this);
+        } else if (operationName.equals("query")) {
+            return new GdataBindingInvoker.QueryInvoker(operation, binding.getURI(), httpClient, authorizationHeader,
+                                                        this);
+        }
+
+        return new GdataBindingInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this);
+    }
+
+    public InterfaceContract getBindingInterfaceContract() {
+        return reference.getInterfaceContract();
+    }
+
+    public void start() {
+
+        // Configure the HTTP client credentials
+        Credentials credentials = new UsernamePasswordCredentials("admin", "admin");
+        httpClient.getParams().setAuthenticationPreemptive(true);
+        URI uri = URI.create(binding.getURI());
+        httpClient.getState().setCredentials(new AuthScope(uri.getHost(), uri.getPort()), credentials);
+
+        // Find the get operation on the reference interface
+        if (true) {
+            return;
+        }
+    }
+
+    public void stop() {
+
+    }
+
+    public boolean supportsOneWayInvocation() {
+        return false;
+    }
+
+    /**
+     * Returns the mediator.
+     * 
+     * @return
+     */
+    Mediator getMediator() {
+        return mediator;
+    }
+
+    /**
+     * Returns the item class type.
+     * 
+     * @return
+     */
+    DataType<?> getItemClassType() {
+        return itemClassType;
+    }
+
+    /**
+     * Returns the item XML type.
+     * 
+     * @return
+     */
+    DataType<?> getItemXMLType() {
+        return itemXMLType;
+    }
+
+    /**
+     * Returns true if the invoker should work with Atom feed entries.
+     * 
+     * @return
+     */
+    boolean supportsFeedEntries() {
+        return supportsFeedEntries;
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataReferenceBindingProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata.provider;
+
+import org.apache.tuscany.sca.binding.gdata.GdataBinding;
+import org.apache.tuscany.sca.databinding.Mediator;
+import org.apache.tuscany.sca.host.http.ServletHost;
+import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.invocation.MessageFactory;
+import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
+import org.apache.tuscany.sca.runtime.RuntimeWire;
+
+/**
+ * Implementation of the Atom binding provider.
+ * 
+ * @version $Rev$ $Date$
+ */
+class GdataServiceBindingProvider implements ServiceBindingProvider {
+
+    private RuntimeComponentService service;
+    private GdataBinding binding;
+    private ServletHost servletHost;
+    private MessageFactory messageFactory;
+    private String servletMapping;
+    private Mediator mediator;
+
+    GdataServiceBindingProvider(RuntimeComponent component,
+                                RuntimeComponentService service,
+                                GdataBinding binding,
+                                ServletHost servletHost,
+                                MessageFactory messageFactory,
+                                Mediator mediator) {
+        this.service = service;
+        this.binding = binding;
+        this.servletHost = servletHost;
+        this.messageFactory = messageFactory;
+        this.mediator = mediator;
+    }
+
+    public InterfaceContract getBindingInterfaceContract() {
+        return service.getInterfaceContract();
+    }
+
+    public boolean supportsOneWayInvocation() {
+        return false;
+    }
+
+    public void start() {
+        RuntimeComponentService componentService = (RuntimeComponentService)service;
+        RuntimeWire wire = componentService.getRuntimeWire(binding);
+
+        GdataBindingListenerServlet servlet =
+            new GdataBindingListenerServlet(wire, messageFactory, mediator, binding.getTitle());
+
+        servletMapping = binding.getURI();
+        if (!servletMapping.endsWith("/")) {
+            servletMapping += "/";
+        }
+        if (!servletMapping.endsWith("*")) {
+            servletMapping += "*";
+        }
+        servletHost.addServletMapping(servletMapping, servlet);
+
+        // Save the actual binding URI in the binding
+        binding.setURI(servletHost.getURLMapping(binding.getURI()).toString());
+    }
+
+    public void stop() {
+        servletHost.removeServletMapping(servletMapping);
+    }
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GdataServiceBindingProvider.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.BindingProviderFactory Thu Jul 10 23:11:24 2008
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you 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. 
+
+# Implementation class for the binding extension
+org.apache.tuscany.sca.binding.gdata.provider.GdataBindingProviderFactory;model=org.apache.tuscany.sca.binding.gdata.GdataBinding

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd Thu Jul 10 23:11:24 2008
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.    
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema" 
+    targetNamespace="http://echo" 
+    xmlns:sca="http://www.osoa.org/xmlns/sca/1.0"
+    xmlns:e="http://echo" 
+    elementFormDefault="qualified">
+
+    <import namespace="http://www.osoa.org/xmlns/sca/1.0"/>
+
+    <element name="binding.gdata" type="e:GdataBinding"/>
+    
+    <complexType name="GdataBinding">
+        <complexContent>
+            <extension base="sca:Binding">
+            </extension>
+        </complexContent>
+    </complexType>
+</schema>

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/main/resources/tuscany-binding-gdata.xsd
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata;
+
+import org.apache.tuscany.sca.host.embedded.SCADomain;
+
+public class Consumer {
+
+    public static void main(String[] args) throws Exception {
+
+        SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/gdata/Consumer.composite");
+
+        CustomerClient testService = scaDomain.getService(CustomerClient.class, "CustomerClient");
+
+        //testService.testCustomerCollection();
+
+        testService.testGetFeed(); // Tested, worked
+        testService.testGetEntry(); // Tested, worked
+        testService.testPost(); // Tested, worked
+        testService.testGetFeed(); // Tested, worked
+
+        scaDomain.close();
+    }
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/Consumer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata;
+
+public interface CustomerClient {
+
+    // void testCustomerCollection() throws Exception;
+
+    void testGetFeed() throws Exception;
+
+    void testGetEntry() throws Exception;
+
+    void testPost() throws Exception;
+
+    // void testCustomerGetEntry() throws Exception;
+
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClient.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java?rev=675836&view=auto
==============================================================================
--- tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java (added)
+++ tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java Thu Jul 10 23:11:24 2008
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.tuscany.sca.binding.gdata;
+
+import org.apache.abdera.Abdera;
+import org.apache.tuscany.sca.binding.gdata.collection.Collection;
+import org.osoa.sca.annotations.Reference;
+
+import com.google.gdata.data.DateTime;
+import com.google.gdata.data.Entry;
+import com.google.gdata.data.PlainTextConstruct;
+
+public class CustomerClientImpl implements CustomerClient {
+
+    protected final Abdera abdera = new Abdera();
+
+    @Reference
+    public Collection resourceCollection;
+
+    // Test Collection.getFeed()
+    public void testGetFeed() throws Exception {
+        // Get all the entries from the provider
+        System.out.println("\n\n+++++++++++ get the feed from the provider service +++++++++++");
+        com.google.gdata.data.Feed feed = resourceCollection.getFeed();
+        System.out.println("\n\n\n!!!Fetched feed title:  " + feed.getTitle().getPlainText());
+        int i = 0;
+        for (Object o : feed.getEntries()) {
+            com.google.gdata.data.Entry e = (com.google.gdata.data.Entry)o;
+            System.out.print("Entry" + i + "\t");
+            System.out.println(" id = " + e.getId() + "\t title = " + e.getTitle().getPlainText());
+            i++;
+        }
+        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+        System.out.println("\n\n\n");
+    }
+
+    // Test Collection.get(entryID)
+    public void testGetEntry() throws Exception {
+
+        // Get an existing entry based on its id
+        System.out.println("+++++++++++ get an existing entry from the provider service +++++++++++");
+        System.out.println(">>> get an entry based on its id");
+        Entry entry = resourceCollection.get("urn:uuid:customer-0");
+        System.out.println("\n\n\n!!! Entry retrieved with id=" + entry.getId()
+            + " title="
+            + entry.getTitle().getPlainText());
+        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
+        System.out.println("\n\n\n");
+
+    }
+
+    // Test Collection.post(newEntry)
+    public void testPost() throws Exception {
+
+        // Put a new entry to the provider
+        System.out.println("+++++++++++ post a new entry to the provider service +++++++++++");
+        Entry newEntry = new Entry();
+        newEntry.setTitle(new PlainTextConstruct("NewEntry title"));
+        newEntry.setContent(new PlainTextConstruct("NewEntry Content"));
+        System.out.println(">>> post a new entry:  title=" + newEntry.getTitle().getPlainText());
+        Entry confirmedNewEntry = resourceCollection.post(newEntry);
+        System.out.println("!!! New entry posted with id=" + confirmedNewEntry.getId()
+            + " title="
+            + confirmedNewEntry.getTitle());
+        System.out.println("\n");
+    }
+
+    /*
+     * public void testCustomerCollection() throws Exception { //Put a new entry
+     * to the provider System.out.println("\n\n+++++++++++ post a new entry to
+     * the provider service +++++++++++"); Entry newEntry =
+     * newEntry("newtitle"); newEntry.addAuthor("newAuthor");
+     * System.out.println(">>> post a new entry: title=" + newEntry.getTitle() + "
+     * author=" + newEntry.getAuthor().getName()); newEntry =
+     * resourceCollection.post(newEntry); System.out.println("!!! New entry
+     * posted with id=" + newEntry.getId() + " title=" + newEntry.getTitle());
+     * System.out.println("\n"); //Put a new entry to the provider
+     * System.out.println("+++++++++++ post a new entry to the provider service
+     * +++++++++++"); newEntry = newEntry("newtitleTemp");
+     * newEntry.addAuthor("newAuthorTemp"); System.out.println(">>> post a new
+     * entry: title=" + newEntry.getTitle() + " author=" +
+     * newEntry.getAuthor().getName()); newEntry =
+     * resourceCollection.post(newEntry); System.out.println("!!! New entry
+     * posted with id=" + newEntry.getId() + " title=" + newEntry.getTitle());
+     * System.out.println("\n"); //Get an existing entry based on its id
+     * System.out.println("+++++++++++ get an existing entry from the provider
+     * service +++++++++++"); System.out.println(">>> get an entry based on its
+     * id"); Entry entry = resourceCollection.get(newEntry.getId().toString());
+     * System.out.println("!!! Entry retrieved with id=" + entry.getId() + "
+     * title=" + entry.getTitle()); System.out.println("\n"); //Update an
+     * existing entry based on its id System.out.println("+++++++++++ update an
+     * existing entry in the provider service +++++++++++");
+     * System.out.println(">>> put id=" + entry.getId() + "
+     * title=updatedTitle"); resourceCollection.put(entry.getId().toString(),
+     * updateEntry(entry, "updatedTitle")); System.out.println("!!! Updated
+     * entry with id=" + entry.getId() + " title=" + entry.getTitle());
+     * System.out.println("\n"); System.out.println("+++++++++++ delete an
+     * existing entry from the provider service +++++++++++");
+     * System.out.println(">>> delete id=" + entry.getId());
+     * resourceCollection.delete(entry.getId().toString());
+     * System.out.println("!!! entry deleted"); //Get all the entries from the
+     * provider System.out.println("\n\n+++++++++++ get all the entries from the
+     * provider service +++++++++++"); Feed feed = resourceCollection.getFeed();
+     * int i=0; for (Object o : feed.getEntries()) { Entry e = (Entry)o;
+     * System.out.print("Entry" + i + "\t"); System.out.println(" id = " +
+     * e.getId() + "\t title = " + e.getTitle()+ "\t author = " +
+     * e.getAuthor().getName()); i++; } }
+     */
+
+    private Entry newEntry(String value) {
+        /*
+         * Entry entry = this.abdera.newEntry(); entry.setTitle(value); Content
+         * content = this.abdera.getFactory().newContent();
+         * content.setContentType(Content.Type.TEXT); content.setValue(value);
+         * entry.setContentElement(content);
+         */
+
+        Entry entry = new Entry();
+        entry.setTitle(new PlainTextConstruct(value));
+        entry.setContent(new PlainTextConstruct(value));
+        entry.setUpdated(DateTime.now());
+        // entry.addHtmlLink("http://www.google.com", "languageType", "title");
+        return entry;
+    }
+
+    private Entry updateEntry(Entry entry, String value) {
+        /*
+         * entry.setTitle(value); Content content =
+         * this.abdera.getFactory().newContent();
+         * content.setContentType(Content.Type.TEXT); content.setValue(value);
+         * entry.setContentElement(content);
+         */
+        entry.setTitle(new PlainTextConstruct("Entry title: " + value));
+        entry.setContent(new PlainTextConstruct(value));
+        return entry;
+    }
+
+}

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tuscany/java/sca/modules/binding-gdata-runtime-gsoc/src/test/java/org/apache/tuscany/sca/binding/gdata/CustomerClientImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date