diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2008-09-15 06:50:04 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2008-09-15 06:50:04 +0000 |
commit | 147ed48e86bb4a13e42df35f1d1d800a7b564f4b (patch) | |
tree | 2412db1dcc7b46a214d2b7b46d21349ac08aa9b8 /branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom | |
parent | 512771c8a42d2cde253f6df55ef552f7a0b4f792 (diff) |
Removed more modules as in Oscar's TUSCANY-2440 reduced-set patch. Also removed newer modules added since r643746 and are not required to run the minimum set that we are porting to android. Set svn ignore properties to ignore Manifest files produced by the build.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@695356 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom')
9 files changed, 0 insertions, 2053 deletions
diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/Collection.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/Collection.java deleted file mode 100644 index 7356cd0d2a..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/Collection.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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.atom.collection; - -import org.apache.abdera.model.Entry; -import org.apache.abdera.model.Feed; -import org.osoa.sca.annotations.Remotable; - -/** - * Provides access to a collection of resources using Atom. - * - * @version $Rev$ $Date$ - */ -@Remotable -public interface Collection { - - /** - * Get an Atom feed for a collection of resources. - * - * @return the Atom feed - */ - Feed getFeed(); - - /** - * Get an Atom feed for a collection of resources resulting - * from a query. - * - * @param queryString a query string - * @return the Atom feed - */ - Feed query(String queryString); - - /** - * Creates a new entry. - * - * @param entry - * @return - */ - Entry post(Entry entry); - - /** - * Retrieves an entry. - * - * @param id - * @return - */ - Entry get(String id) throws NotFoundException; - - /** - * Update an entry. - * - * @param id - * @param entry - * @return - */ - void put(String id, Entry entry) throws NotFoundException; - - /** - * Delete an entry. - * - * @param id - */ - void delete(String id) throws NotFoundException; - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/MediaCollection.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/MediaCollection.java deleted file mode 100644 index cc351442e7..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/MediaCollection.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.atom.collection; - -import java.io.InputStream; - -import org.osoa.sca.annotations.Remotable; - -import org.apache.abdera.model.Entry; - -/** - * Provides access to a collection of resources using Atom. - * - * @version $Rev$ $Date$ - */ -@Remotable -public interface MediaCollection extends Collection { - - /** - * Creates a new media entry - * - * @param title - * @param slug - * @param contentType - * @param media - */ - Entry postMedia(String title, String slug, String contentType, InputStream media); - - /** - * Update a media entry. - * - * @param id - * @param contentType - * @param media - * @return - */ - void putMedia(String id, String contentType, InputStream media) throws NotFoundException; - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/NotFoundException.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/NotFoundException.java deleted file mode 100644 index b457840922..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/collection/NotFoundException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.atom.collection; - -/** - * Indicates that a resource could not be found. - * - * @version $Rev$ $Date$ - */ -public class NotFoundException extends Exception { - private static final long serialVersionUID = -5046027674128627383L; - - public NotFoundException() { - } - - public NotFoundException(String message) { - super(message); - } - - public NotFoundException(Throwable cause) { - super(cause); - } - - public NotFoundException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingInvoker.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingInvoker.java deleted file mode 100644 index dafcf57311..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingInvoker.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * 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.atom.provider; - -import static org.apache.tuscany.sca.binding.atom.provider.AtomBindingUtil.entry; -import static org.apache.tuscany.sca.binding.atom.provider.AtomBindingUtil.feedEntry; - -import java.io.InputStreamReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; - -import org.apache.abdera.Abdera; -import org.apache.abdera.factory.Factory; -import org.apache.abdera.model.Document; -import org.apache.abdera.model.Feed; -import org.apache.abdera.parser.Parser; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.StringRequestEntity; -import org.apache.tuscany.sca.binding.atom.collection.NotFoundException; -import org.apache.tuscany.sca.data.collection.Entry; -import org.apache.tuscany.sca.interfacedef.Operation; -import org.apache.tuscany.sca.invocation.Invoker; -import org.apache.tuscany.sca.invocation.Message; -import org.osoa.sca.ServiceRuntimeException; - -/** - * Invoker for the Atom binding. - * - * @version $Rev$ $Date$ - */ -class AtomBindingInvoker implements Invoker { - - private static final Factory abderaFactory = Abdera.getNewFactory(); - private static final Parser abderaParser = Abdera.getNewParser(); - - Operation operation; - String uri; - HttpClient httpClient; - String authorizationHeader; - AtomReferenceBindingProvider provider; - - AtomBindingInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - this.operation = operation; - this.uri = uri; - this.httpClient = httpClient; - this.authorizationHeader = authorizationHeader; - this.provider = bindingProvider; - } - - public Message invoke(Message msg) { - // Shouldn't get here, as the only supported methods are - // defined in the ResourceCollection interface, and implemented - // by specific invoker subclasses - throw new UnsupportedOperationException(operation.getName()); - } - - /** - * Get operation invoker - */ - public static class GetInvoker extends AtomBindingInvoker { - - public GetInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Get an entry - String id = (String)((Object[])msg.getBody())[0]; - - // Send an HTTP GET - GetMethod getMethod = new GetMethod(uri + "/" + id); - getMethod.setRequestHeader("Authorization", authorizationHeader); - boolean parsing = false; - try { - httpClient.executeMethod(getMethod); - int status = getMethod.getStatusCode(); - - // Read the Atom entry - if (status == 200) { - Document<org.apache.abdera.model.Entry> doc = - abderaParser.parse(new InputStreamReader(getMethod.getResponseBodyAsStream())); - parsing = true; - org.apache.abdera.model.Entry feedEntry = doc.getRoot(); - - if (provider.supportsFeedEntries()) { - - // Return the Atom entry - msg.setBody(feedEntry); - - } else { - - // Convert the feed entry to a data entry and return the data item - Entry<Object, Object> entry = entry(feedEntry, provider.getItemClassType(), - provider.getItemXMLType(), provider.getMediator()); - msg.setBody(entry.getData()); - } - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - if (!parsing) { - // Release the connection unless the Abdera parser is - // parsing the response, in this case it will release it - getMethod.releaseConnection(); - } - } - - return msg; - } - } - - /** - * Post operation invoker - */ - public static class PostInvoker extends AtomBindingInvoker { - - public PostInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Post an entry - Object[] args = (Object[])msg.getBody(); - org.apache.abdera.model.Entry feedEntry; - if (provider.supportsFeedEntries()) { - - // Expect an Atom entry - feedEntry = (org.apache.abdera.model.Entry)args[0]; - } else { - - // Expect a key and data item - Entry<Object, Object> entry = new Entry<Object, Object>(args[0], args[1]); - feedEntry = feedEntry(entry, provider.getItemClassType(), - provider.getItemXMLType(), provider.getMediator(), abderaFactory); - } - - // Send an HTTP POST - PostMethod postMethod = new PostMethod(uri); - postMethod.setRequestHeader("Authorization", authorizationHeader); - boolean parsing = false; - try { - - // Write the Atom entry - StringWriter writer = new StringWriter(); - feedEntry.writeTo(writer); - // postMethod.setRequestHeader("Content-type", "application/atom+xml; charset=utf-8"); - postMethod.setRequestHeader("Content-type", "application/atom+xml;type=entry"); - postMethod.setRequestEntity(new StringRequestEntity(writer.toString())); - - httpClient.executeMethod(postMethod); - int status = postMethod.getStatusCode(); - - // Read the Atom entry - if (status == 200 || status == 201) { - Document<org.apache.abdera.model.Entry> doc = abderaParser.parse(new InputStreamReader(postMethod.getResponseBodyAsStream())); - parsing = true; - org.apache.abdera.model.Entry createdEntry = doc.getRoot(); - - // Returns the created Atom entry ID - if (provider.supportsFeedEntries()) { - - // Returns the created entry - msg.setBody(createdEntry); - - } else { - - // Returns the id of the created entry - msg.setBody(createdEntry.getId().toString()); - } - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - if (!parsing) { - // Release the connection unless the Abdera parser is - // parsing the response, in this case it will release it - postMethod.releaseConnection(); - } - } - - return msg; - } - } - - /** - * Put operation invoker - */ - public static class PutInvoker extends AtomBindingInvoker { - - public PutInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Put an entry - Object[] args = (Object[])msg.getBody(); - String id; - org.apache.abdera.model.Entry feedEntry; - if (provider.supportsFeedEntries()) { - - // Expect a key and Atom entry - id = (String)args[0]; - feedEntry = (org.apache.abdera.model.Entry)args[1]; - } else { - - // Expect a key and data item - id = (String)args[0]; - Entry<Object, Object> entry = new Entry<Object, Object>(id, args[1]); - feedEntry = feedEntry(entry, provider.getItemClassType(), - provider.getItemXMLType(), provider.getMediator(), abderaFactory); - } - - // Send an HTTP PUT - PutMethod putMethod = new PutMethod(uri + "/" + id); - putMethod.setRequestHeader("Authorization", authorizationHeader); - - try { - - // Write the Atom entry - StringWriter writer = new StringWriter(); - feedEntry.writeTo(writer); - putMethod.setRequestHeader("Content-type", "application/atom+xml; charset=utf-8"); - putMethod.setRequestEntity(new StringRequestEntity(writer.toString())); - - httpClient.executeMethod(putMethod); - int status = putMethod.getStatusCode(); - if (status == 200 || status == 201 || status == 412) { - - msg.setBody(null); - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - putMethod.releaseConnection(); - } - - return msg; - } - } - - /** - * Delete operation invoker - */ - public static class DeleteInvoker extends AtomBindingInvoker { - - public DeleteInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Delete an entry - String id = (String)((Object[])msg.getBody())[0]; - - // Send an HTTP DELETE - DeleteMethod deleteMethod = new DeleteMethod(uri + "/" + id); - deleteMethod.setRequestHeader("Authorization", authorizationHeader); - try { - httpClient.executeMethod(deleteMethod); - int status = deleteMethod.getStatusCode(); - if (status == 200) { - msg.setBody(null); - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - deleteMethod.releaseConnection(); - } - - return msg; - } - } - - /** - * GetAll operation invoker - */ - public static class GetAllInvoker extends AtomBindingInvoker { - - public GetAllInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Get a feed - - // Send an HTTP GET - GetMethod getMethod = new GetMethod(uri); - getMethod.setRequestHeader("Authorization", authorizationHeader); - boolean parsing = false; - try { - httpClient.executeMethod(getMethod); - int status = getMethod.getStatusCode(); - // AtomBindingInvoker.printResponseHeader( getMethod ); - - // Read the Atom feed - if (status == 200) { - Document<Feed> doc = abderaParser.parse(new InputStreamReader(getMethod.getResponseBodyAsStream())); - parsing = true; - Feed feed = doc.getRoot(); - - if (provider.supportsFeedEntries()) { - - // Returns the Atom feed - msg.setBody(feed); - - } else { - - // Returns an array of data entries - List<Entry<Object, Object>> entries = new ArrayList<Entry<Object,Object>>(); - for (org.apache.abdera.model.Entry feedEntry: feed.getEntries()) { - Entry<Object, Object> entry = entry(feedEntry, provider.getItemClassType(), - provider.getItemXMLType(), provider.getMediator()); - entries.add(entry); - } - msg.setBody(entries.toArray(new Entry[entries.size()])); - } - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - if (!parsing) { - // Release the connection unless the Abdera parser is - // parsing the response, in this case it will release it - getMethod.releaseConnection(); - } - } - - return msg; - } - } - - /** - * Query operation invoker - */ - public static class QueryInvoker extends AtomBindingInvoker { - - public QueryInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // Get a feed from a query - String queryString = (String)((Object[])msg.getBody())[0]; - - // Send an HTTP GET - GetMethod getMethod = new GetMethod(uri); - getMethod.setRequestHeader("Authorization", authorizationHeader); - getMethod.setQueryString(queryString); - boolean parsing = false; - try { - httpClient.executeMethod(getMethod); - int status = getMethod.getStatusCode(); - - // Read the Atom feed - if (status == 200) { - Document<Feed> doc = abderaParser.parse(new InputStreamReader(getMethod.getResponseBodyAsStream())); - parsing = true; - Feed feed = doc.getRoot(); - - if (provider.supportsFeedEntries()) { - - // Returns the Atom feed - msg.setBody(feed); - - } else { - - // Returns an array of data entries - List<Entry<Object, Object>> entries = new ArrayList<Entry<Object,Object>>(); - for (org.apache.abdera.model.Entry feedEntry: feed.getEntries()) { - Entry<Object, Object> entry = entry(feedEntry, provider.getItemClassType(), - provider.getItemXMLType(), provider.getMediator()); - entries.add(entry); - } - msg.setBody(entries.toArray(new Entry[entries.size()])); - } - - } else if (status == 404) { - msg.setFaultBody(new NotFoundException()); - } else { - msg.setFaultBody(new ServiceRuntimeException("HTTP status code: " + status)); - } - - } catch (Exception e) { - msg.setFaultBody(new ServiceRuntimeException(e)); - } finally { - if (!parsing) { - // Release the connection unless the Abdera parser is - // parsing the response, in this case it will release it - getMethod.releaseConnection(); - } - } - - return msg; - } - } - - /** - * PostMedia operation invoker - */ - public static class PostMediaInvoker extends AtomBindingInvoker { - - public PostMediaInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // TODO implement - return super.invoke(msg); - } - } - - /** - * PutMedia operation invoker - */ - public static class PutMediaInvoker extends AtomBindingInvoker { - - public PutMediaInvoker(Operation operation, String uri, HttpClient httpClient, String authorizationHeader, AtomReferenceBindingProvider bindingProvider) { - super(operation, uri, httpClient, authorizationHeader, bindingProvider); - } - - @Override - public Message invoke(Message msg) { - // TODO implement - return super.invoke(msg); - } - } - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java deleted file mode 100644 index 4f76675b56..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java +++ /dev/null @@ -1,879 +0,0 @@ -/* - * 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.atom.provider; - -import static org.apache.tuscany.sca.binding.atom.provider.AtomBindingUtil.entry; -import static org.apache.tuscany.sca.binding.atom.provider.AtomBindingUtil.feedEntry; - -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.net.URL; -import java.net.URLDecoder; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -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.i18n.iri.IRI; -import org.apache.abdera.model.Category; -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.abdera.writer.WriterFactory; - -import org.apache.commons.codec.binary.Base64; -import org.apache.tuscany.sca.binding.http.CacheContext; -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.impl.DataTypeImpl; -import org.apache.tuscany.sca.interfacedef.Operation; -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; - -/** - * A resource collection binding listener, implemented as a Servlet and - * registered in a Servlet host provided by the SCA hosting runtime. - * - * @version $Rev$ $Date$ - */ -class AtomBindingListenerServlet extends HttpServlet { - private static final Logger logger = Logger.getLogger(AtomBindingListenerServlet.class.getName()); - private static final long serialVersionUID = 1L; - - private static final Factory abderaFactory = Abdera.getNewFactory(); - private static final Parser abderaParser = Abdera.getNewParser(); - private static final String ETAG = "ETag"; - private static final String LASTMODIFIED = "Last-Modified"; - private static final String LOCATION = "Location"; - private static final String CONTENTLOCATION = "Content-Location"; - private static final SimpleDateFormat dateFormat = new SimpleDateFormat( "EEE, dd MMM yyyy HH:mm:ss Z" ); // RFC 822 date time - - 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 - */ - AtomBindingListenerServlet(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("getAll")) { - getAllInvoker = 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 == org.apache.abdera.model.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)); - - } - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - // No authentication required for a get request - - // Test for any cache info in the request - CacheContext cacheContext = null; - try { - cacheContext = CacheContext.getCacheContextFromRequest( request ); - } catch ( java.text.ParseException e ) { - } - // System.out.println( "AtomBindingListener.doGet cache context=" + cacheContext ); - - // Get the request path - int servletPathLength = request.getContextPath().length() + request.getServletPath().length(); - String path = URLDecoder.decode(request.getRequestURI().substring(servletPathLength), "UTF-8"); - - 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> - */ - - // Return the Atom service document - response.setContentType("application/atomsvc+xml; charset=utf-8"); - - String href = request.getRequestURL().toString(); - href = href.substring(0, href.length() - "/atomsvc".length()); - - String workspaceURL = new String( href ); - int pathIndex = workspaceURL.indexOf( request.getServletPath() ); - if ( -1 != pathIndex ) - workspaceURL = workspaceURL.substring( 0, pathIndex ) + "/"; - - Service service = abderaFactory.newService(); - //service.setText("service"); - - Workspace workspace = abderaFactory.newWorkspace(); - if ( title != null ) - workspace.setTitle(title); - else - workspace.setTitle("workspace"); - workspace.setBaseUri( new IRI( workspaceURL )); - - Collection collection = workspace.addCollection("collection", href ); - Feed feed = getFeed( request ); - if ( feed != null ) { - String title = feed.getTitle(); - if ( title != null ) - collection.setTitle(title); - else - collection.setTitle("entries"); - collection.addAccepts("application/atom+xml;type=feed"); - collection.addAccepts("application/json;type=feed"); - collection.addAccepts("application/atom+xml;type=entry"); - collection.addAccepts("application/json;type=entry"); - List<Category> categories = feed.getCategories(); - if ( categories != null ) { - collection.addCategories(categories, false, null); - } else - collection.addCategories().setFixed(false); - - } else { - collection.setTitle("entries"); - // collection.addAccepts("application/atom+xml;type=feed"); - collection.addAccepts("application/atom+xml; type=entry"); - collection.addAccepts("application/json;type=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("/")) { - - // Return a feed containing the entries in the collection - Feed feed = getFeed( request ); - if (feed != null) { - String feedETag = "\"" + generateFeedETag( feed ) + "\""; - Date feedUpdated = feed.getUpdated(); - // Test request for predicates. - String predicate = request.getHeader( "If-Match" ); - if (( predicate != null ) && ( !predicate.equals(feedETag) )) { - // No match, should short circuit - response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); - return; - } - predicate = request.getHeader( "If-None-Match" ); - if (( predicate != null ) && ( predicate.equals(feedETag) )) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - if ( feedUpdated != null ) { - predicate = request.getHeader( "If-Unmodified-Since" ); - if ( predicate != null ) { - try { - Date predicateDate = dateFormat.parse( predicate ); - if ( predicateDate.compareTo( feedUpdated ) < 0 ) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - } catch ( java.text.ParseException e ) { - // Ignore and move on - } - } - predicate = request.getHeader( "If-Modified-Since" ); - if ( predicate != null ) { - try { - Date predicateDate = dateFormat.parse( predicate ); - if ( predicateDate.compareTo( feedUpdated ) > 0 ) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - } catch ( java.text.ParseException e ) { - // Ignore and move on - } - } - } - // Provide Etag based on Id and time. - response.addHeader(ETAG, feedETag ); - if ( feedUpdated != null ) - response.addHeader(LASTMODIFIED, dateFormat.format( feedUpdated )); - - // Content negotiation - String acceptType = request.getHeader( "Accept" ); - String preferredType = getContentPreference( acceptType ); - if (( preferredType != null ) && ((preferredType.indexOf( "json") > -1) || (preferredType.indexOf( "JSON") > -1 ))) { - // JSON response body - response.setContentType("application/json;type=feed"); - - try { - Abdera abdera = new Abdera(); - WriterFactory wf = abdera.getWriterFactory(); - org.apache.abdera.writer.Writer json = wf.getWriter("json"); - feed.writeTo(json, response.getWriter()); - } catch (Exception e) { - throw new ServletException(e); - } - - } else { - // Write the Atom feed - response.setContentType("application/atom+xml;type=feed"); - try { - feed.getDocument().writeTo(response.getOutputStream()); - } 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 - org.apache.abdera.model.Entry 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()); - } - if (supportsFeedEntries) { - // The service implementation returns a feed entry - feedEntry = responseMessage.getBody(); - } 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()); - feedEntry = feedEntry(entry, itemClassType, itemXMLType, mediator, abderaFactory); - } - // Write the Atom entry - if (feedEntry != null) { - String entryETag = "\"" + generateEntryETag( feedEntry ) + "\""; - Date entryUpdated = feedEntry.getUpdated(); - if ( entryUpdated != null ) - response.addHeader(LASTMODIFIED, dateFormat.format( entryUpdated )); - // TODO Check If-Modified-Since If-Unmodified-Since predicates against LASTMODIFIED. - // If true return 304 and null body. - - Link link = feedEntry.getSelfLink(); - if (link != null) { - response.addHeader(LOCATION, link.getHref().toString()); - } else { - link = feedEntry.getLink( "Edit" ); - if (link != null) { - response.addHeader(LOCATION, link.getHref().toString()); - } - } - - // Test request for predicates. - String predicate = request.getHeader( "If-Match" ); - if (( predicate != null ) && ( !predicate.equals(entryETag) )) { - // No match, should short circuit - response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED); - return; - } - predicate = request.getHeader( "If-None-Match" ); - if (( predicate != null ) && ( predicate.equals(entryETag) )) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - if ( entryUpdated != null ) { - predicate = request.getHeader( "If-Unmodified-Since" ); - if ( predicate != null ) { - try { - Date predicateDate = dateFormat.parse( predicate ); - if ( predicateDate.compareTo( entryUpdated ) < 0 ) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - } catch ( java.text.ParseException e ) { - // Ignore and move on - } - } - predicate = request.getHeader( "If-Modified-Since" ); - if ( predicate != null ) { - try { - Date predicateDate = dateFormat.parse( predicate ); - if ( predicateDate.compareTo( entryUpdated ) > 0 ) { - // Match, should short circuit - response.sendError(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - } catch ( java.text.ParseException e ) { - // Ignore and move on - } - } - } - // Provide Etag based on Id and time. - response.addHeader(ETAG, entryETag ); - if ( entryUpdated != null ) - response.addHeader(LASTMODIFIED, dateFormat.format( entryUpdated )); - - // Content negotiation - String acceptType = request.getHeader( "Accept" ); - String preferredType = getContentPreference( acceptType ); - if (( preferredType != null ) && ((preferredType.indexOf( "json") > -1) || (preferredType.indexOf( "JSON") > -1 ))) { - // JSON response body - response.setContentType("application/json;type=entry"); - try { - Abdera abdera = new Abdera(); - WriterFactory wf = abdera.getWriterFactory(); - org.apache.abdera.writer.Writer json = wf.getWriter("json"); - feedEntry.writeTo(json, response.getWriter()); - } catch (Exception e) { - throw new ServletException(e); - } - } else { - // XML response body - response.setContentType("application/atom+xml;type=entry"); - try { - feedEntry.writeTo(getWriter(response)); - } 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); - } - - } - - protected Feed getFeed( HttpServletRequest request ) throws ServletException { - if (supportsFeedEntries) { - // The service implementation supports feed entries, invoke its getFeed operation - 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()); - } - return (Feed)responseMessage.getBody(); - } else { - - // 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); - } - 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 feed = abderaFactory.newFeed(); - - // Set the feed title - if (title != null) { - feed.setTitle(title); - } else { - feed.setTitle("Feed"); - } - // All feeds must provide Id and updated elements. - // However, some do not, so provide some program protection. - feed.setId( "Feed" + feed.hashCode()); - Date responseLastModified = new Date( 0 ); - - // Add entries to the feed - for (Entry<Object, Object> entry: collection) { - org.apache.abdera.model.Entry feedEntry = feedEntry(entry, itemClassType, itemXMLType, mediator, abderaFactory); - // Use the most recent entry update as the feed update - Date entryUpdated = feedEntry.getUpdated(); - if (( entryUpdated != null ) && (entryUpdated.compareTo( responseLastModified ) > 0 )) - responseLastModified = entryUpdated; - feed.addEntry(feedEntry); - } - // If no entries were newly updated, - if ( responseLastModified.compareTo( new Date( 0 ) ) == 0 ) - responseLastModified = new Date(); - return feed; - } - } - return null; - } - - @Override - protected void doPost(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"); - - if (path == null || path.length() == 0 || path.equals("/")) { - org.apache.abdera.model.Entry 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 - 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[] {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, abderaFactory); - } - - } 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 - IRI feedId = createdFeedEntry.getId(); - if ( feedId != null ) - response.addHeader(ETAG, "\"" + feedId.toString() + "\"" ); - Date entryUpdated = createdFeedEntry.getUpdated(); - if ( entryUpdated != null ) - response.addHeader(LASTMODIFIED, dateFormat.format( entryUpdated )); - Link link = createdFeedEntry.getSelfLink(); - if (link != null) { - response.addHeader(LOCATION, link.getHref().toString()); - } else { - link = createdFeedEntry.getLink( "Edit" ); - if (link != null) { - response.addHeader(LOCATION, link.getHref().toString()); - } - } - - // Write the created Atom entry - response.setStatus(HttpServletResponse.SC_CREATED); - response.setContentType("application/atom+xml;type=entry"); - try { - createdFeedEntry.writeTo(getWriter(response)); - } 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); - } - - /** - * Generate ETag based on feed Id and updated fields. - * Note that the feed id should be unique per feed, immutable, and unchanging, - * but the ETag should change whenever the feed contents change. - * @param feed - * @return ETag - */ - public static String generateFeedETag( Feed feed ) { - if ( feed == null ) { - return null; - } - - IRI feedIdIRI = feed.getId(); - String feedId = "ID"; - if ( feedIdIRI != null ) { - feedId = feedIdIRI.toString(); - } - - Date feedUpdated = feed.getUpdated(); - if ( feedUpdated == null ) { - return feedId; - } - - return feedId + "-" + feedUpdated.hashCode(); - } - - /** - * Generate ETag based on entry Id and updated fields. - * Note that the entry id should be unique per entry, immutable, and unchanging, - * but the ETag should change whenever the entry contents change. - * @param feed - * @return ETag - */ - public static String generateEntryETag( org.apache.abdera.model.Entry entry ) { - if ( entry == null ) { - return null; - } - - IRI entryIdIRI = entry.getId(); - String entryId = "ID"; - if ( entryIdIRI != null ) { - entryId = entryIdIRI.toString(); - } - - Date entryUpdated = entry.getUpdated(); - if ( entryUpdated == null ) { - return entryId; - } - - return entryId + "-" + entryUpdated.hashCode(); - } - - public static String getContentPreference( String acceptType ) { - if (( acceptType == null ) || ( acceptType.length() < 1 )) { - return "application/atom+xml"; - } - StringTokenizer st = new StringTokenizer( acceptType, "," ); - if ( st.hasMoreTokens() ) - return st.nextToken(); - return "application/atom+xml"; - } - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingProviderFactory.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingProviderFactory.java deleted file mode 100644 index b6b805e383..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingProviderFactory.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.atom.provider; - -import org.apache.tuscany.sca.binding.atom.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; -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. - * - * @version $Rev$ $Date$ - */ -public class AtomBindingProviderFactory implements BindingProviderFactory<AtomBinding> { - - private MessageFactory messageFactory; - private Mediator mediator; - private ServletHost servletHost; - - public AtomBindingProviderFactory(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, - AtomBinding binding) { - return new AtomReferenceBindingProvider(component, reference, binding, mediator); - } - - public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component, - RuntimeComponentService service, - AtomBinding binding) { - return new AtomServiceBindingProvider(component, service, binding, servletHost, messageFactory, mediator); - } - - public Class<AtomBinding> getModelType() { - return AtomBinding.class; - } -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingUtil.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingUtil.java deleted file mode 100644 index 62fde86122..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingUtil.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * 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.atom.provider; - -import java.util.Date; - -import org.apache.abdera.factory.Factory; -import org.apache.abdera.model.Content; -import org.apache.abdera.model.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; - -/** - * Utility methods used in this package. - * - * @version $Rev$ $Date$ - */ -class AtomBindingUtil { - - /** - * Create a data item from an Atom entry. - * @param feedEntry - * @param itemClassType - * @param itemXMLType - * @param mediator - * @return - */ - 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); - - } 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); - } - } 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 - */ - 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; - - } 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; - } else { - return null; - } - } - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomReferenceBindingProvider.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomReferenceBindingProvider.java deleted file mode 100644 index f2b1d1f72b..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomReferenceBindingProvider.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 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.atom.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.atom.AtomBinding; -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 AtomReferenceBindingProvider implements ReferenceBindingProvider { - - private RuntimeComponentReference reference; - private AtomBinding 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 - */ - AtomReferenceBindingProvider(RuntimeComponent component, - RuntimeComponentReference reference, - AtomBinding 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(); - 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)); - if (itemClassType.getPhysical() == org.apache.abdera.model.Entry.class) { - supportsFeedEntries = true; - } - - return new AtomBindingInvoker.GetInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - - } else if (operationName.equals("post")) { - return new AtomBindingInvoker.PostInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("put")) { - return new AtomBindingInvoker.PutInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("delete")) { - return new AtomBindingInvoker.DeleteInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("getFeed") || operationName.equals("getAll")) { - return new AtomBindingInvoker.GetAllInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("postMedia")) { - return new AtomBindingInvoker.PostMediaInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("putMedia")) { - return new AtomBindingInvoker.PutMediaInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } else if (operationName.equals("query")) { - return new AtomBindingInvoker.QueryInvoker(operation, binding.getURI(), httpClient, authorizationHeader, this); - } - - return new AtomBindingInvoker(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; - } - -} diff --git a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomServiceBindingProvider.java b/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomServiceBindingProvider.java deleted file mode 100644 index e1d470f5a3..0000000000 --- a/branches/sca-android/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomServiceBindingProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.atom.provider; - -import org.apache.tuscany.sca.binding.atom.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; -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 AtomServiceBindingProvider implements ServiceBindingProvider { - - private RuntimeComponentService service; - private AtomBinding binding; - private ServletHost servletHost; - private MessageFactory messageFactory; - private String servletMapping; - private Mediator mediator; - - AtomServiceBindingProvider(RuntimeComponent component, - RuntimeComponentService service, - AtomBinding 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); - - AtomBindingListenerServlet servlet = - new AtomBindingListenerServlet(wire, messageFactory, mediator, binding.getTitle()); - - servletMapping = binding.getURI(); - if (!servletMapping.endsWith("/")) { - servletMapping += "/"; - } - if (!servletMapping.endsWith("*")) { - servletMapping += "*"; - } - servletHost.addServletMapping(servletMapping, servlet); - } - - public void stop() { - servletHost.removeServletMapping(servletMapping); - } -} |