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 2011/04/18 11:29:46 UTC

svn commit: r1094397 [2/3] - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings: ./ src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/ src/main/java/org/apache/chemistry/opencmis/server/impl/browser/...

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java Mon Apr 18 09:29:45 2011
@@ -0,0 +1,181 @@
+/*
+ * 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;
+
+import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBigIntegerParameter;
+import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
+import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
+
+import java.math.BigInteger;
+import java.util.List;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.impl.Constants;
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+import org.apache.chemistry.opencmis.commons.server.CmisService;
+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;
+
+/**
+ * Repository Service operations.
+ */
+public final class RepositoryService {
+
+    /**
+     * getRepositories.
+     */
+    @SuppressWarnings("unchecked")
+    public static void getRepositories(CallContext context, CmisService service, HttpServletRequest request,
+            HttpServletResponse response) throws Exception {
+        // execute
+        List<RepositoryInfo> infoDataList = service.getRepositoryInfos(null);
+
+        JSONObject result = new JSONObject();
+        for (RepositoryInfo ri : infoDataList) {
+            result.put(ri.getId(), JSONConverter.convert(ri, request));
+        }
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(result, request, response);
+    }
+
+    /**
+     * getRepositoryInfo.
+     */
+    public static void getRepositoryInfo(CallContext context, CmisService service, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // execute
+        RepositoryInfo ri = service.getRepositoryInfo(repositoryId, null);
+        JSONObject jsonRi = JSONConverter.convert(ri, request);
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(jsonRi, request, response);
+    }
+
+    /**
+     * 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, "invalidArgument", "Unknown transaction!");
+            }
+
+            result = (JSONObject) JSONValue.parse(cookieValue);
+        } catch (Exception pe) {
+            result.put("code", 0);
+            result.put("objectId", null);
+            result.put("message", "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,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // get parameters
+        String typeId = getStringParameter(request, Constants.PARAM_TYPE_ID);
+        boolean includePropertyDefinitions = getBooleanParameter(request, Constants.PARAM_PROPERTY_DEFINITIONS, false);
+        BigInteger maxItems = getBigIntegerParameter(request, Constants.PARAM_MAX_ITEMS);
+        BigInteger skipCount = getBigIntegerParameter(request, Constants.PARAM_SKIP_COUNT);
+
+        // execute
+        TypeDefinitionList typeList = service.getTypeChildren(repositoryId, typeId, includePropertyDefinitions,
+                maxItems, skipCount, null);
+        JSONObject jsonTypeList = JSONConverter.convert(typeList);
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(jsonTypeList, request, response);
+    }
+
+    /**
+     * getTypeDescendants.
+     */
+    @SuppressWarnings("unchecked")
+    public static void getTypeDescendants(CallContext context, CmisService service, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // get parameters
+        String typeId = getStringParameter(request, Constants.PARAM_TYPE_ID);
+        BigInteger depth = getBigIntegerParameter(request, Constants.PARAM_DEPTH);
+        boolean includePropertyDefinitions = getBooleanParameter(request, Constants.PARAM_PROPERTY_DEFINITIONS, false);
+
+        // execute
+        List<TypeDefinitionContainer> typeTree = service.getTypeDescendants(repositoryId, typeId, depth,
+                includePropertyDefinitions, null);
+
+        if (typeTree == null) {
+            throw new CmisRuntimeException("Type tree is null!");
+        }
+
+        JSONArray jsonTypeTree = new JSONArray();
+        for (TypeDefinitionContainer container : typeTree) {
+            jsonTypeTree.add(JSONConverter.convert(container));
+        }
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(jsonTypeTree, request, response);
+    }
+
+    /**
+     * getTypeDefintion.
+     */
+    public static void getTypeDefintion(CallContext context, CmisService service, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // get parameters
+        String typeId = getStringParameter(request, Constants.PARAM_TYPE_ID);
+
+        // execute
+        TypeDefinition type = service.getTypeDefinition(repositoryId, typeId, null);
+        JSONObject jsonType = JSONConverter.convert(type);
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(jsonType, request, response);
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/RepositoryService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/TypeCache.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/TypeCache.java?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/TypeCache.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/TypeCache.java Mon Apr 18 09:29:45 2011
@@ -0,0 +1,63 @@
+/*
+ * 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;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.server.CmisService;
+import org.apache.chemistry.opencmis.commons.server.ObjectInfo;
+
+/**
+ * Temporary type cache used for one call.
+ */
+public class TypeCache {
+
+    private String repositoryId;
+    private CmisService service;
+    private Map<String, TypeDefinition> typeDefinitions;
+
+    public TypeCache(String repositoryId, CmisService service) {
+        this.repositoryId = repositoryId;
+        this.service = service;
+        typeDefinitions = new HashMap<String, TypeDefinition>();
+    }
+
+    public TypeDefinition getTypeDefinition(String typeId) {
+        TypeDefinition type = typeDefinitions.get(typeId);
+        if (type == null) {
+            type = service.getTypeDefinition(repositoryId, typeId, null);
+            if (type != null) {
+                typeDefinitions.put(type.getId(), type);
+            }
+        }
+
+        return type;
+    }
+
+    public TypeDefinition getTypeDefinitionForObject(String objectId) {
+        ObjectInfo info = service.getObjectInfo(repositoryId, objectId);
+        if (info == null) {
+            return null;
+        }
+
+        return getTypeDefinition(info.getTypeId());
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/TypeCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java Mon Apr 18 09:29:45 2011
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getBooleanParameter;
+import static org.apache.chemistry.opencmis.server.shared.HttpUtils.getStringParameter;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.chemistry.opencmis.commons.data.ObjectData;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.commons.impl.Constants;
+import org.apache.chemistry.opencmis.commons.server.CallContext;
+import org.apache.chemistry.opencmis.commons.server.CmisService;
+import org.apache.chemistry.opencmis.server.impl.browser.json.JSONConverter;
+import org.json.simple.JSONArray;
+
+/**
+ * Versioning Service operations.
+ */
+public class VersioningService {
+
+    /**
+     * getAllVersions.
+     */
+    @SuppressWarnings("unchecked")
+    public static void getAllVersions(CallContext context, CmisService service, String repositoryId,
+            HttpServletRequest request, HttpServletResponse response) throws Exception {
+        // get parameters
+        String objectId = (String) context.get(BrowserBindingUtils.CONTEXT_OBJECT_ID);
+        String filter = getStringParameter(request, Constants.PARAM_FILTER);
+        Boolean includeAllowableActions = getBooleanParameter(request, Constants.PARAM_ALLOWABLE_ACTIONS);
+
+        // execute
+        List<ObjectData> versions = service.getAllVersions(repositoryId, objectId, null, filter,
+                includeAllowableActions, null);
+
+        if (versions == null) {
+            throw new CmisRuntimeException("Versions are null!");
+        }
+
+        TypeCache typeCache = new TypeCache(repositoryId, service);
+        JSONArray jsonVersions = new JSONArray();
+        for (ObjectData version : versions) {
+            jsonVersions.add(JSONConverter.convert(version, typeCache));
+        }
+
+        response.setStatus(HttpServletResponse.SC_OK);
+        BrowserBindingUtils.writeJSON(jsonVersions, request, response);
+    }
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/VersioningService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConstants.java Mon Apr 18 09:29:45 2011
@@ -0,0 +1,183 @@
+/*
+ * 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;
+
+/**
+ * JSON object constants.
+ */
+public class JSONConstants {
+
+    public final static String ERROR_EXCEPTION = "exception";
+    public final static String ERROR_MESSAGE = "message";
+    public final static String ERROR_STACKTRACE = "stacktrace";
+
+    public final static String REPINFO_ID = "repositoryId";
+    public final static String REPINFO_NAME = "repositoryName";
+    public final static String REPINFO_DESCRIPTION = "repositoryDescription";
+    public final static String REPINFO_VENDOR = "vendorName";
+    public final static String REPINFO_PRODUCT = "productName";
+    public final static String REPINFO_PRODUCT_VERSION = "productVersion";
+    public final static String REPINFO_ROOT_FOLDER_ID = "rootFolderId";
+    public final static String REPINFO_REPOSITORY_URL = "repositoryUrl";
+    public final static String REPINFO_ROOT_FOLDER_URL = "rootFolderUrl";
+    public final static String REPINFO_CAPABILITIES = "capabilities";
+    public final static String REPINFO_ACL_CAPABILITIES = "aclCapabilities";
+    public final static String REPINFO_CHANGE_LOCK_TOKEN = "latestChangeLogToken";
+    public final static String REPINFO_CMIS_VERSION_SUPPORTED = "cmisVersionSupported";
+    public final static String REPINFO_THIN_CLIENT_URI = "thinClientURI";
+    public final static String REPINFO_CHANGES_INCOMPLETE = "changesIncomplete";
+    public final static String REPINFO_CHANGES_ON_TYPE = "changesOnType";
+    public final static String REPINFO_PRINCIPAL_ID_ANONYMOUS = "principalIdAnonymous";
+    public final static String REPINFO_PRINCIPAL_ID_ANYONE = "principalIdAnyone";
+
+    public final static String JSON_CAP_CONTENT_STREAM_UPDATES = "capabilityContentStreamUpdatability";
+    public final static String JSON_CAP_CHANGES = "capabilityChanges";
+    public final static String JSON_CAP_RENDITIONS = "capabilityRenditions";
+    public final static String JSON_CAP_GET_DESCENDANTS = "capabilityGetDescendants";
+    public final static String JSON_CAP_GET_FOLDER_TREE = "capabilityGetFolderTree";
+    public final static String JSON_CAP_MULTIFILING = "capabilityMultifiling";
+    public final static String JSON_CAP_UNFILING = "capabilityUnfiling";
+    public final static String JSON_CAP_VERSION_SPECIFIC_FILING = "capabilityVersionSpecificFiling";
+    public final static String JSON_CAP_PWC_SEARCHABLE = "capabilityPWCSearchable";
+    public final static String JSON_CAP_PWC_UPDATABLE = "capabilityPWCUpdatable";
+    public final static String JSON_CAP_ALL_VERSIONS_SEARCHABLE = "capabilityAllVersionsSearchable";
+    public final static String JSON_CAP_QUERY = "capabilityQuery";
+    public final static String JSON_CAP_JOIN = "capabilityJoin";
+    public final static String JSON_CAP_ACL = "capabilityACL";
+
+    public final static String JSON_ACLCAP_SUPPORTED_PERMISSIONS = "supportedPermissions";
+    public final static String JSON_ACLCAP_ACL_PROPAGATION = "propagation";
+    public final static String JSON_ACLCAP_PERMISSIONS = "permissions";
+    public final static String JSON_ACLCAP_PERMISSION_MAPPING = "permissionMapping";
+
+    public final static String JSON_ACLCAP_PERMISSION_PERMISSION = "permission";
+    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_PERMISSION = "permission";
+
+    public final static String JSON_OBJECT_PROPERTIES = "properties";
+    public final static String JSON_OBJECT_ALLOWABLE_ACTIONS = "allowableActions";
+    public final static String JSON_OBJECT_RELATIONSHIPS = "relationships";
+    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_RENDITIONS = "renditions";
+
+    public final static String JSON_OBJECTINFOLDER_OBJECT = "object";
+    public final static String JSON_OBJECTINFOLDER_PATH_SEGMENT = "pathSegment";
+    public final static String JSON_OBJECTPARENTS_OBJECT = "object";
+    public final static String JSON_OBJECTPARENTS_RELATIVE_PATH_SEGMENT = "relativePathSegment";
+
+    public final static String JSON_PROPERTY_ID = "id";
+    public final static String JSON_PROPERTY_LOCALNAME = "localName";
+    public final static String JSON_PROPERTY_DISPLAYNAME = "displayName";
+    public final static String JSON_PROPERTY_QUERYNAME = "queryName";
+    public final static String JSON_PROPERTY_VALUE = "value";
+    public final static String JSON_PROPERTY_DATATYPE = "type";
+    public final static String JSON_PROPERTY_CARDINALITY = "cardinality";
+
+    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 = "princial";
+    public final static String JSON_ACE_PRINCIPAL_ID = "princialId";
+    public final static String JSON_ACE_PERMISSIONS = "permissions";
+    public final static String JSON_ACE_IS_DIRECT = "isDirect";
+
+    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";
+
+    public final static String JSON_OBJECTLIST_OBJECTS = "objects";
+    public final static String JSON_OBJECTLIST_HAS_MORE_ITEMS = "hasMoreItems";
+    public final static String JSON_OBJECTLIST_NUM_ITEMS = "numItems";
+
+    public final static String JSON_OBJECTINFOLDERLIST_OBJECTS = "objects";
+    public final static String JSON_OBJECTINFOLDERLIST_HAS_MORE_ITEMS = "hasMoreItems";
+    public final static String JSON_OBJECTINFOLDERLIST_NUM_ITEMS = "numItems";
+
+    public final static String JSON_OBJECTINFOLDERCONTAINER_OBJECT = "object";
+    public final static String JSON_OBJECTINFOLDERCONTAINER_CHILDREN = "children";
+
+    public final static String JSON_TYPE_ID = "id";
+    public final static String JSON_TYPE_LOCALNAME = "localName";
+    public final static String JSON_TYPE_LOCALNAMESPACE = "localNamespace";
+    public final static String JSON_TYPE_DISPLAYNAME = "displayName";
+    public final static String JSON_TYPE_QUERYNAME = "queryName";
+    public final static String JSON_TYPE_DESCRIPTION = "description";
+    public final static String JSON_TYPE_BASE_ID = "baseId";
+    public final static String JSON_TYPE_PARENT_ID = "parentId";
+    public final static String JSON_TYPE_CREATABLE = "creatable";
+    public final static String JSON_TYPE_FILEABLE = "fileable";
+    public final static String JSON_TYPE_QUERYABLE = "queryable";
+    public final static String JSON_TYPE_FULLTEXT_INDEXED = "fulltextIndexed";
+    public final static String JSON_TYPE_INCLUDE_IN_SUPERTYPE_QUERY = "includedInSupertypeQuery";
+    public final static String JSON_TYPE_CONTROLABLE_POLICY = "controllablePolicy";
+    public final static String JSON_TYPE_CONTROLABLE_ACL = "controllableACL";
+    public final static String JSON_TYPE_PROPERTY_DEFINITIONS = "propertyDefinitions";
+
+    public final static String JSON_TYPE_VERSIONABLE = "versionable"; // document
+    public final static String JSON_TYPE_CONTENTSTREAM_ALLOWED = "contentStreamAllowed"; // document
+
+    public final static String JSON_TYPE_ALLOWED_SOURCE_TYPES = "allowedSourceTypes"; // relationship
+    public final static String JSON_TYPE_ALLOWED_TARGET_TYPES = "allowedTargetTypes"; // relationship
+
+    public final static String JSON_PROPERTYTYPE_ID = "id";
+    public final static String JSON_PROPERTYTYPE_LOCALNAME = "localName";
+    public final static String JSON_PROPERTYTYPE_LOCALNAMESPACE = "localNamespace";
+    public final static String JSON_PROPERTYTYPE_DISPLAYNAME = "displayName";
+    public final static String JSON_PROPERTYTYPE_QUERYNAME = "queryName";
+    public final static String JSON_PROPERTYTYPE_DESCRIPTION = "description";
+    public final static String JSON_PROPERTYTYPE_PROPERTY_TYPE = "propertyType";
+    public final static String JSON_PROPERTYTYPE_CARDINALITY = "cardinality";
+    public final static String JSON_PROPERTYTYPE_UPDATABILITY = "updatability";
+    public final static String JSON_PROPERTYTYPE_INHERITED = "inherited";
+    public final static String JSON_PROPERTYTYPE_REQUIRED = "required";
+    public final static String JSON_PROPERTYTYPE_QUERYABLE = "queryable";
+    public final static String JSON_PROPERTYTYPE_OPENCHOICE = "openChoice";
+
+    public final static String JSON_PROPERTYTYPE_DEAULT_VALUE = "defaultValue";
+
+    public final static String JSON_PROPERTYTYPE_MAX_LENGTH = "maxLength";
+    public final static String JSON_PROPERTYTYPE_MIN_VALUE = "minValue";
+    public final static String JSON_PROPERTYTYPE_MAX_VALUE = "maxValue";
+    public final static String JSON_PROPERTYTYPE_MAX_PRECISION = "precision";
+    public final static String JSON_PROPERTYTYPE_MAX_RESOLUTION = "resolution";
+
+    public final static String JSON_PROPERTYTYPE_CHOICE_DISPLAYNAME = "displayName";
+    public final static String JSON_PROPERTYTYPE_CHOICE_VALUE = "value";
+    public final static String JSON_PROPERTYTYPE_CHOICE_CHOICE = "choice";
+
+    public final static String JSON_TYPESLIST_TYPES = "types";
+    public final static String JSON_TYPESLIST_HAS_MORE_ITEMS = "hasMoreItems";
+    public final static String JSON_TYPESLIST_NUM_ITEMS = "numItems";
+
+    public final static String JSON_TYPESCONTAINER_TYPE = "type";
+    public final static String JSON_TYPESCONTAINER_CHILDREN = "children";
+}

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

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java Mon Apr 18 09:29:45 2011
@@ -0,0 +1,733 @@
+/*
+ * 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.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+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.ObjectInFolderContainer;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
+import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
+import org.apache.chemistry.opencmis.commons.data.ObjectList;
+import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
+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.DocumentTypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.PermissionDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.RelationshipTypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionContainer;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinitionList;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.Cardinality;
+import org.apache.chemistry.opencmis.commons.enums.PropertyType;
+import org.apache.chemistry.opencmis.server.impl.browser.BrowserBindingUtils;
+import org.apache.chemistry.opencmis.server.impl.browser.TypeCache;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+/**
+ * OpenCMIS objects to JSON converter.
+ */
+public class JSONConverter extends JSONConstants {
+
+    /**
+     * Private constructor.
+     */
+    private JSONConverter() {
+    }
+
+    /**
+     * Converts a repository info object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(RepositoryInfo repositoryInfo, HttpServletRequest request) {
+        if (repositoryInfo == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(REPINFO_ID, repositoryInfo.getId());
+        result.put(REPINFO_NAME, repositoryInfo.getName());
+        result.put(REPINFO_DESCRIPTION, repositoryInfo.getDescription());
+        result.put(REPINFO_VENDOR, repositoryInfo.getVendorName());
+        result.put(REPINFO_PRODUCT, repositoryInfo.getProductName());
+        result.put(REPINFO_PRODUCT_VERSION, repositoryInfo.getProductVersion());
+        result.put(REPINFO_ROOT_FOLDER_ID, repositoryInfo.getRootFolderId());
+        result.put(REPINFO_CAPABILITIES, convert(repositoryInfo.getCapabilities()));
+        result.put(REPINFO_ACL_CAPABILITIES, convert(repositoryInfo.getAclCapabilities()));
+        result.put(REPINFO_CHANGE_LOCK_TOKEN, repositoryInfo.getLatestChangeLogToken());
+        result.put(REPINFO_CMIS_VERSION_SUPPORTED, repositoryInfo.getCmisVersionSupported());
+        result.put(REPINFO_THIN_CLIENT_URI, repositoryInfo.getThinClientUri());
+        result.put(REPINFO_CHANGES_INCOMPLETE, repositoryInfo.getChangesIncomplete());
+
+        if (repositoryInfo.getChangesOnType() != null) {
+            JSONArray changesOnType = new JSONArray();
+
+            for (BaseTypeId type : repositoryInfo.getChangesOnType()) {
+                changesOnType.add(getJSONStringValue(type));
+            }
+
+            result.put(REPINFO_CHANGES_ON_TYPE, changesOnType);
+        }
+
+        result.put(REPINFO_PRINCIPAL_ID_ANONYMOUS, repositoryInfo.getPrincipalIdAnonymous());
+        result.put(REPINFO_PRINCIPAL_ID_ANYONE, repositoryInfo.getPrincipalIdAnyone());
+
+        result.put(REPINFO_REPOSITORY_URL, BrowserBindingUtils.compileRepositoryUrl(request, repositoryInfo.getId())
+                .toString());
+        result.put(REPINFO_ROOT_FOLDER_URL, BrowserBindingUtils.compileRootUrl(request, repositoryInfo.getId())
+                .toString());
+
+        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()
+                .value()));
+        result.put(JSON_CAP_CHANGES, getJSONStringValue(capabilities.getChangesCapability().value()));
+        result.put(JSON_CAP_RENDITIONS, getJSONStringValue(capabilities.getRenditionsCapability().value()));
+        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().value()));
+        result.put(JSON_CAP_JOIN, getJSONStringValue(capabilities.getJoinCapability().value()));
+        result.put(JSON_CAP_ACL, getJSONStringValue(capabilities.getAclCapability().value()));
+
+        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().value()));
+        result.put(JSON_ACLCAP_ACL_PROPAGATION, getJSONStringValue(capabilities.getAclPropagation().value()));
+
+        // permissions
+        if (capabilities.getPermissions() != null) {
+            JSONArray permissions = new JSONArray();
+
+            for (PermissionDefinition permDef : capabilities.getPermissions()) {
+                JSONObject permission = new JSONObject();
+                permission.put(JSON_ACLCAP_PERMISSION_PERMISSION, 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_PERMISSION, mappingPermissions);
+
+                permissionMapping.add(mapping);
+            }
+
+            result.put(JSON_ACLCAP_PERMISSION_MAPPING, permissionMapping);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts an object.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectData object, TypeCache typeCache) {
+        if (object == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        // properties
+        if (object.getProperties() != null) {
+            JSONObject properties = new JSONObject();
+
+            for (PropertyData<?> property : object.getProperties().getPropertyList()) {
+                TypeDefinition type = null;
+                if (typeCache != null) {
+                    type = typeCache.getTypeDefinitionForObject(object.getId());
+                }
+
+                PropertyDefinition<?> propDef = null;
+                if (type != null) {
+                    propDef = type.getPropertyDefinitions().get(property.getId());
+                }
+
+                properties.put(property.getId(), convert(property, propDef));
+            }
+
+            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, typeCache));
+            }
+
+            result.put(JSON_OBJECT_RELATIONSHIPS, 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().value()));
+            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_RENDITIONS, renditions);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts a property.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(PropertyData<?> property, PropertyDefinition<?> propDef) {
+        if (property == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        result.put(JSON_PROPERTY_ID, property.getId());
+        result.put(JSON_PROPERTY_LOCALNAME, property.getLocalName());
+        result.put(JSON_PROPERTY_DISPLAYNAME, property.getDisplayName());
+        result.put(JSON_PROPERTY_QUERYNAME, property.getQueryName());
+
+        if (propDef != null) {
+            result.put(JSON_PROPERTY_DATATYPE, propDef.getPropertyType().value());
+            result.put(JSON_PROPERTY_CARDINALITY, propDef.getCardinality().value());
+
+            if ((property.getValues() == null) || (property.getValues().size() == 0)) {
+                result.put(JSON_PROPERTY_VALUE, null);
+            } else if (propDef.getCardinality() == Cardinality.SINGLE) {
+                result.put(JSON_PROPERTY_VALUE, getJSONValue(property.getValues().get(0)));
+            } else {
+                JSONArray values = new JSONArray();
+
+                for (Object value : property.getValues()) {
+                    values.add(getJSONValue(value));
+                }
+
+                result.put(JSON_PROPERTY_VALUE, values);
+            }
+        } else {
+            result.put(JSON_PROPERTY_DATATYPE, getJSONPropertyDataType(property));
+
+            if ((property.getValues() == null) || (property.getValues().size() == 0)) {
+                result.put(JSON_PROPERTY_VALUE, null);
+            } else if (property.getValues().size() == 1) {
+                JSONArray values = new JSONArray();
+
+                for (Object value : property.getValues()) {
+                    values.add(getJSONValue(value));
+                }
+
+                result.put(JSON_PROPERTY_VALUE, values);
+            }
+        }
+
+        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();
+            JSONObject principalObjecy = new JSONObject();
+            principalObjecy.put(JSON_ACE_PRINCIPAL_ID, ace.getPrincipalId());
+            aceObject.put(JSON_ACE_PRINCIPAL, principalObjecy);
+            aceObject.put(JSON_ACE_PERMISSIONS, permissions);
+            aceObject.put(JSON_ACE_IS_DIRECT, ace.isDirect());
+
+            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;
+    }
+
+    /**
+     * Converts a query object list.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectList list) {
+        JSONObject result = new JSONObject();
+
+        if (list != null) {
+            JSONArray objects = new JSONArray();
+            if (list.getObjects() != null) {
+                for (ObjectData object : list.getObjects()) {
+                    objects.add(convert(object, null));
+                }
+            }
+
+            result.put(JSON_OBJECTLIST_OBJECTS, objects);
+
+            if (list.hasMoreItems() != null) {
+                result.put(JSON_OBJECTLIST_HAS_MORE_ITEMS, list.hasMoreItems());
+            }
+            if (list.getNumItems() != null) {
+                result.put(JSON_OBJECTLIST_NUM_ITEMS, list.getNumItems());
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts an object in a folder list.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectInFolderData objectInFolder, TypeCache typeCache) {
+        if ((objectInFolder == null) || (objectInFolder.getObject() == null)) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_OBJECTINFOLDER_OBJECT, convert(objectInFolder.getObject(), typeCache));
+        if (objectInFolder.getPathSegment() != null) {
+            result.put(JSON_OBJECTINFOLDER_PATH_SEGMENT, objectInFolder.getPathSegment());
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts a folder list.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectInFolderList objectInFolderList, TypeCache typeCache) {
+        if (objectInFolderList == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        if (objectInFolderList.getObjects() != null) {
+            JSONArray objects = new JSONArray();
+
+            for (ObjectInFolderData object : objectInFolderList.getObjects()) {
+                objects.add(convert(object, typeCache));
+            }
+
+            result.put(JSON_OBJECTINFOLDERLIST_OBJECTS, objects);
+        }
+
+        if (objectInFolderList.hasMoreItems() != null) {
+            result.put(JSON_OBJECTINFOLDERLIST_HAS_MORE_ITEMS, objectInFolderList.hasMoreItems());
+        }
+        if (objectInFolderList.getNumItems() != null) {
+            result.put(JSON_OBJECTINFOLDERLIST_NUM_ITEMS, objectInFolderList.getNumItems());
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts a folder container.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectInFolderContainer container, TypeCache typeCache) {
+        if (container == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_OBJECTINFOLDERCONTAINER_OBJECT, convert(container.getObject(), typeCache));
+
+        if ((container.getChildren() != null) && (container.getChildren().size() > 0)) {
+            JSONArray children = new JSONArray();
+            for (ObjectInFolderContainer descendant : container.getChildren()) {
+                children.add(JSONConverter.convert(descendant, typeCache));
+            }
+
+            result.put(JSON_OBJECTINFOLDERCONTAINER_CHILDREN, children);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts an object parent.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(ObjectParentData parent, TypeCache typeCache) {
+        if ((parent == null) || (parent.getObject() == null)) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_OBJECTPARENTS_OBJECT, convert(parent.getObject(), typeCache));
+        if (parent.getRelativePathSegment() != null) {
+            result.put(JSON_OBJECTPARENTS_RELATIVE_PATH_SEGMENT, parent.getRelativePathSegment());
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts a type definition.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(TypeDefinition type) {
+        if (type == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_TYPE_ID, type.getId());
+        result.put(JSON_TYPE_LOCALNAME, type.getLocalName());
+        result.put(JSON_TYPE_LOCALNAMESPACE, type.getLocalNamespace());
+        result.put(JSON_TYPE_DISPLAYNAME, type.getDisplayName());
+        result.put(JSON_TYPE_QUERYNAME, type.getQueryName());
+        result.put(JSON_TYPE_DESCRIPTION, type.getDescription());
+        result.put(JSON_TYPE_BASE_ID, type.getBaseTypeId().value());
+        result.put(JSON_TYPE_PARENT_ID, type.getParentTypeId());
+        result.put(JSON_TYPE_CREATABLE, type.isCreatable());
+        result.put(JSON_TYPE_FILEABLE, type.isFileable());
+        result.put(JSON_TYPE_QUERYABLE, type.isQueryable());
+        result.put(JSON_TYPE_FULLTEXT_INDEXED, type.isFulltextIndexed());
+        result.put(JSON_TYPE_INCLUDE_IN_SUPERTYPE_QUERY, type.isIncludedInSupertypeQuery());
+        result.put(JSON_TYPE_CONTROLABLE_POLICY, type.isControllablePolicy());
+        result.put(JSON_TYPE_CONTROLABLE_ACL, type.isControllableAcl());
+
+        if (type instanceof DocumentTypeDefinition) {
+            result.put(JSON_TYPE_VERSIONABLE, ((DocumentTypeDefinition) type).isVersionable());
+            result.put(JSON_TYPE_CONTENTSTREAM_ALLOWED, ((DocumentTypeDefinition) type).getContentStreamAllowed()
+                    .value());
+        }
+
+        if (type instanceof RelationshipTypeDefinition) {
+            result.put(JSON_TYPE_ALLOWED_SOURCE_TYPES,
+                    getJSONArrayFromList(((RelationshipTypeDefinition) type).getAllowedSourceTypeIds()));
+            result.put(JSON_TYPE_ALLOWED_TARGET_TYPES,
+                    getJSONArrayFromList(((RelationshipTypeDefinition) type).getAllowedTargetTypeIds()));
+        }
+
+        if ((type.getPropertyDefinitions() != null) && (!type.getPropertyDefinitions().isEmpty())) {
+            JSONObject propertyDefs = new JSONObject();
+
+            for (PropertyDefinition<?> pd : type.getPropertyDefinitions().values()) {
+                propertyDefs.put(pd.getId(), convert(pd));
+            }
+
+            result.put(JSON_TYPE_PROPERTY_DEFINITIONS, propertyDefs);
+        }
+
+        return result;
+    }
+
+    /**
+     * Converts a property type definition.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(PropertyDefinition<?> propertyDef) {
+        if (propertyDef == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_PROPERTYTYPE_ID, propertyDef.getId());
+        result.put(JSON_PROPERTYTYPE_LOCALNAME, propertyDef.getLocalName());
+        result.put(JSON_PROPERTYTYPE_LOCALNAMESPACE, propertyDef.getLocalName());
+        result.put(JSON_PROPERTYTYPE_DISPLAYNAME, propertyDef.getDisplayName());
+        result.put(JSON_PROPERTYTYPE_QUERYNAME, propertyDef.getQueryName());
+        result.put(JSON_PROPERTYTYPE_DESCRIPTION, propertyDef.getDescription());
+        result.put(JSON_PROPERTYTYPE_PROPERTY_TYPE, propertyDef.getPropertyType().value());
+        result.put(JSON_PROPERTYTYPE_CARDINALITY, propertyDef.getCardinality().value());
+        result.put(JSON_PROPERTYTYPE_UPDATABILITY, propertyDef.getUpdatability().value());
+        result.put(JSON_PROPERTYTYPE_INHERITED, propertyDef.isInherited());
+        result.put(JSON_PROPERTYTYPE_REQUIRED, propertyDef.isRequired());
+        result.put(JSON_PROPERTYTYPE_REQUIRED, propertyDef.isQueryable());
+        result.put(JSON_PROPERTYTYPE_OPENCHOICE, propertyDef.isOpenChoice());
+
+        // TODO: add type specific details
+        // TODO: add choice
+
+        return result;
+    }
+
+    /**
+     * Converts a type definition list.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(TypeDefinitionList list) {
+        if (list == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+
+        if (list.getList() != null) {
+            JSONArray objects = new JSONArray();
+
+            for (TypeDefinition type : list.getList()) {
+                objects.add(convert(type));
+            }
+
+            result.put(JSON_TYPESLIST_TYPES, objects);
+        }
+
+        result.put(JSON_TYPESLIST_HAS_MORE_ITEMS, list.hasMoreItems());
+        result.put(JSON_TYPESLIST_NUM_ITEMS, list.getNumItems());
+
+        return result;
+    }
+
+    /**
+     * Converts a type definition container.
+     */
+    @SuppressWarnings("unchecked")
+    public static JSONObject convert(TypeDefinitionContainer container) {
+        if (container == null) {
+            return null;
+        }
+
+        JSONObject result = new JSONObject();
+        result.put(JSON_TYPESCONTAINER_TYPE, convert(container.getTypeDefinition()));
+
+        if ((container.getChildren() != null) && (container.getChildren().size() > 0)) {
+            JSONArray children = new JSONArray();
+            for (TypeDefinitionContainer child : container.getChildren()) {
+                children.add(JSONConverter.convert(child));
+            }
+
+            result.put(JSON_TYPESCONTAINER_CHILDREN, children);
+        }
+
+        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;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static JSONArray getJSONArrayFromList(List<?> list) {
+        if (list == null) {
+            return null;
+        }
+
+        JSONArray result = new JSONArray();
+        result.addAll(list);
+
+        return result;
+    }
+
+    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: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/browser/json/JSONConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ExceptionHelper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ExceptionHelper.java?rev=1094397&r1=1094396&r2=1094397&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ExceptionHelper.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/shared/ExceptionHelper.java Mon Apr 18 09:29:45 2011
@@ -57,9 +57,9 @@ public class ExceptionHelper {
     /**
      * Returns the stack trace as DOM node.
      */
-    public static Node getStacktraceAsNode(Exception ex) {
+    public static Node getStacktraceAsNode(Throwable t) {
         try {
-            String st = getStacktraceAsString(ex);
+            String st = getStacktraceAsString(t);
             if (st != null) {
                 DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
                 DocumentBuilder docBuilder = dbfac.newDocumentBuilder();

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml?rev=1094397&r1=1094396&r2=1094397&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml Mon Apr 18 09:29:45 2011
@@ -51,6 +51,16 @@
 		</init-param>
 		<load-on-startup>2</load-on-startup>
 	</servlet>
+	
+	<servlet>
+		<servlet-name>cmisbrowser</servlet-name>
+		<servlet-class>org.apache.chemistry.opencmis.server.impl.browser.CmisBrowserBindingServlet</servlet-class>
+		<init-param>
+			<param-name>callContextHandler</param-name>
+			<param-value>org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler</param-value>
+		</init-param>
+		<load-on-startup>2</load-on-startup>
+	</servlet>
 
 
 	<servlet-mapping>
@@ -63,6 +73,11 @@
 		<url-pattern>/atom/*</url-pattern>
 	</servlet-mapping>
 
+	<servlet-mapping>
+		<servlet-name>cmisbrowser</servlet-name>
+		<url-pattern>/browser/*</url-pattern>
+	</servlet-mapping>
+
 	<session-config>
 		<session-timeout>60</session-timeout>
 	</session-config>

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/css/opencmis.css
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/css/opencmis.css?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/css/opencmis.css (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/css/opencmis.css Mon Apr 18 09:29:45 2011
@@ -0,0 +1,63 @@
+@CHARSET "UTF-8";
+
+body {
+  font-family: Verdana, arial, sans-serif;
+  color: black;
+  font-size: 12px;
+}
+
+h1 {
+  font-size: 24px;
+  line-height: normal;
+  font-weight: bold;
+  background-color: #f0f0f0;
+  color: #003366;
+   border-bottom: 1px solid #3c78b5;
+  padding: 2px;
+  margin: 4px 0px 4px 0px;
+}
+
+h2 {
+  font-size: 18px;
+  line-height: normal;
+  font-weight: bold;
+  background-color: #f0f0f0;
+   border-bottom: 1px solid #3c78b5;
+  padding: 2px;
+  margin: 4px 0px 4px 0px;
+}
+
+h3 {
+  font-size: 14px;
+  line-height: normal;
+  font-weight: bold;
+  background-color: #f0f0f0;
+  padding: 2px;
+  margin: 4px 0px 4px 0px;
+}
+
+h4 {
+  font-size: 12px;
+  line-height: normal;
+  font-weight: bold;
+  background-color: #f0f0f0;
+  padding: 2px;
+  margin: 4px 0px 4px 0px;
+}
+
+HR {
+  color: 3c78b5;
+  height: 1;
+}
+
+th  {
+    border: 1px solid #ccc;
+    padding: 2px 4px 2px 4px;
+    background: #f0f0f0;
+    text-align: center;
+}
+
+td  {
+    border: 1px solid #ccc;
+    padding: 3px 4px 3px 4px;
+}

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/css/opencmis.css
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/asf_logo.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/asf_logo.png?rev=1094397&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/asf_logo.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/chemistry_logo_small.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/chemistry_logo_small.png?rev=1094397&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/images/chemistry_logo_small.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/index.html?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/index.html (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/index.html Mon Apr 18 09:29:45 2011
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+/*
+ * 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.
+ */
+-->
+<html>
+<head>
+<title>OpenCMIS Browser Binding</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<link rel="stylesheet" type="text/css" href="css/opencmis.css"/>
+</head>
+<body>
+<a href="http://chemistry.apache.org"><img alt="Apache Chemistry Logo" title="Apache Chemistry Logo" src="images/chemistry_logo_small.png" /></a>
+<h1>Apache Chemistry OpenCMIS</h1>
+
+<br/>
+<h2>AtomPub binding</h2>
+<div><a href="atom">AtomPub service document</a></div>
+
+<br/>
+<h2>Web Services binding</h2>
+<div><a href="services/RepositoryService">Web Services overview</a></div>
+
+<br/>
+<h2>Browser binding</h2>
+<div><a href="browser">Browser binding service URL</a></div>
+
+<br/>
+<h2>Web interface</h2>
+<div><a href="web">OpenCMIS web interface</a></div>
+
+<br/>
+<h2>License</h2>
+<a href="http://www.apache.org"><img alt="ASF Logo" title="ASF Logo" src="images/asf_logo.png" align="right"/></a>
+<div>This software is licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0 License</a>.</div>
+<br/>
+
+</body>
+</html>
\ No newline at end of file

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/index.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createdocument.html
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createdocument.html?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createdocument.html (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createdocument.html Mon Apr 18 09:29:45 2011
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+/*
+ * 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.
+ */
+-->
+<html>
+<head>
+<title>OpenCMIS Browser Binding createDocument Demo</title>
+<link rel="stylesheet" type="text/css" href="../css/opencmis.css"/>
+<style type="text/css">
+.box {
+	border-width: 1px;
+	border-style: solid;
+	width: 100%;
+	padding: 3px;
+}
+
+td {
+	padding: 5px;
+}
+
+</style>
+<script type="text/javascript" src="opencmis.js"></script>
+<script type="text/javascript">
+var repositoryUrl;
+var rootFolderUrl;
+var lastTransaction;
+
+function loadRepositoryInfos(infos) {
+    for(repId in infos) {
+        var ri = infos[repId];		
+
+        // the InMemory repository has only one repository
+        repositoryUrl = ri.repositoryUrl;
+        rootFolderUrl = ri.rootFolderUrl; 
+    }
+}
+
+function createDocument() {
+    var createForm = document.getElementById('createForm');
+    var docname = createForm["propertyValue[0]"].value;
+    document.getElementById('info').innerHTML = "Creating " + docname + " ...";
+
+    createForm.action = rootFolderUrl + createForm.folder.value;
+    lastTransaction = createGUID();
+    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 + "\nCode: " + result.code);
+    }
+    else {
+        alert("Error: " + result.message + "\nException: " + result.exception + "\nCode: " + result.code);
+    }
+}
+</script>
+</head>
+<body>
+<h1>OpenCMIS Browser Binding - Create Demo</h1>
+<br/>
+<h2>Create Document</h2>
+
+<form id="createForm" action="" method="POST" target="result" enctype="multipart/form-data" onsubmit="return createDocument()">
+<input name="cmisaction" type="hidden" value="createDocument" />
+<input name="transaction" type="hidden" value="" />
+<table>
+<tr>
+    <td>Folder:</td>
+    <td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
+</tr>
+<tr>
+    <td>Name:</td>
+    <td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="document"></td>
+    <input name="propertyId[0]" type="hidden" value="cmis:name" />
+</tr>
+<tr>
+    <td>Object Type:</td>
+    <td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:document"></td>
+    <input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" />
+</tr>
+<tr>
+    <td>File name:</td>
+    <td><input name="filename" type="text" size="30" maxlength="30" value=""> (if left blank the orignal file name is used)</td>
+</tr>
+<tr>
+    <td>Content type:</td>
+    <td><input name="contentType" type="text" size="30" maxlength="30" value=""> (if left blank the content type is determined by the browser)</td>
+</tr>
+<tr>
+	<td>File:</td>
+	<td><input name="content" type="file"></td>
+</tr>
+<tr>
+    <td></td>
+    <td><input type="submit" value="Create" /></td>
+</tr>
+</table>
+</form>
+
+<div id="info"></div>
+<iframe name="result" style="border:2px;width:800px;height:400px;" onload="createDocumentCallback()"></iframe>
+
+<script type="text/javascript" src="../browser?clientToken=loadRepositoryInfos"></script>
+</body>
+</html>
\ No newline at end of file

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createdocument.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createfolder.html
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createfolder.html?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createfolder.html (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createfolder.html Mon Apr 18 09:29:45 2011
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+/*
+ * 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.
+ */
+-->
+<html>
+<head>
+<title>OpenCMIS Browser Binding createFolder Demo</title>
+<link rel="stylesheet" type="text/css" href="../css/opencmis.css"/>
+<style type="text/css">
+.box {
+	border-width: 1px;
+	border-style: solid;
+	width: 100%;
+	padding: 3px;
+}
+
+td {
+	padding: 5px;
+}
+</style>
+<script type="text/javascript" src="opencmis.js"></script>
+<script type="text/javascript">
+var repositoryUrl;
+var rootFolderUrl;
+var lastTransaction;
+
+function loadRepositoryInfos(infos) {
+    for(repId in infos) {
+        var ri = infos[repId];		
+
+        // the InMemory repository has only one repository
+        repositoryUrl = ri.repositoryUrl;
+        rootFolderUrl = ri.rootFolderUrl; 
+    }
+}
+
+function createFolder() {
+    var createForm = document.getElementById('createForm');
+    var foldername = createForm["propertyValue[0]"].value;
+    document.getElementById('info').innerHTML = "Creating " + foldername + " ...";
+
+    createForm.action = rootFolderUrl + createForm.folder.value;
+    lastTransaction = createGUID();
+    createForm.transaction.value = lastTransaction;
+ 
+    return true;
+}
+
+function createFolderCallback() {
+    if(lastTransaction) {
+        document.getElementById('info').innerHTML = 'Transaction: ' + lastTransaction
+
+        var script1 = document.createElement("script");
+        script1.setAttribute("src", repositoryUrl + "?selector=lastResult&clientToken=showNewFolderId&transaction="+lastTransaction);
+        script1.setAttribute("type","text/javascript");                
+        document.body.appendChild(script1);
+    }
+}
+
+function showNewFolderId(result) {
+    if(result.objectId) {
+        alert("New folder id: " + result.objectId + "\nCode: " + result.code);
+    }
+    else {
+        alert("Error: " + result.message + "\nException: " + result.exception + "\nCode: " + result.code);
+    }
+}
+</script>
+</head>
+<body>
+<h1>OpenCMIS Browser Binding - Create Demo</h1>
+<br/>
+<h2>Create Folder</h2>
+
+<form id="createForm" action="" method="POST" target="result" onsubmit="return createFolder()">
+<input name="cmisaction" type="hidden" value="createFolder" />
+<input name="transaction" type="hidden" value="" />
+<table>
+<tr>
+    <td>Folder:</td>
+    <td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
+</tr>
+<tr>
+    <td>Name:</td>
+    <td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="folder"></td>
+    <input name="propertyId[0]" type="hidden" value="cmis:name" />
+</tr>
+<tr>
+    <td>Object Type:</td>
+    <td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:folder"></td>
+    <input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" />
+</tr>
+<tr>
+    <td></td>
+    <td><input type="submit" value="Create" /></td>
+</tr>
+</table>
+</form>
+
+<div id="info"></div>
+<iframe name="result" style="border:2px;width:800px;height:400px;" onload="createFolderCallback()"></iframe>
+
+<script type="text/javascript" src="../browser?clientToken=loadRepositoryInfos"></script>
+</body>
+</html>
\ No newline at end of file

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/createfolder.html
------------------------------------------------------------------------------
    svn:eol-style = native

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/demo.html
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/demo.html?rev=1094397&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/demo.html (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/demo.html Mon Apr 18 09:29:45 2011
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- 
+/*
+ * 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.
+ */
+-->
+<html>
+<head>
+<title>OpenCMIS Browser Binding Demo</title>
+<link rel="stylesheet" type="text/css" href="../css/opencmis.css"/>
+<style type="text/css">
+.box {
+	border-width: 1px;
+	border-style: solid;
+	width: 100%;
+	padding: 3px;
+}
+
+td {
+	padding: 5px;
+}
+</style>
+<script type="text/javascript">
+var repositoryUrl;
+var rootFolderUrl;
+
+function printRepositoryInfos(infos) {
+	for(repId in infos) {
+        var ri = infos[repId];		
+        document.getElementById('repositoryInfo').innerHTML = 
+            '<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>' +
+            '<tr><td>Description:</td><td>' + ri.repositoryDescription + '</td></tr>' +
+            '<tr><td>Product:</td><td>' + ri.vendorName + ' ' + ri.productName + ' ' + ri.productVersion + '</td></tr>' +
+            '<tr><td>Root folder id:</td><td>' + ri.rootFolderId + '</td></tr>' +
+            '<tr><td>Repository URL:</td><td>' + ri.repositoryUrl + '</td></tr>' +
+            '<tr><td>Root folder URL:</td><td>' + ri.rootFolderUrl + '</td></tr>' +
+            '</table>';
+
+        // the InMemory repository has only one repository
+        repositoryUrl = ri.repositoryUrl;
+        rootFolderUrl = ri.rootFolderUrl; 
+	}
+
+    var rootFolder = "/";
+
+    document.getElementById('queryForm').action = repositoryUrl;
+	
+    var script1 = document.createElement("script");        
+    script1.setAttribute("src", rootFolderUrl + rootFolder + "?selector=object&clientToken=printObject");
+    script1.setAttribute("type","text/javascript");                
+    document.body.appendChild(script1);
+
+    var script2 = document.createElement("script");        
+    script2.setAttribute("src", rootFolderUrl + rootFolder + "?selector=children&clientToken=printChildren");
+    script2.setAttribute("type","text/javascript");                
+    document.body.appendChild(script2);
+
+    var script3 = document.createElement("script");        
+    script3.setAttribute("src", repositoryUrl + "?selector=typeChildren&clientToken=printTypes");
+    script3.setAttribute("type","text/javascript");                
+    document.body.appendChild(script3);
+}
+
+function printObject(obj) {
+    var id = obj.properties["cmis:objectId"].value;
+    var name = obj.properties["cmis:name"].value;
+
+    var s = '<h2>Object "' + name + '" (' + id + ')</h2>';
+
+    s = s + '<h3>Properties</h3>';
+    s = s + '<table>';
+	
+    for(propertyId in obj.properties) {
+        var property = obj.properties[propertyId];
+        s = s + '<tr><td>' + propertyId + '</td>';
+        s = s + '<td>' + property.displayName + '</td>';
+        s = s + '<td>' + property.type + '</td>';
+        s = s + '<td>' + property.cardinality + '</td>';
+
+        if(property.type == 'datetime') {
+            s = s + '<td>' + (new Date(property.value)) + '</td></tr>';
+        } else {
+            s = s + '<td>' + property.value + '</td></tr>';
+        }
+    }
+    
+    s = s + '</table>';
+    
+    document.getElementById('objectInfo').innerHTML = s;
+}
+
+function printChildren(children) {
+    var s = '<h2>Children</h2>';
+
+    s = s + '<h3>Properties</h3>';
+
+    s = s + '<table><tr><th>Name</th><th>Type</th><th>MIME Type</th><th>Size</th>' +
+    '<th>Created By</th><th>Created At</th><th>Id</th></tr>';
+
+    for(var index in children.objects) {
+        var object = children.objects[index].object;
+
+        var name = object.properties["cmis:name"].value;
+        var type = object.properties["cmis:objectTypeId"].value;
+        var mimetype = "";
+        var size = "";
+        var createdBy = object.properties["cmis:createdBy"].value;
+        var creationDate = new Date(object.properties["cmis:creationDate"].value);
+        var id = object.properties["cmis:objectId"].value;
+        var link = "";
+
+        if(object.properties["cmis:baseTypeId"].value == "cmis:document") {
+            if(object.properties["cmis:contentStreamLength"]) {
+                size = object.properties["cmis:contentStreamLength"].value;
+            } else {
+                size = "";
+            }
+
+            if(object.properties["cmis:contentStreamMimeType"]) {           	 
+                mimetype = object.properties["cmis:contentStreamMimeType"].value;
+                link = encodeURI(rootFolderUrl + '?objectId=' + id + '&selector=content');
+            } else {
+            	mimetype = "";
+            	link = "";
+            }
+        }
+
+        s = s + '<tr><td>';
+        if(link != "") {
+            s = s + '<a href="' + link + '">' + name + '</a>';
+        }
+        else {
+            s = s + name;
+        }
+        s = s + '</td><td>' + type + '</td><td>' + mimetype + '</td><td style="rext-align:right">' + size +
+         '</td><td>' + createdBy + '</td><td>' + creationDate + '</td><td>' + id + '</td></tr>';
+    }
+    
+    s = s + '</table>';
+    
+    document.getElementById('folderInfo').innerHTML = s;
+}
+
+function printTypes(types) {
+    var s = '<h2>Base Types</h2>';
+    
+    for(var index in types.types) {
+        var type = types.types[index];
+
+        s = s + '<h3>' + type.id + '</h3>';
+        s = s + '<ul>';
+
+        for(var propId in type.propertyDefinitions) {
+            var propType = type.propertyDefinitions[propId];
+            s = s + '<li>' + propType.id + '</li>';
+        }
+
+        s = s + '</ul>';
+    }
+    
+    document.getElementById('typeInfo').innerHTML = s;
+}
+</script>
+</head>
+<body>
+<h1>OpenCMIS Browser Binding - Demo</h1>
+<br />
+<div id="repositoryInfo" class="box">repositoryInfo</div>
+<br />
+<div id="objectInfo" class="box">objectInfo</div>
+<br />
+<div id="folderInfo" class="box">folderInfo</div>
+<br />
+<div id="typeInfo" class="box">typeInfo</div>
+<br />
+<div id="query" class="box">
+<h2>Query</h2>
+<form id="queryForm" action="" method="POST">
+<input name="cmisaction" type="hidden" value="query" />
+<table>
+<tr><td>Query:</td><td><input name="q" type="text" size="100" maxlength="1000" value="SELECT * FROM cmis:document"></td></tr>
+<tr><td>Max Items:</td><td><input name="maxItems" type="text" size="4" maxlength="8" value="100"></td></tr>
+<tr><td>Skip Count:</td><td><input name="skipCount" type="text" size="4" maxlength="8" value="0"></td></tr>
+<tr><td></td><td><input type="submit" value="Go" /></td></tr>
+</table>
+</form>
+</div>
+
+<script type="text/javascript" src="../browser?clientToken=printRepositoryInfos"></script>
+</body>
+</html>
\ No newline at end of file

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/web/demo.html
------------------------------------------------------------------------------
    svn:eol-style = native