chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From f...@apache.org
Subject svn commit: r1064683 - in /incubator/chemistry/opencmis-browser-binding/trunk/src/main: java/org/apache/chemistry/opencmis/server/impl/browser/ webapp/
Date Fri, 28 Jan 2011 14:11:25 GMT
Author: fmui
Date: Fri Jan 28 14:11:25 2011
New Revision: 1064683

URL: http://svn.apache.org/viewvc?rev=1064683&view=rev
Log:
found a solution for the cross-domain problem

Removed:
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/result.html
Modified:
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/BrowserBindingUtils.java
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/create.html

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/BrowserBindingUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/BrowserBindingUtils.java?rev=1064683&r1=1064682&r2=1064683&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/BrowserBindingUtils.java
(original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/BrowserBindingUtils.java
Fri Jan 28 14:11:25 2011
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -44,6 +45,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
+import org.apache.chemistry.opencmis.commons.impl.Base64;
 import org.apache.chemistry.opencmis.commons.impl.UrlBuilder;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl;
@@ -59,6 +61,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.server.impl.CallContextImpl;
 import org.apache.chemistry.opencmis.server.shared.HttpUtils;
+import org.json.simple.JSONObject;
 import org.json.simple.JSONStreamAware;
 
 public class BrowserBindingUtils {
@@ -67,6 +70,8 @@ public class BrowserBindingUtils {
 
     public static final String ROOT_PATH_FRAGMENT = "root";
 
+    public static final String SELECTOR_LAST_RESULT = "lastResult";
+
     public static final String SELECTOR_TYPE_CHILDREN = "typeChildren";
     public static final String SELECTOR_TYPE_DESCENDANTS = "typeDescendants";
     public static final String SELECTOR_TYPE_DEFINITION = "typeDefintion";
@@ -84,10 +89,11 @@ public class BrowserBindingUtils {
     public static final String ACTION_QUERY = "query";
 
     public static final String PARAM_SELECTOR = "selector";
-    public static final String PARAM_REDIRECT = "redirect";
+    public static final String PARAM_TRANSACTION = "transaction";
     public static final String PARAM_CLIENTTOKEN = "clientToken";
 
     public static final String FIELD_ACTION = "cmisaction";
+    public static final String FIELD_TRANSACTION = "transaction";
     public static final String FIELD_OBJECT_ID = "objectId";
     public static final String FIELD_PROP_NAME = "property_name_";
     public static final String FIELD_PROP_VALUE = "property_value_";
@@ -95,6 +101,7 @@ public class BrowserBindingUtils {
     public static final String CONTEXT_OBJECT_ID = "org.apache.chemistry.openmis.browserbinding.objectId";
     public static final String CONTEXT_OBJECT_TYPE_ID = "org.apache.chemistry.openmis.browserbinding.objectTypeId";
     public static final String CONTEXT_BASETYPE_ID = "org.apache.chemistry.openmis.browserbinding.basetypeId";
+    public static final String CONTEXT_TRANSACTION = "org.apache.chemistry.openmis.browserbinding.transaction";
 
     public enum CallUrl {
         SERVICE, REPOSITORY, ROOT
@@ -149,7 +156,7 @@ public class BrowserBindingUtils {
      * Returns the object id of the current request.
      */
     public static void prepareContext(CallContext context, CallUrl callUrl, CmisService service,
String repositoryId,
-            String objectId, HttpServletRequest request) {
+            String objectId, String transaction, HttpServletRequest request) {
         if (callUrl != CallUrl.ROOT) {
             return;
         }
@@ -170,6 +177,7 @@ public class BrowserBindingUtils {
                     getProperty(object, PropertyIds.OBJECT_TYPE_ID, String.class));
             ((CallContextImpl) context).put(CONTEXT_BASETYPE_ID,
                     getProperty(object, PropertyIds.BASE_TYPE_ID, String.class));
+            ((CallContextImpl) context).put(CONTEXT_TRANSACTION, transaction);
         }
     }
 
@@ -333,6 +341,57 @@ public class BrowserBindingUtils {
     }
 
     /**
+     * Transforms the transaction into a cookie name.
+     */
+    public static String getCookieName(String transaction) {
+        if ((transaction == null) || (transaction.length() == 0)) {
+            return "cmis%";
+        }
+      
+        return "cmis_" + Base64.encodeBytes(transaction.getBytes()).replace('=', '%');
+    }
+
+    /**
+     * Sets a transaction cookie.
+     */
+    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
String repositoryId,
+            String transaction, String value) {
+        setCookie(request, response, repositoryId, transaction, value, 3600);
+    }
+
+    /**
+     * Deletes a transaction cookie.
+     */
+    public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
String repositoryId,
+            String transaction) {
+        setCookie(request, response, repositoryId, transaction, "", 0);
+    }
+
+    /**
+     * Sets a transaction cookie.
+     */
+    public static void setCookie(HttpServletRequest request, HttpServletResponse response,
String repositoryId,
+            String transaction, String value, int expiry) {
+        if ((transaction != null) && (transaction.length() > 0)) {
+            Cookie tansactionCookie = new Cookie(BrowserBindingUtils.getCookieName(transaction),
value);
+            tansactionCookie.setMaxAge(expiry);
+            tansactionCookie.setPath(request.getContextPath() + request.getServletPath()
+ "/" + repositoryId);
+            response.addCookie(tansactionCookie);
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    public static String createCookieValue(int code, String objectId, String error) {
+        JSONObject result = new JSONObject();
+        
+        result.put("code", code);
+        result.put("objectId", objectId);
+        result.put("error", error);
+        
+        return result.toJSONString();
+    }
+
+    /**
      * Writes JSON to the servlet response and adds a callback wrapper if
      * requested.
      */

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java?rev=1064683&r1=1064682&r2=1064683&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
(original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisBrowserBindingServlet.java
Fri Jan 28 14:11:25 2011
@@ -90,6 +90,8 @@ public class CmisBrowserBindingServlet e
 
         try {
             repositoryDispatcher.addResource("", Dispatcher.METHOD_GET, RepositoryService.class,
"getRepositoryInfo");
+            repositoryDispatcher.addResource(BrowserBindingUtils.SELECTOR_LAST_RESULT, Dispatcher.METHOD_GET,
+                    RepositoryService.class, "getLastResult");
             repositoryDispatcher.addResource(BrowserBindingUtils.SELECTOR_TYPE_CHILDREN,
Dispatcher.METHOD_GET,
                     RepositoryService.class, "getTypeChildren");
             repositoryDispatcher.addResource(BrowserBindingUtils.SELECTOR_TYPE_DESCENDANTS,
Dispatcher.METHOD_GET,
@@ -140,13 +142,13 @@ public class CmisBrowserBindingServlet e
                     response.setHeader("WWW-Authenticate", "Basic realm=\"CMIS\"");
                     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization
Required");
                 } else {
-                    writeError((CmisBaseException) e, request, response);
+                    writeError((CmisBaseException) e, request, response, context);
                 }
             } else if (e instanceof CmisRuntimeException) {
                 LOG.error(e.getMessage(), e);
-                writeError((CmisBaseException) e, request, response);
+                writeError((CmisBaseException) e, request, response, context);
             } else if (e instanceof CmisBaseException) {
-                writeError((CmisBaseException) e, request, response);
+                writeError((CmisBaseException) e, request, response, context);
             } else {
                 LOG.error(e.getMessage(), e);
                 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
@@ -205,7 +207,7 @@ public class CmisBrowserBindingServlet e
                 String objectId = getStringParameter(request, Constants.PARAM_OBJECT_ID);
 
                 // add object id and object base type id to context
-                BrowserBindingUtils.prepareContext(context, callUrl, service, repositoryId,
objectId, request);
+                BrowserBindingUtils.prepareContext(context, callUrl, service, repositoryId,
objectId, null, request);
 
                 // dispatch
                 if (callUrl == CallUrl.REPOSITORY) {
@@ -245,13 +247,15 @@ public class CmisBrowserBindingServlet e
 
                 String action = HttpUtils.getStringParameter(postRequest, BrowserBindingUtils.FIELD_ACTION);
                 String objectId = HttpUtils.getStringParameter(postRequest, BrowserBindingUtils.FIELD_OBJECT_ID);
+                String transaction = HttpUtils.getStringParameter(postRequest, BrowserBindingUtils.FIELD_TRANSACTION);
 
                 if ((action == null) || (action.length() == 0)) {
                     throw new CmisNotSupportedException("Unknown action");
                 }
 
                 // add object id and object base type id to context
-                BrowserBindingUtils.prepareContext(context, callUrl, service, repositoryId,
objectId, postRequest);
+                BrowserBindingUtils.prepareContext(context, callUrl, service, repositoryId,
objectId, transaction,
+                        postRequest);
 
                 // dispatch
                 if (callUrl == CallUrl.REPOSITORY) {
@@ -279,7 +283,8 @@ public class CmisBrowserBindingServlet e
      * Translates an exception in an appropriate HTTP error code.
      */
     @SuppressWarnings("unchecked")
-    private void writeError(CmisBaseException ex, HttpServletRequest request, HttpServletResponse
response) {
+    private void writeError(CmisBaseException ex, HttpServletRequest request, HttpServletResponse
response,
+            CallContext context) {
         int code = 500;
 
         if (ex instanceof CmisConstraintException) {
@@ -310,6 +315,11 @@ public class CmisBrowserBindingServlet e
 
         response.setStatus(code);
         response.setContentType(BrowserBindingUtils.JSON_MIME_TYPE);
+        if (context != null) {
+            BrowserBindingUtils.setCookie(request, response, context.getRepositoryId(),
+                    (String) context.get(BrowserBindingUtils.CONTEXT_TRANSACTION),
+                    BrowserBindingUtils.createCookieValue(code, null, ex.getMessage()));
+        }
 
         JSONObject jsonResponse = new JSONObject();
         JSONObject jsonResponseObject = new JSONObject();

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java?rev=1064683&r1=1064682&r2=1064683&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
(original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ObjectService.java
Fri Jan 28 14:11:25 2011
@@ -27,8 +27,6 @@ import java.io.BufferedOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.math.BigInteger;
-import java.net.MalformedURLException;
-import java.net.URL;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -37,11 +35,9 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.data.ObjectData;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.enums.VersioningState;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
 import org.apache.chemistry.opencmis.commons.impl.Constants;
 import org.apache.chemistry.opencmis.commons.impl.ReturnVersion;
-import org.apache.chemistry.opencmis.commons.impl.UrlBuilder;
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.server.ObjectInfo;
@@ -61,45 +57,33 @@ public final class ObjectService {
         String folderId = (String) context.get(BrowserBindingUtils.CONTEXT_OBJECT_ID);
         VersioningState versioningState = getEnumParameter(request, Constants.PARAM_VERSIONIG_STATE,
                 VersioningState.class);
-        String redirect = getStringParameter(request, BrowserBindingUtils.PARAM_REDIRECT);
-        URL redirectUrl = null;
-        if (redirect != null) {
-            try {
-                redirectUrl = new URL(redirect);
-            } catch (MalformedURLException e) {
-                throw new CmisInvalidArgumentException("Redirect URL is invalid!");
-            }
-        }
+        String transaction = getStringParameter(request, BrowserBindingUtils.PARAM_TRANSACTION);
 
         TypeCache typeCache = new TypeCache(repositoryId, service);
 
         String newObjectId = service.createDocument(repositoryId,
-                BrowserBindingUtils.createProperties(request,null, typeCache), folderId,
+                BrowserBindingUtils.createProperties(request, null, typeCache), folderId,
                 BrowserBindingUtils.createContentStream(request), versioningState,
                 BrowserBindingUtils.createPolcies(request), BrowserBindingUtils.createAddAcl(request),
                 BrowserBindingUtils.createRemoveAcl(request), null);
 
-        if (redirectUrl != null) {
-            UrlBuilder ub= new UrlBuilder(redirectUrl.toString());
-            ub.addParameter("cmis:objectId", newObjectId);
-            
-            response.sendRedirect(ub.toString());
-        } else {
-            ObjectInfo objectInfo = service.getObjectInfo(repositoryId, newObjectId);
-            if (objectInfo == null) {
-                throw new CmisRuntimeException("Object Info is missing!");
-            }
-
-            ObjectData object = objectInfo.getObject();
-            if (object == null) {
-                throw new CmisRuntimeException("Object is null!");
-            }
-
-            JSONObject jsonObject = JSONConverter.convert(object, typeCache);
+        ObjectInfo objectInfo = service.getObjectInfo(repositoryId, newObjectId);
+        if (objectInfo == null) {
+            throw new CmisRuntimeException("Object Info is missing!");
+        }
 
-            response.setStatus(HttpServletResponse.SC_OK);
-            BrowserBindingUtils.writeJSON(jsonObject, request, response);
+        ObjectData object = objectInfo.getObject();
+        if (object == null) {
+            throw new CmisRuntimeException("Object is null!");
         }
+
+        JSONObject jsonObject = JSONConverter.convert(object, typeCache);
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.setCookie(request, response, repositoryId, transaction,
+                BrowserBindingUtils.createCookieValue(200, object.getId(), null));
+
+        BrowserBindingUtils.writeJSON(jsonObject, request, response);
     }
 
     /**

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java?rev=1064683&r1=1064682&r2=1064683&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
(original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
Fri Jan 28 14:11:25 2011
@@ -25,6 +25,7 @@ import static org.apache.chemistry.openc
 import java.math.BigInteger;
 import java.util.List;
 
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -39,6 +40,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.server.impl.browser.json.JSONConverter;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
 
 public final class RepositoryService {
 
@@ -73,6 +75,43 @@ public final class RepositoryService {
     }
 
     /**
+     * getLastResult.
+     */
+    @SuppressWarnings("unchecked")
+    public static void getLastResult(CallContext context, CmisService service, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        String transaction = getStringParameter(request, BrowserBindingUtils.PARAM_TRANSACTION);
+        String cookieName = BrowserBindingUtils.getCookieName(transaction);
+        String cookieValue = null;
+
+        if (request.getCookies() != null) {
+            for (Cookie cookie : request.getCookies()) {
+                if (cookieName.equals(cookie.getName())) {
+                    cookieValue = cookie.getValue();
+                    break;
+                }
+            }
+        }
+
+        JSONObject result = null;
+        try {
+            if (cookieValue == null) {
+                cookieValue = BrowserBindingUtils.createCookieValue(0, null, "Unknown transaction!");
+            }
+
+            result = (JSONObject) JSONValue.parse(cookieValue);
+        } catch (Exception pe) {
+            result.put("code", 0);
+            result.put("objectId", null);
+            result.put("error", "Cookie pasring error!");
+        }
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON((JSONObject) JSONValue.parse(cookieValue), request,
response);
+    }
+
+    /**
      * getTypeChildren.
      */
     public static void getTypeChildren(CallContext context, CmisService service, String repositoryId,

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/create.html
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/create.html?rev=1064683&r1=1064682&r2=1064683&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/create.html (original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/create.html Fri Jan
28 14:11:25 2011
@@ -22,6 +22,7 @@ td {
 <script type="text/javascript">
 var repositoryUrl;
 var rootFolderUrl;
+var lastTransaction;
 
 function loadRepositoryInfos(infos) {
     for(repId in infos) {
@@ -41,10 +42,31 @@ function createDocument() {
     document.getElementById('info').innerHTML = "Creating " + docname + " ...";
 
     createForm.action = rootFolderUrl + createForm.folder.value;
-    createForm.redirect.value = location.href.substring(0, location.href.lastIndexOf('/'))
+ "/result.html"
+    lastTransaction = (new Date()).getTime() + "-" + Math.floor(Math.random()*10000000) +
"-" + docname;
+    createForm.transaction.value = lastTransaction;
  
     return true;
 }
+
+function createDocumentCallback() {
+	if(lastTransaction) {
+		document.getElementById('info').innerHTML = 'Transaction: ' + lastTransaction
+
+		var script1 = document.createElement("script");
+		script1.setAttribute("src", repositoryUrl + "?selector=lastResult&clientToken=showNewDocumentId&transaction="+lastTransaction);
+		script1.setAttribute("type","text/javascript");                
+		document.body.appendChild(script1);
+	}
+}
+
+function showNewDocumentId(result) {
+	if(result.objectId) {
+		alert("New document id: " + result.objectId + " (code: " + result.code + ")");
+	}
+	else {
+		alert("Error: " + result.error + " (code: " + result.code + ")");
+	}
+}
 </script>
 </head>
 <body>
@@ -54,7 +76,7 @@ function createDocument() {
 
 <form id="createForm" action="" method="POST" target="result" enctype="multipart/form-data"
onsubmit="return createDocument()">
 <input name="cmisaction" type="hidden" value="createDocument" />
-<input name="redirect" type="hidden" value="" />
+<input name="transaction" type="hidden" value="" />
 <table>
 <tr>
     <td>Folder:</td>
@@ -82,7 +104,7 @@ function createDocument() {
 </form>
 
 <div id="info"></div>
-<iframe name="result" style="border:2px;width:600px;height:400px;"></iframe>
+<iframe name="result" style="border:2px;width:600px;height:400px;" onload="createDocumentCallback()"></iframe>
 
 <script type="text/javascript" src="browser?clientToken=loadRepositoryInfos"></script>
 </body>



Mime
View raw message