blob: 3e0233a04b4e98ede1ad9bdf3f2fce30f7e924c2 [file] [log] [blame]
/*
* 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.property;
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.HashMap;
/**
* The <code>DavPropertyName</code> class reflects a Webdav property name. It
* holds together the actualy name of the property and its namespace.
*/
public class DavPropertyName implements DavConstants, XmlSerializable {
/** internal 'cache' of created property names */
private static final HashMap cache = new HashMap();
/* some standard webdav property (that have #PCDATA) */
public static final DavPropertyName CREATIONDATE = DavPropertyName.create(PROPERTY_CREATIONDATE);
public static final DavPropertyName DISPLAYNAME = DavPropertyName.create(PROPERTY_DISPLAYNAME);
public static final DavPropertyName GETCONTENTLANGUAGE = DavPropertyName.create(PROPERTY_GETCONTENTLANGUAGE);
public static final DavPropertyName GETCONTENTLENGTH = DavPropertyName.create(PROPERTY_GETCONTENTLENGTH);
public static final DavPropertyName GETCONTENTTYPE = DavPropertyName.create(PROPERTY_GETCONTENTTYPE);
public static final DavPropertyName GETETAG = DavPropertyName.create(PROPERTY_GETETAG);
public static final DavPropertyName GETLASTMODIFIED = DavPropertyName.create(PROPERTY_GETLASTMODIFIED);
/* some standard webdav property (that have other elements) */
public static final DavPropertyName LOCKDISCOVERY = DavPropertyName.create(PROPERTY_LOCKDISCOVERY);
public static final DavPropertyName RESOURCETYPE = DavPropertyName.create(PROPERTY_RESOURCETYPE);
public static final DavPropertyName SOURCE = DavPropertyName.create(PROPERTY_SOURCE);
public static final DavPropertyName SUPPORTEDLOCK = DavPropertyName.create(PROPERTY_SUPPORTEDLOCK);
/* property use by microsoft that are not specified in the RFC 2518 */
public static final DavPropertyName ISCOLLECTION = DavPropertyName.create("iscollection");
/** the name of the property */
private final String name;
/** the namespace of the property */
private final Namespace namespace;
/**
* Creates a new <code>DavPropertyName</code> with the given name and
* Namespace.
*
* @param name The local name of the new property name
* @param namespace The namespace of the new property name
*
* @return The WebDAV property name
*/
public synchronized static DavPropertyName create(String name, Namespace namespace) {
// get (or create) map for the given namespace
HashMap map = (HashMap) cache.get(namespace);
if (map == null) {
map = new HashMap();
cache.put(namespace, map);
}
// get (or create) property name object
DavPropertyName ret = (DavPropertyName) map.get(name);
if (ret == null) {
if (namespace.equals(NAMESPACE)) {
// ensure prefix for default 'DAV:' namespace
namespace = NAMESPACE;
}
ret = new DavPropertyName(name, namespace);
map.put(name, ret);
}
return ret;
}
/**
* Creates a new <code>DavPropertyName</code> with the given local name
* and the default WebDAV {@link DavConstants#NAMESPACE namespace}.
*
* @param name The local name of the new property name
*
* @return The WebDAV property name
*/
public synchronized static DavPropertyName create(String name) {
return create(name, NAMESPACE);
}
/**
* Create a new <code>DavPropertyName</code> with the name and namespace
* of the given Xml element.
*
* @param nameElement
* @return <code>DavPropertyName</code> instance
*/
public synchronized static DavPropertyName createFromXml(Element nameElement) {
if (nameElement == null) {
throw new IllegalArgumentException("Cannot build DavPropertyName from a 'null' element.");
}
String ns = nameElement.getNamespaceURI();
if (ns == null) {
return create(nameElement.getLocalName(), Namespace.EMPTY_NAMESPACE);
} else {
return create(nameElement.getLocalName(), Namespace.getNamespace(nameElement.getPrefix(), ns));
}
}
/**
* Creates a new <code>DavPropertyName</code> with the given name and
* Namespace.
*
* @param name The local name of the new property name
* @param namespace The namespace of the new property name
*/
private DavPropertyName(String name, Namespace namespace) {
if (name == null || namespace == null) {
throw new IllegalArgumentException("Name and namespace must not be 'null' for a DavPropertyName.");
}
this.name = name;
this.namespace = namespace;
}
/**
* Return the name of this <code>DavPropertyName</code>.
*
* @return name
*/
public String getName() {
return name;
}
/**
* Return the namespace of this <code>DavPropertyName</code>.
*
* @return namespace
*/
public Namespace getNamespace() {
return namespace;
}
/**
* Computes the hash code using this propertys name and namespace.
*
* @return the hash code
*/
public int hashCode() {
return (name.hashCode() + namespace.hashCode()) % Integer.MAX_VALUE;
}
/**
* Checks if this property has the same name and namespace as the
* given one.
*
* @param obj the object to compare to
*
* @return <code>true</code> if the 2 objects are equal;
* <code>false</code> otherwise
*/
public boolean equals(Object obj) {
if (obj instanceof DavPropertyName) {
DavPropertyName propName = (DavPropertyName) obj;
return name.equals(propName.name) && namespace.equals(propName.namespace);
}
return false;
}
/**
* Returns a string representation of this property suitable for debugging
*
* @return a human readable string representation
*/
public String toString() {
return DomUtil.getQualifiedName(name, namespace);
}
/**
* Creates a JDOM element with the name and namespace of this
* DavPropertyName.
*
* @return A JDOM Element.
* @param document
*/
public Element toXml(Document document) {
return DomUtil.createElement(document, name, namespace);
}
}