You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2010/06/30 15:40:38 UTC

svn commit: r959306 - in /incubator/chemistry/opencmis-browser-binding/trunk: ./ src/main/java/org/apache/chemistry/opencmis/server/impl/browser/ src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/ src/main/webapp/

Author: fmui
Date: Wed Jun 30 13:40:38 2010
New Revision: 959306

URL: http://svn.apache.org/viewvc?rev=959306&view=rev
Log:
much nicer JSON

Added:
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java   (with props)
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java   (with props)
Removed:
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryInfoList.java
Modified:
    incubator/chemistry/opencmis-browser-binding/trunk/pom.xml
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisResource.java
    incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/demo.jsp

Modified: incubator/chemistry/opencmis-browser-binding/trunk/pom.xml
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/pom.xml?rev=959306&r1=959305&r2=959306&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/pom.xml (original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/pom.xml Wed Jun 30 13:40:38 2010
@@ -102,9 +102,15 @@
              <version>1.3</version>
         </dependency>
         <dependency>
-            <groupId>com.sun.grizzly</groupId>
-            <artifactId>grizzly-servlet-webserver</artifactId>
-            <version>1.9.18-i</version>
+             <groupId>com.googlecode.json-simple</groupId>
+             <artifactId>json-simple</artifactId>
+             <version>1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
         </dependency>
     </dependencies>
 

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisResource.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisResource.java?rev=959306&r1=959305&r2=959306&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisResource.java (original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/CmisResource.java Wed Jun 30 13:40:38 2010
@@ -31,7 +31,6 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.xml.bind.JAXBElement;
-import javax.xml.namespace.QName;
 
 import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.data.ObjectData;
@@ -41,10 +40,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
 import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
 import org.apache.chemistry.opencmis.commons.impl.Converter;
-import org.apache.chemistry.opencmis.commons.impl.JaxBHelper;
 import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisObjectInFolderListType;
-import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisObjectType;
-import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisRepositoryInfoType;
 import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisTypeDefinitionListType;
 import org.apache.chemistry.opencmis.commons.impl.jaxb.CmisTypeDefinitionType;
 import org.apache.chemistry.opencmis.commons.impl.server.AbstractServiceFactory;
@@ -54,6 +50,8 @@ import org.apache.chemistry.opencmis.ser
 import org.apache.chemistry.opencmis.server.impl.CmisRepositoryContextListener;
 import org.apache.chemistry.opencmis.server.impl.atompub.BasicAuthCallContextHandler;
 import org.apache.chemistry.opencmis.server.impl.atompub.CallContextHandler;
+import org.apache.chemistry.opencmis.server.impl.browser.json.JSONConverter;
+import org.json.simple.JSONArray;
 
 @Path("/")
 public class CmisResource {
@@ -75,20 +73,20 @@ public class CmisResource {
     @GET
     @Path("/repositories")
     @Produces(MediaType.APPLICATION_JSON)
-    public JAXBElement<RepositoryInfoList> getRepositories() {
+    @SuppressWarnings("unchecked")
+    public String getRepositories() {
         CmisService service = null;
 
         try {
-            service = getService(null);
+            JSONArray result = new JSONArray();
 
-            RepositoryInfoList result = new RepositoryInfoList();
+            service = getService(null);
 
             for (RepositoryInfo ri : service.getRepositoryInfos(null)) {
-                result.getRepositoryInfos().add(Converter.convert(ri));
+                result.add(JSONConverter.convert(ri));
             }
 
-            return new JAXBElement<RepositoryInfoList>(new QName("repositoryInfoList"), RepositoryInfoList.class,
-                    result);
+            return result.toJSONString();
         } finally {
             if (service != null) {
                 service.close();
@@ -99,7 +97,7 @@ public class CmisResource {
     @GET
     @Path("/repository/{repositoryId}")
     @Produces(MediaType.APPLICATION_JSON)
-    public JAXBElement<CmisRepositoryInfoType> getRepository(@PathParam("repositoryId") String repositoryId) {
+    public String getRepository(@PathParam("repositoryId") String repositoryId) {
         CmisService service = null;
 
         try {
@@ -107,7 +105,7 @@ public class CmisResource {
 
             RepositoryInfo ri = service.getRepositoryInfo(repositoryId, null);
 
-            return JaxBHelper.CMIS_EXTRA_OBJECT_FACTORY.createRepositoryInfo(Converter.convert(ri));
+            return JSONConverter.convert(ri).toJSONString();
         } finally {
             if (service != null) {
                 service.close();
@@ -159,17 +157,16 @@ public class CmisResource {
     @GET
     @Path("/object/{repositoryId}")
     @Produces(MediaType.APPLICATION_JSON)
-    public JAXBElement<CmisObjectType> getObject(@PathParam("repositoryId") String repositoryId,
-            @QueryParam("id") String objectId) {
+    public String getObject(@PathParam("repositoryId") String repositoryId, @QueryParam("id") String objectId) {
         CmisService service = null;
 
         try {
             service = getService(repositoryId);
 
-            ObjectData object = service.getObject(repositoryId, objectId, null, true, IncludeRelationships.NONE, null,
-                    false, false, null);
+            ObjectData object = service.getObject(repositoryId, objectId, null, true, IncludeRelationships.BOTH, null,
+                    true, true, null);
 
-            return JaxBHelper.CMIS_EXTRA_OBJECT_FACTORY.createObject(Converter.convert(object));
+            return JSONConverter.convert(object).toJSONString();
         } finally {
             if (service != null) {
                 service.close();

Added: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java?rev=959306&view=auto
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java (added)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java Wed Jun 30 13:40:38 2010
@@ -0,0 +1,100 @@
+/*
+ * 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.chemistry.opencmis.server.impl.browser.json;
+
+
+public class JSONConstants {
+
+    public final static String JSON_REPINFO_ID = "repositoryId";
+    public final static String JSON_REPINFO_NAME = "repositoryName";
+    public final static String JSON_REPINFO_DESCRIPTION = "repositoryDescription";
+    public final static String JSON_REPINFO_VENDOR = "vendorName";
+    public final static String JSON_REPINFO_PRODUCT = "productName";
+    public final static String JSON_REPINFO_PRODUCT_VERSION = "productVersion";
+    public final static String JSON_REPINFO_ROOT_FOLDER_ID = "rootFolderId";
+    public final static String JSON_REPINFO_CAPABILITIES = "capabilities";
+    public final static String JSON_REPINFO_ACL_CAPABILITIES = "aclCapabilities";
+    public final static String JSON_REPINFO_CHANGE_LOCK_TOKEN = "latestChangeLogToken";
+    public final static String JSON_REPINFO_CMIS_VERSION_SUPPORTED = "cmisVersionSupported";
+    public final static String JSON_REPINFO_THIN_CLIENT_URI = "thinClientURI";
+    public final static String JSON_REPINFO_CHANGES_INCOMPLETE = "changesIncomplete";
+    public final static String JSON_REPINFO_CHANGES_ON_TYPE = "changesOnType";
+    public final static String JSON_REPINFO_PRINCIPAL_ID_ANONYMOUS = "principalIdAnonymous";
+    public final static String JSON_REPINFO_PRINCIPAL_ID_ANYONE = "principalIdAnyone";
+
+    public final static String JSON_CAP_CONTENT_STREAM_UPDATES = "contentStreamUpdates";
+    public final static String JSON_CAP_CHANGES = "changes";
+    public final static String JSON_CAP_RENDITIONS = "renditions";
+    public final static String JSON_CAP_GET_DESCENDANTS = "getDescendants";
+    public final static String JSON_CAP_GET_FOLDER_TREE = "getFolderTree";
+    public final static String JSON_CAP_MULTIFILING = "multifiling";
+    public final static String JSON_CAP_UNFILING = "unfiling";
+    public final static String JSON_CAP_VERSION_SPECIFIC_FILING = "versionSpecificFiling";
+    public final static String JSON_CAP_PWC_SEARCHABLE = "pwcSearchable";
+    public final static String JSON_CAP_PWC_UPDATABLE = "pwcUpdatable";
+    public final static String JSON_CAP_ALL_VERSIONS_SEARCHABLE = "allVersionsSearchable";
+    public final static String JSON_CAP_QUERY = "query";
+    public final static String JSON_CAP_JOIN = "join";
+    public final static String JSON_CAP_ACL = "acl";
+
+    public final static String JSON_ACLCAP_SUPPORTED_PERMISSIONS = "supportedPermissions";
+    public final static String JSON_ACLCAP_ACL_PROPAGATION = "aclPropagation";
+    public final static String JSON_ACLCAP_PERMISSIONS = "permissions";
+    public final static String JSON_ACLCAP_PERMISSION_MAPPING = "permissionMapping";
+
+    public final static String JSON_ACLCAP_PERMISSION_ID = "id";
+    public final static String JSON_ACLCAP_PERMISSION_DESCRIPTION = "description";
+
+    public final static String JSON_ACLCAP_MAPPING_KEY = "key";
+    public final static String JSON_ACLCAP_MAPPING_PERMISSIONS = "permissions";
+
+    public final static String JSON_OBJECT_PROPERTIES = "properties";
+    public final static String JSON_OBJECT_ALLOWABLE_ACTIONS = "allowableActions";
+    public final static String JSON_OBJECT_RELATIONSHIP = "relationship";
+    public final static String JSON_OBJECT_CHANGE_EVENT_INFO = "changeEventInfo";
+    public final static String JSON_OBJECT_ACL = "acl";
+    public final static String JSON_OBJECT_EXACT_ACL = "exactACL";
+    public final static String JSON_OBJECT_POLICY_IDS = "policyIds";
+    public final static String JSON_OBJECT_RENDITION = "rendition";
+
+    public final static String JSON_PROPERTY_ID = "id";
+    public final static String JSON_PROPERTY_LOCAL_NAME = "localName";
+    public final static String JSON_PROPERTY_DISPLAY_NAME = "displayName";
+    public final static String JSON_PROPERTY_QUERY_NAME = "queryName";
+    public final static String JSON_PROPERTY_VALUES = "values";
+    public final static String JSON_PROPERTY_DATATYPE = "type";
+
+    public final static String JSON_CHANGE_EVENT_TYPE = "changeType";
+    public final static String JSON_CHANGE_EVENT_TIME = "changeTime";
+
+    public final static String JSON_ACL_ACES = "aces";
+    public final static String JSON_ACL_IS_EXACT = "isExact";
+
+    public final static String JSON_ACE_PRINCIPAL = "princialId";
+    public final static String JSON_ACE_PERMISSIONS = "permissions";
+
+    public final static String JSON_RENDITION_STREAM_ID = "streamId";
+    public final static String JSON_RENDITION_MIMETYPE = "mimetype";
+    public final static String JSON_RENDITION_LENGTH = "length";
+    public final static String JSON_RENDITION_KIND = "kind";
+    public final static String JSON_RENDITION_TITLE = "title";
+    public final static String JSON_RENDITION_HEIGHT = "height";
+    public final static String JSON_RENDITION_WIDTH = "width";
+    public final static String JSON_RENDITION_DOCUMENT_ID = "renditionDocumentId";
+}

Propchange: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java?rev=959306&view=auto
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java (added)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java Wed Jun 30 13:40:38 2010
@@ -0,0 +1,393 @@
+/*
+ * 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.chemistry.opencmis.server.impl.browser.json;
+
+import java.util.GregorianCalendar;
+import java.util.Set;
+
+import org.apache.chemistry.opencmis.commons.data.Ace;
+import org.apache.chemistry.opencmis.commons.data.Acl;
+import org.apache.chemistry.opencmis.commons.data.AclCapabilities;
+import org.apache.chemistry.opencmis.commons.data.AllowableActions;
+import org.apache.chemistry.opencmis.commons.data.ChangeEventInfo;
+import org.apache.chemistry.opencmis.commons.data.ObjectData;
+import org.apache.chemistry.opencmis.commons.data.PermissionMapping;
+import org.apache.chemistry.opencmis.commons.data.PropertyBoolean;
+import org.apache.chemistry.opencmis.commons.data.PropertyData;
+import org.apache.chemistry.opencmis.commons.data.PropertyDateTime;
+import org.apache.chemistry.opencmis.commons.data.PropertyDecimal;
+import org.apache.chemistry.opencmis.commons.data.PropertyHtml;
+import org.apache.chemistry.opencmis.commons.data.PropertyId;
+import org.apache.chemistry.opencmis.commons.data.PropertyInteger;
+import org.apache.chemistry.opencmis.commons.data.PropertyString;
+import org.apache.chemistry.opencmis.commons.data.PropertyUri;
+import org.apache.chemistry.opencmis.commons.data.RenditionData;
+import org.apache.chemistry.opencmis.commons.data.RepositoryCapabilities;
+import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
+import org.apache.chemistry.opencmis.commons.definitions.PermissionDefinition;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.PropertyType;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+public class JSONConverter extends JSONConstants {
+
+    /**
+     * Private constructor.
+     */
+    private JSONConverter() {
+    }
+
+    /**
+     * Converts a repository info object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(RepositoryInfo repositoryInfo) {
+        if (repositoryInfo == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(JSON_REPINFO_ID, repositoryInfo.getId());
+        result.put(JSON_REPINFO_NAME, repositoryInfo.getName());
+        result.put(JSON_REPINFO_DESCRIPTION, repositoryInfo.getDescription());
+        result.put(JSON_REPINFO_VENDOR, repositoryInfo.getVendorName());
+        result.put(JSON_REPINFO_PRODUCT, repositoryInfo.getProductName());
+        result.put(JSON_REPINFO_PRODUCT_VERSION, repositoryInfo.getProductVersion());
+        result.put(JSON_REPINFO_ROOT_FOLDER_ID, repositoryInfo.getRootFolderId());
+        result.put(JSON_REPINFO_CAPABILITIES, convert(repositoryInfo.getCapabilities()));
+        result.put(JSON_REPINFO_ACL_CAPABILITIES, convert(repositoryInfo.getAclCapabilities()));
+        result.put(JSON_REPINFO_CHANGE_LOCK_TOKEN, repositoryInfo.getLatestChangeLogToken());
+        result.put(JSON_REPINFO_CMIS_VERSION_SUPPORTED, repositoryInfo.getCmisVersionSupported());
+        result.put(JSON_REPINFO_THIN_CLIENT_URI, repositoryInfo.getThinClientUri());
+        result.put(JSON_REPINFO_CHANGES_INCOMPLETE, repositoryInfo.getChangesIncomplete());
+
+        if (repositoryInfo.getChangesOnType() != null) {
+            JSONArray changesOnType = new JSONArray();
+
+            for (BaseTypeId type : repositoryInfo.getChangesOnType()) {
+                changesOnType.add(getJSONStringValue(type));
+            }
+
+            result.put(JSON_REPINFO_CHANGES_ON_TYPE, changesOnType);
+        }
+
+        result.put(JSON_REPINFO_PRINCIPAL_ID_ANONYMOUS, repositoryInfo.getPrincipalIdAnonymous());
+        result.put(JSON_REPINFO_PRINCIPAL_ID_ANYONE, repositoryInfo.getPrincipalIdAnyone());
+
+        return result;
+    }
+
+    /**
+     * Converts a capabilities object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(RepositoryCapabilities capabilities) {
+        if (capabilities == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(JSON_CAP_CONTENT_STREAM_UPDATES,
+                getJSONStringValue(capabilities.getContentStreamUpdatesCapability()));
+        result.put(JSON_CAP_CHANGES, getJSONStringValue(capabilities.getChangesCapability()));
+        result.put(JSON_CAP_RENDITIONS, getJSONStringValue(capabilities.getRenditionsCapability()));
+        result.put(JSON_CAP_GET_DESCENDANTS, capabilities.isGetDescendantsSupported());
+        result.put(JSON_CAP_GET_FOLDER_TREE, capabilities.isGetFolderTreeSupported());
+        result.put(JSON_CAP_MULTIFILING, capabilities.isMultifilingSupported());
+        result.put(JSON_CAP_UNFILING, capabilities.isUnfilingSupported());
+        result.put(JSON_CAP_VERSION_SPECIFIC_FILING, capabilities.isVersionSpecificFilingSupported());
+        result.put(JSON_CAP_PWC_SEARCHABLE, capabilities.isPwcSearchableSupported());
+        result.put(JSON_CAP_PWC_UPDATABLE, capabilities.isPwcUpdatableSupported());
+        result.put(JSON_CAP_ALL_VERSIONS_SEARCHABLE, capabilities.isAllVersionsSearchableSupported());
+        result.put(JSON_CAP_QUERY, getJSONStringValue(capabilities.getQueryCapability()));
+        result.put(JSON_CAP_JOIN, getJSONStringValue(capabilities.getJoinCapability()));
+        result.put(JSON_CAP_ACL, getJSONStringValue(capabilities.getAclCapability()));
+
+        return result;
+    }
+
+    /**
+     * Converts an ACL capabilities object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(AclCapabilities capabilities) {
+        if (capabilities == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(JSON_ACLCAP_SUPPORTED_PERMISSIONS, getJSONStringValue(capabilities.getSupportedPermissions()));
+        result.put(JSON_ACLCAP_ACL_PROPAGATION, getJSONStringValue(capabilities.getAclPropagation()));
+
+        // permissions
+        if (capabilities.getPermissions() != null) {
+            JSONArray permissions = new JSONArray();
+
+            for (PermissionDefinition permDef : capabilities.getPermissions()) {
+                JSONObject permission = new JSONObject();
+                permission.put(JSON_ACLCAP_PERMISSION_ID, permDef.getId());
+                permission.put(JSON_ACLCAP_PERMISSION_DESCRIPTION, permDef.getDescription());
+
+                permissions.add(permission);
+            }
+
+            result.put(JSON_ACLCAP_PERMISSIONS, permissions);
+        }
+
+        // permission mapping
+
+        if (capabilities.getPermissionMapping() != null) {
+            JSONArray permissionMapping = new JSONArray();
+
+            for (PermissionMapping permMap : capabilities.getPermissionMapping().values()) {
+                JSONArray mappingPermissions = new JSONArray();
+                if (permMap.getPermissions() != null) {
+                    for (String p : permMap.getPermissions()) {
+                        mappingPermissions.add(p);
+                    }
+                }
+
+                JSONObject mapping = new JSONObject();
+                mapping.put(JSON_ACLCAP_MAPPING_KEY, permMap.getKey());
+                mapping.put(JSON_ACLCAP_MAPPING_PERMISSIONS, mappingPermissions);
+
+                permissionMapping.add(mapping);
+            }
+
+            result.put(JSON_ACLCAP_PERMISSION_MAPPING, permissionMapping);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts an object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectData object) {
+        if (object == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        // properties
+        if (object.getProperties() != null) {
+            JSONObject properties = new JSONObject();
+
+            for (PropertyData<?> prop : object.getProperties().getPropertyList()) {
+                JSONArray propertyValues = new JSONArray();
+                if (prop.getValues() != null) {
+                    for (Object value : prop.getValues()) {
+                        propertyValues.add(getJSONValue(value));
+                    }
+                }
+
+                JSONObject propertyObject = new JSONObject();
+                propertyObject.put(JSON_PROPERTY_ID, prop.getId());
+                propertyObject.put(JSON_PROPERTY_LOCAL_NAME, prop.getLocalName());
+                propertyObject.put(JSON_PROPERTY_DISPLAY_NAME, prop.getDisplayName());
+                propertyObject.put(JSON_PROPERTY_QUERY_NAME, prop.getQueryName());
+                propertyObject.put(JSON_PROPERTY_VALUES, propertyValues);
+                propertyObject.put(JSON_PROPERTY_DATATYPE, getJSONPropertyDataType(prop));
+
+                properties.put(prop.getId(), propertyObject);
+            }
+
+            result.put(JSON_OBJECT_PROPERTIES, properties);
+        }
+
+        // allowable actions
+        if (object.getAllowableActions() != null) {
+            result.put(JSON_OBJECT_ALLOWABLE_ACTIONS, convert(object.getAllowableActions()));
+        }
+
+        // relationships
+        if (object.getRelationships() != null) {
+            JSONArray relationships = new JSONArray();
+
+            for (ObjectData relationship : object.getRelationships()) {
+                relationships.add(convert(relationship));
+            }
+
+            result.put(JSON_OBJECT_RELATIONSHIP, relationships);
+        }
+
+        // change event info
+        if (object.getChangeEventInfo() != null) {
+            JSONObject changeEventInfo = new JSONObject();
+
+            ChangeEventInfo cei = object.getChangeEventInfo();
+            changeEventInfo.put(JSON_CHANGE_EVENT_TYPE, getJSONStringValue(cei.getChangeType()));
+            changeEventInfo.put(JSON_CHANGE_EVENT_TIME, getJSONValue(cei.getChangeTime()));
+
+            result.put(JSON_OBJECT_CHANGE_EVENT_INFO, changeEventInfo);
+        }
+
+        // ACL
+        if ((object.getAcl() != null) && (object.getAcl().getAces() != null)) {
+            result.put(JSON_OBJECT_ACL, convert(object.getAcl()));
+            result.put(JSON_OBJECT_EXACT_ACL, object.isExactAcl());
+        }
+
+        // policy ids
+        if ((object.getPolicyIds() != null) && (object.getPolicyIds().getPolicyIds() != null)) {
+            JSONArray policyIds = new JSONArray();
+
+            for (String pi : object.getPolicyIds().getPolicyIds()) {
+                policyIds.add(pi);
+            }
+
+            result.put(JSON_OBJECT_POLICY_IDS, policyIds);
+        }
+
+        // renditions
+        if (object.getRenditions() != null) {
+            JSONArray renditions = new JSONArray();
+
+            for (RenditionData rendition : object.getRenditions()) {
+                renditions.add(convert(rendition));
+            }
+
+            result.put(JSON_OBJECT_RENDITION, renditions);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts allowable actions.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(AllowableActions allowableActions) {
+        if (allowableActions == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        Set<Action> actionSet = allowableActions.getAllowableActions();
+        for (Action action : Action.values()) {
+            result.put(action.value(), actionSet.contains(action));
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts an ACL.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(Acl acl) {
+        if ((acl == null) || (acl.getAces() == null)) {
+            return null;
+        }
+
+        JSONArray aceObjects = new JSONArray();
+
+        for (Ace ace : acl.getAces()) {
+            JSONArray permissions = new JSONArray();
+            if (ace.getPermissions() != null) {
+                for (String p : ace.getPermissions()) {
+                    permissions.add(p);
+                }
+            }
+
+            JSONObject aceObject = new JSONObject();
+            aceObject.put(JSON_ACE_PRINCIPAL, ace.getPrincipalId());
+            aceObject.put(JSON_ACE_PERMISSIONS, permissions);
+
+            aceObjects.add(aceObject);
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_ACL_ACES, aceObjects);
+        result.put(JSON_ACL_IS_EXACT, acl.isExact());
+
+        return result;
+    }
+
+    /**
+     * Converts a rendition.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(RenditionData rendition) {
+        if (rendition == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(JSON_RENDITION_STREAM_ID, rendition.getStreamId());
+        result.put(JSON_RENDITION_MIMETYPE, rendition.getMimeType());
+        result.put(JSON_RENDITION_LENGTH, rendition.getBigLength());
+        result.put(JSON_RENDITION_KIND, rendition.getKind());
+        result.put(JSON_RENDITION_TITLE, rendition.getTitle());
+        result.put(JSON_RENDITION_HEIGHT, rendition.getBigHeight());
+        result.put(JSON_RENDITION_WIDTH, rendition.getBigWidth());
+        result.put(JSON_RENDITION_DOCUMENT_ID, rendition.getRenditionDocumentId());
+
+        return result;
+    }
+
+    // -----------------------------------------------------------------
+
+    public static String getJSONStringValue(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+
+        return obj.toString();
+    }
+
+    public static Object getJSONValue(Object value) {
+        if (value instanceof GregorianCalendar) {
+            return ((GregorianCalendar) value).getTimeInMillis();
+        }
+
+        return value;
+    }
+
+    public static String getJSONPropertyDataType(PropertyData<?> property) {
+        if (property instanceof PropertyBoolean) {
+            return PropertyType.BOOLEAN.value();
+        } else if (property instanceof PropertyId) {
+            return PropertyType.ID.value();
+        } else if (property instanceof PropertyInteger) {
+            return PropertyType.INTEGER.value();
+        } else if (property instanceof PropertyDateTime) {
+            return PropertyType.DATETIME.value();
+        } else if (property instanceof PropertyDecimal) {
+            return PropertyType.DECIMAL.value();
+        } else if (property instanceof PropertyHtml) {
+            return PropertyType.HTML.value();
+        } else if (property instanceof PropertyString) {
+            return PropertyType.STRING.value();
+        } else if (property instanceof PropertyUri) {
+            return PropertyType.URI.value();
+        }
+
+        return null;
+    }
+}

Propchange: incubator/chemistry/opencmis-browser-binding/trunk/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/demo.jsp
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/demo.jsp?rev=959306&r1=959305&r2=959306&view=diff
==============================================================================
--- incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/demo.jsp (original)
+++ incubator/chemistry/opencmis-browser-binding/trunk/src/main/webapp/demo.jsp Wed Jun 30 13:40:38 2010
@@ -18,10 +18,10 @@
 <script type="text/javascript">
 $(document).ready(function(){
   $.getJSON('<%=request.getContextPath()%>/browser/repositories', 
-    function(data) {
-      var ri = data.repositoryInfos;
+    function(riData) {
+      var ri = riData[0];
       $('#repositoryInfo').html(
-        '<h2>Repsository ' + ri.repositoryName + ' (' + ri.repositoryId + ')</h2>' +
+        '<h2>Repsository "' + ri.repositoryName + '" (' + ri.repositoryId + ')</h2>' +
         '<table>' +
         '<tr><td>Id:</td><td>' + ri.repositoryId + '</td></tr>' +
         '<tr><td>Name:</td><td>' + ri.repositoryName + '</td></tr>' +
@@ -29,6 +29,45 @@ $(document).ready(function(){
         '<tr><td>Product:</td><td>' + ri.vendorName + ' ' + ri.productName + ' ' + ri.productVersion + '</td></tr>' +
         '<tr><td>Root folder id:</td><td>' + ri.rootFolderId + '</td></tr>' +
         '</table>');
+
+      $.getJSON(encodeURI('<%=request.getContextPath()%>/browser/object/' + ri.repositoryId + '?id=' + ri.rootFolderId), 
+        function(objData) {
+          var id = objData.properties["cmis:objectId"].values[0];
+          var name = objData.properties["cmis:name"].values[0];
+          
+          var s = '<h2>Object "' + name + '" (' + id + ')</h2>';
+
+          s = s + '<h3>Properties</h3>';
+          s = s + '<table>';
+          
+          var propertyId;
+          for(propertyId in objData.properties) {
+              var property = objData.properties[propertyId];
+              s = s + '<tr><td>' + property.id +  '</td><td><td>' + property.type +  '</td><td>';
+
+              for(var i in property.values) {
+                  var value = property.values[i];
+                  if(property.type == 'datetime') {
+                      value = new Date(value);
+                  }
+                  
+                  s = s + value + '<br/>';
+              }
+               
+               s = s + '</td></tr>';
+          }          
+          
+          s = s + '</table>';
+
+          s = s + '<h3>(Some) Allowable Actions</h3>';
+          s = s + '<table>';
+          s = s + '<tr><td>Can get properties:</td><td>' + objData.allowableActions.canGetProperties + '</td></tr>';
+          s = s + '<tr><td>Can get children:</td><td>' + objData.allowableActions.canGetChildren + '</td></tr>';
+          s = s + '<tr><td>Can get content stream:</td><td>' + objData.allowableActions.canGetContentStream + '</td></tr>';
+          s = s + '</table>';
+          
+    	  $('#objectInfo').html(s);
+        });
    });
 });     
 </script>
@@ -39,5 +78,9 @@ $(document).ready(function(){
 <div id="repositoryInfo" class="box">
 RepositoryInfo
 </div>
+<br/>
+<div id="objectInfo" class="box">
+objectInfo
+</div>
 </body>
 </html>
\ No newline at end of file