diff options
12 files changed, 1281 insertions, 0 deletions
diff --git a/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataBindingListenerServlet.java b/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataBindingListenerServlet.java new file mode 100644 index 0000000000..1f9318070d --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataBindingListenerServlet.java @@ -0,0 +1,426 @@ +/* + * 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 com.google.gdata.data.BaseEntry; +import com.google.gdata.data.BaseFeed; +import com.google.gdata.data.ExtensionProfile; +import com.google.gdata.data.Link; +import com.google.gdata.data.ParseSource; +import com.google.gdata.util.ServiceException; +import com.google.gdata.util.common.xml.XmlWriter; +import java.io.IOException; +import java.net.URLDecoder; +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 org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.runtime.RuntimeWire; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.databinding.Mediator; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.invocation.InvocationChain; +import org.apache.tuscany.sca.invocation.Message; + +class GDataBindingListenerServlet extends HttpServlet { + + private static final Logger logger = Logger.getLogger(GDataBindingListenerServlet.class.getName()); + private RuntimeWire wire; + private Invoker getFeedInvoker; + 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; + + 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")) { + getFeedInvoker = invocationChain.getHeadInvoker(); + } else if (operationName.equals("query")) { + queryInvoker = invocationChain.getHeadInvoker(); + } else if (operationName.equals("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")) { + postInvoker = invocationChain.getHeadInvoker(); + } else if (operationName.equals("postMedia")) { + postMediaInvoker = invocationChain.getHeadInvoker(); + } else if (operationName.equals("delete")) { + deleteInvoker = invocationChain.getHeadInvoker(); + } + } + +// // Determine the collection item type +// itemXMLType = new DataTypeImpl<Class<?>>(String.class.getName(), String.class, String.class); +// Class<?> itemClass = getOperation.getOutputType().getPhysical(); +// if (itemClass == BaseEntry.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)); + } + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + int servletPathLength = request.getContextPath().length() + request.getServletPath().length(); + + String path = URLDecoder.decode(request.getRequestURI().substring(servletPathLength), "UTF-8"); + + logger.fine("get " + request.getRequestURI()); + + if (path != null && path.equals("/atomsvc")) { + //FIX-ME - Doing nothing + } else if (path == null || path.length() == 0 || path.equals("/")) { + + // Return a feed containing the entries in the collection + BaseFeed feed = null; + + Message requestMessage = messageFactory.createMessage(); + Message responseMessage; + if (request.getQueryString() != null) { + requestMessage.setBody(new Object[]{request.getQueryString()}); + responseMessage = queryInvoker.invoke(requestMessage); + } else { + responseMessage = getFeedInvoker.invoke(requestMessage); + } + if (responseMessage.isFault()) { + throw new ServletException((Throwable) responseMessage.getBody()); + } + + // The service implementation supports feed entries, invoke its getFeed operation + feed = (BaseFeed) responseMessage.getBody(); + + if (feed != null) { + + // Write the Atom feed + response.setContentType("application/atom+xml; charset=utf-8"); + try { + + XmlWriter writer = new XmlWriter(response.getWriter()); + feed.generateAtom(writer, new ExtensionProfile()); + writer.flush(); + writer.close(); + + } catch (IOException ioe) { + throw new ServletException(ioe); + } + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + + } else if (path.startsWith("/")) { + // Return a specific entry in the collection + BaseEntry feedEntry; + + // 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()); + } + + // The service implementation returns a feed entry + feedEntry = responseMessage.getBody(); + + // Write the Atom entry + if (feedEntry != null) { + response.setContentType("application/atom+xml; charset=utf-8"); + try { + XmlWriter writer = new XmlWriter(response.getWriter()); + feedEntry.generateAtom(writer, new ExtensionProfile()); + writer.flush(); + writer.close(); + } catch (IOException ioe) { + throw new ServletException(ioe); + } + } 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 { + + // FIX-ME: 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"); + + if (path == null || path.length() == 0 || path.equals("/")) { + + BaseEntry createdFeedEntry = null; + + // Create a new Atom entry + String contentType = request.getContentType(); + if (contentType != null && contentType.startsWith("application/atom+xml")) { + + // Read the entry from the request + BaseEntry feedEntry; + try { + ParseSource parser = new ParseSource(request.getReader()); + feedEntry = BaseEntry.readEntry(parser); + + } catch (ServiceException ex) { + throw new ServletException(ex); + } + + // 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 if (contentType != null) { + + // Create a new media entry + + // Get incoming headers + String reqTitle = request.getHeader("Title"); + String slug = request.getHeader("Slug"); + + // Let the component implementation create the media entry + Message requestMessage = messageFactory.createMessage(); + requestMessage.setBody(new Object[]{reqTitle, 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 { + + XmlWriter writer = new XmlWriter(response.getWriter()); + createdFeedEntry.generateAtom(writer, new ExtensionProfile()); + writer.flush(); + writer.close(); + + } catch (IOException ioe) { + throw new ServletException(ioe); + } + + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // FIX-ME: 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()); + + BaseEntry createdFeedEntry = null; + + 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 + BaseEntry feedEntry; + try { + ParseSource parser = new ParseSource(request.getReader()); + feedEntry = BaseEntry.readEntry(parser); + + } catch (ServiceException ex) { + throw new ServletException(ex); + } + + // Let the component implementation create it + + // 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()); + } + } + + createdFeedEntry = 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()); + } + } + + 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 { + + XmlWriter writer = new XmlWriter(response.getWriter()); + createdFeedEntry.generateAtom(writer, new ExtensionProfile()); + writer.flush(); + writer.close(); + + } catch (IOException ioe) { + throw new ServletException(ioe); + } + + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + } + + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // FIX-ME: 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()); + } + } + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataServiceBindingProvider.java b/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataServiceBindingProvider.java new file mode 100644 index 0000000000..bb5739324c --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/main/java/org/apache/tuscany/sca/binding/gdata/provider/GDataServiceBindingProvider.java @@ -0,0 +1,85 @@ +/* + * 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; + +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 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); + } + + public InterfaceContract getBindingInterfaceContract() { + return service.getInterfaceContract(); + } + + public boolean supportsOneWayInvocation() { + return false; + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumer.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumer.java new file mode 100644 index 0000000000..35a692ac67 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumer.java @@ -0,0 +1,121 @@ +/* + * 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.calendarconsumer; + +import com.google.gdata.data.BaseEntry; +import com.google.gdata.data.DateTime; +import com.google.gdata.data.Entry; +import com.google.gdata.data.Feed; +import com.google.gdata.data.Person; +import com.google.gdata.data.PlainTextConstruct; +import com.google.gdata.data.extensions.EventEntry; +import com.google.gdata.data.extensions.When; +import org.apache.tuscany.sca.host.embedded.SCADomain; + +public class CalendarConsumer { + + public static void main(String... args) throws Exception { + + SCADomain scaDomain; + CalendarConsumerImpl resourceCollection; + + //init + scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/gdata/CalendarConsumer.composite"); + resourceCollection = scaDomain.getService(CalendarConsumerImpl.class, "CalendarConsumer"); + + //test methods + System.out.println( + "\n//--------------------------" + + "\n// Get the Feed" + + "\n//--------------------------\n"); + + Feed feed = (Feed) resourceCollection.getFeed(); + + System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); + for (Entry e : feed.getEntries()) { + System.out.println("# " + e.getTitle().getPlainText()); + } + + System.out.println( + "\n//--------------------------" + + "\n// Post a new Entry" + + "\n//--------------------------\n"); + + EventEntry entry = new EventEntry(); + + entry.setTitle(new PlainTextConstruct("GSoC extra activity")); + entry.setContent(new PlainTextConstruct("Reading the book Beautiful Code")); + + Person author = new Person("GSoC Student 2008", null, "gsocstudent2008@gmail.com"); + entry.getAuthors().add(author); + + DateTime startTime = DateTime.parseDateTime("2008-07-30T15:00:00-08:00"); + DateTime endTime = DateTime.parseDateTime("2008-07-30T17:00:00-08:00"); + When eventTimes = new When(); + eventTimes.setStartTime(startTime); + eventTimes.setEndTime(endTime); + entry.addTime(eventTimes); + + BaseEntry returnedEntry = resourceCollection.post(entry); + + System.out.println("# " + returnedEntry.getTitle().getPlainText()); + + System.out.println( + "\n//--------------------------" + + "\n// Get an Entry" + + "\n//--------------------------\n"); + + BaseEntry searchedEntry = resourceCollection.get(returnedEntry.getSelfLink().getHref()); + + System.out.println("# " + searchedEntry.getTitle().getPlainText()); + + System.out.println( + "\n//--------------------------" + + "\n// Update an Entry" + + "\n//--------------------------\n"); + + searchedEntry.setTitle(new PlainTextConstruct("GSoC extra activity(opcional)")); + BaseEntry updatedEntry = resourceCollection.put(searchedEntry.getEditLink().getHref(), searchedEntry); + + System.out.println("# " + updatedEntry.getTitle().getPlainText()); + + System.out.println( + "\n//--------------------------" + + "\n// Delete an Entry" + + "\n//--------------------------\n"); + + resourceCollection.delete(updatedEntry.getEditLink().getHref()); + + System.out.println( + "\n//--------------------------" + + "\n// Execute a query" + + "\n//--------------------------\n"); + + feed = (Feed) resourceCollection.query("Students"); + + System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); + for (Entry e : feed.getEntries()) { + System.out.println("# " + e.getTitle().getPlainText()); + } + + //close + scaDomain.close(); + + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerImpl.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerImpl.java new file mode 100644 index 0000000000..8da6977c2c --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerImpl.java @@ -0,0 +1,55 @@ +/* + * 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.calendarconsumer; + +import com.google.gdata.data.BaseEntry; +import com.google.gdata.data.BaseFeed; + +import org.apache.tuscany.sca.binding.gdata.collection.Collection; +import org.osoa.sca.annotations.Reference; + +public class CalendarConsumerImpl { + + @Reference + public Collection resourceCollection; + + public BaseFeed getFeed() { + return resourceCollection.getFeed(); + } + + public BaseEntry post(BaseEntry entry) { + return resourceCollection.post(entry); + } + + public BaseEntry get(String id) throws org.apache.tuscany.sca.implementation.data.collection.NotFoundException { + return resourceCollection.get(id); + } + + public BaseEntry put(String id, BaseEntry entry) throws org.apache.tuscany.sca.implementation.data.collection.NotFoundException { + return resourceCollection.put(id, entry); + } + + public void delete(String id) throws org.apache.tuscany.sca.implementation.data.collection.NotFoundException { + resourceCollection.delete(id); + } + + public BaseFeed query(String queryString) { + return resourceCollection.query(queryString); + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerTest.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerTest.java new file mode 100644 index 0000000000..361b9b122d --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/calendarconsumer/CalendarConsumerTest.java @@ -0,0 +1,203 @@ +/* + * 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.calendarconsumer; + +import com.google.gdata.data.BaseEntry; +import com.google.gdata.data.DateTime; +import com.google.gdata.data.Feed; +import com.google.gdata.data.Person; +import com.google.gdata.data.PlainTextConstruct; +import com.google.gdata.data.extensions.EventEntry; +import com.google.gdata.data.extensions.When; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.apache.tuscany.sca.host.embedded.SCADomain; +import org.apache.tuscany.sca.implementation.data.collection.NotFoundException; + +import org.junit.Test; +import org.junit.BeforeClass; +import org.junit.AfterClass; +import static org.junit.Assert.assertNotNull; + +//FIX-ME: the tests are executed in an incorrect order +public class CalendarConsumerTest { + + private static SCADomain scaDomain; + private Feed feed; + private BaseEntry returnedEntry; + private BaseEntry searchedEntry; + private BaseEntry updatedEntry; + private static CalendarConsumerImpl consumer; + + @BeforeClass + public static void init() { + scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/gdata/CalendarConsumer.composite"); + consumer = scaDomain.getService(CalendarConsumerImpl.class, "CalendarConsumer"); + } + + @AfterClass + public static void close() { + scaDomain.close(); + } + + @Test + public void getFeed() { + System.out.println("getfeed"); + feed = (Feed) consumer.getFeed(); + assertNotNull(feed); + } + + @Test + public void post() { + System.out.println("post"); + EventEntry entry = new EventEntry(); + + entry.setTitle(new PlainTextConstruct("GSoC extra activity")); + entry.setContent(new PlainTextConstruct("Reading the book Beautiful Code")); + + Person author = new Person("GSoC Student 2008", null, "gsocstudent2008@gmail.com"); + entry.getAuthors().add(author); + + DateTime startTime = DateTime.parseDateTime("2008-07-22T15:00:00-08:00"); + DateTime endTime = DateTime.parseDateTime("2008-07-22T17:00:00-08:00"); + When eventTimes = new When(); + eventTimes.setStartTime(startTime); + eventTimes.setEndTime(endTime); + entry.addTime(eventTimes); + + returnedEntry = consumer.post(entry); + assertNotNull(returnedEntry); + } + + @Test + public void get() { + System.out.println("get"); + try { + searchedEntry = consumer.get(returnedEntry.getSelfLink().getHref()); + assertNotNull(searchedEntry); + } catch (NotFoundException ex) { + Logger.getLogger(CalendarConsumerTest.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Test + public void put() { + System.out.println("put"); + try { + searchedEntry.setTitle(new PlainTextConstruct("GSoC extra activity(opcional)")); + updatedEntry = consumer.put(searchedEntry.getEditLink().getHref(), searchedEntry); + assertNotNull(updatedEntry); + } catch (NotFoundException ex) { + Logger.getLogger(CalendarConsumerTest.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Test + public void delete() { + System.out.println("delete"); + try { + consumer.delete(updatedEntry.getEditLink().getHref()); + } catch (NotFoundException ex) { + Logger.getLogger(CalendarConsumerTest.class.getName()).log(Level.SEVERE, null, ex); + } + } + + @Test + public void query() { + System.out.println("query"); + feed = (Feed) consumer.query("Students"); + assertNotNull(feed); + }// public void testCustomerCollection() throws Exception { +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Get the Feed" + +// "\n//--------------------------\n"); +// +// Feed feed = (Feed) resourceCollection.getFeed(); +// +// System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); +// for (Entry e : feed.getEntries()) { +// System.out.println("# " + e.getTitle().getPlainText()); +// } +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Post a new Entry" + +// "\n//--------------------------\n"); +// +// EventEntry entry = new EventEntry(); +// +// entry.setTitle(new PlainTextConstruct("GSoC extra activity")); +// entry.setContent(new PlainTextConstruct("Reading the book Beautiful Code")); +// +// Person author = new Person("GSoC Student 2008", null, "gsocstudent2008@gmail.com"); +// entry.getAuthors().add(author); +// +// DateTime startTime = DateTime.parseDateTime("2008-06-19T15:00:00-08:00"); +// DateTime endTime = DateTime.parseDateTime("2008-06-19T17:00:00-08:00"); +// When eventTimes = new When(); +// eventTimes.setStartTime(startTime); +// eventTimes.setEndTime(endTime); +// entry.addTime(eventTimes); +// +// BaseEntry returnedEntry = resourceCollection.post(entry); +// +// System.out.println("# " + returnedEntry.getTitle().getPlainText()); +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Get an Entry" + +// "\n//--------------------------\n"); +// +// BaseEntry searchedEntry = resourceCollection.get(returnedEntry.getSelfLink().getHref()); +// +// System.out.println("# " + searchedEntry.getTitle().getPlainText()); +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Update an Entry" + +// "\n//--------------------------\n"); +// +// searchedEntry.setTitle(new PlainTextConstruct("GSoC extra activity(opcional)")); +// BaseEntry updatedEntry = resourceCollection.put(searchedEntry.getEditLink().getHref(), searchedEntry); +// +// System.out.println("# " + updatedEntry.getTitle().getPlainText()); +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Delete an Entry" + +// "\n//--------------------------\n"); +// +// resourceCollection.delete(updatedEntry.getEditLink().getHref()); +// +// System.out.println( +// "\n//--------------------------" + +// "\n// Execute a query" + +// "\n//--------------------------\n"); +// +// feed = (Feed) resourceCollection.query("Students"); +// +// System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); +// for (Entry e : feed.getEntries()) { +// System.out.println("# " + e.getTitle().getPlainText()); +// } +// +// } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Consumer.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Consumer.java new file mode 100644 index 0000000000..00055f28b2 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Consumer.java @@ -0,0 +1,36 @@ +/* + * 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.consumerprovider; + +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(); + + scaDomain.close(); + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClient.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClient.java new file mode 100644 index 0000000000..1d42c9b1a4 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClient.java @@ -0,0 +1,25 @@ +/* + * 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.consumerprovider; + +public interface CustomerClient { + + void testCustomerCollection() throws Exception; +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClientImpl.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClientImpl.java new file mode 100644 index 0000000000..558f65979d --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerClientImpl.java @@ -0,0 +1,115 @@ +/* + * 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.consumerprovider; + +import com.google.gdata.data.BaseEntry; +import com.google.gdata.data.DateTime; +import com.google.gdata.data.Entry; +import com.google.gdata.data.Feed; +import com.google.gdata.data.Person; +import com.google.gdata.data.PlainTextConstruct; +import com.google.gdata.data.extensions.EventEntry; +import com.google.gdata.data.extensions.When; +import org.apache.tuscany.sca.binding.gdata.collection.Collection; +import org.osoa.sca.annotations.Reference; +import org.osoa.sca.annotations.Scope; + +@Scope("COMPOSITE") +public class CustomerClientImpl implements CustomerClient { + + @Reference + public Collection resourceCollection; + + public void testCustomerCollection() throws Exception { + + System.out.println( + "\n//--------------------------" + + "\n// Get the Feed" + + "\n//--------------------------\n"); + + Feed feed = (Feed) resourceCollection.getFeed(); + + System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); + for (Entry e : feed.getEntries()) { + System.out.println("# " + e.getTitle().getPlainText()); + } + + System.out.println( + "\n//--------------------------" + + "\n// Post a new Entry" + + "\n//--------------------------\n"); + + EventEntry entry = new EventEntry(); + + entry.setTitle(new PlainTextConstruct("Activity")); + entry.setContent(new PlainTextConstruct("Reading the book Beautiful Code")); + + Person author = new Person("GSoC Student 2008", null, "gsocstudent2008@gmail.com"); + entry.getAuthors().add(author); + + DateTime startTime = DateTime.parseDateTime("2008-06-19T15:00:00-08:00"); + DateTime endTime = DateTime.parseDateTime("2008-06-19T17:00:00-08:00"); + When eventTimes = new When(); + eventTimes.setStartTime(startTime); + eventTimes.setEndTime(endTime); + entry.addTime(eventTimes); + + BaseEntry returnedEntry = resourceCollection.post(entry); + + System.out.println("# " + returnedEntry.getTitle().getPlainText()); + + System.out.println( + "\n//--------------------------" + + "\n// Get an Entry" + + "\n//--------------------------\n"); + + BaseEntry searchedEntry = resourceCollection.get(returnedEntry.getId()); + System.out.println("# " + searchedEntry.getTitle().getPlainText()); + + + System.out.println( + "\n//--------------------------" + + "\n// Update an Entry" + + "\n//--------------------------\n"); + + searchedEntry.setTitle(new PlainTextConstruct("Activity (opcional)")); + BaseEntry updatedEntry = resourceCollection.put(searchedEntry.getId(), searchedEntry); + + System.out.println("# " + updatedEntry.getTitle().getPlainText()); + + System.out.println( + "\n//--------------------------" + + "\n// Delete an Entry" + + "\n//--------------------------\n"); + + resourceCollection.delete(updatedEntry.getId()); + + System.out.println( + "\n//--------------------------" + + "\n// Execute a query" + + "\n//--------------------------\n"); + + feed = (Feed) resourceCollection.query("GSoC"); + + System.out.println("Feed content - " + feed.getUpdated().toString() + ":\n"); + for (Entry e : feed.getEntries()) { + System.out.println("# " + e.getTitle().getPlainText()); + } + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerCollectionImpl.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerCollectionImpl.java new file mode 100644 index 0000000000..8233d01dd9 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/CustomerCollectionImpl.java @@ -0,0 +1,116 @@ +/* + * 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.consumerprovider; + +import com.google.gdata.data.BaseEntry; +import com.google.gdata.data.BaseFeed; +import com.google.gdata.data.DateTime; +import com.google.gdata.data.Entry; +import com.google.gdata.data.Feed; +import com.google.gdata.data.PlainTextConstruct; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; +import java.util.UUID; +import org.apache.tuscany.sca.binding.gdata.collection.Collection; +import org.apache.tuscany.sca.implementation.data.collection.NotFoundException; +import org.osoa.sca.annotations.Scope; + +@Scope("COMPOSITE") +public class CustomerCollectionImpl implements Collection { + + private Map<String, BaseEntry> entries; + + public CustomerCollectionImpl() { + entries = new HashMap<String, BaseEntry>(); + + BaseEntry entry = new Entry(); + entry.setId("urn:uuid:customer-0"); + entry.setTitle(new PlainTextConstruct("An exampling entry - GSoC")); + + entries.put(entry.getId(), entry); + } + + public BaseFeed<? extends BaseFeed, ? extends BaseEntry> getFeed() { + System.out.println(">>> CustomerCollectionImpl.getFeed"); + + BaseFeed feed = new Feed(); + feed.setTitle(new PlainTextConstruct("Customers Feed")); + feed.setSubtitle(new PlainTextConstruct("This is a sample feed")); + feed.setUpdated(new DateTime()); + + //FIX-ME + //feed.addHtmlLink("", "", ""); //feed.addLink(""); + //feed.addHtmlLink("", "self", ""); //feed.addLink("", "self"); + feed.addHtmlLink("http://localhost:8086/customer", "", ""); + + feed.setEntries(new ArrayList(entries.values())); + + return feed; + } + + public BaseFeed<? extends BaseFeed, ? extends BaseEntry> query(String queryString) { + System.out.println(">>> CustomerCollectionImpl.query collection " + queryString); + return getFeed(); + } + + public BaseEntry post(BaseEntry entry) { + System.out.println(">>> CustomerCollectionImpl.post entry=" + entry.getTitle().getPlainText()); + + String id = "urn:uuid:customer-" + UUID.randomUUID().toString(); + entry.setId(id); + + //FIX-ME + entry.addHtmlLink("" + id, "edit", ""); + entry.addHtmlLink("" + id, "alternate", ""); + + DateTime dateTime = new DateTime(new Date(), TimeZone.getTimeZone("America/Los_Angeles")); + entry.setUpdated(dateTime); + + entries.put(id, entry); + + System.out.println(">>> CustomerCollectionImpl.post return id=" + id); + + return entry; + } + + public BaseEntry get(String id) throws NotFoundException { + System.out.println(">>> CustomerCollectionImpl.get id=" + id); + + return entries.get(id); + } + + public BaseEntry put(String id, BaseEntry entry) throws NotFoundException { + System.out.println(">>> CustomerCollectionImpl.put id=" + id + " entry=" + entry.getTitle()); + + DateTime dateTime = new DateTime(new Date(), TimeZone.getTimeZone("America/Los_Angeles")); + entry.setUpdated(dateTime); + + entries.put(id, entry); + + return entries.get(id); + } + + public void delete(String id) throws NotFoundException { + System.out.println(">>> CustomerCollectionImpl.delete id=" + id); + entries.remove(id); + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Provider.java b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Provider.java new file mode 100644 index 0000000000..9beca538df --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/java/org/apache/tuscany/sca/binding/gdata/consumerprovider/Provider.java @@ -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.consumerprovider; + +import org.apache.tuscany.sca.host.embedded.SCADomain; + +public class Provider { + + public static void main(String[] args) throws Exception { + + SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/gdata/Provider.composite"); + + System.out.println("Ready for consultings..."); + System.in.read(); + + scaDomain.close(); + } +} diff --git a/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/CalendarConsumer.composite b/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/CalendarConsumer.composite new file mode 100644 index 0000000000..a208852f16 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/CalendarConsumer.composite @@ -0,0 +1,32 @@ +<?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. +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace="http://customer" + name="CalendarConsumerComposite"> + + <component name="CalendarConsumer"> + <implementation.java class="org.apache.tuscany.sca.binding.gdata.calendarconsumer.CalendarConsumerImpl"/> + <reference name="resourceCollection"> + <tuscany:binding.gdata uri="http://www.google.com/calendar/feeds/gsocstudent2008@gmail.com/private/full" serviceType="cl" username="gsocstudent2008@gmail.com" password="gsoc2008"/> + </reference> + </component> + +</composite>
\ No newline at end of file diff --git a/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/Provider.composite b/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/Provider.composite new file mode 100644 index 0000000000..e7ddb38ff0 --- /dev/null +++ b/java/sca/modules/binding-gdata-runtime/src/test/resources/org/apache/tuscany/sca/binding/gdata/Provider.composite @@ -0,0 +1,33 @@ +<?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. +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" + targetNamespace = "http://customer" + name="Provider"> + + <service name="customer" promote="CustomerCollection"> + <tuscany:binding.gdata uri = "http://localhost:8086/customer" username="gsocstudent2008" password="gsoc2008" serviceType="cl"/> + </service> + + <component name="CustomerCollection"> + <implementation.java class="org.apache.tuscany.sca.binding.gdata.consumerprovider.CustomerCollectionImpl"/> + </component> + +</composite> |