X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fdav%2FMultiStatusWriter.java;h=986b2fe9271c665fda435b399f7124d37e9a0a14;hb=bbfad683e435f1989cb7ed4aa56a2fed52b64245;hp=4c06b032f092d04623ba61dff316c549224a0f5f;hpb=51cc05f670214c32f3beecc33bb701865ff6c735;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/dav/MultiStatusWriter.java b/org.argeo.cms/src/org/argeo/cms/dav/MultiStatusWriter.java index 4c06b032f..986b2fe92 100644 --- a/org.argeo.cms/src/org/argeo/cms/dav/MultiStatusWriter.java +++ b/org.argeo.cms/src/org/argeo/cms/dav/MultiStatusWriter.java @@ -20,6 +20,8 @@ import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import org.argeo.util.http.HttpStatus; + class MultiStatusWriter implements Consumer { private BlockingQueue queue = new ArrayBlockingQueue<>(64); @@ -31,6 +33,12 @@ class MultiStatusWriter implements Consumer { private AtomicBoolean polling = new AtomicBoolean(); + private String protocol; + + public MultiStatusWriter(String protocol) { + this.protocol = protocol; + } + public void process(NamespaceContext namespaceContext, OutputStream out, CompletionStage published, boolean propname) throws IOException { published.thenRun(() -> allPublished()); @@ -54,9 +62,9 @@ class MultiStatusWriter implements Consumer { davResponse = queue.poll(10, TimeUnit.MILLISECONDS); if (davResponse == null) continue poll; - System.err.println(davResponse.getHref()); + //System.err.println(davResponse.getHref()); } catch (InterruptedException e) { - System.err.println(e); + //System.err.println(e); continue poll; } finally { polling.set(false); @@ -79,13 +87,14 @@ class MultiStatusWriter implements Consumer { protected void writeDavResponse(XMLStreamWriter xsWriter, DavResponse davResponse, boolean propname) throws XMLStreamException { Set namespaces = new HashSet<>(); - for (QName key : davResponse.getPropertyNames()) { - if (key.getNamespaceURI().equals(DavXmlElement.WEBDAV_NAMESPACE_URI)) - continue; // skip - if (key.getNamespaceURI().equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) - continue; // skip - namespaces.add(key.getNamespaceURI()); - } + for (HttpStatus status : davResponse.getStatuses()) + for (QName key : davResponse.getPropertyNames(status)) { + if (key.getNamespaceURI().equals(DavXmlElement.WEBDAV_NAMESPACE_URI)) + continue; // skip + if (key.getNamespaceURI().equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) + continue; // skip + namespaces.add(key.getNamespaceURI()); + } DavXmlElement.response.startElement(xsWriter); // namespaces for (String ns : namespaces) @@ -94,30 +103,45 @@ class MultiStatusWriter implements Consumer { DavXmlElement.href.setSimpleValue(xsWriter, davResponse.getHref()); { - DavXmlElement.propstat.startElement(xsWriter); - { - DavXmlElement.prop.startElement(xsWriter); - if (!davResponse.getResourceTypes().isEmpty() || davResponse.isCollection()) { - DavXmlElement.resourcetype.startElement(xsWriter); - if (davResponse.isCollection()) - DavXmlElement.collection.emptyElement(xsWriter); - for (QName resourceType : davResponse.getResourceTypes()) { - xsWriter.writeEmptyElement(resourceType.getNamespaceURI(), resourceType.getLocalPart()); - } - xsWriter.writeEndElement();// resource type - } - for (QName key : davResponse.getPropertyNames()) { - if (propname) { - xsWriter.writeEmptyElement(key.getNamespaceURI(), key.getLocalPart()); - } else { - xsWriter.writeStartElement(key.getNamespaceURI(), key.getLocalPart()); - xsWriter.writeCData(davResponse.getProperties().get(key)); - xsWriter.writeEndElement(); + for (HttpStatus status : davResponse.getStatuses()) { + DavXmlElement.propstat.startElement(xsWriter); + { + DavXmlElement.prop.startElement(xsWriter); + + // resourcetype + if (HttpStatus.OK.equals(status)) + if (propname) { + DavXmlElement.resourcetype.emptyElement(xsWriter); + } else { + if (!davResponse.getResourceTypes().isEmpty() || davResponse.isCollection()) { + DavXmlElement.resourcetype.startElement(xsWriter); + if (davResponse.isCollection()) + DavXmlElement.collection.emptyElement(xsWriter); + for (QName resourceType : davResponse.getResourceTypes()) { + xsWriter.writeEmptyElement(resourceType.getNamespaceURI(), + resourceType.getLocalPart()); + } + xsWriter.writeEndElement();// resource type + } + } + + properties: for (QName key : davResponse.getPropertyNames(status)) { + if (DavXmlElement.resourcetype.qName().equals(key)) + continue properties; + + if (propname) { + xsWriter.writeEmptyElement(key.getNamespaceURI(), key.getLocalPart()); + } else { + xsWriter.writeStartElement(key.getNamespaceURI(), key.getLocalPart()); + xsWriter.writeCData(davResponse.getProperties().get(key)); + xsWriter.writeEndElement(); + } } + xsWriter.writeEndElement();// prop } - xsWriter.writeEndElement();// prop + DavXmlElement.status.setSimpleValue(xsWriter, status.getStatusLine(protocol)); + xsWriter.writeEndElement();// propstat } - xsWriter.writeEndElement();// propstat } xsWriter.writeEndElement();// response }