diff options
Diffstat (limited to 'sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util')
3 files changed, 306 insertions, 0 deletions
diff --git a/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/IOUtils.java b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/IOUtils.java new file mode 100644 index 0000000000..daac727cb6 --- /dev/null +++ b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/IOUtils.java @@ -0,0 +1,176 @@ +/*
+ * 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.notification.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class IOUtils {
+
+ // FIXME: For some reason, tomcat converts the header names to be lower case, see TUSCANY-1791
+ public static final String Notification_Source = "notification-source";
+ public static final String Notification_Target = "notification-target";
+ public static final String Notification_Operation = "notification-operation";
+
+ public static final int DEF_BLOCK_SIZE = 512;
+
+ public static Object sendHttpRequest(URL targetURL,
+ String opName,
+ Writeable wbody,
+ ReadableContinuation rcont) throws Exception {
+ if (opName == null) {
+ opName = "";
+ }
+ Map<String, String> headers = new HashMap<String, String>();
+ headers.put(Notification_Operation, opName);
+ return sendHttpRequest(targetURL, headers, wbody, rcont);
+ }
+
+ public static Object sendHttpRequest(URL targetURL,
+ Map<String, String> headers,
+ Writeable wbody,
+ ReadableContinuation rcont) throws Exception {
+
+ String targetUri = targetURL.toString();
+ String sourceUri = "";
+
+ final HttpURLConnection con = (HttpURLConnection) targetURL.openConnection();
+ con.setRequestMethod("POST");
+ //con.setRequestProperty("Content-Length", Integer.toString(sbody.getBytes().length));
+ con.setAllowUserInteraction(false);
+ con.setInstanceFollowRedirects(false);
+ if (targetUri != null) {
+ con.setRequestProperty(Notification_Target, targetUri);
+ }
+
+ if (sourceUri != null) {
+ con.setRequestProperty(Notification_Source, sourceUri);
+ }
+
+ for (String key : headers.keySet()) {
+ con.setRequestProperty(key, headers.get(key));
+ }
+ con.setDoOutput(true);
+ con.setDoInput(true);
+ con.connect();
+ Object response = null;
+ try {
+ if (wbody != null) {
+ OutputStream ost = con.getOutputStream();
+ wbody.write(ost);
+ } else {
+ throw new IOUtilsException("Missing writeable body");
+ }
+ final int rc = con.getResponseCode();
+ switch (rc) {
+ case HttpURLConnection.HTTP_OK:
+ if (rcont != null) {
+ InputStream ist = con.getInputStream();
+ response = rcont.read(ist);
+ }
+ break;
+ case HttpURLConnection.HTTP_NO_CONTENT:
+ break;
+ default:
+ throw new RuntimeException("Unexpected response code: " + rc);
+ }
+ } finally {
+ con.disconnect();
+ }
+ return response;
+ }
+
+ public interface Writeable {
+ void write(OutputStream os) throws IOUtilsException;
+ }
+
+ public interface ReadableContinuation {
+ Object read(InputStream is) throws IOUtilsException;
+ }
+
+ @SuppressWarnings("serial")
+ public static class IOUtilsException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public IOUtilsException(String message) {
+ super(message);
+ }
+
+ public IOUtilsException(Throwable cause) {
+ super(cause);
+ }
+ }
+
+ public static byte [] readFully(final InputStream ist, int len) throws IOException {
+ ByteArrayOutputStream baost = new ByteArrayOutputStream();
+ copyStream(ist,baost,len);
+ return baost.toByteArray();
+ }
+
+ public static int copyStream(final InputStream ist, final OutputStream ost) throws IOException {
+ return copyStream(ist, ost, -1, 0);
+ }
+
+ public static int copyStream(final InputStream ist, final OutputStream ost, int length) throws IOException {
+ return copyStream(ist, ost, length, 0);
+ }
+
+ public static int copyStream(final InputStream ist, final OutputStream ost, final int length, int blockSize) throws IOException {
+
+ int cbCopied = 0;
+ if (blockSize <= 0) {
+ blockSize = DEF_BLOCK_SIZE;
+ }
+
+ final byte[] block = new byte[blockSize];
+ boolean done = length == 0;
+ while (!done) {
+ try {
+ // determine how many bytes to read
+ final int cbToRead = length == -1 ? block.length : (Math.min(length - cbCopied, block.length));
+ final int cbRead = ist.read(block, 0, cbToRead);
+ if (cbRead == -1) {
+ done = true;
+ } else {
+ ost.write(block, 0, cbRead);
+ cbCopied += cbRead;
+ done = cbCopied == length;
+ }
+ } catch (final EOFException e) {
+ done = true;
+ }
+ }
+ ost.flush();
+ return cbCopied;
+ }
+}
diff --git a/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/NotificationServlet.java b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/NotificationServlet.java new file mode 100644 index 0000000000..f780514eda --- /dev/null +++ b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/NotificationServlet.java @@ -0,0 +1,89 @@ +/*
+ * 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.notification.util;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * Receives notification in HTTP request and dispatches it down the wire
+ *
+ * @version $Rev$ $Date$
+ */
+@SuppressWarnings("serial")
+public class NotificationServlet extends HttpServlet {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private NotificationServletHandler handler;
+ private NotificationServletStreamHandler servletStreamHandler;
+
+ public NotificationServlet(NotificationServletHandler handler) {
+ this.handler = handler;
+ this.servletStreamHandler = null;
+ }
+
+ public NotificationServlet(NotificationServletStreamHandler servletStreamHandler) {
+ this.handler = null;
+ this.servletStreamHandler = servletStreamHandler;
+ }
+
+ @Override
+ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ HashMap<String, String> headers = new HashMap<String, String>();
+ Enumeration headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = (String)headerNames.nextElement();
+ headers.put(headerName, request.getHeader(headerName));
+ }
+ if (handler != null) {
+ byte[] requestBody = IOUtils.readFully(request.getInputStream(), request.getContentLength());
+ byte[] handlersResponse = handler.handle(headers, requestBody);
+ if (handlersResponse != null) {
+ response.getOutputStream().write(handlersResponse);
+ response.getOutputStream().flush();
+ }
+ } else {
+ try {
+ servletStreamHandler.handle(headers, request.getInputStream(), request.getContentLength(), response.getOutputStream());
+ } catch(RuntimeException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public interface NotificationServletHandler {
+ byte[] handle(Map<String, String> headers, byte[] payload);
+ }
+
+ public interface NotificationServletStreamHandler {
+ void handle(Map<String, String> headers, ServletInputStream istream, int contentLength, ServletOutputStream ostream);
+ }
+}
diff --git a/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/URIUtil.java b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/URIUtil.java new file mode 100644 index 0000000000..42ccd5cdac --- /dev/null +++ b/sca-java-1.x/tags/1.5-RC0/modules/binding-notification/src/main/java/org/apache/tuscany/sca/binding/notification/util/URIUtil.java @@ -0,0 +1,41 @@ +/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.binding.notification.util;
+
+import java.net.URI;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class URIUtil {
+
+ public static String getPath(URI uri) {
+ String path = null;
+
+ if (uri.isOpaque()) {
+ path = "/" + uri.getSchemeSpecificPart();
+ } else if (uri.isAbsolute()) {
+ path = uri.getPath();
+ } else {
+ path = "/" + uri.getPath();
+ }
+
+ return path;
+ }
+}
|