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 2006/01/13 12:13:30 UTC
svn commit: r368683 [5/8] - in
/incubator/jackrabbit/trunk/contrib/jcr-server: client/
client/src/java/org/apache/jackrabbit/webdav/client/methods/ server/
server/src/java/org/apache/jackrabbit/server/
server/src/java/org/apache/jackrabbit/server/io/ s...
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/IfHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/IfHeader.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/IfHeader.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/IfHeader.java Fri Jan 13 03:11:35 2006
@@ -15,17 +15,18 @@
*/
package org.apache.jackrabbit.webdav.header;
-import org.apache.log4j.Logger;
import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Iterator;
-import java.io.StringReader;
-import java.io.IOException;
-import java.io.Reader;
+import java.util.List;
/**
* The <code>IfHeader</code> class represents the state lists defined
@@ -38,7 +39,7 @@
Resource = Coded-URL
List = "(" 1*(["Not"](State-etag | "[" entity-tag "]")) ")"
State-etag = Coded-URL
- Coded-URL = "<" absoluteURI ">"
+ Coded-URL = "<" absoluteURI ">"
* </pre>
* <p>
* Reformulating this specification into proper EBNF as specified by N. Wirth
@@ -47,9 +48,9 @@
* within words which is considered significant.
* <pre>
If = "If:" ( Tagged | Untagged ).
- Tagged = { "<" Word ">" Untagged } .
+ Tagged = { "<" Word ">" Untagged } .
Untagged = { "(" IfList ")" } .
- IfList = { [ "Not" ] ( ("<" Word ">" ) | ( "[" Word "]" ) ) } .
+ IfList = { [ "Not" ] ( ("<" Word ">" ) | ( "[" Word "]" ) ) } .
Word = characters .
* </pre>
* <p>
@@ -74,7 +75,7 @@
*
* @author Felix Meschberger
*/
-public class IfHeader {
+public class IfHeader implements Header {
/**
* default logger
@@ -82,14 +83,40 @@
private static final Logger log = Logger.getLogger(IfHeader.class);
/**
+ * The string representation of the header value
+ */
+ private final String headerValue;
+
+ /**
* The list of untagged state entries
*/
private final IfHeaderInterface ifHeader;
/**
- * The list of all tokens present in the If header.
+ * The list of all positive tokens present in the If header.
*/
private List allTokens = new ArrayList();
+ /**
+ * The list of all NOT tokens present in the If header.
+ */
+ private List allNotTokens = new ArrayList();
+
+ /**
+ * Create a Untagged <code>IfHeader</code> if the given lock tokens.
+ *
+ * @param tokens
+ */
+ public IfHeader(String[] tokens) {
+ allTokens.addAll(Arrays.asList(tokens));
+ StringBuffer b = new StringBuffer();
+ for (int i = 0; i < tokens.length; i++) {
+ b.append("(").append("<");
+ b.append(tokens[i]);
+ b.append(">").append(")");
+ }
+ headerValue = b.toString();
+ ifHeader = parse();
+ }
/**
* Parses the <em>If</em> header and creates and internal representation
@@ -98,45 +125,8 @@
* @param req The request object
*/
public IfHeader(HttpServletRequest req) {
-
- String ifHeaderValue = req.getHeader(DavConstants.HEADER_IF);
- if (ifHeaderValue != null && ifHeaderValue.length() > 0) {
-
- StringReader reader = null;
- int firstChar = 0;
-
- try {
- reader = new StringReader(ifHeaderValue);
-
- // get the first character to decide - expect '(' or '<'
- try {
- reader.mark(1);
- firstChar = readWhiteSpace(reader);
- reader.reset();
- } catch (IOException ignore) {
- // may be thrown according to API but is only thrown by the
- // StringReader class if the reader is already closed.
- }
-
- if (firstChar == '(') {
- ifHeader = parseUntagged(reader);
- } else if (firstChar == '<') {
- ifHeader = parseTagged(reader);
- } else {
- logIllegalState("If", firstChar, "(<", null);
- ifHeader = null;
- }
-
- } finally {
- if (reader != null) {
- reader.close();
- }
- }
-
- } else {
- log.debug("IfHeader: No If header in request");
- ifHeader = null;
- }
+ headerValue = req.getHeader(DavConstants.HEADER_IF);
+ ifHeader = parse();
}
/**
@@ -150,6 +140,16 @@
}
/**
+ * Return the String representation of the If header present on
+ * the given request or <code>null</code>.
+ *
+ * @return If header value as String or <code>null</code>.
+ */
+ public String getHeaderValue() {
+ return headerValue;
+ }
+
+ /**
* Returns true if an If header was present in the given request. False otherwise.
*
* @return true if an If header was present.
@@ -189,13 +189,65 @@
}
/**
- *
- * @return
+ * @return an interator over all tokens present in the if header, that were
+ * not denied by a leading NOT statement.
*/
public Iterator getAllTokens() {
return allTokens.iterator();
}
+ /**
+ * @return an interator over all NOT tokens present in the if header, that
+ * were explicitely denied.
+ */
+ public Iterator getAllNotTokens() {
+ return allNotTokens.iterator();
+ }
+
+ /**
+ * Parse the original header value and build th internal IfHeaderInterface
+ * object that is easy to query.
+ */
+ private IfHeaderInterface parse() {
+ IfHeaderInterface ifHeader;
+ if (headerValue != null && headerValue.length() > 0) {
+ StringReader reader = null;
+ int firstChar = 0;
+
+ try {
+ reader = new StringReader(headerValue);
+ // get the first character to decide - expect '(' or '<'
+ try {
+ reader.mark(1);
+ firstChar = readWhiteSpace(reader);
+ reader.reset();
+ } catch (IOException ignore) {
+ // may be thrown according to API but is only thrown by the
+ // StringReader class if the reader is already closed.
+ }
+
+ if (firstChar == '(') {
+ ifHeader = parseUntagged(reader);
+ } else if (firstChar == '<') {
+ ifHeader = parseTagged(reader);
+ } else {
+ logIllegalState("If", firstChar, "(<", null);
+ ifHeader = null;
+ }
+
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+
+ } else {
+ log.debug("IfHeader: No If header in request");
+ ifHeader = null;
+ }
+ return ifHeader;
+ }
+
//---------- internal IF header parser -------------------------------------
/**
* Parses a tagged type <em>If</em> header. This method implements the
@@ -331,7 +383,11 @@
if (word != null) {
res.add(new IfListEntryToken(word, positive));
// also add the token to the list of all tokens
+ if (positive) {
allTokens.add(word);
+ } else {
+ allNotTokens.add(word);
+ }
positive = true;
}
break;
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.header;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.webdav.version.DeltaVConstants;
+import org.apache.jackrabbit.webdav.WebdavRequest;
+
+/**
+ * <code>LabelHeader</code>...
+ */
+public class LabelHeader implements Header {
+
+ private static Logger log = Logger.getLogger(LabelHeader.class);
+
+ private final String label;
+
+ public LabelHeader(String label) {
+ if (label == null) {
+ throw new IllegalArgumentException("null is not a valid label.");
+ }
+ this.label = label;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getHeaderName() {
+ return DeltaVConstants.HEADER_LABEL;
+ }
+
+ public String getHeaderValue() {
+ return Text.escape(label);
+ }
+
+ public static LabelHeader parse(WebdavRequest request) {
+ String hv = request.getHeader(DeltaVConstants.HEADER_LABEL);
+ if (hv == null) {
+ return null;
+ } else {
+ return new LabelHeader(Text.unescape(hv));
+ }
+ }
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/LabelHeader.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.header;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.webdav.DavConstants;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <code>OverwriteHeader</code>...
+ */
+public class OverwriteHeader implements Header {
+
+ private static Logger log = Logger.getLogger(OverwriteHeader.class);
+
+ public static final String OVERWRITE_TRUE = "T";
+ public static final String OVERWRITE_FALSE = "F";
+
+ private boolean doOverwrite;
+
+ public OverwriteHeader(boolean doOverwrite) {
+ this.doOverwrite = doOverwrite;
+ }
+
+ public OverwriteHeader(HttpServletRequest request) {
+ String overwriteHeader = request.getHeader(DavConstants.HEADER_OVERWRITE);
+ if (overwriteHeader != null) {
+ doOverwrite = overwriteHeader.equalsIgnoreCase(OVERWRITE_TRUE);
+ }
+ }
+
+ public String getHeaderName() {
+ return DavConstants.HEADER_OVERWRITE;
+ }
+
+ public String getHeaderValue() {
+ return (doOverwrite) ? OVERWRITE_TRUE : OVERWRITE_FALSE;
+ }
+
+ public boolean isOverwrite() {
+ return doOverwrite;
+ }
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/OverwriteHeader.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.header;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.webdav.DavConstants;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <code>TimeoutHeader</code>...
+ */
+public class TimeoutHeader implements Header, DavConstants {
+
+ private static Logger log = Logger.getLogger(TimeoutHeader.class);
+
+ private final long timeout;
+
+ public TimeoutHeader(long timeout) {
+ this.timeout = timeout;
+ }
+
+ public String getHeaderName() {
+ return DavConstants.HEADER_TIMEOUT;
+ }
+
+ public String getHeaderValue() {
+ return String.valueOf(timeout);
+ }
+
+ public long getTimeout() {
+ return timeout;
+ }
+
+ /**
+ * Parse the request timeout header and convert the timeout value
+ * into a long indicating the number of milliseconds until expiration time
+ * is reached.<br>
+ * NOTE: If the requested timeout is 'infinite' {@link Long.MAX_VALUE}
+ * is returned. If the header is missing or is in an invalid format that
+ * cannot be parsed, the default value is returned.
+ *
+ * @param request
+ * @param defaultValue
+ * @return long representing the timeout present in the header or the default
+ * value if the header is missing or could not be parsed.
+ */
+ public static TimeoutHeader parse(HttpServletRequest request, long defaultValue) {
+ String timeoutStr = request.getHeader(HEADER_TIMEOUT);
+ long timeout = defaultValue;
+ if (timeoutStr != null && timeoutStr.length() > 0) {
+ int secondsInd = timeoutStr.indexOf("Second-");
+ if (secondsInd >= 0) {
+ secondsInd += 7; // read over "Second-"
+ int i = secondsInd;
+ while (i < timeoutStr.length() && Character.isDigit(timeoutStr.charAt(i))) {
+ i++;
+ }
+ try {
+ timeout = 1000L * Long.parseLong(timeoutStr.substring(secondsInd, i));
+ } catch (NumberFormatException ignore) {
+ // ignore and return 'undefined' timeout
+ log.error("Invalid timeout format: " + timeoutStr);
+ }
+ } else if (timeoutStr.equalsIgnoreCase(TIMEOUT_INFINITE)) {
+ timeout = INFINITE_TIMEOUT;
+ }
+ }
+ return new TimeoutHeader(timeout);
+ }
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/header/TimeoutHeader.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractActiveLock.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractActiveLock.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractActiveLock.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractActiveLock.java Fri Jan 13 03:11:35 2006
@@ -16,8 +16,9 @@
package org.apache.jackrabbit.webdav.lock;
import org.apache.jackrabbit.webdav.DavConstants;
-import org.apache.jackrabbit.webdav.util.XmlUtil;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
/**
* <code>AbstractActiveLock</code>...
@@ -29,43 +30,34 @@
* as defined by RFC 2518.
*
* @return Xml representation
+ * @param document
*/
- public Element toXml() {
- Element activeLock = new Element(XML_ACTIVELOCK, NAMESPACE);
-
- // locktype property
- Element property = new Element(XML_LOCKTYPE, NAMESPACE);
- property.addContent(getType().toXml());
- activeLock.addContent(property);
+ public Element toXml(Document document) {
+ Element activeLock = DomUtil.createElement(document, XML_ACTIVELOCK, NAMESPACE);
// lockscope property
- property = new Element(XML_LOCKSCOPE, NAMESPACE);
- property.addContent(getScope().toXml());
- activeLock.addContent(property);
-
+ activeLock.appendChild(getScope().toXml(document));
+ // locktype property
+ activeLock.appendChild(getType().toXml(document));
// depth
- activeLock.addContent(XmlUtil.depthToXml(isDeep()));
+ activeLock.appendChild(DomUtil.depthToXml(isDeep(), document));
// timeout
long timeout = getTimeout();
if (!isExpired() && timeout != UNDEFINED_TIMEOUT) {
- activeLock.addContent(XmlUtil.timeoutToXml(timeout));
+ activeLock.appendChild(DomUtil.timeoutToXml(timeout, document));
}
// owner
if (getOwner() != null) {
- property = new Element(XML_OWNER, NAMESPACE);
- property.setText(getOwner());
- activeLock.addContent(property);
+ DomUtil.addChildElement(activeLock, XML_OWNER, NAMESPACE, getOwner());
}
// locktoken
if (getToken() != null) {
- property = new Element(XML_LOCKTOKEN, NAMESPACE);
- Element href = new Element(XML_HREF, NAMESPACE);
- href.setText(getToken());
- property.addContent(href);
- activeLock.addContent(property);
+ Element lToken = DomUtil.addChildElement(activeLock, XML_LOCKTOKEN, NAMESPACE);
+ lToken.appendChild(DomUtil.hrefToXml(getToken(), document));
}
return activeLock;
}
+
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractLockEntry.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractLockEntry.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractLockEntry.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/AbstractLockEntry.java Fri Jan 13 03:11:35 2006
@@ -17,10 +17,12 @@
import org.apache.log4j.Logger;
import org.apache.jackrabbit.webdav.DavConstants;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
/**
- * <code>AbstractLockEntry</code> provides the generic {@link #toXml} method.
+ * <code>AbstractLockEntry</code> provides the generic {@link org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml} method.
*/
public abstract class AbstractLockEntry implements LockEntry, DavConstants {
@@ -30,15 +32,14 @@
* Returns the Xml representation of this <code>LockEntry</code>.
*
* @return Xml representation
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ * @param document
*/
- public Element toXml() {
- Element entry = new Element(XML_LOCKENTRY, NAMESPACE);
- Element prop = new Element(XML_LOCKSCOPE, NAMESPACE);
- prop.addContent(getScope().toXml());
- entry.addContent(prop);
- prop = new Element(XML_LOCKTYPE, NAMESPACE);
- prop.addContent(getType().toXml());
- entry.addContent(prop);
+ public Element toXml(Document document) {
+ Element entry = DomUtil.createElement(document, XML_LOCKENTRY, NAMESPACE);
+ entry.appendChild(getScope().toXml(document));
+ entry.appendChild(getType().toXml(document));
return entry;
}
+
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/ActiveLock.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/ActiveLock.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/ActiveLock.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/ActiveLock.java Fri Jan 13 03:11:35 2006
@@ -15,13 +15,13 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
/**
* <code>ActiveLock</code> encapsulates the lock information for a
* {@link org.apache.jackrabbit.webdav.DavResource}.
*/
-public interface ActiveLock {
+public interface ActiveLock extends XmlSerializable {
/**
* Return true, if the given token matches the lock token present in this
@@ -104,11 +104,4 @@
* @return scope
*/
public Scope getScope();
-
- /**
- * Return the Xml representation of this lock.
- *
- * @return Xml representation of this lock
- */
- public Element toXml();
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockDiscovery.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockDiscovery.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockDiscovery.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockDiscovery.java Fri Jan 13 03:11:35 2006
@@ -15,9 +15,10 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
import java.util.List;
import java.util.ArrayList;
@@ -75,29 +76,31 @@
}
/**
+ * Returns the list of active locks.
+ *
+ * @return list of active locks
+ * @see org.apache.jackrabbit.webdav.property.DavProperty#getValue()
+ */
+ public Object getValue() {
+ return activeLocks;
+ }
+
+ /**
* Creates a JDOM <code><lockdiscovery></code> element in order to respond to a LOCK
* request or to the lockdiscovery property of a PROPFIND request.<br>
* NOTE: if the {@link #activeLocks} list is empty an empty lockdiscovery
* property is created ( <code><lockdiscovery/></code>)
* @return A JDOM element of the <active> lock tag.
+ * @param document
*/
- public Element toXml() {
- Element lockdiscovery = getName().toXml();
+ public Element toXml(Document document) {
+ Element lockdiscovery = getName().toXml(document);
Iterator it = activeLocks.iterator();
while (it.hasNext()) {
ActiveLock lock = (ActiveLock) it.next();
- lockdiscovery.addContent(lock.toXml());
+ lockdiscovery.appendChild(lock.toXml(document));
}
return lockdiscovery;
}
- /**
- * Returns the list of active locks.
- *
- * @return list of active locks
- * @see org.apache.jackrabbit.webdav.property.DavProperty#getValue()
- */
- public Object getValue() {
- return activeLocks;
- }
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockEntry.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockEntry.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockEntry.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockEntry.java Fri Jan 13 03:11:35 2006
@@ -15,12 +15,12 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
/**
* <code>LockEntry</code>...
*/
-public interface LockEntry {
+public interface LockEntry extends XmlSerializable {
/**
* Returns the type of this lock entry
@@ -35,11 +35,4 @@
* @return scope of this lock entry.
*/
public Scope getScope();
-
- /**
- * Returns the Xml representation of this entry.
- *
- * @return Xml representation
- */
- public Element toXml();
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockInfo.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockInfo.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockInfo.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/LockInfo.java Fri Jan 13 03:11:35 2006
@@ -16,10 +16,11 @@
package org.apache.jackrabbit.webdav.lock;
import org.apache.jackrabbit.webdav.DavConstants;
-import org.jdom.Element;
-
-import java.util.List;
-import java.util.Iterator;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
/**
* <code>LockInfo</code> is a simple utility class encapsulating the information
@@ -31,7 +32,7 @@
* given, since this left to those objects responsible for the lock creation
* on the requested resource.
*/
-public class LockInfo {
+public class LockInfo implements DavConstants, XmlSerializable {
private Type type;
private Scope scope;
@@ -42,6 +43,38 @@
private boolean isRefreshLock;
/**
+ * Create a new <code>LockInfo</code> used for refreshing an existing lock.
+ *
+ * @param timeout
+ */
+ public LockInfo(long timeout) {
+ this.timeout = (timeout > 0) ? timeout : INFINITE_TIMEOUT;
+ this.isRefreshLock = true;
+ }
+
+ /**
+ * Create a new <code>LockInfo</code>
+ *
+ * @param scope
+ * @param type
+ * @param owner
+ * @param timeout
+ * @param isDeep
+ */
+ public LockInfo(Scope scope, Type type, String owner, long timeout, boolean isDeep) {
+ this.timeout = (timeout > 0) ? timeout : INFINITE_TIMEOUT;
+ this.isDeep = isDeep;
+
+ if (scope == null || type == null) {
+ this.isRefreshLock = true;
+ } else {
+ this.scope = scope;
+ this.type = type;
+ this.owner = owner;
+ }
+ }
+
+ /**
* Create a new <code>LockInfo</code> object from the given information. If
* <code>liElement</code> is <code>null</code> this lockinfo is assumed to
* be issued from a 'Refresh Lock' request.
@@ -57,29 +90,28 @@
* <code>null</null> but does not start with an 'lockinfo' element.
*/
public LockInfo(Element liElement, long timeout, boolean isDeep) {
- this.timeout = timeout;
+ this.timeout = (timeout > 0) ? timeout : INFINITE_TIMEOUT;
this.isDeep = isDeep;
if (liElement != null) {
- if (!DavConstants.XML_LOCKINFO.equals(liElement.getName())) {
- throw new IllegalArgumentException("Element must have name 'lockinfo'.");
+ if (!DomUtil.matches(liElement, XML_LOCKINFO, NAMESPACE)) {
+ throw new IllegalArgumentException("'DAV:lockinfo' element expected.");
}
- List childList = liElement.getChildren();
- for (int i = 0; i < childList.size(); i++) {
- Element child = (Element) childList.get(i);
- String nodeName = child.getName();
- if (DavConstants.XML_LOCKTYPE.equals(nodeName)) {
- Element typeElement = getFirstChildElement(child);
- type = Type.create(typeElement);
- } else if (DavConstants.XML_LOCKSCOPE.equals(nodeName)) {
- Element scopeElement = getFirstChildElement(child);
- scope = Scope.create(scopeElement);
- } else if (DavConstants.XML_OWNER.equals(nodeName)) {
- owner = child.getChildTextTrim(DavConstants.XML_HREF);
+ ElementIterator it = DomUtil.getChildren(liElement);
+ while (it.hasNext()) {
+ Element child = it.nextElement();
+ String childName = child.getLocalName();
+ if (XML_LOCKTYPE.equals(childName)) {
+ type = Type.createFromXml(child);
+ } else if (XML_LOCKSCOPE.equals(childName)) {
+ scope = Scope.createFromXml(child);
+ } else if (XML_OWNER.equals(childName)) {
+ // first try if 'owner' is inside a href element
+ owner = DomUtil.getChildTextTrim(child, XML_HREF, NAMESPACE);
if (owner==null) {
- // check if child is a text element
- owner = child.getTextTrim();
+ // otherwise: assume owner is a simple text element
+ owner = DomUtil.getTextTrim(child);
}
}
}
@@ -90,25 +122,6 @@
}
/**
- * Retrieve the first element from the content list of the specified Xml element.
- *
- * @param elem
- * @return
- */
- private static Element getFirstChildElement(Element elem) {
- if (elem.getContentSize() > 0) {
- Iterator it = elem.getContent().iterator();
- while (it.hasNext()) {
- Object content = it.next();
- if (content instanceof Element) {
- return (Element) content;
- }
- }
- }
- return null;
- }
-
- /**
* Returns the lock type or <code>null</null> if no 'lockinfo' element was
* passed to the constructor or did not contain an 'type' element and the
* type has not been set otherwise.
@@ -188,4 +201,29 @@
public boolean isRefreshLock() {
return isRefreshLock;
}
+
+ /**
+ * Returns the xml representation of this lock info.<br>
+ * NOTE however, that the depth and the timeout are not included
+ * in the xml. They will be passed to the server using the corresponding
+ * request headers.
+ *
+ * @param document
+ * @return xml representation of this lock info.
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ */
+ public Element toXml(Document document) {
+ if (isRefreshLock) {
+ return null;
+ } else {
+ Element lockInfo = DomUtil.createElement(document, XML_LOCKINFO, NAMESPACE);
+ lockInfo.appendChild(scope.toXml(document));
+ lockInfo.appendChild(type.toXml(document));
+ if (owner != null) {
+ DomUtil.addChildElement(lockInfo, XML_OWNER, NAMESPACE, owner);
+ }
+ return lockInfo;
+ }
+ }
+
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Scope.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Scope.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Scope.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Scope.java Fri Jan 13 03:11:35 2006
@@ -15,33 +15,37 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
-import org.jdom.Namespace;
import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
-import java.util.*;
+import java.util.Map;
+import java.util.HashMap;
/**
* The <code>Scope</code> class abstracts the lock scope as defined by RFC 2518.
*/
-public class Scope {
+public class Scope implements XmlSerializable {
private static final Map scopes = new HashMap();
public static final Scope EXCLUSIVE = Scope.create(DavConstants.XML_EXCLUSIVE, DavConstants.NAMESPACE);
public static final Scope SHARED = Scope.create(DavConstants.XML_SHARED, DavConstants.NAMESPACE);
- private final String name;
+ private final String localName;
private final Namespace namespace;
/**
* Private constructor
*
- * @param name
+ * @param localName
* @param namespace
*/
- private Scope(String name, Namespace namespace) {
- this.name = name;
+ private Scope(String localName, Namespace namespace) {
+ this.localName = localName;
this.namespace = namespace;
}
@@ -50,9 +54,29 @@
* the LOCK request and response body and in the {@link LockDiscovery}.
*
* @return Xml representation
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
*/
- public Element toXml() {
- return new Element(name, namespace);
+ public Element toXml(Document document) {
+ Element lockScope = DomUtil.createElement(document, DavConstants.XML_LOCKSCOPE, DavConstants.NAMESPACE);
+ DomUtil.addChildElement(lockScope, localName, namespace);
+ return lockScope;
+ }
+
+ /**
+ * Returns <code>true</code> if this Scope is equal to the given one.
+ *
+ * @param obj
+ * @return
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof Scope) {
+ Scope other = (Scope) obj;
+ return localName.equals(other.localName) && namespace.equals(other.namespace);
+ }
+ return false;
}
/**
@@ -61,46 +85,33 @@
* @param lockScope
* @return Scope object.
*/
- public static Scope create(Element lockScope) {
+ public static Scope createFromXml(Element lockScope) {
+ if (lockScope != null && DavConstants.XML_LOCKSCOPE.equals(lockScope.getLocalName())) {
+ // we have the parent element and must retrieve the scope first
+ lockScope = DomUtil.getFirstChildElement(lockScope);
+ }
if (lockScope == null) {
- throw new IllegalArgumentException("'null' is not valid lock scope entry.");
+ throw new IllegalArgumentException("'null' is not a valid lock scope entry.");
}
- return create(lockScope.getName(), lockScope.getNamespace());
+ Namespace namespace = Namespace.getNamespace(lockScope.getPrefix(), lockScope.getNamespaceURI());
+ return create(lockScope.getLocalName(), namespace);
}
/**
* Create a <code>Scope</code> object from the given name and namespace.
*
- * @param name
+ * @param localName
* @param namespace
* @return Scope object.
*/
- public static Scope create(String name, Namespace namespace) {
- String key = "{" + namespace.getURI() + "}" + name;
+ public static Scope create(String localName, Namespace namespace) {
+ String key = DomUtil.getQualifiedName(localName, namespace);
if (scopes.containsKey(key)) {
return (Scope) scopes.get(key);
} else {
- Scope scope = new Scope(name, namespace);
+ Scope scope = new Scope(localName, namespace);
scopes.put(key, scope);
return scope;
}
}
-
- /**
- * Returns <code>true</code> if this Scope is equal to the given one.
- *
- * @param obj
- * @return
- */
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof Scope) {
- Scope other = (Scope) obj;
- return name.equals(other.name) && namespace.equals(other.namespace);
- }
- return false;
- }
-
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SimpleLockManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SimpleLockManager.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SimpleLockManager.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SimpleLockManager.java Fri Jan 13 03:11:35 2006
@@ -18,8 +18,11 @@
import java.util.HashMap;
import java.util.Iterator;
-import org.apache.jackrabbit.webdav.*;
import org.apache.jackrabbit.util.Text;
+import org.apache.jackrabbit.webdav.DavResource;
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.DavResourceIterator;
/**
* Simple manager for webdav locks.<br>
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SupportedLock.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SupportedLock.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SupportedLock.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/SupportedLock.java Fri Jan 13 03:11:35 2006
@@ -15,9 +15,10 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
import java.util.ArrayList;
import java.util.Iterator;
@@ -96,13 +97,14 @@
* Creates a JDOM element that represents the <supportedlock> tag.
*
* @return A JDOM element of this lock support.
+ * @param document
*/
- public Element toXml() {
- Element support = getName().toXml();
+ public Element toXml(Document document) {
+ Element support = getName().toXml(document);
Iterator iter = entries.iterator();
while (iter.hasNext()) {
LockEntry le = (LockEntry) iter.next();
- support.addContent(le.toXml());
+ support.appendChild(le.toXml(document));
}
return support;
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Type.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Type.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Type.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/lock/Type.java Fri Jan 13 03:11:35 2006
@@ -15,22 +15,26 @@
*/
package org.apache.jackrabbit.webdav.lock;
-import org.jdom.Element;
-import org.jdom.Namespace;
import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
/**
* The <code>Type</code> class encapsulates the lock type as defined by RFC 2518.
*/
-public class Type {
+public class Type implements XmlSerializable {
private static Map types = new HashMap();
public static final Type WRITE = Type.create(DavConstants.XML_WRITE, DavConstants.NAMESPACE);
- private final String name;
+ private final String localName;
private final Namespace namespace;
/**
@@ -40,7 +44,7 @@
* @param namespace
*/
private Type(String name, Namespace namespace) {
- this.name = name;
+ this.localName = name;
this.namespace = namespace;
}
@@ -48,9 +52,29 @@
* Returns the Xml representation of this lock <code>Type</code>.
*
* @return Xml representation
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
*/
- public Element toXml() {
- return new Element(name, namespace);
+ public Element toXml(Document document) {
+ Element lockType = DomUtil.createElement(document, DavConstants.XML_LOCKTYPE, DavConstants.NAMESPACE);
+ DomUtil.addChildElement(lockType, localName, namespace);
+ return lockType;
+ }
+
+ /**
+ * Returns <code>true</code> if this Type is equal to the given one.
+ *
+ * @param obj
+ * @return
+ */
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof Type) {
+ Type other = (Type) obj;
+ return localName.equals(other.localName) && namespace.equals(other.namespace);
+ }
+ return false;
}
/**
@@ -59,45 +83,33 @@
* @param lockType
* @return <code>Type</code> object.
*/
- public static Type create(Element lockType) {
+ public static Type createFromXml(Element lockType) {
+ if (lockType != null && DavConstants.XML_LOCKTYPE.equals(lockType.getLocalName())) {
+ // we have the parent element and must retrieve the type first
+ lockType = DomUtil.getFirstChildElement(lockType);
+ }
if (lockType == null) {
throw new IllegalArgumentException("'null' is not valid lock type entry.");
}
- return create(lockType.getName(), lockType.getNamespace());
+ Namespace namespace = Namespace.getNamespace(lockType.getPrefix(), lockType.getNamespaceURI());
+ return create(lockType.getLocalName(), namespace);
}
/**
- * Create a <code>Type</code> object from the given name and namespace.
+ * Create a <code>Type</code> object from the given localName and namespace.
*
- * @param name
+ * @param localName
* @param namespace
* @return <code>Type</code> object.
*/
- public static Type create(String name, Namespace namespace) {
- String key = "{" + namespace.getURI() + "}" + name;
+ public static Type create(String localName, Namespace namespace) {
+ String key = DomUtil.getQualifiedName(localName, namespace);
if (types.containsKey(key)) {
return (Type) types.get(key);
} else {
- Type type = new Type(name, namespace);
+ Type type = new Type(localName, namespace);
types.put(key, type);
return type;
}
- }
-
- /**
- * Returns <code>true</code> if this Type is equal to the given one.
- *
- * @param obj
- * @return
- */
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj instanceof Type) {
- Type other = (Type) obj;
- return name.equals(other.name) && namespace.equals(other.namespace);
- }
- return false;
}
}
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.observation;
+
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+
+/**
+ * <code>EventBundle</code> defines an empty interface used to represent a bundle
+ * of events.
+ *
+ * @see EventDiscovery#addEventBundle(EventBundle)
+ */
+public interface EventBundle extends XmlSerializable {
+
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventBundle.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventDiscovery.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventDiscovery.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventDiscovery.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventDiscovery.java Fri Jan 13 03:11:35 2006
@@ -16,10 +16,14 @@
package org.apache.jackrabbit.webdav.observation;
import org.apache.log4j.Logger;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
import java.util.List;
import java.util.ArrayList;
+import java.util.Iterator;
/**
* <code>EventDiscovery</code> represents the request body of a successfull
@@ -27,7 +31,7 @@
* definition what events that particular subscription is interested in was
* specified with the initial SUBSCRIPTION that started the event listening.
*/
-public class EventDiscovery implements ObservationConstants {
+public class EventDiscovery implements ObservationConstants, XmlSerializable {
private static Logger log = Logger.getLogger(EventDiscovery.class);
@@ -41,7 +45,7 @@
* @param eventBundle
* @see Subscription
*/
- public void addEventBundle(Element eventBundle) {
+ public void addEventBundle(EventBundle eventBundle) {
if (eventBundle != null) {
bundles.add(eventBundle);
}
@@ -52,10 +56,17 @@
* being present in the POLL response body.
*
* @return Xml representation
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ * @param document
*/
- public Element toXml() {
- Element ed = new Element(XML_EVENTDISCOVERY, NAMESPACE);
- ed.addContent(bundles);
+ public Element toXml(Document document) {
+ Element ed = DomUtil.createElement(document, XML_EVENTDISCOVERY, NAMESPACE);
+ Iterator it = bundles.iterator();
+ while (it.hasNext()) {
+ EventBundle bundle = (EventBundle)it.next();
+ ed.appendChild(bundle.toXml(document));
+ }
return ed;
}
+
}
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.observation;
+
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+
+/**
+ * <code>EventType</code>...
+ */
+public interface EventType extends XmlSerializable {
+
+ public String getName();
+
+ public Namespace getNamespace();
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/EventType.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java?rev=368683&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java Fri Jan 13 03:11:35 2006
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.observation;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+
+/**
+ * <code>Filter</code>...
+ */
+public class Filter implements XmlSerializable {
+
+ private static Logger log = Logger.getLogger(Filter.class);
+
+ private final String filterName;
+ private final Namespace filterNamespace;
+ private final String filterValue;
+
+ public Filter(String filterName, Namespace filterNamespace, String filterValue) {
+ if (filterName == null) {
+ throw new IllegalArgumentException("filterName must not be null.");
+ }
+ this.filterName = filterName;
+ this.filterNamespace = filterNamespace;
+ this.filterValue = filterValue;
+ }
+
+ public Filter(Element filterElem) {
+ filterName = filterElem.getLocalName();
+ filterNamespace = DomUtil.getNamespace(filterElem);
+ filterValue = DomUtil.getTextTrim(filterElem);
+ }
+
+ public String getName() {
+ return filterName;
+ }
+
+ public Namespace getNamespace() {
+ return filterNamespace;
+ }
+
+ public String getValue() {
+ return filterValue;
+ }
+
+ public boolean isMatchingFilter(String localName, Namespace namespace) {
+ boolean matchingNsp = (filterNamespace == null) ? namespace == null : filterNamespace.equals(namespace);
+ return filterName.equals(localName) && matchingNsp;
+ }
+
+ public Element toXml(Document document) {
+ return DomUtil.createElement(document, filterName, filterNamespace, filterValue);
+ }
+
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Filter.java
------------------------------------------------------------------------------
svn:keywords = author date id revision url
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/ObservationConstants.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/ObservationConstants.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/ObservationConstants.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/ObservationConstants.java Fri Jan 13 03:11:35 2006
@@ -15,8 +15,8 @@
*/
package org.apache.jackrabbit.webdav.observation;
-import org.jdom.Namespace;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.xml.Namespace;
/**
* <code>ObservationConstants</code> interface provide constants for request
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Subscription.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Subscription.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Subscription.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/Subscription.java Fri Jan 13 03:11:35 2006
@@ -15,13 +15,18 @@
*/
package org.apache.jackrabbit.webdav.observation;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
/**
* <code>Subscription</code> represents public representation of the event
- * listener created (or modified) by a successful SUBSCRIBE request.
+ * listener created (or modified) by a successful SUBSCRIBE request.<br>
+ * Please note that this interface extends the <code>XmlSerializable</code>
+ * interface. Tthe Xml representation of a <code>Subscription</code> is
+ * returned in the response to a successful SUBSCRIBE request as well
+ * as in a PROPFIND request. In both cases the subscription is packed into
+ * a {@link SubscriptionDiscovery} property object.
*/
-public interface Subscription {
+public interface Subscription extends XmlSerializable {
/**
* Returns the id of this subscription, that must be used for unsubscribing
@@ -30,15 +35,4 @@
* @return subscriptionId
*/
public String getSubscriptionId();
-
- /**
- * Return the Xml representation of this <code>Subscription</code> that is
- * returned in the response to a successful SUBSCRIBE request as well
- * as in a PROPFIND request. In both cases the subscription is packed into
- * a {@link SubscriptionDiscovery} property object.
- *
- * @return Xml representation
- */
- public Element toXml();
-
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionDiscovery.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionDiscovery.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionDiscovery.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionDiscovery.java Fri Jan 13 03:11:35 2006
@@ -16,7 +16,8 @@
package org.apache.jackrabbit.webdav.observation;
import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
-import org.jdom.Element;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
/**
* <code>SubscriptionDiscovery</code> encapsulates the 'subscriptiondiscovery'
@@ -53,26 +54,28 @@
}
/**
+ * Returns an array of {@link Subscription}s.
+ *
+ * @return an array of {@link Subscription}s
+ * @see org.apache.jackrabbit.webdav.property.DavProperty#getValue()
+ */
+ public Object getValue() {
+ return subscriptions;
+ }
+
+ /**
* Returns the Xml representation of the subscription discovery.
*
* @return Xml representation
- * @see org.apache.jackrabbit.webdav.property.DavProperty#toXml()
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ * @param document
*/
- public Element toXml() {
- Element elem = getName().toXml();
+ public Element toXml(Document document) {
+ Element elem = getName().toXml(document);
for (int i = 0; i < subscriptions.length; i++) {
- elem.addContent(subscriptions[i].toXml());
+ elem.appendChild(subscriptions[i].toXml(document));
}
return elem;
}
- /**
- * Returns an array of {@link Subscription}s.
- *
- * @return an array of {@link Subscription}s
- * @see org.apache.jackrabbit.webdav.property.DavProperty#getValue()
- */
- public Object getValue() {
- return subscriptions;
- }
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionInfo.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionInfo.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionInfo.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/observation/SubscriptionInfo.java Fri Jan 13 03:11:35 2006
@@ -16,24 +16,82 @@
package org.apache.jackrabbit.webdav.observation;
import org.apache.log4j.Logger;
-import org.apache.jackrabbit.webdav.util.XmlUtil;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.Namespace;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+import java.util.ArrayList;
import java.util.List;
/**
* <code>SubscriptionInfo</code> class encapsulates the subscription info
- * that forms the request body of a SUBSCRIBE request.
+ * that forms the request body of a SUBSCRIBE request.<br>
+ * The following xml layout is defined for the subscription info:
+ * <pre>
+ * <!ELEMENT subscriptioninfo ( eventtype, nolocal?, filter? ) >
+ * <!ELEMENT eventtype ANY >
+ *
+ * ANY defines any sequence of elements where at least one defines a valid
+ * eventtype. Note that a single eventtype must not occur multiple times.
+
+ * <!ELEMENT nolocal EMPTY >
+ * <!ELEMENT filter ANY >
+ *
+ * ANY: any sequence of elements identifying a filter for event listening but
+ * at least a single element.
+ * </pre>
* @see ObservationConstants#XML_SUBSCRIPTIONINFO
*/
-public class SubscriptionInfo implements ObservationConstants {
+public class SubscriptionInfo implements ObservationConstants, XmlSerializable {
private static Logger log = Logger.getLogger(SubscriptionInfo.class);
- private Element info;
- private List eventTypes;
- private long timeout;
- private boolean isDeep;
+ private final EventType[] eventTypes;
+ private final Filter[] filters;
+ private final boolean noLocal;
+ private final boolean isDeep;
+ private final long timeout;
+
+ /**
+ * Create a new <code>SubscriptionInfo</code>
+ *
+ * @param eventTypes
+ * @param isDeep
+ * @param timeout
+ */
+ public SubscriptionInfo(EventType[] eventTypes, boolean isDeep, long timeout) {
+ this(eventTypes, null, false, isDeep, timeout);
+ }
+
+ /**
+ * Create a new <code>SubscriptionInfo</code>
+ *
+ * @param eventTypes
+ * @param filters
+ * @param noLocal
+ * @param isDeep
+ * @param timeout
+ */
+ public SubscriptionInfo(EventType[] eventTypes, Filter[] filters, boolean noLocal, boolean isDeep, long timeout) {
+ if (eventTypes == null || eventTypes.length == 0) {
+ throw new IllegalArgumentException("'subscriptioninfo' must at least indicate a single event type.");
+ }
+
+ this.eventTypes = eventTypes;
+ this.noLocal = noLocal;
+
+ if (filters != null) {
+ this.filters = filters;
+ } else {
+ this.filters = new Filter[0];
+ }
+
+ this.isDeep = isDeep;
+ this.timeout = timeout;
+ }
/**
* Create a new <code>SubscriptionInfo</code>
@@ -44,57 +102,79 @@
* @throws IllegalArgumentException if the reqInfo element does not contain the mandatory elements.
*/
public SubscriptionInfo(Element reqInfo, long timeout, boolean isDeep) {
- if (!XML_SUBSCRIPTIONINFO.equals(reqInfo.getName())) {
+ if (!DomUtil.matches(reqInfo, XML_SUBSCRIPTIONINFO, NAMESPACE)) {
throw new IllegalArgumentException("Element with name 'subscriptioninfo' expected");
}
- if (reqInfo.getChild(XML_EVENTTYPE, NAMESPACE) == null ) {
+ List typeList = new ArrayList();
+ Element el = DomUtil.getChildElement(reqInfo, XML_EVENTTYPE, NAMESPACE);
+ if (el != null) {
+ ElementIterator it = DomUtil.getChildren(el);
+ while (it.hasNext()) {
+ Element typeElem = it.nextElement();
+ EventType et = new SimpleEventType(typeElem.getLocalName(), DomUtil.getNamespace(typeElem));
+ typeList.add(et);
+ }
+ } else {
throw new IllegalArgumentException("'subscriptioninfo' must contain an 'eventtype' child element.");
}
- eventTypes = reqInfo.getChild(XML_EVENTTYPE, NAMESPACE).getChildren();
- if (eventTypes.size() == 0) {
+ if (typeList.isEmpty()) {
throw new IllegalArgumentException("'subscriptioninfo' must at least indicate a single event type.");
}
+ eventTypes = (EventType[]) typeList.toArray(new EventType[typeList.size()]);
- // detach the request info, in order to remove the reference to the parent
- this.info = (Element)reqInfo.detach();
+ List filters = new ArrayList();
+ el = DomUtil.getChildElement(reqInfo, XML_FILTER, NAMESPACE);
+ if (el != null) {
+ ElementIterator it = DomUtil.getChildren(el);
+ while (it.hasNext()) {
+ Filter f = new Filter(it.nextElement());
+ filters.add(f);
+ }
+ }
+ this.filters = (Filter[])filters.toArray(new Filter[filters.size()]);
+
+ this.noLocal = DomUtil.hasChildElement(reqInfo, XML_NOLOCAL, NAMESPACE);
this.isDeep = isDeep;
- setTimeOut(timeout);
+ this.timeout = timeout;
}
/**
- * Return list of event types Xml elements present in the subscription info.
- * NOTE: the elements need to be detached in order to be added as content
- * to any other Xml element.
+ * Return array of event type names present in the subscription info.
*
- * @return List of Xml elements defining which events this subscription should
- * listen to.
+ * @return array of String defining the names of the events this subscription
+ * should listen to.
*
*/
- public List getEventTypes() {
+ public EventType[] getEventTypes() {
return eventTypes;
}
/**
+ * Return all filters defined for this <code>SubscriptionInfo</code>
+ *
+ * @return all filters or an empty Filter array.
+ */
+ public Filter[] getFilters() {
+ return filters;
+ }
+
+ /**
* Return array of filters with the specified name.
*
- * @param name the filter elments must provide.
+ * @param localName the filter elments must provide.
+ * @param namespace
* @return array containing the text of the filter elements with the given
* name.
*/
- public String[] getFilters(String name) {
- String[] filters = null;
- Element filter = info.getChild(XML_FILTER);
- if (filter != null) {
- List li = filter.getChildren(name);
- if (!li.isEmpty()) {
- filters = new String[li.size()];
+ public Filter[] getFilters(String localName, Namespace namespace) {
+ List l = new ArrayList();
for (int i = 0; i < filters.length; i++) {
- filters[i] = ((Element)li.get(i)).getText();
+ if (filters[i].isMatchingFilter(localName, namespace)) {
+ l.add(filters[i]);
}
}
- }
- return filters;
+ return (Filter[])l.toArray(new Filter[l.size()]);
}
/**
@@ -104,7 +184,7 @@
* @return if {@link #XML_NOLOCAL} element is present.
*/
public boolean isNoLocal() {
- return info.getChild(XML_NOLOCAL, NAMESPACE) != null;
+ return noLocal;
}
/**
@@ -128,21 +208,57 @@
}
/**
- * Set the timeout. NOTE: no validation is made.
+ * Xml representation of this <code>SubscriptionInfo</code>.
*
- * @param timeout as defined by the {@link org.apache.jackrabbit.webdav.DavConstants#HEADER_TIMEOUT}.
+ * @return Xml representation
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ * @param document
*/
- public void setTimeOut(long timeout) {
- this.timeout = timeout;
+ public Element toXml(Document document) {
+ Element subscrInfo = DomUtil.createElement(document, XML_SUBSCRIPTIONINFO, NAMESPACE);
+ Element eventType = DomUtil.addChildElement(subscrInfo, XML_EVENTTYPE, NAMESPACE);
+ for (int i = 0; i < eventTypes.length; i++) {
+ eventType.appendChild(eventTypes[i].toXml(document));
+ }
+
+ if (filters.length > 0) {
+ Element filter = DomUtil.addChildElement(subscrInfo, XML_FILTER, NAMESPACE);
+ for (int i = 0; i < filters.length; i++) {
+ filter.appendChild(filters[i].toXml(document));
+ }
+ }
+
+ if (noLocal) {
+ DomUtil.addChildElement(subscrInfo, XML_NOLOCAL, NAMESPACE);
+ }
+ return subscrInfo;
}
+ //--------------------------------------------------------< inner class >---
/**
- * Xml representation of this <code>SubscriptionInfo</code>.
- *
- * @return Xml representation
+ * Simple EventType implementation that only consists of a qualified event
+ * name.
*/
- public Element[] toXml() {
- Element[] elems = { info, XmlUtil.depthToXml(isDeep), XmlUtil.timeoutToXml(timeout)};
- return elems;
+ private class SimpleEventType implements EventType {
+
+ private String localName;
+ private Namespace namespace;
+
+ SimpleEventType(String localName, Namespace namespace) {
+ this.localName = localName;
+ this.namespace = namespace;
+ }
+
+ public Element toXml(Document document) {
+ return DomUtil.createElement(document, localName, namespace);
+ }
+
+ public String getName() {
+ return localName;
+ }
+
+ public Namespace getNamespace() {
+ return namespace;
+ }
}
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderPatch.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderPatch.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderPatch.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderPatch.java Fri Jan 13 03:11:35 2006
@@ -17,10 +17,13 @@
import org.apache.log4j.Logger;
import org.apache.jackrabbit.webdav.DavConstants;
-import org.jdom.Element;
+import org.apache.jackrabbit.webdav.xml.XmlSerializable;
+import org.apache.jackrabbit.webdav.xml.ElementIterator;
+import org.apache.jackrabbit.webdav.xml.DomUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
import java.util.List;
-import java.util.Iterator;
import java.util.ArrayList;
/**
@@ -37,7 +40,7 @@
* <!ELEMENT after segment >
* </pre>
*/
-public class OrderPatch implements OrderingConstants{
+public class OrderPatch implements OrderingConstants, XmlSerializable {
private static Logger log = Logger.getLogger(OrderPatch.class);
@@ -47,35 +50,11 @@
/**
* Create a new <code>OrderPath</code> object.
*
- * @param orderPatchElement
- * @throws IllegalArgumentException if the specified Xml element was not valid.
+ * @param orderingType
+ * @param instruction
*/
- public OrderPatch(Element orderPatchElement) {
- if (!OrderingConstants.XML_ORDERPATCH.equals(orderPatchElement.getName()) ||
- orderPatchElement.getChild(OrderingConstants.XML_ORDERING_TYPE) == null) {
- throw new IllegalArgumentException("ORDERPATH request body must start with an 'orderpatch' element, which must contain an 'ordering-type' child element.");
- }
- // retrieve the orderingtype element
- orderingType = orderPatchElement.getChild(OrderingConstants.XML_ORDERING_TYPE).getChildText(DavConstants.XML_HREF);
-
- // set build the list of ordering instructions
- List oMembers = orderPatchElement.getChildren(OrderingConstants.XML_ORDER_MEMBER, DavConstants.NAMESPACE);
- Iterator it = oMembers.iterator();
- int cnt = 0;
- List tmpInst = new ArrayList();
- while (it.hasNext()) {
- Element member = (Element) it.next();
- try {
- String segment = member.getChildText(OrderingConstants.XML_SEGMENT);
- Position pos = new Position(member.getChild(OrderingConstants.XML_POSITION));
- Member om = new Member(segment, pos);
- tmpInst.add(om);
- cnt++;
- } catch (IllegalArgumentException e) {
- log.error("Invalid element in 'orderpatch' request body: " + e.getMessage());
- }
- }
- instructions = (Member[]) tmpInst.toArray(new Member[cnt]);
+ public OrderPatch(String orderingType, Member instruction) {
+ this(orderingType, new Member[] {instruction});
}
/**
@@ -85,6 +64,9 @@
* @param instructions
*/
public OrderPatch(String orderingType, Member[] instructions) {
+ if (orderingType == null || instructions == null) {
+ throw new IllegalArgumentException("ordering type and instructions cannot be null.");
+ }
this.orderingType = orderingType;
this.instructions = instructions;
}
@@ -108,12 +90,71 @@
return instructions;
}
+ //------------------------------------------< XmlSerializable interface >---
+ /**
+ *
+ * @return
+ * @param document
+ */
+ public Element toXml(Document document) {
+ Element orderPatch = DomUtil.createElement(document, XML_ORDERPATCH, NAMESPACE);
+ // add DAV:ordering-type below DAV:orderpatch
+ Element otype = DomUtil.addChildElement(orderPatch, XML_ORDERING_TYPE, NAMESPACE);
+ otype.appendChild(DomUtil.hrefToXml(orderingType, document));
+ // add DAV:member elements below DAV:orderpatch
+ for (int i = 0; i < instructions.length; i++) {
+ orderPatch.appendChild(instructions[i].toXml(document));
+ }
+ return null;
+ }
+
+ //------------------------------------------------------< static method >---
+ /**
+ * Create a new <code>OrderPath</code> object.
+ *
+ * @param orderPatchElement
+ * @throws IllegalArgumentException if the specified Xml element was not valid.
+ */
+ public static OrderPatch createFromXml(Element orderPatchElement) {
+ if (!DomUtil.matches(orderPatchElement, XML_ORDERPATCH, NAMESPACE)) {
+ throw new IllegalArgumentException("ORDERPATH request body must start with an 'orderpatch' element.");
+ }
+
+ // retrieve the href of the orderingtype element
+ String orderingType;
+ Element otype = DomUtil.getChildElement(orderPatchElement, XML_ORDERING_TYPE, NAMESPACE);
+ if (otype != null) {
+ orderingType = DomUtil.getChildText(otype, DavConstants.XML_HREF, DavConstants.NAMESPACE);
+ } else {
+ throw new IllegalArgumentException("ORDERPATH request body must contain an 'ordering-type' child element.");
+ }
+
+ // set build the list of ordering instructions
+ List tmpList = new ArrayList();
+ ElementIterator it = DomUtil.getChildren(orderPatchElement, XML_ORDER_MEMBER, NAMESPACE);
+ while (it.hasNext()) {
+ Element el = it.nextElement();
+ try {
+ // retrieve text 'DAV:segment' child of this DAV:order-member element
+ String segment = DomUtil.getChildText(el, XML_SEGMENT, NAMESPACE);
+ // retrieve the 'DAV:position' child element
+ Position pos = Position.createFromXml(DomUtil.getChildElement(el, XML_POSITION, NAMESPACE));
+ Member om = new Member(segment, pos);
+ tmpList.add(om);
+ } catch (IllegalArgumentException e) {
+ log.error("Invalid element in 'orderpatch' request body: " + e.getMessage());
+ }
+ }
+ Member[] instructions = (Member[]) tmpList.toArray(new Member[tmpList.size()]);
+ return new OrderPatch(orderingType, instructions);
+ }
+
//--------------------------------------------------------------------------
/**
* Internal class <code>Member</code> represents the 'Order-Member' children
* elements of an 'OrderPatch' request body present in the ORDERPATCH request.
*/
- public class Member {
+ public static class Member implements XmlSerializable {
private String memberHandle;
private Position position;
@@ -148,5 +189,17 @@
public Position getPosition() {
return position;
}
+
+ //--------------------------------------< XmlSerializable interface >---
+ /**
+ * @see org.apache.jackrabbit.webdav.xml.XmlSerializable#toXml(Document)
+ */
+ public Element toXml(Document document) {
+ Element memberElem = DomUtil.createElement(document, XML_ORDER_MEMBER, NAMESPACE);
+ DomUtil.addChildElement(memberElem, XML_SEGMENT, NAMESPACE, memberHandle);
+ memberElem.appendChild(position.toXml(document));
+ return memberElem;
+ }
+
}
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingConstants.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingConstants.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingConstants.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingConstants.java Fri Jan 13 03:11:35 2006
@@ -17,6 +17,7 @@
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.DavConstants;
+import org.apache.jackrabbit.webdav.xml.Namespace;
/**
* <code>OrderingConstants</code> provide constants for request and response
@@ -24,6 +25,11 @@
* <a href="http://www.ietf.org/rfc/rfc3648.txt">RFC 3648</a>.
*/
public interface OrderingConstants {
+
+ /**
+ * The namespace
+ */
+ public static final Namespace NAMESPACE = DavConstants.NAMESPACE;
/**
* The "Ordering-Type" request header.
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingDavServletRequest.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingDavServletRequest.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingDavServletRequest.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingDavServletRequest.java Fri Jan 13 03:11:35 2006
@@ -16,6 +16,7 @@
package org.apache.jackrabbit.webdav.ordering;
import org.apache.jackrabbit.webdav.DavServletRequest;
+import org.apache.jackrabbit.webdav.DavException;
/**
* <code>OrderingDavServletRequest</code> provides extensions to the
@@ -48,6 +49,6 @@
*
* @return <code>OrderPatch</code> object encapsulating the request body.
*/
- public OrderPatch getOrderPatch();
+ public OrderPatch getOrderPatch() throws DavException;
}
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingType.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingType.java?rev=368683&r1=368682&r2=368683&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingType.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/webdav/ordering/OrderingType.java Fri Jan 13 03:11:35 2006
@@ -15,9 +15,7 @@
*/
package org.apache.jackrabbit.webdav.ordering;
-import org.jdom.Element;
-import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
-import org.apache.jackrabbit.webdav.util.XmlUtil;
+import org.apache.jackrabbit.webdav.property.HrefProperty;
/**
* <code>OrderingType</code> represents the {@link #ORDERING_TYPE
@@ -29,31 +27,25 @@
*
* @see org.apache.jackrabbit.webdav.property.DavProperty#isProtected()
*/
-public class OrderingType extends DefaultDavProperty implements OrderingConstants {
+public class OrderingType extends HrefProperty implements OrderingConstants {
/**
- * Create an OrderingType with the given ordering.<br>
- * NOTE: the ordering-type property is defined to be protected.
- *
- * @param href
- * @see org.apache.jackrabbit.webdav.property.DavProperty#isProtected()
+ * Creates a <code>OrderingType</code> with the default type (e.g. default
+ * value). The default value is specified to be {@link #ORDERING_TYPE_UNORDERED}.
*/
- public OrderingType(String href) {
- super(ORDERING_TYPE, href, true);
+ public OrderingType() {
+ this(null);
}
/**
- * Returns the Xml representation of this property. If the property has
- * a <code>null</code> value, the default ({@link #ORDERING_TYPE_UNORDERED
- * DAV:unordered}) is assumed.
+ * Create an <code>OrderingType</code> with the given ordering.<br>
+ * NOTE: the ordering-type property is defined to be protected.
*
- * @return Xml representation
+ * @param href
+ * @see org.apache.jackrabbit.webdav.property.DavProperty#isProtected()
*/
- public Element toXml() {
- Element elem = getName().toXml();
- // spec requires that the default is 'DAV:unordered'
- String href = (getValue() != null) ? getValue().toString() : ORDERING_TYPE_UNORDERED;
- XmlUtil.hrefToXml(href);
- return elem;
+ public OrderingType(String href) {
+ // spec requires that the default value is 'DAV:unordered'
+ super(ORDERING_TYPE, (href != null) ? href : ORDERING_TYPE_UNORDERED, true);
}
}