You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2011/08/03 23:41:45 UTC

svn commit: r1153680 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory: query/InMemoryQueryProcessor.java types/PropertyUtil.java

Author: jens
Date: Wed Aug  3 21:41:44 2011
New Revision: 1153680

URL: http://svn.apache.org/viewvc?rev=1153680&view=rev
Log:
fix bug: queries for system properties raising an exception [CMIS-413]

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java?rev=1153680&r1=1153679&r2=1153680&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/query/InMemoryQueryProcessor.java Wed Aug  3 21:41:44 2011
@@ -52,6 +52,7 @@ import org.apache.chemistry.opencmis.inm
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.ContentStreamDataImpl;
 import org.apache.chemistry.opencmis.inmemory.storedobj.impl.ObjectStoreImpl;
 import org.apache.chemistry.opencmis.inmemory.types.PropertyCreationHelper;
+import org.apache.chemistry.opencmis.inmemory.types.PropertyUtil;
 import org.apache.chemistry.opencmis.server.support.TypeManager;
 import org.apache.chemistry.opencmis.server.support.query.AbstractPredicateWalker;
 import org.apache.chemistry.opencmis.server.support.query.CmisQueryWalker;
@@ -524,11 +525,13 @@ public class InMemoryQueryProcessor {
             // System.identityHashCode(leftChild) + " is " + leftChild);
             ColumnReference colRef = getColumnReference(leftChild);
             PropertyDefinition<?> pd = colRef.getPropertyDefinition();
-            PropertyData<?> lVal = so.getProperties().get(colRef.getPropertyId());
-            if (lVal instanceof List<?>) {
+            Object val = PropertyUtil.getProperty(so, colRef.getPropertyId());
+            if (val==null) {
+                return null;
+            }if (val instanceof List<?>) {
                 throw new IllegalStateException("You can't query operators <, <=, ==, !=, >=, > on multi-value properties ");
             } else {
-                return InMemoryQueryProcessor.this.compareTo(pd, lVal, rVal);
+                return InMemoryQueryProcessor.this.compareTo(pd, val, rVal);
             }
         }
 
@@ -626,8 +629,7 @@ public class InMemoryQueryProcessor {
         return false;
     }
 
-    protected int compareTo(PropertyDefinition<?> td, PropertyData<?> lVal, Object rVal) {
-        Object lValue = lVal.getFirstValue();
+    protected int compareTo(PropertyDefinition<?> td, Object lValue, Object rVal) {
         switch (td.getPropertyType()) {
         case BOOLEAN:
             if (rVal instanceof Boolean) {
@@ -637,7 +639,7 @@ public class InMemoryQueryProcessor {
             }
             break;
         case INTEGER: {
-            Long lLongValue = ((BigInteger) lVal.getFirstValue()).longValue();
+            Long lLongValue = ((BigInteger) lValue).longValue();
             if (rVal instanceof Long) {
                 return (lLongValue).compareTo((Long) rVal);
             } else if (rVal instanceof Double) {
@@ -659,7 +661,7 @@ public class InMemoryQueryProcessor {
             }
             break;
         case DECIMAL: {
-            Double lDoubleValue = ((BigDecimal) lVal.getFirstValue()).doubleValue();
+            Double lDoubleValue = ((BigDecimal) lValue).doubleValue();
             if (rVal instanceof Double) {
                 return lDoubleValue.compareTo((Double) rVal);
             } else if (rVal instanceof Long) {

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java?rev=1153680&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/main/java/org/apache/chemistry/opencmis/inmemory/types/PropertyUtil.java Wed Aug  3 21:41:44 2011
@@ -0,0 +1,156 @@
+/*
+ * 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.inmemory.types;
+
+import org.apache.chemistry.opencmis.commons.PropertyIds;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.PropertyData;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Content;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Document;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.DocumentVersion;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.Folder;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.StoredObject;
+import org.apache.chemistry.opencmis.inmemory.storedobj.api.VersionedDocument;
+
+public class PropertyUtil {
+    
+    public static Object getProperty(StoredObject so, String propertyId) {
+        ContentStream content = null;
+        DocumentVersion ver = null;
+        VersionedDocument verDoc = null;
+        Folder folder = null;
+        Document doc = null;
+
+        if (so instanceof Content)
+            content = ((Content) so).getContent(0, 0);
+        if (so instanceof DocumentVersion)
+            ver = (DocumentVersion) so;
+        if (so instanceof VersionedDocument)
+            verDoc = (VersionedDocument) so;
+        if (so instanceof Folder)
+            folder = (Folder) so;
+        if (so instanceof Document)
+            doc = (Document) so;
+
+        // generic properties:
+        if (propertyId.equals(PropertyIds.NAME)) {
+            return so.getName();
+        }
+        if (propertyId.equals(PropertyIds.OBJECT_ID)) {
+            return so.getId();
+        }
+        if (propertyId.equals(PropertyIds.OBJECT_TYPE_ID)) {
+            return so.getTypeId();
+        }
+        if (propertyId.equals(PropertyIds.BASE_TYPE_ID)) {
+            return null; // TOODO: return so.getBaseTypeId());
+        }
+        if (propertyId.equals(PropertyIds.CREATED_BY)) {
+            return so.getCreatedBy();
+        }
+        if (propertyId.equals(PropertyIds.CREATION_DATE)) {
+            return so.getCreatedAt();
+        }
+        if (propertyId.equals(PropertyIds.LAST_MODIFIED_BY)) {
+            return so.getModifiedBy();
+        }
+        if (propertyId.equals(PropertyIds.LAST_MODIFICATION_DATE)) {
+            return so.getModifiedAt();
+        }
+        if (propertyId.equals(PropertyIds.CHANGE_TOKEN)) {
+            return so.getChangeToken();
+        }
+
+        if (ver != null) {
+            // get version related properties
+            // not support on a version, only on a versioned document:
+            // VERSION_SERIES_ID, IS_VERSION_SERIES_CHECKED_OUT,
+            // VERSION_SERIES_CHECKED_OUT_BY,
+            // VERSION_SERIES_CHECKED_OUT_ID, IS_LATEST_MAJOR_VERSION,
+            // IS_LATEST_VERSION
+            if (propertyId.equals(PropertyIds.IS_MAJOR_VERSION)) {
+                return ver.isMajor();
+            }
+
+            if (propertyId.equals(PropertyIds.CHECKIN_COMMENT)) {
+                return ver.getCheckinComment();
+            }
+            if (propertyId.equals(PropertyIds.VERSION_LABEL)) {
+                return ver.getVersionLabel();
+            }
+            if (propertyId.equals(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID)) {
+                return ver.isPwc() ? ver.getId() : null;
+            }
+        }
+
+        // get versioned document related properties
+        if (verDoc != null) {
+            if (propertyId.equals(PropertyIds.VERSION_SERIES_ID)) {
+                return verDoc.getId();
+            }
+            if (propertyId.equals(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT)) {
+                return verDoc.isCheckedOut();
+            }
+            if (propertyId.equals(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY)) {
+                return verDoc.getCheckedOutBy();
+            }
+        }
+
+        // Set the content related properties
+        if (null != content) {
+            // omit: PropertyIds.CMIS_CONTENT_STREAM_ID
+            if (propertyId.equals(PropertyIds.CONTENT_STREAM_FILE_NAME)) {
+                return content.getFileName();
+            }
+
+            if (propertyId.equals(PropertyIds.CONTENT_STREAM_LENGTH)) {
+                return content.getBigLength();
+            }
+            if (propertyId.equals(PropertyIds.CONTENT_STREAM_MIME_TYPE)) {
+                return content.getMimeType();
+            }
+        }
+
+        if (folder != null) {
+            // not supported: ALLOWED_CHILD_OBJECT_TYPE_IDS
+            if (propertyId.equals(PropertyIds.PARENT_ID)) {
+                return folder.getParent() == null ? null : folder.getParent().getId();
+            }
+
+            if (propertyId.equals(PropertyIds.PATH)) {
+                return folder.getPath();
+            }
+        }
+
+        if (doc != null) {
+            if (propertyId.equals(PropertyIds.IS_IMMUTABLE)) {
+                return false;
+            }
+        }
+
+       // try custom property:
+       PropertyData<?> lVal = so.getProperties().get(propertyId);
+       if (lVal != null) {
+           return lVal.getValues().size() > 1 ? lVal.getValues() : lVal.getFirstValue();
+       }  else {
+           return null;
+       }
+    }
+
+}