chemistry-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r934896 [2/12] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-server: chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/ chemistry-opencmis-server-bindings/src/main/java/org/apache/chemi...
Date Fri, 16 Apr 2010 14:14:02 GMT
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java?rev=934896&r1=934895&r2=934896&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomEntryParser.java Fri Apr 16 14:14:00 2010
@@ -60,480 +60,443 @@ import org.apache.commons.codec.binary.B
  */
 public class AtomEntryParser {
 
-  private final static String TAG_ENTRY = "entry";
-  private final static String TAG_TITLE = "title";
-  private final static String TAG_OBJECT = "object";
-  private final static String TAG_CONTENT = "content";
-  private final static String TAG_BASE64 = "base64";
-  private final static String TAG_MEDIATYPE = "mediatype";
-
-  private final static String ATTR_SRC = "src";
-  private final static String ATTR_TYPE = "type";
-
-  private ObjectData fObject;
-  private ContentStreamImpl fAtomContentStream;
-  private ContentStreamImpl fCmisContentStream;
-
-  /**
-   * Constructor.
-   */
-  public AtomEntryParser() {
-  }
-
-  /**
-   * Constructor that immediately parses the given stream.
-   */
-  public AtomEntryParser(InputStream stream) throws Exception {
-    parse(stream);
-  }
-
-  /**
-   * Returns the object.
-   */
-  public ObjectData getObject() {
-    return fObject;
-  }
-
-  /**
-   * Returns the properties of the object.
-   */
-  public Properties getProperties() {
-    return (fObject == null ? null : fObject.getProperties());
-  }
-
-  /**
-   * Returns the Id of the object.
-   */
-  public String getId() {
-    Properties properties = getProperties();
-    if (properties == null) {
-      return null;
-    }
-
-    Map<String, PropertyData<?>> propertiesMap = properties.getProperties();
-    if (propertiesMap == null) {
-      return null;
-    }
-
-    PropertyData<?> property = propertiesMap.get(PropertyIds.OBJECT_ID);
-    if (property instanceof PropertyId) {
-      return ((PropertyId) property).getFirstValue();
-    }
-
-    return null;
-  }
-
-  /**
-   * Returns the ACL of the object.
-   */
-  public Acl getAcl() {
-    return (fObject == null ? null : fObject.getAcl());
-  }
-
-  /**
-   * Returns the policy id list of the object.
-   */
-  public List<String> getPolicyIds() {
-    if ((fObject == null) || (fObject.getPolicyIds() == null)) {
-      return null;
-    }
-
-    return fObject.getPolicyIds().getPolicyIds();
-  }
-
-  /**
-   * Returns the content stream.
-   */
-  public ContentStream getContentStream() {
-    return (fCmisContentStream == null ? fAtomContentStream : fCmisContentStream);
-  }
-
-  /**
-   * Parses the stream.
-   */
-  public void parse(InputStream stream) throws Exception {
-    fObject = null;
-    fAtomContentStream = null;
-    fCmisContentStream = null;
-
-    if (stream == null) {
-      return;
-    }
-
-    XMLInputFactory factory = XMLInputFactory.newInstance();
-    XMLStreamReader parser = factory.createXMLStreamReader(stream);
-
-    while (true) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.START_ELEMENT) {
-        QName name = parser.getName();
-
-        if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())
-            && (TAG_ENTRY.equals(name.getLocalPart()))) {
-          parseEntry(parser);
-          break;
-        }
-        else {
-          throw new CmisInvalidArgumentException("XML is not an Atom entry!");
-        }
-      }
-
-      if (!next(parser)) {
-        break;
-      }
-    }
-
-    parser.close();
-  }
-
-  /**
-   * Parses an Atom entry.
-   */
-  private void parseEntry(XMLStreamReader parser) throws Exception {
-    String atomTitle = null;
-
-    next(parser);
-
-    // walk through all tags in entry
-    while (true) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.START_ELEMENT) {
-        QName name = parser.getName();
-
-        if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
-          if (TAG_OBJECT.equals(name.getLocalPart())) {
-            parseObject(parser);
-          }
-          else if (TAG_CONTENT.equals(name.getLocalPart())) {
-            parseCmisContent(parser);
-          }
-          else {
-            skip(parser);
-          }
-        }
-        else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
-          if (TAG_CONTENT.equals(name.getLocalPart())) {
-            parseAtomContent(parser);
-          }
-          else if (TAG_TITLE.equals(name.getLocalPart())) {
-            atomTitle = readText(parser);
-          }
-          else {
-            skip(parser);
-          }
-        }
-        else {
-          skip(parser);
-        }
-      }
-      else if (event == XMLStreamReader.END_ELEMENT) {
-        break;
-      }
-      else {
-        if (!next(parser)) {
-          break;
-        }
-      }
-    }
-
-    // overwrite cmis:name with Atom title
-    if ((fObject != null) && (fObject.getProperties() != null) && (atomTitle != null)) {
-      PropertyString nameProperty = new PropertyStringImpl(PropertyIds.NAME, atomTitle);
-      ((PropertiesImpl) fObject.getProperties()).addProperty(nameProperty);
-    }
-  }
-
-  /**
-   * Parses a CMIS object.
-   */
-  private void parseObject(XMLStreamReader parser) throws Exception {
-    Unmarshaller u = JaxBHelper.createUnmarshaller();
-    JAXBElement<CmisObjectType> object = u.unmarshal(parser, CmisObjectType.class);
-
-    if (object != null) {
-      fObject = Converter.convert(object.getValue());
-    }
-  }
-
-  /**
-   * Extract the content stream.
-   */
-  private void parseAtomContent(XMLStreamReader parser) throws Exception {
-    fAtomContentStream = new ContentStreamImpl();
-
-    // read attributes
-    String type = "text";
-    for (int i = 0; i < parser.getAttributeCount(); i++) {
-      QName attrName = parser.getAttributeName(i);
-      if (ATTR_TYPE.equals(attrName.getLocalPart())) {
-        fAtomContentStream.setMimeType(parser.getAttributeValue(i));
-        if (parser.getAttributeValue(i) != null) {
-          type = parser.getAttributeValue(i).trim().toLowerCase();
-        }
-      }
-      else if (ATTR_SRC.equals(attrName.getLocalPart())) {
-        throw new CmisNotSupportedException("External content not supported!");
-      }
-    }
-
-    if (type.equals("text") || type.equals("html")) {
-      fAtomContentStream.setStream(new ByteArrayInputStream(readText(parser).getBytes("UTF-8")));
-    }
-    else if (type.equals("xhtml")) {
-      fAtomContentStream.setStream(copy(parser));
-    }
-    else if (type.endsWith("/xml") || type.endsWith("+xml")) {
-      fAtomContentStream.setStream(copy(parser));
-    }
-    else if (type.startsWith("text/")) {
-      fAtomContentStream.setStream(new ByteArrayInputStream(readText(parser).getBytes("UTF-8")));
-    }
-    else {
-      fAtomContentStream.setStream(new ByteArrayInputStream(Base64.decodeBase64(readText(parser))));
-    }
-  }
-
-  /**
-   * Extract the content stream.
-   */
-  private void parseCmisContent(XMLStreamReader parser) throws Exception {
-    fCmisContentStream = new ContentStreamImpl();
-
-    next(parser);
-
-    // walk through all tags in content
-    while (true) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.START_ELEMENT) {
-        QName name = parser.getName();
-
-        if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
-          if (TAG_MEDIATYPE.equals(name.getLocalPart())) {
-            fCmisContentStream.setMimeType(readText(parser));
-          }
-          else if (TAG_BASE64.equals(name.getLocalPart())) {
-            fCmisContentStream.setStream(new ByteArrayInputStream(Base64
-                .decodeBase64(readText(parser))));
-          }
-          else {
-            skip(parser);
-          }
-        }
-        else {
-          skip(parser);
-        }
-      }
-      else if (event == XMLStreamReader.END_ELEMENT) {
-        break;
-      }
-      else {
-        if (!next(parser)) {
-          break;
-        }
-      }
-    }
-
-    next(parser);
-  }
-
-  /**
-   * Parses a tag that contains text.
-   */
-  private String readText(XMLStreamReader parser) throws Exception {
-    StringBuilder sb = new StringBuilder();
-
-    next(parser);
-
-    while (true) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.END_ELEMENT) {
-        break;
-      }
-      else if (event == XMLStreamReader.CHARACTERS) {
-        String s = parser.getText();
-        if (s != null) {
-          sb.append(s);
-        }
-      }
-      else if (event == XMLStreamReader.START_ELEMENT) {
-        throw new RuntimeException("Unexpected tag: " + parser.getName());
-      }
-
-      if (!next(parser)) {
-        break;
-      }
-    }
-
-    next(parser);
-
-    return sb.toString();
-  }
-
-  /**
-   * Copies a subtree into a stream.
-   */
-  private InputStream copy(XMLStreamReader parser) throws Exception {
-    // create a writer
-    ByteArrayOutputStream out = new ByteArrayOutputStream();
-    XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
-
-    writer.writeStartDocument();
-
-    // copy subtree
-    int level = 1;
-    while (next(parser)) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.START_ELEMENT) {
-        copyStartElement(parser, writer);
-        level++;
-      }
-      else if (event == XMLStreamReader.CHARACTERS) {
-        writer.writeCharacters(parser.getText());
-      }
-      else if (event == XMLStreamReader.COMMENT) {
-        writer.writeComment(parser.getText());
-      }
-      else if (event == XMLStreamReader.CDATA) {
-        writer.writeCData(parser.getText());
-      }
-      else if (event == XMLStreamReader.END_ELEMENT) {
-        level--;
-        if (level == 0) {
-          break;
-        }
-        writer.writeEndElement();
-      }
-      else {
-        break;
-      }
-    }
-
-    writer.writeEndDocument();
-
-    next(parser);
-
-    return new ByteArrayInputStream(out.toByteArray());
-  }
-
-  /**
-   * Copies a XML start element.
-   */
-  private void copyStartElement(XMLStreamReader parser, XMLStreamWriter writer) throws Exception {
-    String namespaceUri = parser.getNamespaceURI();
-    String prefix = parser.getPrefix();
-    String localName = parser.getLocalName();
-
-    // write start element
-    if (namespaceUri != null) {
-      if ((prefix == null) || (prefix.length() == 0)) {
-        writer.writeStartElement(localName);
-      }
-      else {
-        writer.writeStartElement(prefix, localName, namespaceUri);
-      }
-    }
-    else {
-      writer.writeStartElement(localName);
-    }
-
-    // set namespaces
-    for (int i = 0; i < parser.getNamespaceCount(); i++) {
-      addNamespace(writer, parser.getNamespacePrefix(i), parser.getNamespaceURI(i));
-    }
-    addNamespaceIfMissing(writer, prefix, namespaceUri);
-
-    // write attributes
-    for (int i = 0; i < parser.getAttributeCount(); i++) {
-      String attrNamespaceUri = parser.getAttributeNamespace(i);
-      String attrPrefix = parser.getAttributePrefix(i);
-      String attrName = parser.getAttributeLocalName(i);
-      String attrValue = parser.getAttributeValue(i);
-
-      if ((attrNamespaceUri == null) || (attrNamespaceUri.trim().length() == 0)) {
-        writer.writeAttribute(attrName, attrValue);
-      }
-      else if ((attrPrefix == null) || (attrPrefix.trim().length() == 0)) {
-        writer.writeAttribute(attrNamespaceUri, attrName, attrValue);
-      }
-      else {
-        addNamespaceIfMissing(writer, attrPrefix, attrNamespaceUri);
-        writer.writeAttribute(attrPrefix, attrNamespaceUri, attrName, attrValue);
-      }
-    }
-  }
-
-  /**
-   * Checks if the given prefix is assigned to the given namespace.
-   */
-  @SuppressWarnings("unchecked")
-  private void addNamespaceIfMissing(XMLStreamWriter writer, String prefix, String namespaceUri)
-      throws Exception {
-    if ((namespaceUri == null) || (namespaceUri.trim().length() == 0)) {
-      return;
-    }
-
-    if (prefix == null) {
-      prefix = "";
-    }
-
-    Iterator<String> iter = (Iterator<String>) writer.getNamespaceContext().getPrefixes(
-        namespaceUri);
-    if (iter == null) {
-      return;
-    }
-
-    while (iter.hasNext()) {
-      String p = iter.next();
-      if ((p != null) && (p.equals(prefix))) {
-        return;
-      }
-    }
-
-    addNamespace(writer, prefix, namespaceUri);
-  }
-
-  /**
-   * Adds a namespace to a XML element.
-   */
-  private void addNamespace(XMLStreamWriter writer, String prefix, String namespaceUri)
-      throws Exception {
-    if ((prefix == null) || (prefix.trim().length() == 0)) {
-      writer.setDefaultNamespace(namespaceUri);
-      writer.writeDefaultNamespace(namespaceUri);
-    }
-    else {
-      writer.setPrefix(prefix, namespaceUri);
-      writer.writeNamespace(prefix, namespaceUri);
-    }
-  }
-
-  /**
-   * Skips a tag or subtree.
-   */
-  private void skip(XMLStreamReader parser) throws Exception {
-    int level = 1;
-    while (next(parser)) {
-      int event = parser.getEventType();
-      if (event == XMLStreamReader.START_ELEMENT) {
-        level++;
-      }
-      else if (event == XMLStreamReader.END_ELEMENT) {
-        level--;
-        if (level == 0) {
-          break;
-        }
-      }
-    }
-
-    next(parser);
-  }
-
-  private boolean next(XMLStreamReader parser) throws Exception {
-    if (parser.hasNext()) {
-      parser.next();
-      return true;
-    }
+	private final static String TAG_ENTRY = "entry";
+	private final static String TAG_TITLE = "title";
+	private final static String TAG_OBJECT = "object";
+	private final static String TAG_CONTENT = "content";
+	private final static String TAG_BASE64 = "base64";
+	private final static String TAG_MEDIATYPE = "mediatype";
+
+	private final static String ATTR_SRC = "src";
+	private final static String ATTR_TYPE = "type";
+
+	private ObjectData fObject;
+	private ContentStreamImpl fAtomContentStream;
+	private ContentStreamImpl fCmisContentStream;
+
+	/**
+	 * Constructor.
+	 */
+	public AtomEntryParser() {
+	}
+
+	/**
+	 * Constructor that immediately parses the given stream.
+	 */
+	public AtomEntryParser(InputStream stream) throws Exception {
+		parse(stream);
+	}
+
+	/**
+	 * Returns the object.
+	 */
+	public ObjectData getObject() {
+		return fObject;
+	}
+
+	/**
+	 * Returns the properties of the object.
+	 */
+	public Properties getProperties() {
+		return (fObject == null ? null : fObject.getProperties());
+	}
+
+	/**
+	 * Returns the Id of the object.
+	 */
+	public String getId() {
+		Properties properties = getProperties();
+		if (properties == null) {
+			return null;
+		}
+
+		Map<String, PropertyData<?>> propertiesMap = properties.getProperties();
+		if (propertiesMap == null) {
+			return null;
+		}
+
+		PropertyData<?> property = propertiesMap.get(PropertyIds.OBJECT_ID);
+		if (property instanceof PropertyId) {
+			return ((PropertyId) property).getFirstValue();
+		}
+
+		return null;
+	}
+
+	/**
+	 * Returns the ACL of the object.
+	 */
+	public Acl getAcl() {
+		return (fObject == null ? null : fObject.getAcl());
+	}
+
+	/**
+	 * Returns the policy id list of the object.
+	 */
+	public List<String> getPolicyIds() {
+		if ((fObject == null) || (fObject.getPolicyIds() == null)) {
+			return null;
+		}
+
+		return fObject.getPolicyIds().getPolicyIds();
+	}
+
+	/**
+	 * Returns the content stream.
+	 */
+	public ContentStream getContentStream() {
+		return (fCmisContentStream == null ? fAtomContentStream : fCmisContentStream);
+	}
+
+	/**
+	 * Parses the stream.
+	 */
+	public void parse(InputStream stream) throws Exception {
+		fObject = null;
+		fAtomContentStream = null;
+		fCmisContentStream = null;
+
+		if (stream == null) {
+			return;
+		}
+
+		XMLInputFactory factory = XMLInputFactory.newInstance();
+		XMLStreamReader parser = factory.createXMLStreamReader(stream);
+
+		while (true) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.START_ELEMENT) {
+				QName name = parser.getName();
+
+				if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI()) && (TAG_ENTRY.equals(name.getLocalPart()))) {
+					parseEntry(parser);
+					break;
+				} else {
+					throw new CmisInvalidArgumentException("XML is not an Atom entry!");
+				}
+			}
+
+			if (!next(parser)) {
+				break;
+			}
+		}
+
+		parser.close();
+	}
+
+	/**
+	 * Parses an Atom entry.
+	 */
+	private void parseEntry(XMLStreamReader parser) throws Exception {
+		String atomTitle = null;
+
+		next(parser);
+
+		// walk through all tags in entry
+		while (true) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.START_ELEMENT) {
+				QName name = parser.getName();
+
+				if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
+					if (TAG_OBJECT.equals(name.getLocalPart())) {
+						parseObject(parser);
+					} else if (TAG_CONTENT.equals(name.getLocalPart())) {
+						parseCmisContent(parser);
+					} else {
+						skip(parser);
+					}
+				} else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+					if (TAG_CONTENT.equals(name.getLocalPart())) {
+						parseAtomContent(parser);
+					} else if (TAG_TITLE.equals(name.getLocalPart())) {
+						atomTitle = readText(parser);
+					} else {
+						skip(parser);
+					}
+				} else {
+					skip(parser);
+				}
+			} else if (event == XMLStreamReader.END_ELEMENT) {
+				break;
+			} else {
+				if (!next(parser)) {
+					break;
+				}
+			}
+		}
+
+		// overwrite cmis:name with Atom title
+		if ((fObject != null) && (fObject.getProperties() != null) && (atomTitle != null)) {
+			PropertyString nameProperty = new PropertyStringImpl(PropertyIds.NAME, atomTitle);
+			((PropertiesImpl) fObject.getProperties()).addProperty(nameProperty);
+		}
+	}
+
+	/**
+	 * Parses a CMIS object.
+	 */
+	private void parseObject(XMLStreamReader parser) throws Exception {
+		Unmarshaller u = JaxBHelper.createUnmarshaller();
+		JAXBElement<CmisObjectType> object = u.unmarshal(parser, CmisObjectType.class);
+
+		if (object != null) {
+			fObject = Converter.convert(object.getValue());
+		}
+	}
+
+	/**
+	 * Extract the content stream.
+	 */
+	private void parseAtomContent(XMLStreamReader parser) throws Exception {
+		fAtomContentStream = new ContentStreamImpl();
+
+		// read attributes
+		String type = "text";
+		for (int i = 0; i < parser.getAttributeCount(); i++) {
+			QName attrName = parser.getAttributeName(i);
+			if (ATTR_TYPE.equals(attrName.getLocalPart())) {
+				fAtomContentStream.setMimeType(parser.getAttributeValue(i));
+				if (parser.getAttributeValue(i) != null) {
+					type = parser.getAttributeValue(i).trim().toLowerCase();
+				}
+			} else if (ATTR_SRC.equals(attrName.getLocalPart())) {
+				throw new CmisNotSupportedException("External content not supported!");
+			}
+		}
+
+		if (type.equals("text") || type.equals("html")) {
+			fAtomContentStream.setStream(new ByteArrayInputStream(readText(parser).getBytes("UTF-8")));
+		} else if (type.equals("xhtml")) {
+			fAtomContentStream.setStream(copy(parser));
+		} else if (type.endsWith("/xml") || type.endsWith("+xml")) {
+			fAtomContentStream.setStream(copy(parser));
+		} else if (type.startsWith("text/")) {
+			fAtomContentStream.setStream(new ByteArrayInputStream(readText(parser).getBytes("UTF-8")));
+		} else {
+			fAtomContentStream.setStream(new ByteArrayInputStream(Base64.decodeBase64(readText(parser))));
+		}
+	}
+
+	/**
+	 * Extract the content stream.
+	 */
+	private void parseCmisContent(XMLStreamReader parser) throws Exception {
+		fCmisContentStream = new ContentStreamImpl();
+
+		next(parser);
+
+		// walk through all tags in content
+		while (true) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.START_ELEMENT) {
+				QName name = parser.getName();
+
+				if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
+					if (TAG_MEDIATYPE.equals(name.getLocalPart())) {
+						fCmisContentStream.setMimeType(readText(parser));
+					} else if (TAG_BASE64.equals(name.getLocalPart())) {
+						fCmisContentStream.setStream(new ByteArrayInputStream(Base64.decodeBase64(readText(parser))));
+					} else {
+						skip(parser);
+					}
+				} else {
+					skip(parser);
+				}
+			} else if (event == XMLStreamReader.END_ELEMENT) {
+				break;
+			} else {
+				if (!next(parser)) {
+					break;
+				}
+			}
+		}
+
+		next(parser);
+	}
+
+	/**
+	 * Parses a tag that contains text.
+	 */
+	private String readText(XMLStreamReader parser) throws Exception {
+		StringBuilder sb = new StringBuilder();
+
+		next(parser);
+
+		while (true) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.END_ELEMENT) {
+				break;
+			} else if (event == XMLStreamReader.CHARACTERS) {
+				String s = parser.getText();
+				if (s != null) {
+					sb.append(s);
+				}
+			} else if (event == XMLStreamReader.START_ELEMENT) {
+				throw new RuntimeException("Unexpected tag: " + parser.getName());
+			}
+
+			if (!next(parser)) {
+				break;
+			}
+		}
+
+		next(parser);
+
+		return sb.toString();
+	}
+
+	/**
+	 * Copies a subtree into a stream.
+	 */
+	private InputStream copy(XMLStreamReader parser) throws Exception {
+		// create a writer
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
+
+		writer.writeStartDocument();
+
+		// copy subtree
+		int level = 1;
+		while (next(parser)) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.START_ELEMENT) {
+				copyStartElement(parser, writer);
+				level++;
+			} else if (event == XMLStreamReader.CHARACTERS) {
+				writer.writeCharacters(parser.getText());
+			} else if (event == XMLStreamReader.COMMENT) {
+				writer.writeComment(parser.getText());
+			} else if (event == XMLStreamReader.CDATA) {
+				writer.writeCData(parser.getText());
+			} else if (event == XMLStreamReader.END_ELEMENT) {
+				level--;
+				if (level == 0) {
+					break;
+				}
+				writer.writeEndElement();
+			} else {
+				break;
+			}
+		}
+
+		writer.writeEndDocument();
+
+		next(parser);
+
+		return new ByteArrayInputStream(out.toByteArray());
+	}
+
+	/**
+	 * Copies a XML start element.
+	 */
+	private void copyStartElement(XMLStreamReader parser, XMLStreamWriter writer) throws Exception {
+		String namespaceUri = parser.getNamespaceURI();
+		String prefix = parser.getPrefix();
+		String localName = parser.getLocalName();
+
+		// write start element
+		if (namespaceUri != null) {
+			if ((prefix == null) || (prefix.length() == 0)) {
+				writer.writeStartElement(localName);
+			} else {
+				writer.writeStartElement(prefix, localName, namespaceUri);
+			}
+		} else {
+			writer.writeStartElement(localName);
+		}
+
+		// set namespaces
+		for (int i = 0; i < parser.getNamespaceCount(); i++) {
+			addNamespace(writer, parser.getNamespacePrefix(i), parser.getNamespaceURI(i));
+		}
+		addNamespaceIfMissing(writer, prefix, namespaceUri);
+
+		// write attributes
+		for (int i = 0; i < parser.getAttributeCount(); i++) {
+			String attrNamespaceUri = parser.getAttributeNamespace(i);
+			String attrPrefix = parser.getAttributePrefix(i);
+			String attrName = parser.getAttributeLocalName(i);
+			String attrValue = parser.getAttributeValue(i);
+
+			if ((attrNamespaceUri == null) || (attrNamespaceUri.trim().length() == 0)) {
+				writer.writeAttribute(attrName, attrValue);
+			} else if ((attrPrefix == null) || (attrPrefix.trim().length() == 0)) {
+				writer.writeAttribute(attrNamespaceUri, attrName, attrValue);
+			} else {
+				addNamespaceIfMissing(writer, attrPrefix, attrNamespaceUri);
+				writer.writeAttribute(attrPrefix, attrNamespaceUri, attrName, attrValue);
+			}
+		}
+	}
+
+	/**
+	 * Checks if the given prefix is assigned to the given namespace.
+	 */
+	@SuppressWarnings("unchecked")
+	private void addNamespaceIfMissing(XMLStreamWriter writer, String prefix, String namespaceUri) throws Exception {
+		if ((namespaceUri == null) || (namespaceUri.trim().length() == 0)) {
+			return;
+		}
+
+		if (prefix == null) {
+			prefix = "";
+		}
+
+		Iterator<String> iter = (Iterator<String>) writer.getNamespaceContext().getPrefixes(namespaceUri);
+		if (iter == null) {
+			return;
+		}
+
+		while (iter.hasNext()) {
+			String p = iter.next();
+			if ((p != null) && (p.equals(prefix))) {
+				return;
+			}
+		}
+
+		addNamespace(writer, prefix, namespaceUri);
+	}
+
+	/**
+	 * Adds a namespace to a XML element.
+	 */
+	private void addNamespace(XMLStreamWriter writer, String prefix, String namespaceUri) throws Exception {
+		if ((prefix == null) || (prefix.trim().length() == 0)) {
+			writer.setDefaultNamespace(namespaceUri);
+			writer.writeDefaultNamespace(namespaceUri);
+		} else {
+			writer.setPrefix(prefix, namespaceUri);
+			writer.writeNamespace(prefix, namespaceUri);
+		}
+	}
+
+	/**
+	 * Skips a tag or subtree.
+	 */
+	private void skip(XMLStreamReader parser) throws Exception {
+		int level = 1;
+		while (next(parser)) {
+			int event = parser.getEventType();
+			if (event == XMLStreamReader.START_ELEMENT) {
+				level++;
+			} else if (event == XMLStreamReader.END_ELEMENT) {
+				level--;
+				if (level == 0) {
+					break;
+				}
+			}
+		}
+
+		next(parser);
+	}
+
+	private boolean next(XMLStreamReader parser) throws Exception {
+		if (parser.hasNext()) {
+			parser.next();
+			return true;
+		}
 
-    return false;
-  }
+		return false;
+	}
 }
\ No newline at end of file

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomFeed.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomFeed.java?rev=934896&r1=934895&r2=934896&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomFeed.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomFeed.java Fri Apr 16 14:14:00 2010
@@ -35,135 +35,133 @@ import org.apache.chemistry.opencmis.com
  */
 public class AtomFeed extends AtomDocumentBase {
 
-  public static final BigInteger DEFAULT_PAGE_SIZE = BigInteger.valueOf(100);
+	public static final BigInteger DEFAULT_PAGE_SIZE = BigInteger.valueOf(100);
 
-  /**
-   * Creates an Atom feed document.
-   */
-  public AtomFeed() {
-  }
-
-  /**
-   * Creates an Atom feed that is embedded somewhere.
-   */
-  public AtomFeed(XMLStreamWriter writer) {
-    setWriter(writer);
-  }
-
-  /**
-   * Opens the feed tag.
-   */
-  public void startFeed(boolean isRoot) throws XMLStreamException {
-    getWriter().writeStartElement(Constants.NAMESPACE_ATOM, "feed");
-
-    if (isRoot) {
-      writeNamespace(Constants.NAMESPACE_ATOM);
-      writeNamespace(Constants.NAMESPACE_CMIS);
-      writeNamespace(Constants.NAMESPACE_RESTATOM);
-      writeNamespace(Constants.NAMESPACE_APP);
-    }
-  }
-
-  /**
-   * Opens the children tag.
-   */
-  public void startChildren() throws XMLStreamException {
-    XMLStreamWriter writer = getWriter();
-    writer.writeStartElement(Constants.NAMESPACE_RESTATOM, "children");
-  }
-
-  /**
-   * Closes the feed tag.
-   */
-  public void endChildren() throws XMLStreamException {
-    getWriter().writeEndElement();
-  }
-
-  /**
-   * Closes the feed tag.
-   */
-  public void endFeed() throws XMLStreamException {
-    getWriter().writeEndElement();
-  }
-
-  /**
-   * Writes the feed elements that are required by Atom.
-   */
-  public void writeFeedElements(String id, String author, String title, GregorianCalendar updated,
-      String pathSegment, BigInteger numItems) throws XMLStreamException {
-    writeAuthor(author);
-    writeId(generateAtomId(id));
-    writeTitle(title);
-    writeUpdated(updated);
-    writePathSegment(pathSegment);
-    writeNumItems(numItems);
-  }
-
-  /**
-   * Writes a CMIS numItems tag.
-   */
-  public void writeNumItems(BigInteger numItems) throws XMLStreamException {
-    if (numItems == null) {
-      return;
-    }
-
-    writeSimpleTag(Constants.NAMESPACE_RESTATOM, "numItems", numItems.toString());
-  }
-
-  /**
-   * Writes paging links.
-   */
-  public void writePagingLinks(UrlBuilder pagingUrl, BigInteger maxItems, BigInteger skipCount,
-      BigInteger numItems, Boolean hasMoreItems, BigInteger pageSize) throws XMLStreamException {
-
-    if ((skipCount == null) || (skipCount.compareTo(BigInteger.ZERO) == -1)) {
-      skipCount = BigInteger.ZERO;
-    }
-
-    if ((maxItems == null) || (maxItems.compareTo(BigInteger.ZERO) == -1)) {
-      if ((pageSize == null) || (pageSize.compareTo(BigInteger.ZERO) == -1)) {
-        maxItems = DEFAULT_PAGE_SIZE;
-      }
-      else {
-        maxItems = pageSize;
-      }
-    }
-
-    // if not first page -> add "first" and "previous" link
-    if (skipCount.compareTo(BigInteger.ZERO) == 1) {
-      // first link
-      UrlBuilder firstLink = new UrlBuilder(pagingUrl);
-      firstLink.addParameter(Constants.PARAM_SKIP_COUNT, "0");
-      firstLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-      writeFirstLink(firstLink.toString());
-
-      // previous link
-      UrlBuilder previousLink = new UrlBuilder(pagingUrl);
-      previousLink.addParameter(Constants.PARAM_SKIP_COUNT, skipCount.subtract(maxItems).max(
-          BigInteger.ZERO));
-      previousLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-      writePreviousLink(previousLink.toString());
-    }
-
-    // if has more -> add "next" link
-    if ((hasMoreItems != null) && hasMoreItems.booleanValue()) {
-      // next link
-      UrlBuilder nextLink = new UrlBuilder(pagingUrl);
-      nextLink.addParameter(Constants.PARAM_SKIP_COUNT, skipCount.add(maxItems));
-      nextLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-      writeNextLink(nextLink.toString());
-    }
-
-    // if not last page -> add "last" link
-    if ((numItems != null) && (numItems.compareTo(BigInteger.ZERO) == 1)) {
-      BigInteger lastSkip = numItems.subtract(maxItems).max(BigInteger.ZERO);
-      if (lastSkip.compareTo(BigInteger.ZERO) == 1) {
-        // last link
-        UrlBuilder lastLink = new UrlBuilder(pagingUrl);
-        lastLink.addParameter(Constants.PARAM_SKIP_COUNT, lastSkip);
-        lastLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-        writeLastLink(lastLink.toString());
-      }
-    }
-  }
+	/**
+	 * Creates an Atom feed document.
+	 */
+	public AtomFeed() {
+	}
+
+	/**
+	 * Creates an Atom feed that is embedded somewhere.
+	 */
+	public AtomFeed(XMLStreamWriter writer) {
+		setWriter(writer);
+	}
+
+	/**
+	 * Opens the feed tag.
+	 */
+	public void startFeed(boolean isRoot) throws XMLStreamException {
+		getWriter().writeStartElement(Constants.NAMESPACE_ATOM, "feed");
+
+		if (isRoot) {
+			writeNamespace(Constants.NAMESPACE_ATOM);
+			writeNamespace(Constants.NAMESPACE_CMIS);
+			writeNamespace(Constants.NAMESPACE_RESTATOM);
+			writeNamespace(Constants.NAMESPACE_APP);
+		}
+	}
+
+	/**
+	 * Opens the children tag.
+	 */
+	public void startChildren() throws XMLStreamException {
+		XMLStreamWriter writer = getWriter();
+		writer.writeStartElement(Constants.NAMESPACE_RESTATOM, "children");
+	}
+
+	/**
+	 * Closes the feed tag.
+	 */
+	public void endChildren() throws XMLStreamException {
+		getWriter().writeEndElement();
+	}
+
+	/**
+	 * Closes the feed tag.
+	 */
+	public void endFeed() throws XMLStreamException {
+		getWriter().writeEndElement();
+	}
+
+	/**
+	 * Writes the feed elements that are required by Atom.
+	 */
+	public void writeFeedElements(String id, String author, String title, GregorianCalendar updated,
+			String pathSegment, BigInteger numItems) throws XMLStreamException {
+		writeAuthor(author);
+		writeId(generateAtomId(id));
+		writeTitle(title);
+		writeUpdated(updated);
+		writePathSegment(pathSegment);
+		writeNumItems(numItems);
+	}
+
+	/**
+	 * Writes a CMIS numItems tag.
+	 */
+	public void writeNumItems(BigInteger numItems) throws XMLStreamException {
+		if (numItems == null) {
+			return;
+		}
+
+		writeSimpleTag(Constants.NAMESPACE_RESTATOM, "numItems", numItems.toString());
+	}
+
+	/**
+	 * Writes paging links.
+	 */
+	public void writePagingLinks(UrlBuilder pagingUrl, BigInteger maxItems, BigInteger skipCount, BigInteger numItems,
+			Boolean hasMoreItems, BigInteger pageSize) throws XMLStreamException {
+
+		if ((skipCount == null) || (skipCount.compareTo(BigInteger.ZERO) == -1)) {
+			skipCount = BigInteger.ZERO;
+		}
+
+		if ((maxItems == null) || (maxItems.compareTo(BigInteger.ZERO) == -1)) {
+			if ((pageSize == null) || (pageSize.compareTo(BigInteger.ZERO) == -1)) {
+				maxItems = DEFAULT_PAGE_SIZE;
+			} else {
+				maxItems = pageSize;
+			}
+		}
+
+		// if not first page -> add "first" and "previous" link
+		if (skipCount.compareTo(BigInteger.ZERO) == 1) {
+			// first link
+			UrlBuilder firstLink = new UrlBuilder(pagingUrl);
+			firstLink.addParameter(Constants.PARAM_SKIP_COUNT, "0");
+			firstLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+			writeFirstLink(firstLink.toString());
+
+			// previous link
+			UrlBuilder previousLink = new UrlBuilder(pagingUrl);
+			previousLink.addParameter(Constants.PARAM_SKIP_COUNT, skipCount.subtract(maxItems).max(BigInteger.ZERO));
+			previousLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+			writePreviousLink(previousLink.toString());
+		}
+
+		// if has more -> add "next" link
+		if ((hasMoreItems != null) && hasMoreItems.booleanValue()) {
+			// next link
+			UrlBuilder nextLink = new UrlBuilder(pagingUrl);
+			nextLink.addParameter(Constants.PARAM_SKIP_COUNT, skipCount.add(maxItems));
+			nextLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+			writeNextLink(nextLink.toString());
+		}
+
+		// if not last page -> add "last" link
+		if ((numItems != null) && (numItems.compareTo(BigInteger.ZERO) == 1)) {
+			BigInteger lastSkip = numItems.subtract(maxItems).max(BigInteger.ZERO);
+			if (lastSkip.compareTo(BigInteger.ZERO) == 1) {
+				// last link
+				UrlBuilder lastLink = new UrlBuilder(pagingUrl);
+				lastLink.addParameter(Constants.PARAM_SKIP_COUNT, lastSkip);
+				lastLink.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+				writeLastLink(lastLink.toString());
+			}
+		}
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomPubUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomPubUtils.java?rev=934896&r1=934895&r2=934896&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomPubUtils.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/AtomPubUtils.java Fri Apr 16 14:14:00 2010
@@ -52,462 +52,446 @@ import org.apache.chemistry.opencmis.ser
  */
 public final class AtomPubUtils {
 
-  public static final String RESOURCE_CHILDREN = "children";
-  public static final String RESOURCE_DESCENDANTS = "descendants";
-  public static final String RESOURCE_FOLDERTREE = "foldertree";
-  public static final String RESOURCE_TYPE = "type";
-  public static final String RESOURCE_TYPES = "types";
-  public static final String RESOURCE_TYPESDESC = "typedesc";
-  public static final String RESOURCE_ENTRY = "entry";
-  public static final String RESOURCE_PARENTS = "parents";
-  public static final String RESOURCE_VERSIONS = "versions";
-  public static final String RESOURCE_ALLOWABLEACIONS = "allowableactions";
-  public static final String RESOURCE_ACL = "acl";
-  public static final String RESOURCE_POLICIES = "policies";
-  public static final String RESOURCE_RELATIONSHIPS = "relationships";
-  public static final String RESOURCE_OBJECTBYID = "id";
-  public static final String RESOURCE_OBJECTBYPATH = "path";
-  public static final String RESOURCE_QUERY = "query";
-  public static final String RESOURCE_CHECKEDOUT = "checkedout";
-  public static final String RESOURCE_UNFILED = "unfiled";
-  public static final String RESOURCE_CHANGES = "changes";
-  public static final String RESOURCE_CONTENT = "content";
-
-  public static final BigInteger PAGE_SIZE = BigInteger.valueOf(100);
-
-  public static final String TYPE_AUTHOR = "unknown";
-
-  /**
-   * Private constructor.
-   */
-  private AtomPubUtils() {
-  }
-
-  /**
-   * Compiles the base URL for links, collections and templates.
-   */
-  public static UrlBuilder compileBaseUrl(HttpServletRequest request, String repositoryId) {
-    UrlBuilder url = new UrlBuilder(request.getScheme(), request.getServerName(), request
-        .getServerPort(), null);
-
-    url.addPath(request.getContextPath());
-    url.addPath(request.getServletPath());
-
-    if (repositoryId != null) {
-      url.addPath(repositoryId);
-    }
-
-    return url;
-  }
-
-  /**
-   * Compiles a URL for links, collections and templates.
-   */
-  public static String compileUrl(UrlBuilder baseUrl, String resource, String id) {
-    return compileUrlBuilder(baseUrl, resource, id).toString();
-  }
-
-  /**
-   * Compiles a URL for links, collections and templates.
-   */
-  public static UrlBuilder compileUrlBuilder(UrlBuilder baseUrl, String resource, String id) {
-    UrlBuilder url = new UrlBuilder(baseUrl);
-    url.addPath(resource);
-
-    if (id != null) {
-      url.addParameter("id", id);
-    }
-
-    return url;
-  }
-
-  // -------------------------------------------------------------------------
-  // --- parameters ---
-  // -------------------------------------------------------------------------
-
-  /**
-   * Extracts a string parameter.
-   */
-  @SuppressWarnings("unchecked")
-  public static String getStringParameter(HttpServletRequest request, String name) {
-    if (name == null) {
-      return null;
-    }
-
-    Map<String, String[]> parameters = (Map<String, String[]>) request.getParameterMap();
-    for (Map.Entry<String, String[]> parameter : parameters.entrySet()) {
-      if (name.equalsIgnoreCase(parameter.getKey())) {
-        if (parameter.getValue() == null) {
-          return null;
-        }
-        return parameter.getValue()[0];
-      }
-    }
-
-    return null;
-  }
-
-  /**
-   * Extracts a boolean parameter (with default).
-   */
-  public static boolean getBooleanParameter(HttpServletRequest request, String name, boolean def) {
-    String value = getStringParameter(request, name);
-    if (value == null) {
-      return def;
-    }
-
-    return Boolean.valueOf(value);
-  }
-
-  /**
-   * Extracts a boolean parameter.
-   */
-  public static Boolean getBooleanParameter(HttpServletRequest request, String name) {
-    String value = getStringParameter(request, name);
-    if (value == null) {
-      return null;
-    }
-
-    return Boolean.valueOf(value);
-  }
-
-  /**
-   * Extracts an integer parameter (with default).
-   */
-  public static BigInteger getBigIntegerParameter(HttpServletRequest request, String name, long def) {
-    BigInteger result = getBigIntegerParameter(request, name);
-    if (result == null) {
-      result = BigInteger.valueOf(def);
-    }
-
-    return result;
-  }
-
-  /**
-   * Extracts an integer parameter.
-   */
-  public static BigInteger getBigIntegerParameter(HttpServletRequest request, String name) {
-    String value = getStringParameter(request, name);
-    if (value == null) {
-      return null;
-    }
-
-    try {
-      return new BigInteger(value);
-    }
-    catch (Exception e) {
-      throw new CmisInvalidArgumentException("Invalid parameter '" + name + "'!");
-    }
-  }
-
-  /**
-   * Extracts an enum parameter.
-   */
-  @SuppressWarnings("unchecked")
-  public static <T> T getEnumParameter(HttpServletRequest request, String name, Class<T> clazz) {
-    String value = getStringParameter(request, name);
-    if (value == null) {
-      return null;
-    }
-
-    try {
-      Method m = clazz.getMethod("fromValue", new Class[] { String.class });
-      return (T) m.invoke(null, new Object[] { value });
-    }
-    catch (Exception e) {
-      if (e instanceof IllegalArgumentException) {
-        throw new CmisInvalidArgumentException("Invalid parameter '" + name + "'!");
-      }
-
-      throw new CmisRuntimeException(e.getMessage(), e);
-    }
-  }
-
-  /**
-   * Extracts a property from an object.
-   */
-  @SuppressWarnings("unchecked")
-  public static <T> T getProperty(ObjectData object, String name, Class<T> clazz) {
-    if (object == null) {
-      return null;
-    }
-
-    Properties propData = object.getProperties();
-    if (propData == null) {
-      return null;
-    }
-
-    Map<String, PropertyData<?>> properties = propData.getProperties();
-    if (properties == null) {
-      return null;
-    }
-
-    PropertyData<?> property = properties.get(name);
-    if (property == null) {
-      return null;
-    }
-
-    Object value = property.getFirstValue();
-    if (!clazz.isInstance(value)) {
-      return null;
-    }
-
-    return (T) value;
-  }
-
-  // -------------------------------------------------------------------------
-  // --- entry builder ---
-  // -------------------------------------------------------------------------
-
-  /**
-   * Writes the a object entry.
-   */
-  public static void writeObjectEntry(AtomEntry entry, ObjectData object,
-      ObjectInfoHolder infoHolder, List<ObjectInFolderContainer> children, String repositoryId,
-      String pathSegment, String relativePathSegment, UrlBuilder baseUrl, boolean isRoot)
-      throws XMLStreamException, JAXBException {
-    if ((object == null) || (infoHolder == null)) {
-      throw new CmisRuntimeException("Object or Object Info not set!");
-    }
-
-    ObjectInfo info = infoHolder.getObjectInfo(object.getId());
-    if (info == null) {
-      throw new CmisRuntimeException("Object Info not found!");
-    }
-
-    // start
-    entry.startEntry(isRoot);
-
-    // write object
-    String contentSrc = null;
-
-    if (info.hasContent()) {
-      UrlBuilder contentSrcBuilder = compileUrlBuilder(baseUrl, RESOURCE_CONTENT, info.getId());
-      if (info.getFileName() != null) {
-        contentSrcBuilder.addPath(info.getFileName());
-      }
-
-      contentSrc = contentSrcBuilder.toString();
-    }
-
-    entry.writeObject(object, info, contentSrc, info.getContentType(), pathSegment,
-        relativePathSegment);
-
-    // write links
-    entry.writeServiceLink(baseUrl.toString(), repositoryId);
-
-    entry.writeSelfLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()), info.getId());
-    entry.writeEnclosureLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()));
-    entry.writeEditLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()));
-    entry.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, info.getTypeId()));
-    entry.writeAllowableActionsLink(compileUrl(baseUrl, RESOURCE_ALLOWABLEACIONS, info.getId()));
-
-    if (info.hasParent()) {
-      entry.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, info.getId()),
-          Constants.MEDIATYPE_FEED);
-    }
-
-    if (info.getBaseType() == BaseTypeId.CMIS_FOLDER) {
-      entry.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, info.getId()),
-          Constants.MEDIATYPE_FEED);
-
-      if (info.supportsDescendants()) {
-        entry.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, info.getId()),
-            Constants.MEDIATYPE_DESCENDANTS);
-      }
-
-      if (info.supportsFolderTree()) {
-        entry.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, info.getId()));
-      }
-    }
-
-    if (info.getVersionSeriesId() != null) {
-      entry.writeVersionHistoryLink(compileUrl(baseUrl, RESOURCE_VERSIONS, info
-          .getVersionSeriesId()));
-    }
-
-    if (!info.isCurrentVersion()) {
-      UrlBuilder cvUrl = compileUrlBuilder(baseUrl, RESOURCE_ENTRY, info.getId());
-      cvUrl.addParameter(Constants.PARAM_RETURN_VERSION, ReturnVersion.LATEST);
-      entry.writeEditLink(cvUrl.toString());
-    }
-
-    if (contentSrc != null) {
-      entry.writeEditMediaLink(contentSrc, info.getContentType());
-    }
-
-    if (info.getWorkingCopyId() != null) {
-      entry.writeWorkingCopyLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getWorkingCopyId()));
-    }
-
-    if (info.getWorkingCopyOriginalId() != null) {
-      entry.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getWorkingCopyOriginalId()));
-    }
-
-    if (info.getRenditionInfos() != null) {
-      for (RenditionInfo ri : info.getRenditionInfos()) {
-        entry.writeAlternateLink(compileUrl(baseUrl, RESOURCE_CONTENT, ri.getId()), ri
-            .getContenType(), ri.getKind(), ri.getTitle(), ri.getLength());
-      }
-    }
-
-    if (info.hasAcl()) {
-      entry.writeAclLink(compileUrl(baseUrl, RESOURCE_ACL, info.getId()));
-    }
-
-    if (info.supportsPolicies()) {
-      entry.writeAclLink(compileUrl(baseUrl, RESOURCE_POLICIES, info.getId()));
-    }
-
-    if (info.supportsRelationships()) {
-      entry.writeRelationshipsLink(compileUrl(baseUrl, RESOURCE_RELATIONSHIPS, info.getId()));
-    }
-
-    if (info.getRelationshipSourceIds() != null) {
-      for (String id : info.getRelationshipSourceIds()) {
-        entry.writeRelationshipSourceLink(compileUrl(baseUrl, RESOURCE_ENTRY, id));
-      }
-    }
-
-    if (info.getRelationshipTargetIds() != null) {
-      for (String id : info.getRelationshipTargetIds()) {
-        entry.writeRelationshipTargetLink(compileUrl(baseUrl, RESOURCE_ENTRY, id));
-      }
-    }
-
-    // write children
-    if ((children != null) && (children.size() > 0)) {
-      writeObjectChildren(entry, info, children, infoHolder, repositoryId, baseUrl);
-    }
-
-    // we are done
-    entry.endEntry();
-  }
-
-  /**
-   * Writes an objects entry children feed.
-   */
-  public static void writeObjectChildren(AtomEntry entry, ObjectInfo folderInfo,
-      List<ObjectInFolderContainer> children, ObjectInfoHolder infoHolder, String repositoryId,
-      UrlBuilder baseUrl) throws XMLStreamException, JAXBException {
-
-    // start
-    AtomFeed feed = new AtomFeed(entry.getWriter());
-    feed.startChildren();
-    feed.startFeed(false);
-
-    // write basic Atom feed elements
-    feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(),
-        folderInfo.getLastModificationDate(), null, null);
-
-    // write links
-    feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-    feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
-
-    feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
-
-    feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()),
-        Constants.MEDIATYPE_FEED);
-
-    feed.writeDownLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()),
-        Constants.MEDIATYPE_DESCENDANTS);
-
-    feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()),
-        Constants.MEDIATYPE_FEED);
-
-    for (ObjectInFolderContainer container : children) {
-      if ((container != null) && (container.getObject() != null)) {
-        writeObjectEntry(entry, container.getObject().getObject(), infoHolder, container
-            .getChildren(), repositoryId, container.getObject().getPathSegment(), null, baseUrl,
-            false);
-      }
-    }
-
-    // we are done
-    feed.endFeed();
-    feed.endChildren();
-  }
-
-  /**
-   * Writes the a type entry.
-   */
-  public static void writeTypeEntry(AtomEntry entry, TypeDefinition type,
-      List<TypeDefinitionContainer> children, String repositoryId, UrlBuilder baseUrl,
-      boolean isRoot) throws XMLStreamException, JAXBException {
-
-    // start
-    entry.startEntry(isRoot);
-
-    // write type
-    entry.writeType(type);
-
-    // write links
-    entry.writeServiceLink(baseUrl.toString(), repositoryId);
-
-    entry.writeSelfLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()), type.getId());
-    entry.writeEnclosureLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()));
-    if (type.getParentTypeId() != null) {
-      entry.writeUpLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getParentTypeId()),
-          Constants.MEDIATYPE_ENTRY);
-    }
-    UrlBuilder downLink = compileUrlBuilder(baseUrl, RESOURCE_TYPES, null);
-    downLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
-    entry.writeDownLink(downLink.toString(), Constants.MEDIATYPE_CHILDREN);
-    entry.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getBaseTypeId().value()));
-
-    // write children
-    if ((children != null) && (children.size() > 0)) {
-      writeTypeChildren(entry, type, children, repositoryId, baseUrl);
-    }
-
-    // we are done
-    entry.endEntry();
-  }
-
-  /**
-   * Writes the a type entry children feed.
-   */
-  private static void writeTypeChildren(AtomEntry entry, TypeDefinition type,
-      List<TypeDefinitionContainer> children, String repositoryId, UrlBuilder baseUrl)
-      throws XMLStreamException, JAXBException {
-
-    // start
-    AtomFeed feed = new AtomFeed(entry.getWriter());
-    feed.startChildren();
-    feed.startFeed(false);
-
-    // write basic Atom feed elements
-    feed.writeFeedElements(type.getId(), TYPE_AUTHOR, type.getDisplayName(),
-        new GregorianCalendar(), null, null);
-
-    feed.writeServiceLink(baseUrl.toString(), repositoryId);
-
-    UrlBuilder selfLink = compileUrlBuilder(baseUrl, RESOURCE_TYPESDESC, null);
-    selfLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
-    feed.writeSelfLink(selfLink.toString(), type.getId());
-
-    feed.writeViaLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()));
-
-    UrlBuilder downLink = compileUrlBuilder(baseUrl, RESOURCE_TYPES, null);
-    downLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
-    feed.writeDownLink(downLink.toString(), Constants.MEDIATYPE_FEED);
-
-    if (type.getParentTypeId() != null) {
-      feed.writeUpLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getParentTypeId()),
-          Constants.MEDIATYPE_ENTRY);
-    }
-
-    // write tree
-    for (TypeDefinitionContainer container : children) {
-      if ((container != null) && (container.getTypeDefinition() != null)) {
-        writeTypeEntry(entry, container.getTypeDefinition(), container.getChildren(), repositoryId,
-            baseUrl, false);
-      }
-    }
-
-    // we are done
-    feed.endFeed();
-    feed.endChildren();
-  }
+	public static final String RESOURCE_CHILDREN = "children";
+	public static final String RESOURCE_DESCENDANTS = "descendants";
+	public static final String RESOURCE_FOLDERTREE = "foldertree";
+	public static final String RESOURCE_TYPE = "type";
+	public static final String RESOURCE_TYPES = "types";
+	public static final String RESOURCE_TYPESDESC = "typedesc";
+	public static final String RESOURCE_ENTRY = "entry";
+	public static final String RESOURCE_PARENTS = "parents";
+	public static final String RESOURCE_VERSIONS = "versions";
+	public static final String RESOURCE_ALLOWABLEACIONS = "allowableactions";
+	public static final String RESOURCE_ACL = "acl";
+	public static final String RESOURCE_POLICIES = "policies";
+	public static final String RESOURCE_RELATIONSHIPS = "relationships";
+	public static final String RESOURCE_OBJECTBYID = "id";
+	public static final String RESOURCE_OBJECTBYPATH = "path";
+	public static final String RESOURCE_QUERY = "query";
+	public static final String RESOURCE_CHECKEDOUT = "checkedout";
+	public static final String RESOURCE_UNFILED = "unfiled";
+	public static final String RESOURCE_CHANGES = "changes";
+	public static final String RESOURCE_CONTENT = "content";
+
+	public static final BigInteger PAGE_SIZE = BigInteger.valueOf(100);
+
+	public static final String TYPE_AUTHOR = "unknown";
+
+	/**
+	 * Private constructor.
+	 */
+	private AtomPubUtils() {
+	}
+
+	/**
+	 * Compiles the base URL for links, collections and templates.
+	 */
+	public static UrlBuilder compileBaseUrl(HttpServletRequest request, String repositoryId) {
+		UrlBuilder url = new UrlBuilder(request.getScheme(), request.getServerName(), request.getServerPort(), null);
+
+		url.addPath(request.getContextPath());
+		url.addPath(request.getServletPath());
+
+		if (repositoryId != null) {
+			url.addPath(repositoryId);
+		}
+
+		return url;
+	}
+
+	/**
+	 * Compiles a URL for links, collections and templates.
+	 */
+	public static String compileUrl(UrlBuilder baseUrl, String resource, String id) {
+		return compileUrlBuilder(baseUrl, resource, id).toString();
+	}
+
+	/**
+	 * Compiles a URL for links, collections and templates.
+	 */
+	public static UrlBuilder compileUrlBuilder(UrlBuilder baseUrl, String resource, String id) {
+		UrlBuilder url = new UrlBuilder(baseUrl);
+		url.addPath(resource);
+
+		if (id != null) {
+			url.addParameter("id", id);
+		}
+
+		return url;
+	}
+
+	// -------------------------------------------------------------------------
+	// --- parameters ---
+	// -------------------------------------------------------------------------
+
+	/**
+	 * Extracts a string parameter.
+	 */
+	@SuppressWarnings("unchecked")
+	public static String getStringParameter(HttpServletRequest request, String name) {
+		if (name == null) {
+			return null;
+		}
+
+		Map<String, String[]> parameters = (Map<String, String[]>) request.getParameterMap();
+		for (Map.Entry<String, String[]> parameter : parameters.entrySet()) {
+			if (name.equalsIgnoreCase(parameter.getKey())) {
+				if (parameter.getValue() == null) {
+					return null;
+				}
+				return parameter.getValue()[0];
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * Extracts a boolean parameter (with default).
+	 */
+	public static boolean getBooleanParameter(HttpServletRequest request, String name, boolean def) {
+		String value = getStringParameter(request, name);
+		if (value == null) {
+			return def;
+		}
+
+		return Boolean.valueOf(value);
+	}
+
+	/**
+	 * Extracts a boolean parameter.
+	 */
+	public static Boolean getBooleanParameter(HttpServletRequest request, String name) {
+		String value = getStringParameter(request, name);
+		if (value == null) {
+			return null;
+		}
+
+		return Boolean.valueOf(value);
+	}
+
+	/**
+	 * Extracts an integer parameter (with default).
+	 */
+	public static BigInteger getBigIntegerParameter(HttpServletRequest request, String name, long def) {
+		BigInteger result = getBigIntegerParameter(request, name);
+		if (result == null) {
+			result = BigInteger.valueOf(def);
+		}
+
+		return result;
+	}
+
+	/**
+	 * Extracts an integer parameter.
+	 */
+	public static BigInteger getBigIntegerParameter(HttpServletRequest request, String name) {
+		String value = getStringParameter(request, name);
+		if (value == null) {
+			return null;
+		}
+
+		try {
+			return new BigInteger(value);
+		} catch (Exception e) {
+			throw new CmisInvalidArgumentException("Invalid parameter '" + name + "'!");
+		}
+	}
+
+	/**
+	 * Extracts an enum parameter.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T getEnumParameter(HttpServletRequest request, String name, Class<T> clazz) {
+		String value = getStringParameter(request, name);
+		if (value == null) {
+			return null;
+		}
+
+		try {
+			Method m = clazz.getMethod("fromValue", new Class[] { String.class });
+			return (T) m.invoke(null, new Object[] { value });
+		} catch (Exception e) {
+			if (e instanceof IllegalArgumentException) {
+				throw new CmisInvalidArgumentException("Invalid parameter '" + name + "'!");
+			}
+
+			throw new CmisRuntimeException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Extracts a property from an object.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T getProperty(ObjectData object, String name, Class<T> clazz) {
+		if (object == null) {
+			return null;
+		}
+
+		Properties propData = object.getProperties();
+		if (propData == null) {
+			return null;
+		}
+
+		Map<String, PropertyData<?>> properties = propData.getProperties();
+		if (properties == null) {
+			return null;
+		}
+
+		PropertyData<?> property = properties.get(name);
+		if (property == null) {
+			return null;
+		}
+
+		Object value = property.getFirstValue();
+		if (!clazz.isInstance(value)) {
+			return null;
+		}
+
+		return (T) value;
+	}
+
+	// -------------------------------------------------------------------------
+	// --- entry builder ---
+	// -------------------------------------------------------------------------
+
+	/**
+	 * Writes the a object entry.
+	 */
+	public static void writeObjectEntry(AtomEntry entry, ObjectData object, ObjectInfoHolder infoHolder,
+			List<ObjectInFolderContainer> children, String repositoryId, String pathSegment,
+			String relativePathSegment, UrlBuilder baseUrl, boolean isRoot) throws XMLStreamException, JAXBException {
+		if ((object == null) || (infoHolder == null)) {
+			throw new CmisRuntimeException("Object or Object Info not set!");
+		}
+
+		ObjectInfo info = infoHolder.getObjectInfo(object.getId());
+		if (info == null) {
+			throw new CmisRuntimeException("Object Info not found!");
+		}
+
+		// start
+		entry.startEntry(isRoot);
+
+		// write object
+		String contentSrc = null;
+
+		if (info.hasContent()) {
+			UrlBuilder contentSrcBuilder = compileUrlBuilder(baseUrl, RESOURCE_CONTENT, info.getId());
+			if (info.getFileName() != null) {
+				contentSrcBuilder.addPath(info.getFileName());
+			}
+
+			contentSrc = contentSrcBuilder.toString();
+		}
+
+		entry.writeObject(object, info, contentSrc, info.getContentType(), pathSegment, relativePathSegment);
+
+		// write links
+		entry.writeServiceLink(baseUrl.toString(), repositoryId);
+
+		entry.writeSelfLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()), info.getId());
+		entry.writeEnclosureLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()));
+		entry.writeEditLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getId()));
+		entry.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, info.getTypeId()));
+		entry.writeAllowableActionsLink(compileUrl(baseUrl, RESOURCE_ALLOWABLEACIONS, info.getId()));
+
+		if (info.hasParent()) {
+			entry.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, info.getId()), Constants.MEDIATYPE_FEED);
+		}
+
+		if (info.getBaseType() == BaseTypeId.CMIS_FOLDER) {
+			entry.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, info.getId()), Constants.MEDIATYPE_FEED);
+
+			if (info.supportsDescendants()) {
+				entry.writeDownLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, info.getId()),
+						Constants.MEDIATYPE_DESCENDANTS);
+			}
+
+			if (info.supportsFolderTree()) {
+				entry.writeFolderTreeLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, info.getId()));
+			}
+		}
+
+		if (info.getVersionSeriesId() != null) {
+			entry.writeVersionHistoryLink(compileUrl(baseUrl, RESOURCE_VERSIONS, info.getVersionSeriesId()));
+		}
+
+		if (!info.isCurrentVersion()) {
+			UrlBuilder cvUrl = compileUrlBuilder(baseUrl, RESOURCE_ENTRY, info.getId());
+			cvUrl.addParameter(Constants.PARAM_RETURN_VERSION, ReturnVersion.LATEST);
+			entry.writeEditLink(cvUrl.toString());
+		}
+
+		if (contentSrc != null) {
+			entry.writeEditMediaLink(contentSrc, info.getContentType());
+		}
+
+		if (info.getWorkingCopyId() != null) {
+			entry.writeWorkingCopyLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getWorkingCopyId()));
+		}
+
+		if (info.getWorkingCopyOriginalId() != null) {
+			entry.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, info.getWorkingCopyOriginalId()));
+		}
+
+		if (info.getRenditionInfos() != null) {
+			for (RenditionInfo ri : info.getRenditionInfos()) {
+				entry.writeAlternateLink(compileUrl(baseUrl, RESOURCE_CONTENT, ri.getId()), ri.getContenType(), ri
+						.getKind(), ri.getTitle(), ri.getLength());
+			}
+		}
+
+		if (info.hasAcl()) {
+			entry.writeAclLink(compileUrl(baseUrl, RESOURCE_ACL, info.getId()));
+		}
+
+		if (info.supportsPolicies()) {
+			entry.writeAclLink(compileUrl(baseUrl, RESOURCE_POLICIES, info.getId()));
+		}
+
+		if (info.supportsRelationships()) {
+			entry.writeRelationshipsLink(compileUrl(baseUrl, RESOURCE_RELATIONSHIPS, info.getId()));
+		}
+
+		if (info.getRelationshipSourceIds() != null) {
+			for (String id : info.getRelationshipSourceIds()) {
+				entry.writeRelationshipSourceLink(compileUrl(baseUrl, RESOURCE_ENTRY, id));
+			}
+		}
+
+		if (info.getRelationshipTargetIds() != null) {
+			for (String id : info.getRelationshipTargetIds()) {
+				entry.writeRelationshipTargetLink(compileUrl(baseUrl, RESOURCE_ENTRY, id));
+			}
+		}
+
+		// write children
+		if ((children != null) && (children.size() > 0)) {
+			writeObjectChildren(entry, info, children, infoHolder, repositoryId, baseUrl);
+		}
+
+		// we are done
+		entry.endEntry();
+	}
+
+	/**
+	 * Writes an objects entry children feed.
+	 */
+	public static void writeObjectChildren(AtomEntry entry, ObjectInfo folderInfo,
+			List<ObjectInFolderContainer> children, ObjectInfoHolder infoHolder, String repositoryId, UrlBuilder baseUrl)
+			throws XMLStreamException, JAXBException {
+
+		// start
+		AtomFeed feed = new AtomFeed(entry.getWriter());
+		feed.startChildren();
+		feed.startFeed(false);
+
+		// write basic Atom feed elements
+		feed.writeFeedElements(folderInfo.getId(), folderInfo.getCreatedBy(), folderInfo.getName(), folderInfo
+				.getLastModificationDate(), null, null);
+
+		// write links
+		feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+		feed.writeSelfLink(compileUrl(baseUrl, RESOURCE_DESCENDANTS, folderInfo.getId()), null);
+
+		feed.writeViaLink(compileUrl(baseUrl, RESOURCE_ENTRY, folderInfo.getId()));
+
+		feed.writeDownLink(compileUrl(baseUrl, RESOURCE_CHILDREN, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+
+		feed.writeDownLink(compileUrl(baseUrl, RESOURCE_FOLDERTREE, folderInfo.getId()),
+				Constants.MEDIATYPE_DESCENDANTS);
+
+		feed.writeUpLink(compileUrl(baseUrl, RESOURCE_PARENTS, folderInfo.getId()), Constants.MEDIATYPE_FEED);
+
+		for (ObjectInFolderContainer container : children) {
+			if ((container != null) && (container.getObject() != null)) {
+				writeObjectEntry(entry, container.getObject().getObject(), infoHolder, container.getChildren(),
+						repositoryId, container.getObject().getPathSegment(), null, baseUrl, false);
+			}
+		}
+
+		// we are done
+		feed.endFeed();
+		feed.endChildren();
+	}
+
+	/**
+	 * Writes the a type entry.
+	 */
+	public static void writeTypeEntry(AtomEntry entry, TypeDefinition type, List<TypeDefinitionContainer> children,
+			String repositoryId, UrlBuilder baseUrl, boolean isRoot) throws XMLStreamException, JAXBException {
+
+		// start
+		entry.startEntry(isRoot);
+
+		// write type
+		entry.writeType(type);
+
+		// write links
+		entry.writeServiceLink(baseUrl.toString(), repositoryId);
+
+		entry.writeSelfLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()), type.getId());
+		entry.writeEnclosureLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()));
+		if (type.getParentTypeId() != null) {
+			entry.writeUpLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getParentTypeId()), Constants.MEDIATYPE_ENTRY);
+		}
+		UrlBuilder downLink = compileUrlBuilder(baseUrl, RESOURCE_TYPES, null);
+		downLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
+		entry.writeDownLink(downLink.toString(), Constants.MEDIATYPE_CHILDREN);
+		entry.writeDescribedByLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getBaseTypeId().value()));
+
+		// write children
+		if ((children != null) && (children.size() > 0)) {
+			writeTypeChildren(entry, type, children, repositoryId, baseUrl);
+		}
+
+		// we are done
+		entry.endEntry();
+	}
+
+	/**
+	 * Writes the a type entry children feed.
+	 */
+	private static void writeTypeChildren(AtomEntry entry, TypeDefinition type, List<TypeDefinitionContainer> children,
+			String repositoryId, UrlBuilder baseUrl) throws XMLStreamException, JAXBException {
+
+		// start
+		AtomFeed feed = new AtomFeed(entry.getWriter());
+		feed.startChildren();
+		feed.startFeed(false);
+
+		// write basic Atom feed elements
+		feed.writeFeedElements(type.getId(), TYPE_AUTHOR, type.getDisplayName(), new GregorianCalendar(), null, null);
+
+		feed.writeServiceLink(baseUrl.toString(), repositoryId);
+
+		UrlBuilder selfLink = compileUrlBuilder(baseUrl, RESOURCE_TYPESDESC, null);
+		selfLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
+		feed.writeSelfLink(selfLink.toString(), type.getId());
+
+		feed.writeViaLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getId()));
+
+		UrlBuilder downLink = compileUrlBuilder(baseUrl, RESOURCE_TYPES, null);
+		downLink.addParameter(Constants.PARAM_TYPE_ID, type.getId());
+		feed.writeDownLink(downLink.toString(), Constants.MEDIATYPE_FEED);
+
+		if (type.getParentTypeId() != null) {
+			feed.writeUpLink(compileUrl(baseUrl, RESOURCE_TYPE, type.getParentTypeId()), Constants.MEDIATYPE_ENTRY);
+		}
+
+		// write tree
+		for (TypeDefinitionContainer container : children) {
+			if ((container != null) && (container.getTypeDefinition() != null)) {
+				writeTypeEntry(entry, container.getTypeDefinition(), container.getChildren(), repositoryId, baseUrl,
+						false);
+			}
+		}
+
+		// we are done
+		feed.endFeed();
+		feed.endChildren();
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/BasicAuthCallContextHandler.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/BasicAuthCallContextHandler.java?rev=934896&r1=934895&r2=934896&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/BasicAuthCallContextHandler.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/BasicAuthCallContextHandler.java Fri Apr 16 14:14:00 2010
@@ -34,48 +34,47 @@ import org.apache.commons.codec.binary.B
  */
 public class BasicAuthCallContextHandler implements CallContextHandler {
 
-  /**
-   * Constructor.
-   */
-  public BasicAuthCallContextHandler() {
-  }
-
-  /*
-   * (non-Javadoc)
-   * 
-   * @seeorg.apache.opencmis.server.impl.atompub.CallContextHandler#getCallContextMap(javax.servlet.http.
-   * HttpServletRequest)
-   */
-  public Map<String, String> getCallContextMap(HttpServletRequest request) {
-    Map<String, String> result = null;
-
-    String authHeader = request.getHeader("Authorization");
-    if ((authHeader != null) && (authHeader.trim().toLowerCase().startsWith("basic "))) {
-      int x = authHeader.lastIndexOf(' ');
-      if (x == -1) {
-        return result;
-      }
-
-      String credentials = null;
-      try {
-        credentials = new String(Base64.decodeBase64(authHeader.substring(x + 1).getBytes(
-            "ISO-8859-1")), "ISO-8859-1");
-      }
-      catch (Exception e) {
-        return result;
-      }
-
-      x = credentials.indexOf(':');
-      if (x == -1) {
-        return result;
-      }
-
-      // extract user and password and add them to map
-      result = new HashMap<String, String>();
-      result.put(CallContext.USERNAME, credentials.substring(0, x));
-      result.put(CallContext.PASSWORD, credentials.substring(x + 1));
-    }
+	/**
+	 * Constructor.
+	 */
+	public BasicAuthCallContextHandler() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.apache.opencmis.server.impl.atompub.CallContextHandler#
+	 * getCallContextMap(javax.servlet.http. HttpServletRequest)
+	 */
+	public Map<String, String> getCallContextMap(HttpServletRequest request) {
+		Map<String, String> result = null;
+
+		String authHeader = request.getHeader("Authorization");
+		if ((authHeader != null) && (authHeader.trim().toLowerCase().startsWith("basic "))) {
+			int x = authHeader.lastIndexOf(' ');
+			if (x == -1) {
+				return result;
+			}
+
+			String credentials = null;
+			try {
+				credentials = new String(Base64.decodeBase64(authHeader.substring(x + 1).getBytes("ISO-8859-1")),
+						"ISO-8859-1");
+			} catch (Exception e) {
+				return result;
+			}
+
+			x = credentials.indexOf(':');
+			if (x == -1) {
+				return result;
+			}
+
+			// extract user and password and add them to map
+			result = new HashMap<String, String>();
+			result.put(CallContext.USERNAME, credentials.substring(0, x));
+			result.put(CallContext.PASSWORD, credentials.substring(x + 1));
+		}
 
-    return result;
-  }
+		return result;
+	}
 }

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CallContextHandler.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CallContextHandler.java?rev=934896&r1=934895&r2=934896&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CallContextHandler.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/atompub/CallContextHandler.java Fri Apr 16 14:14:00 2010
@@ -32,8 +32,8 @@ import org.apache.chemistry.opencmis.ser
  */
 public interface CallContextHandler {
 
-  /**
-   * Returns key-value pairs that will be added to the {@link CallContext}.
-   */
-  Map<String, String> getCallContextMap(HttpServletRequest request);
+	/**
+	 * Returns key-value pairs that will be added to the {@link CallContext}.
+	 */
+	Map<String, String> getCallContextMap(HttpServletRequest request);
 }



Mime
View raw message