You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2008/08/20 15:12:45 UTC
svn commit: r687316 - in
/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr:
DefaultItemCollection.java DefaultItemResource.java JcrValueType.java
Author: angela
Date: Wed Aug 20 06:12:44 2008
New Revision: 687316
URL: http://svn.apache.org/viewvc?rev=687316&view=rev
Log:
JCR-1300: spi2dav Improve performance for large binary properties
Added:
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java?rev=687316&r1=687315&r2=687316&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemCollection.java Wed Aug 20 06:12:44 2008
@@ -81,6 +81,8 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
@@ -400,8 +402,28 @@
if (in == null) {
// PUT: not possible without request body
throw new DavException(DavServletResponse.SC_BAD_REQUEST, "Cannot create a new non-collection resource without request body.");
+ }
+ // PUT : create new or overwrite existing property.
+ String ct = inputContext.getContentType();
+ int type = JcrValueType.typeFromContentType(ct);
+ if (type != PropertyType.UNDEFINED) {
+ // no need to create value/values property. instead
+ // prop-value can be retrieved directly:
+ int pos = ct.indexOf(';');
+ String charSet = (pos > -1) ? ct.substring(pos) : "UTF-8";
+ if (type == PropertyType.BINARY) {
+ n.setProperty(memberName, inputContext.getInputStream());
+ } else {
+ BufferedReader r = new BufferedReader(new InputStreamReader(inputContext.getInputStream(), charSet));
+ String line;
+ StringBuffer value = new StringBuffer();
+ while ((line = r.readLine()) != null) {
+ value.append(line);
+ }
+ n.setProperty(memberName, value.toString(), type);
+ }
} else {
- // PUT : create new or overwrite existing property.
+ // try to parse the request body into a 'values' property.
tmpFile = File.createTempFile(TMP_PREFIX + Text.escape(memberName), null, null);
FileOutputStream out = new FileOutputStream(tmpFile);
IOUtil.spool(in, out);
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java?rev=687316&r1=687315&r2=687316&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/DefaultItemResource.java Wed Aug 20 06:12:44 2008
@@ -302,14 +302,14 @@
// set the content type
String contentType;
- if (!isMultiple()) {
- contentType = (type == PropertyType.BINARY) ? "application/octet-stream" : "text/plain";
+ if (isMultiple()) {
+ contentType = IOUtil.buildContentType("text/xml","utf-8");
} else {
- contentType = "text/xml";
+ contentType = IOUtil.buildContentType(JcrValueType.contentTypeFromType(type), "utf-8");
+
}
properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTTYPE, contentType));
-
// add jcr-specific resource properties
properties.add(new DefaultDavProperty(JCR_TYPE, PropertyType.nameFromValue(type)));
if (isMultiple()) {
@@ -319,9 +319,6 @@
properties.add(new ValuesProperty(prop.getValue()));
long length = prop.getLength();
properties.add(new DefaultDavProperty(JCR_LENGTH, String.valueOf(length), true));
- if (prop.getLength() > IOUtil.UNDEFINED_LENGTH) {
- properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, String.valueOf(length)));
- }
}
} catch (RepositoryException e) {
log.error("Failed to retrieve resource properties: "+e.getMessage());
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java?rev=687316&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java Wed Aug 20 06:12:44 2008
@@ -0,0 +1,67 @@
+/*
+ * 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.jackrabbit.webdav.jcr;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.PropertyType;
+
+/** <code>JcrValueType</code>... */
+public final class JcrValueType {
+
+ private static Logger log = LoggerFactory.getLogger(JcrValueType.class);
+
+ /**
+ * Fragment for build the content type of request entities representing
+ * a JCR-value. The fragment must be completed as follows:
+ * <pre>
+ * jcr-value/ + Value.getType().toLowerCase()
+ * </pre>
+ *
+ * resulting in the following types:
+ * <pre>
+ * jcr-value/string
+ * jcr-value/boolean
+ * jcr-value/long
+ * jcr-value/double
+ * jcr-value/date
+ * jcr-value/binary
+ * jcr-value/date
+ * jcr-value/name
+ * jcr-value/path
+ * </pre>
+ */
+ private static final String VALUE_CONTENT_TYPE_FRAGMENT = "jcr-value/";
+
+ public static String contentTypeFromType(int propertyType) {
+ return VALUE_CONTENT_TYPE_FRAGMENT + PropertyType.nameFromValue(propertyType).toLowerCase();
+ }
+
+ public static int typeFromContentType(String contentType) {
+ if (contentType != null && contentType.startsWith(VALUE_CONTENT_TYPE_FRAGMENT)) {
+ // no need to create value/values property. instead
+ // prop-value can be retrieved directly:
+ int pos = contentType.indexOf('/');
+ int pos2 = contentType.indexOf(';');
+
+ String typename = contentType.substring(pos+1, pos+2).toUpperCase() + contentType.substring(pos+2, (pos2 > -1) ? pos2 : contentType.length());
+ return PropertyType.valueFromName(typename);
+ }
+ return PropertyType.UNDEFINED;
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JcrValueType.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url