forked from LupusNobilis/java-org.hwo
DAV ServerObjects updates
parent
0fa6e912da
commit
e271583f3e
|
@ -0,0 +1,116 @@
|
||||||
|
package org.hwo.net.serverobjects;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.xml.ws.http.HTTPException;
|
||||||
|
|
||||||
|
import org.hwo.net.http.HttpException;
|
||||||
|
import org.hwo.net.serverobjects.dav.DAVCollection;
|
||||||
|
import org.hwo.net.serverobjects.dav.DAVPropertyName;
|
||||||
|
import org.hwo.net.serverobjects.dav.DAVPropertyNameList;
|
||||||
|
import org.hwo.net.serverobjects.dav.DAVResource;
|
||||||
|
import org.hwo.xml.NodeListIterator;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
public class DAVCollectionSO extends AbstractServerObject{
|
||||||
|
|
||||||
|
class RootCollection extends DAVCollection
|
||||||
|
{
|
||||||
|
|
||||||
|
public RootCollection(String name) {
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String constructURI() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public DAVResource getParent() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private DAVCollection rootCollection;
|
||||||
|
|
||||||
|
public DAVCollectionSO()
|
||||||
|
{
|
||||||
|
rootCollection = new RootCollection("");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void request(ServerObjectRequest request) throws IOException, HttpException
|
||||||
|
{
|
||||||
|
request.getHttpRequest().addResponseHeader("DAV", "1");
|
||||||
|
|
||||||
|
String method = request.getHttpRequest().getRequestMethod();
|
||||||
|
|
||||||
|
System.err.println("DAV Request: " + method);
|
||||||
|
|
||||||
|
if (method.equals("GET"))
|
||||||
|
{
|
||||||
|
request.getHttpRequest().setResponseHeader("Content-Type", "text/plain");
|
||||||
|
request.getHttpRequest().getResponseWriter().write("This is a DAV Container.");
|
||||||
|
} else if (method.equals("PROPFIND"))
|
||||||
|
{
|
||||||
|
doPROPFIND(request);
|
||||||
|
} else if (method.equals("PROPPATCH"))
|
||||||
|
{
|
||||||
|
doPROPPATCH(request);
|
||||||
|
} else if (method.equals("MKCOL"))
|
||||||
|
{
|
||||||
|
doMKCOL(request);
|
||||||
|
} else if (method.equals("DELETE"))
|
||||||
|
{
|
||||||
|
doDELETE(request);
|
||||||
|
} else if (method.equals("OPTIONS"))
|
||||||
|
{
|
||||||
|
doOPTIONS(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void doPROPFIND(ServerObjectRequest request) throws HttpException
|
||||||
|
{
|
||||||
|
System.err.println("PROPFIND:");
|
||||||
|
System.err.println(new String(request.getHttpRequest().getRequestContent()));
|
||||||
|
|
||||||
|
Document d = request.getHttpRequest().getXMLRequest();
|
||||||
|
if (d == null)
|
||||||
|
throw new HttpException(403);
|
||||||
|
|
||||||
|
Element propfind = d.getDocumentElement();
|
||||||
|
|
||||||
|
if (propfind.getLocalName().equals("propfind") && propfind.getNamespaceURI().equals("DAV:"))
|
||||||
|
{
|
||||||
|
for (Element child:NodeListIterator.create(propfind.getChildNodes()))
|
||||||
|
{
|
||||||
|
if (child.getLocalName().equals("prop"))
|
||||||
|
{
|
||||||
|
DAVPropertyNameList names = DAVPropertyNameList.fromXML(child);
|
||||||
|
for (DAVPropertyName name:names)
|
||||||
|
{
|
||||||
|
System.err.println("DAVProp: " + name.getNamespaceURI() + " : " + name.getPropertyName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
protected void doPROPPATCH(ServerObjectRequest request) throws HttpException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected void doMKCOL(ServerObjectRequest request) throws HttpException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected void doDELETE(ServerObjectRequest request) throws HttpException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
protected void doOPTIONS(ServerObjectRequest request) throws HttpException
|
||||||
|
{
|
||||||
|
request.getHttpRequest().setResultCode(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class DAVCollection extends DAVResource{
|
||||||
|
|
||||||
|
List<DAVResource> children;
|
||||||
|
|
||||||
|
public DAVCollection(String name) {
|
||||||
|
super(name);
|
||||||
|
children = new LinkedList<DAVResource>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCollection() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DAVResource[] getChildren() {
|
||||||
|
return children.toArray(new DAVResource[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void appendResource(DAVResource child)
|
||||||
|
{
|
||||||
|
DAVResource resource = getChildByName(child.getName());
|
||||||
|
if (resource != null)
|
||||||
|
{
|
||||||
|
removeChild(resource);
|
||||||
|
}
|
||||||
|
children.add(child);
|
||||||
|
child.setParent(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DAVResource getChildByName(String name)
|
||||||
|
{
|
||||||
|
for (DAVResource resource: children)
|
||||||
|
{
|
||||||
|
if (resource.getName().equals(name))
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeChild(DAVResource child)
|
||||||
|
{
|
||||||
|
children.remove(child);
|
||||||
|
child.setParent(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
|
||||||
|
public class DAVDeadPropertyNS extends DAVPropertyNamespace {
|
||||||
|
|
||||||
|
DocumentBuilder builder;
|
||||||
|
|
||||||
|
public DAVDeadPropertyNS(String namespaceURI)
|
||||||
|
{
|
||||||
|
super(namespaceURI);
|
||||||
|
|
||||||
|
try {
|
||||||
|
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
|
||||||
|
f.setNamespaceAware(true);
|
||||||
|
builder = f.newDocumentBuilder();
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Element getPropertyValue(DAVResource resource, DAVProperty property) {
|
||||||
|
return resource.getProperty(property.getNamespace().getNamespaceURI(), property.getPropertyName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPropertyValue(DAVResource resource, DAVProperty property,Element value) {
|
||||||
|
if (property.isValue(value))
|
||||||
|
{
|
||||||
|
Document d = builder.newDocument();
|
||||||
|
Node n = d.importNode(value, true);
|
||||||
|
d.appendChild(n);
|
||||||
|
System.err.println("setPropertyValue: " + d.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
public abstract class DAVProperty {
|
||||||
|
|
||||||
|
private DAVPropertyNamespace namespace;
|
||||||
|
private String propertyName;
|
||||||
|
|
||||||
|
public DAVProperty(DAVPropertyNamespace namespace,String propertyName)
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
this.propertyName = propertyName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public DAVPropertyNamespace getNamespace() {
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyName() {
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Element getValue(DAVResource resource)
|
||||||
|
{
|
||||||
|
return namespace.getPropertyValue(resource, this);
|
||||||
|
}
|
||||||
|
public void setValue(DAVResource resource,Element value)
|
||||||
|
{
|
||||||
|
this.namespace.setPropertyValue(resource, this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isValue(Element value)
|
||||||
|
{
|
||||||
|
if (value.getNamespaceURI().equals(namespace.getNamespaceURI()) && value.getLocalName().equals(propertyName))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
public class DAVPropertyDAVNS extends DAVPropertyNamespace {
|
||||||
|
|
||||||
|
public DAVPropertyDAVNS(String namespaceURI) {
|
||||||
|
super(namespaceURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Element getPropertyValue(DAVResource resource, DAVProperty property) {
|
||||||
|
|
||||||
|
if (property.getPropertyName().equals(""))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPropertyValue(DAVResource resource, DAVProperty property,
|
||||||
|
Element value) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
public class DAVPropertyName {
|
||||||
|
|
||||||
|
private String namespaceURI;
|
||||||
|
private String propertyName;
|
||||||
|
|
||||||
|
public static DAVPropertyName fromXML(Element property)
|
||||||
|
{
|
||||||
|
DAVPropertyName dpn = new DAVPropertyName();
|
||||||
|
dpn.setNamespaceURI(property.getNamespaceURI());
|
||||||
|
dpn.setPropertyName(property.getLocalName());
|
||||||
|
return dpn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DAVPropertyName()
|
||||||
|
{
|
||||||
|
setNamespaceURI(null);
|
||||||
|
setPropertyName(null);
|
||||||
|
}
|
||||||
|
public DAVPropertyName(String propertyName)
|
||||||
|
{
|
||||||
|
setNamespaceURI(propertyName);
|
||||||
|
setPropertyName(null);
|
||||||
|
}
|
||||||
|
public DAVPropertyName(String propertyName,String namespaceURI)
|
||||||
|
{
|
||||||
|
setNamespaceURI(propertyName);
|
||||||
|
setPropertyName(namespaceURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespaceURI() {
|
||||||
|
return namespaceURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceURI(String namespaceURI) {
|
||||||
|
this.namespaceURI = namespaceURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPropertyName() {
|
||||||
|
return propertyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyName(String propertyName) {
|
||||||
|
this.propertyName = propertyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
import org.hwo.xml.NodeListIterator;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
|
public class DAVPropertyNameList extends LinkedList<DAVPropertyName>{
|
||||||
|
|
||||||
|
public static DAVPropertyNameList fromXML(Element prop)
|
||||||
|
{
|
||||||
|
DAVPropertyNameList l = new DAVPropertyNameList();
|
||||||
|
|
||||||
|
NodeList props = prop.getChildNodes();
|
||||||
|
for (Element p:new NodeListIterator(props))
|
||||||
|
l.add(DAVPropertyName.fromXML(p));
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
public abstract class DAVPropertyNamespace {
|
||||||
|
|
||||||
|
private static Hashtable<String,DAVPropertyNamespace>
|
||||||
|
namespaces;
|
||||||
|
|
||||||
|
public static DAVPropertyNamespace getNameSpace(String namespaceURI)
|
||||||
|
{
|
||||||
|
if (!namespaces.containsKey(namespaceURI))
|
||||||
|
namespaces.put(namespaceURI, new DAVDeadPropertyNS(namespaceURI));
|
||||||
|
|
||||||
|
return namespaces.get(namespaceURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String namespaceURI;
|
||||||
|
|
||||||
|
public DAVPropertyNamespace(String namespaceURI)
|
||||||
|
{
|
||||||
|
this.namespaceURI = namespaceURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getNamespaceURI() {
|
||||||
|
return namespaceURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract public Element getPropertyValue(DAVResource resource,DAVProperty property);
|
||||||
|
abstract public void setPropertyValue(DAVResource resource,DAVProperty property,Element value);
|
||||||
|
|
||||||
|
|
||||||
|
static {
|
||||||
|
namespaces = new Hashtable<String, DAVPropertyNamespace>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,153 @@
|
||||||
|
package org.hwo.net.serverobjects.dav;
|
||||||
|
|
||||||
|
import java.util.Hashtable;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
|
import org.hwo.xml.NodeListIterator;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.w3c.dom.traversal.NodeIterator;
|
||||||
|
|
||||||
|
public class DAVResource {
|
||||||
|
|
||||||
|
private byte[] content;
|
||||||
|
private String name;
|
||||||
|
private String mimetype;
|
||||||
|
|
||||||
|
private DAVResource
|
||||||
|
parent;
|
||||||
|
|
||||||
|
private String uri;
|
||||||
|
|
||||||
|
private Hashtable<String, Document>
|
||||||
|
properties;
|
||||||
|
|
||||||
|
private DocumentBuilder
|
||||||
|
builder;
|
||||||
|
|
||||||
|
public DAVResource(String name)
|
||||||
|
{
|
||||||
|
this.setContent(new byte[0]);
|
||||||
|
this.setName(name);
|
||||||
|
this.setMimetype("application/octet-stream");
|
||||||
|
|
||||||
|
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
|
||||||
|
f.setNamespaceAware(true);
|
||||||
|
try {
|
||||||
|
builder = f.newDocumentBuilder();
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setParent(DAVResource resource)
|
||||||
|
{
|
||||||
|
this.parent = resource;
|
||||||
|
this.setURI(constructURI());
|
||||||
|
}
|
||||||
|
|
||||||
|
public DAVResource getParent()
|
||||||
|
{
|
||||||
|
return this.parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String constructURI()
|
||||||
|
{
|
||||||
|
if (parent != null)
|
||||||
|
return String.format("%s/%s",parent.constructURI(),name);
|
||||||
|
return String.format("/%s", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isCollection()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DAVResource[] getChildren()
|
||||||
|
{
|
||||||
|
return new DAVResource[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getContentLength()
|
||||||
|
{
|
||||||
|
return content.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
public byte[] getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
public void setContent(byte[] content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getURI()
|
||||||
|
{
|
||||||
|
return this.uri;
|
||||||
|
}
|
||||||
|
private void setURI(String uri)
|
||||||
|
{
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getMimetype() {
|
||||||
|
return mimetype;
|
||||||
|
}
|
||||||
|
public void setMimetype(String mimetype) {
|
||||||
|
this.mimetype = mimetype;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Document getPropertyDocument(String namespaceURI)
|
||||||
|
{
|
||||||
|
if (!properties.containsKey(namespaceURI))
|
||||||
|
{
|
||||||
|
Document d = builder.newDocument();
|
||||||
|
d.appendChild(d.createElementNS(namespaceURI, "properties"));
|
||||||
|
properties.put(namespaceURI, d);
|
||||||
|
}
|
||||||
|
return properties.get(namespaceURI);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Element getProperty(String namespaceURI,String propertyName)
|
||||||
|
{
|
||||||
|
Document pdoc = getPropertyDocument(namespaceURI);
|
||||||
|
|
||||||
|
NodeList nl = pdoc.getElementsByTagNameNS(namespaceURI, propertyName);
|
||||||
|
if (nl.getLength()>0)
|
||||||
|
return (Element)nl.item(0);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProperty(String namespaceURI,String propertyName,Element value)
|
||||||
|
{
|
||||||
|
Document pdoc = getPropertyDocument(namespaceURI);
|
||||||
|
|
||||||
|
Element propertyElement = getProperty(namespaceURI, propertyName);
|
||||||
|
if (propertyElement == null)
|
||||||
|
{
|
||||||
|
propertyElement = pdoc.createElementNS(namespaceURI, propertyName);
|
||||||
|
pdoc.getDocumentElement().appendChild( propertyElement );
|
||||||
|
}
|
||||||
|
while (propertyElement.hasChildNodes())
|
||||||
|
propertyElement.removeChild(propertyElement.getFirstChild());
|
||||||
|
|
||||||
|
Element imp = (Element)pdoc.importNode(propertyElement, true);
|
||||||
|
for (Element c: NodeListIterator.create(imp.getChildNodes()))
|
||||||
|
propertyElement.appendChild( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue