Author: jsdelfino
Date: Mon Nov 12 12:39:31 2007
New Revision: 594293
URL: http://svn.apache.org/viewvc?rev=594293&view=rev
Log:
Support collections of business objects and mediate them from/to XML.
Modified:
incubator/tuscany/java/sca/modules/binding-feed/pom.xml
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomBindingProviderFactory.java
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomEntryUtil.java
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomServiceBindingProvider.java
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSBindingProviderFactory.java
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSServiceBindingProvider.java
Modified: incubator/tuscany/java/sca/modules/binding-feed/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/pom.xml?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/binding-feed/pom.xml (original)
+++ incubator/tuscany/java/sca/modules/binding-feed/pom.xml Mon Nov 12 12:39:31
2007
@@ -50,6 +50,12 @@
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
+ <artifactId>tuscany-databinding</artifactId>
+ <version>1.1-incubating-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-host-http</artifactId>
<version>1.1-incubating-SNAPSHOT</version>
</dependency>
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomBindingProviderFactory.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomBindingProviderFactory.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomBindingProviderFactory.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomBindingProviderFactory.java
Mon Nov 12 12:39:31 2007
@@ -22,6 +22,10 @@
import org.apache.tuscany.sca.binding.feed.AtomBinding;
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;
@@ -38,6 +42,7 @@
public class AtomBindingProviderFactory implements
BindingProviderFactory<AtomBinding> {
private MessageFactory messageFactory;
+ private Mediator mediator;
private ServletHost servletHost;
public AtomBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
@@ -45,6 +50,8 @@
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,
@@ -56,7 +63,7 @@
public ServiceBindingProvider
createServiceBindingProvider(RuntimeComponent component,
RuntimeComponentService service,
AtomBinding
binding) {
- return new AtomServiceBindingProvider(component, service, binding,
servletHost, messageFactory);
+ return new AtomServiceBindingProvider(component, service, binding,
servletHost, messageFactory, mediator);
}
public Class<AtomBinding> getModelType() {
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomEntryUtil.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomEntryUtil.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomEntryUtil.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomEntryUtil.java
Mon Nov 12 12:39:31 2007
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.io.Reader;
+import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
@@ -34,6 +35,7 @@
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
+import com.sun.syndication.feed.atom.Content;
import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.atom.Feed;
import com.sun.syndication.io.FeedException;
@@ -71,6 +73,19 @@
WireFeedInput input = new WireFeedInput();
feed = (Feed)input.build(document);
Entry entry = (Entry)feed.getEntries().get(0);
+ if (entry.getContents().size() != 0) {
+ Content content = (Content)entry.getContents().get(0);
+ if ("text/xml".equals(content.getType())) {
+ Element element = root.getChild("content",
root.getNamespace());
+ if (!element.getChildren().isEmpty()) {
+ element = (Element)element.getChildren().get(0);
+ XMLOutputter outputter = new XMLOutputter();
+ StringWriter sw = new StringWriter();
+ outputter.output(element, sw);
+ content.setValue(sw.toString());
+ }
+ }
+ }
return entry;
}
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomServiceBindingProvider.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomServiceBindingProvider.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomServiceBindingProvider.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/AtomServiceBindingProvider.java
Mon Nov 12 12:39:31 2007
@@ -20,6 +20,7 @@
package org.apache.tuscany.sca.binding.feed.provider;
import org.apache.tuscany.sca.binding.feed.AtomBinding;
+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;
@@ -38,16 +39,19 @@
private ServletHost servletHost;
private MessageFactory messageFactory;
private String servletMapping;
+ private Mediator mediator;
AtomServiceBindingProvider(RuntimeComponent component,
RuntimeComponentService service,
AtomBinding binding,
ServletHost servletHost,
- MessageFactory messageFactory) {
+ MessageFactory messageFactory,
+ Mediator mediator) {
this.service = service;
this.binding = binding;
this.servletHost = servletHost;
this.messageFactory = messageFactory;
+ this.mediator = mediator;
}
public InterfaceContract getBindingInterfaceContract() {
@@ -63,7 +67,7 @@
RuntimeWire wire = componentService.getRuntimeWire(binding);
FeedBindingListenerServlet servlet =
- new FeedBindingListenerServlet(wire, messageFactory, "atom_1.0");
+ new FeedBindingListenerServlet(wire, messageFactory, mediator,
"atom_1.0");
servletMapping = binding.getURI();
if (!servletMapping.endsWith("/")) {
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/FeedBindingListenerServlet.java
Mon Nov 12 12:39:31 2007
@@ -34,8 +34,14 @@
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.xml.namespace.QName;
import org.apache.commons.codec.binary.Base64;
+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;
@@ -81,6 +87,10 @@
private Invoker deleteInvoker;
private MessageFactory messageFactory;
private String feedType;
+ private Mediator mediator;
+ private DataType<?> itemClassType;
+ private DataType<?> itemXMLType;
+ private boolean supportsEntries;
/**
* Constructs a new binding listener.
@@ -89,14 +99,17 @@
* @param messageFactory
* @param feedType
*/
- FeedBindingListenerServlet(RuntimeWire wire, MessageFactory
messageFactory, String feedType) {
+ FeedBindingListenerServlet(RuntimeWire wire, MessageFactory
messageFactory, Mediator mediator, String feedType) {
this.wire = wire;
this.messageFactory = messageFactory;
+ this.mediator = mediator;
this.feedType = feedType;
// Get the invokers for the supported operations
+ Operation getOperation = null;
for (InvocationChain invocationChain :
this.wire.getInvocationChains()) {
- String operationName =
invocationChain.getSourceOperation().getName();
+ Operation operation = invocationChain.getTargetOperation();
+ String operationName = operation.getName();
if (operationName.equals("getFeed")) {
getFeedInvoker = invocationChain.getHeadInvoker();
} else if (operationName.equals("getAll")) {
@@ -105,6 +118,7 @@
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")) {
@@ -117,6 +131,18 @@
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 == Entry.class) {
+ supportsEntries = 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
@@ -132,8 +158,7 @@
String path = request.getPathInfo();
// The feedType parameter is used to override what type of feed is
going
- // to
- // be produced
+ // to be produced
String requestFeedType = request.getParameter("feedType");
if (requestFeedType == null)
requestFeedType = feedType;
@@ -176,9 +201,9 @@
// Return a feed containing the entries in the collection
Feed feed = null;
- if (getFeedInvoker != null) {
+ if (supportsEntries) {
- // The service implementation is Feed-aware, invoke its
getFeed operation
+ // The service implementation supports feed entries,
invoke its getFeed operation
Message requestMessage = messageFactory.createMessage();
Message responseMessage =
getFeedInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
@@ -188,8 +213,9 @@
} else {
- // The service implementation is not Feed-aware, invoke
its getAll operation
- // to get the data item collection. then create a Feed
from it
+ // 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 =
getAllInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
@@ -234,9 +260,9 @@
if (responseMessage.isFault()) {
throw new
ServletException((Throwable)responseMessage.getBody());
}
- if (getFeedInvoker != null) {
+ if (supportsEntries) {
- // The service implementation is Feed-aware and returns a
Feed entry
+ // The service implementation returns a feed entry
entry = responseMessage.getBody();
} else {
@@ -270,9 +296,9 @@
// Return an RSS feed containing the entries in the collection
Feed feed = null;
- if (getFeedInvoker != null) {
+ if (supportsEntries) {
- // The service implementation is Feed-aware, invoke its
getFeed operation
+ // The service implementation supports feed entries,
invoke its getFeed operation
Message requestMessage = messageFactory.createMessage();
Message responseMessage =
getFeedInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
@@ -282,8 +308,9 @@
} else {
- // The service implementation is not Feed-aware, invoke
its getAll operation
- // to get the data item collection. then create a Feed
from it
+ // The service implementation does not support feed
entries, invoke its
+ // getAll operation to get the data item collection. then
create feed entries
+ // from the data items
Message requestMessage = messageFactory.createMessage();
Message responseMessage =
getAllInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
@@ -334,10 +361,14 @@
entry.setId(key.toString());
entry.setTitle("item");
+ // Convert the item to XML
+ String value = mediator.mediate(item, itemClassType, itemXMLType,
null).toString();
+ value = value.substring(value.indexOf('>') +1);
+
Content content = new Content();
- content.setType(Content.TEXT);
- content.setValue(item.toString());
- List contents = new ArrayList();
+ content.setType("text/xml");
+ content.setValue(value);
+ List<Content> contents = new ArrayList<Content>();
contents.add(content);
entry.setContents(contents);
@@ -357,6 +388,30 @@
}
}
+ /**
+ * Create a data item from an Atom entry.
+ * @param key
+ * @param item
+ * @return
+ */
+ private Object createItem(Entry entry) {
+ if (entry != null) {
+ List<?> contents = entry.getContents();
+ if (contents.isEmpty()) {
+ return null;
+ }
+ Content content = (Content)contents.get(0);
+
+ // Create the item from XML
+ String value = content.getValue();
+ Object item = mediator.mediate(value, itemXMLType, itemClassType,
null);
+
+ return item;
+ } else {
+ return null;
+ }
+ }
+
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException,
IOException {
@@ -389,9 +444,9 @@
}
// Let the component implementation create it
- if (getFeedInvoker != null) {
+ if (supportsEntries) {
- // The service implementation is Feed-aware, pass the
entry to it
+ // The service implementation supports feed entries, pass
the entry to it
Message requestMessage = messageFactory.createMessage();
requestMessage.setBody(new Object[] {entry});
Message responseMessage =
postInvoker.invoke(requestMessage);
@@ -401,9 +456,9 @@
createdEntry = responseMessage.getBody();
} else {
- // The service implementation is not Feed-aware, pass the
data item to it
+ // The service implementation does not support feed
entries, pass the data item to it
Message requestMessage = messageFactory.createMessage();
- Object item =
((Content)entry.getContents().get(0)).getValue();
+ Object item = createItem(entry);
requestMessage.setBody(new Object[] {item});
Message responseMessage =
postInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
@@ -499,9 +554,9 @@
}
// Let the component implementation create it
- if (getFeedInvoker != null) {
+ if (supportsEntries) {
- // The service implementation is Feed-aware, pass the
entry to it
+ // The service implementation supports feed entries, pass
the entry to it
Message requestMessage = messageFactory.createMessage();
requestMessage.setBody(new Object[] {id, entry});
Message responseMessage =
putInvoker.invoke(requestMessage);
@@ -515,9 +570,9 @@
}
} else {
- // The service implementation is not Feed-aware, pass the
data item to it
+ // The service implementation does not support feed
entries, pass the data item to it
Message requestMessage = messageFactory.createMessage();
- Object item =
((Content)entry.getContents().get(0)).getValue();
+ Object item = createItem(entry);
requestMessage.setBody(new Object[] {id, item});
Message responseMessage =
putInvoker.invoke(requestMessage);
if (responseMessage.isFault()) {
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSBindingProviderFactory.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSBindingProviderFactory.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSBindingProviderFactory.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSBindingProviderFactory.java
Mon Nov 12 12:39:31 2007
@@ -22,6 +22,10 @@
import org.apache.tuscany.sca.binding.feed.RSSBinding;
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;
@@ -37,14 +41,17 @@
*/
public class RSSBindingProviderFactory implements
BindingProviderFactory<RSSBinding> {
- MessageFactory messageFactory;
- ServletHost servletHost;
+ private MessageFactory messageFactory;
+ private Mediator mediator;
+ private ServletHost servletHost;
public RSSBindingProviderFactory(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,
@@ -56,7 +63,7 @@
public ServiceBindingProvider
createServiceBindingProvider(RuntimeComponent component,
RuntimeComponentService service,
RSSBinding
binding) {
- return new RSSServiceBindingProvider(component, service, binding,
servletHost, messageFactory);
+ return new RSSServiceBindingProvider(component, service, binding,
servletHost, messageFactory, mediator);
}
public Class<RSSBinding> getModelType() {
Modified:
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSServiceBindingProvider.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSServiceBindingProvider.java?rev=594293&r1=594292&r2=594293&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSServiceBindingProvider.java
(original)
+++
incubator/tuscany/java/sca/modules/binding-feed/src/main/java/org/apache/tuscany/sca/binding/feed/provider/RSSServiceBindingProvider.java
Mon Nov 12 12:39:31 2007
@@ -20,6 +20,7 @@
package org.apache.tuscany.sca.binding.feed.provider;
import org.apache.tuscany.sca.binding.feed.RSSBinding;
+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;
@@ -38,16 +39,19 @@
private ServletHost servletHost;
private MessageFactory messageFactory;
private String servletMapping;
+ private Mediator mediator;
RSSServiceBindingProvider(RuntimeComponent component,
RuntimeComponentService service,
RSSBinding binding,
ServletHost servletHost,
- MessageFactory messageFactory) {
+ MessageFactory messageFactory,
+ Mediator mediator) {
this.service = service;
this.binding = binding;
this.servletHost = servletHost;
this.messageFactory = messageFactory;
+ this.mediator = mediator;
}
public InterfaceContract getBindingInterfaceContract() {
@@ -63,7 +67,7 @@
RuntimeWire wire = componentService.getRuntimeWire(binding);
FeedBindingListenerServlet servlet =
- new FeedBindingListenerServlet(wire, messageFactory, "rss_2.0");
+ new FeedBindingListenerServlet(wire, messageFactory, mediator,
"rss_2.0");
servletMapping = binding.getURI();
servletHost.addServletMapping(servletMapping, servlet);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]