You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by dc...@apache.org on 2010/04/22 18:04:22 UTC
svn commit: r936922 [5/18] - in
/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client:
chemistry-opencmis-client-api/src/main/java/org/apache/chemistry/opencmis/client/
chemistry-opencmis-client-api/src/main/java/org/apache/chemistry/opencmis/c...
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AtomPubParser.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AtomPubParser.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AtomPubParser.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/AtomPubParser.java Thu Apr 22 16:04:19 2010
@@ -57,541 +57,541 @@ import org.apache.chemistry.opencmis.com
*/
public class AtomPubParser implements CmisAtomPubConstants {
- // public constants
- public static final String LINK_REL_CONTENT = "@@content@@";
+ // public constants
+ public static final String LINK_REL_CONTENT = "@@content@@";
- private InputStream fStream;
- private AtomBase fParseResult;
+ private InputStream fStream;
+ private AtomBase fParseResult;
- public AtomPubParser(InputStream stream) {
- if (stream == null) {
- throw new IllegalArgumentException("No stream.");
- }
-
- fStream = stream;
- }
-
- /**
- * Parses the stream.
- */
- public void parse() throws Exception {
- XMLInputFactory factory = XMLInputFactory.newInstance();
- XMLStreamReader parser = factory.createXMLStreamReader(fStream);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
- if (TAG_FEED.equals(name.getLocalPart())) {
- fParseResult = parseFeed(parser);
- break;
- } else if (TAG_ENTRY.equals(name.getLocalPart())) {
- fParseResult = parseEntry(parser);
- break;
- }
- } else if (Constants.NAMESPACE_CMIS.equals(name.getNamespaceURI())) {
- if (TAG_ALLOWABLEACTIONS.equals(name.getLocalPart())) {
- fParseResult = parseAllowableActions(parser);
- break;
- } else if (TAG_ACL.equals(name.getLocalPart())) {
- fParseResult = parseACL(parser);
- break;
- }
- } else if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
- if (TAG_SERVICE.equals(name.getLocalPart())) {
- fParseResult = parseServiceDoc(parser);
- break;
- }
- }
- }
-
- if (!next(parser)) {
- break;
- }
- }
-
- parser.close();
- }
-
- /**
- * Return the parse results.
- */
- public AtomBase getResults() {
- return fParseResult;
- }
-
- /**
- * Parses a service document.
- */
- private ServiceDoc parseServiceDoc(XMLStreamReader parser) throws Exception {
- ServiceDoc result = new ServiceDoc();
-
- next(parser);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
- if (TAG_WORKSPACE.equals(name.getLocalPart())) {
- result.addWorkspace(parseWorkspace(parser));
- } else {
- skip(parser);
- }
- } else {
- skip(parser);
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- return result;
- }
-
- /**
- * Parses a workspace element in a service document.
- */
- private RepositoryWorkspace parseWorkspace(XMLStreamReader parser) throws Exception {
- RepositoryWorkspace workspace = new RepositoryWorkspace();
-
- next(parser);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- AtomElement element = parseWorkspaceElement(parser);
-
- // check if we can extract the workspace id
- if ((element != null) && (element.getObject() instanceof CmisRepositoryInfoType)) {
- workspace.setId(((CmisRepositoryInfoType) element.getObject()).getRepositoryId());
- }
-
- // add to workspace
- workspace.addElement(element);
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return workspace;
- }
-
- /**
- * Parses an Atom feed.
- */
- private AtomFeed parseFeed(XMLStreamReader parser) throws Exception {
- AtomFeed result = new AtomFeed();
-
- next(parser);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
- if (TAG_LINK.equals(name.getLocalPart())) {
- result.addElement(parseLink(parser));
- } else if (TAG_ENTRY.equals(name.getLocalPart())) {
- result.addEntry(parseEntry(parser));
- } else {
- skip(parser);
- }
- } else if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
- if (TAG_NUM_ITEMS.equals(name.getLocalPart())) {
- result.addElement(parseBigInteger(parser));
- } else {
- skip(parser);
- }
- } else {
- skip(parser);
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return result;
- }
-
- /**
- * Parses an Atom entry.
- */
- private AtomEntry parseEntry(XMLStreamReader parser) throws Exception {
- AtomEntry result = new AtomEntry();
-
- next(parser);
-
- // walk through all tags in entry
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- AtomElement element = parseElement(parser);
- if (element != null) {
- // add to entry
- result.addElement(element);
-
- // find and set object id
- if (element.getObject() instanceof CmisObjectType) {
- for (CmisProperty prop : ((CmisObjectType) element.getObject()).getProperties().getProperty()) {
- if (EnumPropertiesBase.CMIS_OBJECT_ID.value().equals(prop.getPropertyDefinitionId())) {
- result.setId(((CmisPropertyId) prop).getValue().get(0));
- }
- }
- } else if (element.getObject() instanceof CmisTypeDefinitionType) {
- result.setId(((CmisTypeDefinitionType) element.getObject()).getId());
- }
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return result;
- }
-
- /**
- * Parses an Allowable Actions document.
- */
- private AtomAllowableActions parseAllowableActions(XMLStreamReader parser) throws Exception {
- AtomElement elemenet = unmarshalElement(parser, CmisAllowableActionsType.class);
- return new AtomAllowableActions((CmisAllowableActionsType) elemenet.getObject());
- }
-
- /**
- * Parses an ACL document.
- */
- private AtomAcl parseACL(XMLStreamReader parser) throws Exception {
- AtomElement elemenet = unmarshalElement(parser, CmisAccessControlListType.class);
- return new AtomAcl((CmisAccessControlListType) elemenet.getObject());
- }
-
- /**
- * Parses an element.
- */
- private AtomElement parseElement(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
- if (TAG_OBJECT.equals(name.getLocalPart())) {
- return unmarshalElement(parser, CmisObjectType.class);
- } else if (TAG_PATH_SEGMENT.equals(name.getLocalPart())
- || TAG_RELATIVE_PATH_SEGMENT.equals(name.getLocalPart())) {
- return parseText(parser);
- } else if (TAG_TYPE.equals(name.getLocalPart())) {
- return unmarshalElement(parser, CmisTypeDefinitionType.class);
- } else if (TAG_CHILDREN.equals(name.getLocalPart())) {
- return parseChildren(parser);
- }
- } else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
- if (TAG_LINK.equals(name.getLocalPart())) {
- return parseLink(parser);
- } else if (TAG_CONTENT.equals(name.getLocalPart())) {
- return parseAtomContentSrc(parser);
- }
- }
-
- // we don't know it - skip it
- skip(parser);
-
- return null;
- }
-
- /**
- * Unmarshals a JAXB element.
- */
- private <T> AtomElement unmarshalElement(XMLStreamReader parser, Class<T> cmisType) throws Exception {
- QName name = parser.getName();
-
- Unmarshaller u = JaxBHelper.createUnmarshaller();
- JAXBElement<T> object = u.unmarshal(parser, cmisType);
-
- return new AtomElement(name, object.getValue());
- }
-
- /**
- * Parses a children element.
- */
- private AtomElement parseChildren(XMLStreamReader parser) throws Exception {
- AtomElement result = null;
- QName childName = parser.getName();
-
- next(parser);
-
- // walk through the children tag
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
- if (TAG_FEED.equals(name.getLocalPart())) {
- result = new AtomElement(childName, parseFeed(parser));
- } else {
- skip(parser);
- }
- } else {
- skip(parser);
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return result;
- }
-
- /**
- * Parses a workspace element.
- */
- private AtomElement parseWorkspaceElement(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
-
- if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
- if (TAG_REPOSITORY_INFO.equals(name.getLocalPart())) {
- return unmarshalElement(parser, CmisRepositoryInfoType.class);
- } else if (TAG_URI_TEMPLATE.equals(name.getLocalPart())) {
- return parseTemplate(parser);
- }
- } else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
- if (TAG_LINK.equals(name.getLocalPart())) {
- return parseLink(parser);
- }
- } else if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
- if (TAG_COLLECTION.equals(name.getLocalPart())) {
- return parseCollection(parser);
- }
- }
-
- // we don't know it - skip it
- skip(parser);
-
- return null;
- }
-
- /**
- * Parses a collection tag.
- */
- private AtomElement parseCollection(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- Map<String, String> result = new HashMap<String, String>();
-
- result.put("href", parser.getAttributeValue(null, "href"));
-
- next(parser);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName tagName = parser.getName();
- if (Constants.NAMESPACE_RESTATOM.equals(tagName.getNamespaceURI())
- && TAG_COLLECTION_TYPE.equals(tagName.getLocalPart())) {
- result.put("collectionType", readText(parser));
- } else {
- skip(parser);
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return new AtomElement(name, result);
- }
-
- /**
- * Parses a template tag.
- */
- private AtomElement parseTemplate(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- Map<String, String> result = new HashMap<String, String>();
-
- next(parser);
-
- while (true) {
- int event = parser.getEventType();
- if (event == XMLStreamReader.START_ELEMENT) {
- QName tagName = parser.getName();
- if (Constants.NAMESPACE_RESTATOM.equals(tagName.getNamespaceURI())) {
- if (TAG_TEMPLATE_TEMPLATE.equals(tagName.getLocalPart())) {
- result.put("template", readText(parser));
- } else if (TAG_TEMPLATE_TYPE.equals(tagName.getLocalPart())) {
- result.put("type", readText(parser));
- } else {
- skip(parser);
- }
- } else {
- skip(parser);
- }
- } else if (event == XMLStreamReader.END_ELEMENT) {
- break;
- } else {
- if (!next(parser)) {
- break;
- }
- }
- }
-
- next(parser);
-
- return new AtomElement(name, result);
- }
-
- /**
- * Parses a link tag.
- */
- private AtomElement parseLink(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- AtomLink result = new AtomLink();
-
- // save attributes
- for (int i = 0; i < parser.getAttributeCount(); i++) {
- if (LINK_REL.equals(parser.getAttributeLocalName(i))) {
- result.setRel(parser.getAttributeValue(i));
- } else if (LINK_HREF.equals(parser.getAttributeLocalName(i))) {
- result.setHref(parser.getAttributeValue(i));
- } else if (LINK_TYPE.equals(parser.getAttributeLocalName(i))) {
- result.setType(parser.getAttributeValue(i));
- }
- }
-
- // skip enclosed tags, if any
- skip(parser);
-
- return new AtomElement(name, result);
- }
-
- /**
- * Parses a link tag.
- */
- private AtomElement parseAtomContentSrc(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- AtomLink result = new AtomLink();
- result.setRel(LINK_REL_CONTENT);
-
- // save attributes
- for (int i = 0; i < parser.getAttributeCount(); i++) {
- if (CONTENT_SRC.equals(parser.getAttributeLocalName(i))) {
- result.setHref(parser.getAttributeValue(i));
- }
- }
-
- // skip enclosed tags, if any
- skip(parser);
-
- return new AtomElement(name, result);
- }
-
- /**
- * Parses a text tag.
- */
- private AtomElement parseText(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- return new AtomElement(name, readText(parser));
- }
-
- /**
- * Parses a text tag and convert it into an integer.
- */
- private AtomElement parseBigInteger(XMLStreamReader parser) throws Exception {
- QName name = parser.getName();
- return new AtomElement(name, new BigInteger(readText(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();
- }
-
- /**
- * 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;
- }
+ public AtomPubParser(InputStream stream) {
+ if (stream == null) {
+ throw new IllegalArgumentException("No stream.");
+ }
+
+ fStream = stream;
+ }
+
+ /**
+ * Parses the stream.
+ */
+ public void parse() throws Exception {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ XMLStreamReader parser = factory.createXMLStreamReader(fStream);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+ if (TAG_FEED.equals(name.getLocalPart())) {
+ fParseResult = parseFeed(parser);
+ break;
+ } else if (TAG_ENTRY.equals(name.getLocalPart())) {
+ fParseResult = parseEntry(parser);
+ break;
+ }
+ } else if (Constants.NAMESPACE_CMIS.equals(name.getNamespaceURI())) {
+ if (TAG_ALLOWABLEACTIONS.equals(name.getLocalPart())) {
+ fParseResult = parseAllowableActions(parser);
+ break;
+ } else if (TAG_ACL.equals(name.getLocalPart())) {
+ fParseResult = parseACL(parser);
+ break;
+ }
+ } else if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
+ if (TAG_SERVICE.equals(name.getLocalPart())) {
+ fParseResult = parseServiceDoc(parser);
+ break;
+ }
+ }
+ }
+
+ if (!next(parser)) {
+ break;
+ }
+ }
+
+ parser.close();
+ }
+
+ /**
+ * Return the parse results.
+ */
+ public AtomBase getResults() {
+ return fParseResult;
+ }
+
+ /**
+ * Parses a service document.
+ */
+ private ServiceDoc parseServiceDoc(XMLStreamReader parser) throws Exception {
+ ServiceDoc result = new ServiceDoc();
+
+ next(parser);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
+ if (TAG_WORKSPACE.equals(name.getLocalPart())) {
+ result.addWorkspace(parseWorkspace(parser));
+ } else {
+ skip(parser);
+ }
+ } else {
+ skip(parser);
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Parses a workspace element in a service document.
+ */
+ private RepositoryWorkspace parseWorkspace(XMLStreamReader parser) throws Exception {
+ RepositoryWorkspace workspace = new RepositoryWorkspace();
+
+ next(parser);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ AtomElement element = parseWorkspaceElement(parser);
+
+ // check if we can extract the workspace id
+ if ((element != null) && (element.getObject() instanceof CmisRepositoryInfoType)) {
+ workspace.setId(((CmisRepositoryInfoType) element.getObject()).getRepositoryId());
+ }
+
+ // add to workspace
+ workspace.addElement(element);
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return workspace;
+ }
+
+ /**
+ * Parses an Atom feed.
+ */
+ private AtomFeed parseFeed(XMLStreamReader parser) throws Exception {
+ AtomFeed result = new AtomFeed();
+
+ next(parser);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+ if (TAG_LINK.equals(name.getLocalPart())) {
+ result.addElement(parseLink(parser));
+ } else if (TAG_ENTRY.equals(name.getLocalPart())) {
+ result.addEntry(parseEntry(parser));
+ } else {
+ skip(parser);
+ }
+ } else if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
+ if (TAG_NUM_ITEMS.equals(name.getLocalPart())) {
+ result.addElement(parseBigInteger(parser));
+ } else {
+ skip(parser);
+ }
+ } else {
+ skip(parser);
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return result;
+ }
+
+ /**
+ * Parses an Atom entry.
+ */
+ private AtomEntry parseEntry(XMLStreamReader parser) throws Exception {
+ AtomEntry result = new AtomEntry();
+
+ next(parser);
+
+ // walk through all tags in entry
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ AtomElement element = parseElement(parser);
+ if (element != null) {
+ // add to entry
+ result.addElement(element);
+
+ // find and set object id
+ if (element.getObject() instanceof CmisObjectType) {
+ for (CmisProperty prop : ((CmisObjectType) element.getObject()).getProperties().getProperty()) {
+ if (EnumPropertiesBase.CMIS_OBJECT_ID.value().equals(prop.getPropertyDefinitionId())) {
+ result.setId(((CmisPropertyId) prop).getValue().get(0));
+ }
+ }
+ } else if (element.getObject() instanceof CmisTypeDefinitionType) {
+ result.setId(((CmisTypeDefinitionType) element.getObject()).getId());
+ }
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return result;
+ }
+
+ /**
+ * Parses an Allowable Actions document.
+ */
+ private AtomAllowableActions parseAllowableActions(XMLStreamReader parser) throws Exception {
+ AtomElement elemenet = unmarshalElement(parser, CmisAllowableActionsType.class);
+ return new AtomAllowableActions((CmisAllowableActionsType) elemenet.getObject());
+ }
+
+ /**
+ * Parses an ACL document.
+ */
+ private AtomAcl parseACL(XMLStreamReader parser) throws Exception {
+ AtomElement elemenet = unmarshalElement(parser, CmisAccessControlListType.class);
+ return new AtomAcl((CmisAccessControlListType) elemenet.getObject());
+ }
+
+ /**
+ * Parses an element.
+ */
+ private AtomElement parseElement(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
+ if (TAG_OBJECT.equals(name.getLocalPart())) {
+ return unmarshalElement(parser, CmisObjectType.class);
+ } else if (TAG_PATH_SEGMENT.equals(name.getLocalPart())
+ || TAG_RELATIVE_PATH_SEGMENT.equals(name.getLocalPart())) {
+ return parseText(parser);
+ } else if (TAG_TYPE.equals(name.getLocalPart())) {
+ return unmarshalElement(parser, CmisTypeDefinitionType.class);
+ } else if (TAG_CHILDREN.equals(name.getLocalPart())) {
+ return parseChildren(parser);
+ }
+ } else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+ if (TAG_LINK.equals(name.getLocalPart())) {
+ return parseLink(parser);
+ } else if (TAG_CONTENT.equals(name.getLocalPart())) {
+ return parseAtomContentSrc(parser);
+ }
+ }
+
+ // we don't know it - skip it
+ skip(parser);
+
+ return null;
+ }
+
+ /**
+ * Unmarshals a JAXB element.
+ */
+ private <T> AtomElement unmarshalElement(XMLStreamReader parser, Class<T> cmisType) throws Exception {
+ QName name = parser.getName();
+
+ Unmarshaller u = JaxBHelper.createUnmarshaller();
+ JAXBElement<T> object = u.unmarshal(parser, cmisType);
+
+ return new AtomElement(name, object.getValue());
+ }
+
+ /**
+ * Parses a children element.
+ */
+ private AtomElement parseChildren(XMLStreamReader parser) throws Exception {
+ AtomElement result = null;
+ QName childName = parser.getName();
+
+ next(parser);
+
+ // walk through the children tag
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+ if (TAG_FEED.equals(name.getLocalPart())) {
+ result = new AtomElement(childName, parseFeed(parser));
+ } else {
+ skip(parser);
+ }
+ } else {
+ skip(parser);
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return result;
+ }
+
+ /**
+ * Parses a workspace element.
+ */
+ private AtomElement parseWorkspaceElement(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+
+ if (Constants.NAMESPACE_RESTATOM.equals(name.getNamespaceURI())) {
+ if (TAG_REPOSITORY_INFO.equals(name.getLocalPart())) {
+ return unmarshalElement(parser, CmisRepositoryInfoType.class);
+ } else if (TAG_URI_TEMPLATE.equals(name.getLocalPart())) {
+ return parseTemplate(parser);
+ }
+ } else if (Constants.NAMESPACE_ATOM.equals(name.getNamespaceURI())) {
+ if (TAG_LINK.equals(name.getLocalPart())) {
+ return parseLink(parser);
+ }
+ } else if (Constants.NAMESPACE_APP.equals(name.getNamespaceURI())) {
+ if (TAG_COLLECTION.equals(name.getLocalPart())) {
+ return parseCollection(parser);
+ }
+ }
+
+ // we don't know it - skip it
+ skip(parser);
+
+ return null;
+ }
+
+ /**
+ * Parses a collection tag.
+ */
+ private AtomElement parseCollection(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ Map<String, String> result = new HashMap<String, String>();
+
+ result.put("href", parser.getAttributeValue(null, "href"));
+
+ next(parser);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName tagName = parser.getName();
+ if (Constants.NAMESPACE_RESTATOM.equals(tagName.getNamespaceURI())
+ && TAG_COLLECTION_TYPE.equals(tagName.getLocalPart())) {
+ result.put("collectionType", readText(parser));
+ } else {
+ skip(parser);
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return new AtomElement(name, result);
+ }
+
+ /**
+ * Parses a template tag.
+ */
+ private AtomElement parseTemplate(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ Map<String, String> result = new HashMap<String, String>();
+
+ next(parser);
+
+ while (true) {
+ int event = parser.getEventType();
+ if (event == XMLStreamReader.START_ELEMENT) {
+ QName tagName = parser.getName();
+ if (Constants.NAMESPACE_RESTATOM.equals(tagName.getNamespaceURI())) {
+ if (TAG_TEMPLATE_TEMPLATE.equals(tagName.getLocalPart())) {
+ result.put("template", readText(parser));
+ } else if (TAG_TEMPLATE_TYPE.equals(tagName.getLocalPart())) {
+ result.put("type", readText(parser));
+ } else {
+ skip(parser);
+ }
+ } else {
+ skip(parser);
+ }
+ } else if (event == XMLStreamReader.END_ELEMENT) {
+ break;
+ } else {
+ if (!next(parser)) {
+ break;
+ }
+ }
+ }
+
+ next(parser);
+
+ return new AtomElement(name, result);
+ }
+
+ /**
+ * Parses a link tag.
+ */
+ private AtomElement parseLink(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ AtomLink result = new AtomLink();
+
+ // save attributes
+ for (int i = 0; i < parser.getAttributeCount(); i++) {
+ if (LINK_REL.equals(parser.getAttributeLocalName(i))) {
+ result.setRel(parser.getAttributeValue(i));
+ } else if (LINK_HREF.equals(parser.getAttributeLocalName(i))) {
+ result.setHref(parser.getAttributeValue(i));
+ } else if (LINK_TYPE.equals(parser.getAttributeLocalName(i))) {
+ result.setType(parser.getAttributeValue(i));
+ }
+ }
+
+ // skip enclosed tags, if any
+ skip(parser);
+
+ return new AtomElement(name, result);
+ }
+
+ /**
+ * Parses a link tag.
+ */
+ private AtomElement parseAtomContentSrc(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ AtomLink result = new AtomLink();
+ result.setRel(LINK_REL_CONTENT);
+
+ // save attributes
+ for (int i = 0; i < parser.getAttributeCount(); i++) {
+ if (CONTENT_SRC.equals(parser.getAttributeLocalName(i))) {
+ result.setHref(parser.getAttributeValue(i));
+ }
+ }
+
+ // skip enclosed tags, if any
+ skip(parser);
+
+ return new AtomElement(name, result);
+ }
+
+ /**
+ * Parses a text tag.
+ */
+ private AtomElement parseText(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ return new AtomElement(name, readText(parser));
+ }
+
+ /**
+ * Parses a text tag and convert it into an integer.
+ */
+ private AtomElement parseBigInteger(XMLStreamReader parser) throws Exception {
+ QName name = parser.getName();
+ return new AtomElement(name, new BigInteger(readText(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();
+ }
+
+ /**
+ * 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;
+ }
}
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubConstants.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubConstants.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubConstants.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubConstants.java Thu Apr 22 16:04:19 2010
@@ -24,46 +24,46 @@ package org.apache.chemistry.opencmis.cl
*/
public interface CmisAtomPubConstants {
- // service doc
- String TAG_SERVICE = "service";
- String TAG_WORKSPACE = "workspace";
- String TAG_REPOSITORY_INFO = "repositoryInfo";
- String TAG_COLLECTION = "collection";
- String TAG_COLLECTION_TYPE = "collectionType";
- String TAG_URI_TEMPLATE = "uritemplate";
- String TAG_TEMPLATE_TEMPLATE = "template";
- String TAG_TEMPLATE_TYPE = "type";
- String TAG_LINK = "link";
-
- // atom
- String TAG_ATOM_ID = "id";
- String TAG_ATOM_TITLE = "title";
- String TAG_ATOM_UPDATED = "updated";
-
- // feed
- String TAG_FEED = "feed";
-
- // entry
- String TAG_ENTRY = "entry";
- String TAG_OBJECT = "object";
- String TAG_NUM_ITEMS = "numItems";
- String TAG_PATH_SEGMENT = "pathSegment";
- String TAG_RELATIVE_PATH_SEGMENT = "relativePathSegment";
- String TAG_TYPE = "type";
- String TAG_CHILDREN = "children";
- String TAG_CONTENT = "content";
- String TAG_CONTENT_MEDIATYPE = "mediatype";
- String TAG_CONTENT_BASE64 = "base64";
-
- // allowable actions
- String TAG_ALLOWABLEACTIONS = "allowableActions";
-
- // ACL
- String TAG_ACL = "acl";
-
- // links
- String LINK_REL = "rel";
- String LINK_HREF = "href";
- String LINK_TYPE = "type";
- String CONTENT_SRC = "src";
+ // service doc
+ String TAG_SERVICE = "service";
+ String TAG_WORKSPACE = "workspace";
+ String TAG_REPOSITORY_INFO = "repositoryInfo";
+ String TAG_COLLECTION = "collection";
+ String TAG_COLLECTION_TYPE = "collectionType";
+ String TAG_URI_TEMPLATE = "uritemplate";
+ String TAG_TEMPLATE_TEMPLATE = "template";
+ String TAG_TEMPLATE_TYPE = "type";
+ String TAG_LINK = "link";
+
+ // atom
+ String TAG_ATOM_ID = "id";
+ String TAG_ATOM_TITLE = "title";
+ String TAG_ATOM_UPDATED = "updated";
+
+ // feed
+ String TAG_FEED = "feed";
+
+ // entry
+ String TAG_ENTRY = "entry";
+ String TAG_OBJECT = "object";
+ String TAG_NUM_ITEMS = "numItems";
+ String TAG_PATH_SEGMENT = "pathSegment";
+ String TAG_RELATIVE_PATH_SEGMENT = "relativePathSegment";
+ String TAG_TYPE = "type";
+ String TAG_CHILDREN = "children";
+ String TAG_CONTENT = "content";
+ String TAG_CONTENT_MEDIATYPE = "mediatype";
+ String TAG_CONTENT_BASE64 = "base64";
+
+ // allowable actions
+ String TAG_ALLOWABLEACTIONS = "allowableActions";
+
+ // ACL
+ String TAG_ACL = "acl";
+
+ // links
+ String LINK_REL = "rel";
+ String LINK_HREF = "href";
+ String LINK_TYPE = "type";
+ String CONTENT_SRC = "src";
}
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubSpi.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubSpi.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubSpi.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/CmisAtomPubSpi.java Thu Apr 22 16:04:19 2010
@@ -38,96 +38,96 @@ import org.apache.commons.logging.LogFac
*/
public class CmisAtomPubSpi implements CmisSpiFactory, CmisSpi {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- private static Log log = LogFactory.getLog(CmisAtomPubSpi.class);
+ private static Log log = LogFactory.getLog(CmisAtomPubSpi.class);
- private Session session;
+ private Session session;
- private RepositoryService repositoryService;
- private NavigationService navigationService;
- private ObjectService objectService;
- private VersioningService versioningService;
- private DiscoveryService discoveryService;
- private MultiFilingService multiFilingService;
- private RelationshipService relationshipService;
- private PolicyService policyService;
- private AclService aclService;
-
- /**
- * Constructor.
- */
- public CmisAtomPubSpi() {
- }
-
- public CmisSpi getSpiInstance(Session session) {
- if (log.isDebugEnabled()) {
- log.debug("Initializing AtomPub SPI...");
- }
-
- this.session = session;
-
- repositoryService = new RepositoryServiceImpl(session);
- navigationService = new NavigationServiceImpl(session);
- objectService = new ObjectServiceImpl(session);
- versioningService = new VersioningServiceImpl(session);
- discoveryService = new DiscoveryServiceImpl(session);
- multiFilingService = new MultiFilingServiceImpl(session);
- relationshipService = new RelationshipServiceImpl(session);
- policyService = new PolicyServiceImpl(session);
- aclService = new AclServiceImpl(session);
-
- return this;
- }
-
- public RepositoryService getRepositoryService() {
- return repositoryService;
- }
-
- public NavigationService getNavigationService() {
- return navigationService;
- }
-
- public ObjectService getObjectService() {
- return objectService;
- }
-
- public DiscoveryService getDiscoveryService() {
- return discoveryService;
- }
-
- public VersioningService getVersioningService() {
- return versioningService;
- }
-
- public MultiFilingService getMultiFilingService() {
- return multiFilingService;
- }
-
- public RelationshipService getRelationshipService() {
- return relationshipService;
- }
-
- public PolicyService getPolicyService() {
- return policyService;
- }
-
- public AclService getAclService() {
- return aclService;
- }
-
- public void clearAllCaches() {
- session.remove(SpiSessionParameter.LINK_CACHE);
- }
-
- public void clearRepositoryCache(String repositoryId) {
- LinkCache linkCache = (LinkCache) session.get(SpiSessionParameter.LINK_CACHE);
- if (linkCache != null) {
- linkCache.clearRepository(repositoryId);
- }
- }
-
- public void close() {
- // no-op for AtomPub
- }
+ private RepositoryService repositoryService;
+ private NavigationService navigationService;
+ private ObjectService objectService;
+ private VersioningService versioningService;
+ private DiscoveryService discoveryService;
+ private MultiFilingService multiFilingService;
+ private RelationshipService relationshipService;
+ private PolicyService policyService;
+ private AclService aclService;
+
+ /**
+ * Constructor.
+ */
+ public CmisAtomPubSpi() {
+ }
+
+ public CmisSpi getSpiInstance(Session session) {
+ if (log.isDebugEnabled()) {
+ log.debug("Initializing AtomPub SPI...");
+ }
+
+ this.session = session;
+
+ repositoryService = new RepositoryServiceImpl(session);
+ navigationService = new NavigationServiceImpl(session);
+ objectService = new ObjectServiceImpl(session);
+ versioningService = new VersioningServiceImpl(session);
+ discoveryService = new DiscoveryServiceImpl(session);
+ multiFilingService = new MultiFilingServiceImpl(session);
+ relationshipService = new RelationshipServiceImpl(session);
+ policyService = new PolicyServiceImpl(session);
+ aclService = new AclServiceImpl(session);
+
+ return this;
+ }
+
+ public RepositoryService getRepositoryService() {
+ return repositoryService;
+ }
+
+ public NavigationService getNavigationService() {
+ return navigationService;
+ }
+
+ public ObjectService getObjectService() {
+ return objectService;
+ }
+
+ public DiscoveryService getDiscoveryService() {
+ return discoveryService;
+ }
+
+ public VersioningService getVersioningService() {
+ return versioningService;
+ }
+
+ public MultiFilingService getMultiFilingService() {
+ return multiFilingService;
+ }
+
+ public RelationshipService getRelationshipService() {
+ return relationshipService;
+ }
+
+ public PolicyService getPolicyService() {
+ return policyService;
+ }
+
+ public AclService getAclService() {
+ return aclService;
+ }
+
+ public void clearAllCaches() {
+ session.remove(SpiSessionParameter.LINK_CACHE);
+ }
+
+ public void clearRepositoryCache(String repositoryId) {
+ LinkCache linkCache = (LinkCache) session.get(SpiSessionParameter.LINK_CACHE);
+ if (linkCache != null) {
+ linkCache.clearRepository(repositoryId);
+ }
+ }
+
+ public void close() {
+ // no-op for AtomPub
+ }
}
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/DiscoveryServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/DiscoveryServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/DiscoveryServiceImpl.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/DiscoveryServiceImpl.java Thu Apr 22 16:04:19 2010
@@ -52,153 +52,153 @@ import org.apache.chemistry.opencmis.com
*/
public class DiscoveryServiceImpl extends AbstractAtomPubService implements DiscoveryService {
- /**
- * Constructor.
- */
- public DiscoveryServiceImpl(Session session) {
- setSession(session);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.apache.opencmis.client.provider.DiscoveryService#getContentChanges
- * (java.lang.String, org.apache.opencmis.client.provider.Holder,
- * java.lang.Boolean, java.lang.String, java.lang.Boolean,
- * java.lang.Boolean, java.math.BigInteger,
- * org.apache.opencmis.client.provider.ExtensionsData)
- */
- public ObjectList getContentChanges(String repositoryId, Holder<String> changeLogToken, Boolean includeProperties,
- String filter, Boolean includePolicyIds, Boolean includeACL, BigInteger maxItems, ExtensionsData extension) {
- ObjectListImpl result = new ObjectListImpl();
-
- // find the link
- String link = loadRepositoryLink(repositoryId, Constants.REP_REL_CHANGES);
-
- if (link == null) {
- throw new CmisObjectNotFoundException("Unknown repository or content changes not supported!");
- }
-
- UrlBuilder url = new UrlBuilder(link);
- url.addParameter(Constants.PARAM_CHANGE_LOG_TOKEN, (changeLogToken == null ? null : changeLogToken.getValue()));
- url.addParameter(Constants.PARAM_PROPERTIES, includeProperties);
- url.addParameter(Constants.PARAM_FILTER, filter);
- url.addParameter(Constants.PARAM_POLICY_IDS, includePolicyIds);
- url.addParameter(Constants.PARAM_ACL, includeACL);
- url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
-
- // read and parse
- HttpUtils.Response resp = read(url);
- AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
-
- // handle top level
- for (AtomElement element : feed.getElements()) {
- if (element.getObject() instanceof AtomLink) {
- if (isNextLink(element)) {
- result.setHasMoreItems(Boolean.TRUE);
- }
- } else if (isInt(NAME_NUM_ITEMS, element)) {
- result.setNumItems((BigInteger) element.getObject());
- }
- }
-
- // get the changes
- if (!feed.getEntries().isEmpty()) {
- result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
-
- for (AtomEntry entry : feed.getEntries()) {
- ObjectData hit = null;
-
- // walk through the entry
- for (AtomElement element : entry.getElements()) {
- if (element.getObject() instanceof CmisObjectType) {
- hit = convert((CmisObjectType) element.getObject());
- }
- }
-
- if (hit != null) {
- result.getObjects().add(hit);
- }
- }
- }
-
- return result;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.apache.opencmis.client.provider.DiscoveryService#query(java.lang.
- * String, java.lang.String, java.lang.Boolean, java.lang.Boolean,
- * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
- * java.math.BigInteger, java.math.BigInteger,
- * org.apache.opencmis.client.provider.ExtensionsData)
- */
- public ObjectList query(String repositoryId, String statement, Boolean searchAllVersions,
- Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
- BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
- ObjectListImpl result = new ObjectListImpl();
-
- // find the link
- String link = loadCollection(repositoryId, Constants.COLLECTION_QUERY);
-
- if (link == null) {
- throw new CmisObjectNotFoundException("Unknown repository or query not supported!");
- }
-
- UrlBuilder url = new UrlBuilder(link);
-
- // compile query request
- final CmisQueryType query = new CmisQueryType();
- query.setStatement(statement);
- query.setSearchAllVersions(searchAllVersions);
- query.setIncludeAllowableActions(includeAllowableActions);
- query.setIncludeRelationships(convert(EnumIncludeRelationships.class, includeRelationships));
- query.setRenditionFilter(renditionFilter);
- query.setMaxItems(maxItems);
- query.setSkipCount(skipCount);
-
- // post the query and parse results
- HttpUtils.Response resp = post(url, Constants.MEDIATYPE_QUERY, new HttpUtils.Output() {
- public void write(OutputStream out) throws Exception {
- JaxBHelper.marshal(JaxBHelper.CMIS_OBJECT_FACTORY.createQuery(query), out, false);
- }
- });
- AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
-
- // handle top level
- for (AtomElement element : feed.getElements()) {
- if (element.getObject() instanceof AtomLink) {
- if (isNextLink(element)) {
- result.setHasMoreItems(Boolean.TRUE);
- }
- } else if (isInt(NAME_NUM_ITEMS, element)) {
- result.setNumItems((BigInteger) element.getObject());
- }
- }
-
- // get the result set
- if (!feed.getEntries().isEmpty()) {
- result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
-
- for (AtomEntry entry : feed.getEntries()) {
- ObjectData hit = null;
-
- // walk through the entry
- for (AtomElement element : entry.getElements()) {
- if (element.getObject() instanceof CmisObjectType) {
- hit = convert((CmisObjectType) element.getObject());
- }
- }
-
- if (hit != null) {
- result.getObjects().add(hit);
- }
- }
- }
+ /**
+ * Constructor.
+ */
+ public DiscoveryServiceImpl(Session session) {
+ setSession(session);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.opencmis.client.provider.DiscoveryService#getContentChanges
+ * (java.lang.String, org.apache.opencmis.client.provider.Holder,
+ * java.lang.Boolean, java.lang.String, java.lang.Boolean,
+ * java.lang.Boolean, java.math.BigInteger,
+ * org.apache.opencmis.client.provider.ExtensionsData)
+ */
+ public ObjectList getContentChanges(String repositoryId, Holder<String> changeLogToken, Boolean includeProperties,
+ String filter, Boolean includePolicyIds, Boolean includeACL, BigInteger maxItems, ExtensionsData extension) {
+ ObjectListImpl result = new ObjectListImpl();
+
+ // find the link
+ String link = loadRepositoryLink(repositoryId, Constants.REP_REL_CHANGES);
+
+ if (link == null) {
+ throw new CmisObjectNotFoundException("Unknown repository or content changes not supported!");
+ }
+
+ UrlBuilder url = new UrlBuilder(link);
+ url.addParameter(Constants.PARAM_CHANGE_LOG_TOKEN, (changeLogToken == null ? null : changeLogToken.getValue()));
+ url.addParameter(Constants.PARAM_PROPERTIES, includeProperties);
+ url.addParameter(Constants.PARAM_FILTER, filter);
+ url.addParameter(Constants.PARAM_POLICY_IDS, includePolicyIds);
+ url.addParameter(Constants.PARAM_ACL, includeACL);
+ url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems);
+
+ // read and parse
+ HttpUtils.Response resp = read(url);
+ AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
+
+ // handle top level
+ for (AtomElement element : feed.getElements()) {
+ if (element.getObject() instanceof AtomLink) {
+ if (isNextLink(element)) {
+ result.setHasMoreItems(Boolean.TRUE);
+ }
+ } else if (isInt(NAME_NUM_ITEMS, element)) {
+ result.setNumItems((BigInteger) element.getObject());
+ }
+ }
+
+ // get the changes
+ if (!feed.getEntries().isEmpty()) {
+ result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
+
+ for (AtomEntry entry : feed.getEntries()) {
+ ObjectData hit = null;
+
+ // walk through the entry
+ for (AtomElement element : entry.getElements()) {
+ if (element.getObject() instanceof CmisObjectType) {
+ hit = convert((CmisObjectType) element.getObject());
+ }
+ }
+
+ if (hit != null) {
+ result.getObjects().add(hit);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.opencmis.client.provider.DiscoveryService#query(java.lang.
+ * String, java.lang.String, java.lang.Boolean, java.lang.Boolean,
+ * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String,
+ * java.math.BigInteger, java.math.BigInteger,
+ * org.apache.opencmis.client.provider.ExtensionsData)
+ */
+ public ObjectList query(String repositoryId, String statement, Boolean searchAllVersions,
+ Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
+ BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) {
+ ObjectListImpl result = new ObjectListImpl();
+
+ // find the link
+ String link = loadCollection(repositoryId, Constants.COLLECTION_QUERY);
+
+ if (link == null) {
+ throw new CmisObjectNotFoundException("Unknown repository or query not supported!");
+ }
+
+ UrlBuilder url = new UrlBuilder(link);
+
+ // compile query request
+ final CmisQueryType query = new CmisQueryType();
+ query.setStatement(statement);
+ query.setSearchAllVersions(searchAllVersions);
+ query.setIncludeAllowableActions(includeAllowableActions);
+ query.setIncludeRelationships(convert(EnumIncludeRelationships.class, includeRelationships));
+ query.setRenditionFilter(renditionFilter);
+ query.setMaxItems(maxItems);
+ query.setSkipCount(skipCount);
+
+ // post the query and parse results
+ HttpUtils.Response resp = post(url, Constants.MEDIATYPE_QUERY, new HttpUtils.Output() {
+ public void write(OutputStream out) throws Exception {
+ JaxBHelper.marshal(JaxBHelper.CMIS_OBJECT_FACTORY.createQuery(query), out, false);
+ }
+ });
+ AtomFeed feed = parse(resp.getStream(), AtomFeed.class);
+
+ // handle top level
+ for (AtomElement element : feed.getElements()) {
+ if (element.getObject() instanceof AtomLink) {
+ if (isNextLink(element)) {
+ result.setHasMoreItems(Boolean.TRUE);
+ }
+ } else if (isInt(NAME_NUM_ITEMS, element)) {
+ result.setNumItems((BigInteger) element.getObject());
+ }
+ }
+
+ // get the result set
+ if (!feed.getEntries().isEmpty()) {
+ result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size()));
+
+ for (AtomEntry entry : feed.getEntries()) {
+ ObjectData hit = null;
+
+ // walk through the entry
+ for (AtomElement element : entry.getElements()) {
+ if (element.getObject() instanceof CmisObjectType) {
+ hit = convert((CmisObjectType) element.getObject());
+ }
+ }
+
+ if (hit != null) {
+ result.getObjects().add(hit);
+ }
+ }
+ }
- return result;
- }
+ return result;
+ }
}
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/HttpUtils.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/HttpUtils.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/HttpUtils.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/HttpUtils.java Thu Apr 22 16:04:19 2010
@@ -47,230 +47,230 @@ import org.apache.commons.logging.LogFac
*/
public class HttpUtils {
- private static final Log log = LogFactory.getLog(HttpUtils.class);
+ private static final Log log = LogFactory.getLog(HttpUtils.class);
- private static final int BUFFER_SIZE = 4096;
+ private static final int BUFFER_SIZE = 4096;
- private HttpUtils() {
- }
+ private HttpUtils() {
+ }
- public static Response invokeGET(UrlBuilder url, Session session) {
- return invoke(url, "GET", null, null, session, null, null);
- }
-
- public static Response invokeGET(UrlBuilder url, Session session, BigInteger offset, BigInteger length) {
- return invoke(url, "GET", null, null, session, offset, length);
- }
-
- public static Response invokePOST(UrlBuilder url, String contentType, Output writer, Session session) {
- return invoke(url, "POST", contentType, writer, session, null, null);
- }
-
- public static Response invokePUT(UrlBuilder url, String contentType, Output writer, Session session) {
- return invoke(url, "PUT", contentType, writer, session, null, null);
- }
-
- public static Response invokeDELETE(UrlBuilder url, Session session) {
- return invoke(url, "DELETE", null, null, session, null, null);
- }
-
- private static Response invoke(UrlBuilder url, String method, String contentType, Output writer, Session session,
- BigInteger offset, BigInteger length) {
- try {
- // log before connect
- if (log.isDebugEnabled()) {
- log.debug(method + " " + url);
- }
-
- // connect
- HttpURLConnection conn = (HttpURLConnection) (new URL(url.toString())).openConnection();
- conn.setRequestMethod(method);
- conn.setDoInput(true);
- conn.setDoOutput(writer != null);
-
- // set content type
- if (contentType != null) {
- conn.setRequestProperty("Content-Type", contentType);
- }
-
- // authenticate
- AbstractAuthenticationProvider authProvider = CmisBindingsHelper.getAuthenticationProvider(session);
- if (authProvider != null) {
- Map<String, List<String>> httpHeaders = authProvider.getHTTPHeaders(url.toString());
- if (httpHeaders != null) {
- for (Map.Entry<String, List<String>> header : httpHeaders.entrySet()) {
- if (header.getValue() != null) {
- for (String value : header.getValue()) {
- conn.setRequestProperty(header.getKey(), value);
- }
- }
- }
- }
- }
-
- // range
- if ((offset != null) || (length != null)) {
- StringBuilder sb = new StringBuilder("bytes=");
-
- if ((offset == null) || (offset.signum() == -1)) {
- offset = BigInteger.ZERO;
- }
-
- sb.append(offset.toString());
- sb.append("-");
-
- if ((length != null) && (length.signum() == 1)) {
- sb.append(offset.add(length.subtract(BigInteger.ONE)).toString());
- }
-
- conn.setRequestProperty("Range", sb.toString());
- }
-
- // send data
- if (writer != null) {
- OutputStream out = new BufferedOutputStream(conn.getOutputStream(), BUFFER_SIZE);
- writer.write(out);
- out.flush();
- }
-
- // connect
- conn.connect();
-
- // get stream, if present
- int respCode = conn.getResponseCode();
- InputStream inputStream = null;
- if ((respCode == 200) || (respCode == 201) || (respCode == 203) || (respCode == 206)) {
- inputStream = conn.getInputStream();
- }
-
- // get the response
- return new Response(respCode, conn.getResponseMessage(), conn.getHeaderFields(), inputStream, conn
- .getErrorStream());
- } catch (Exception e) {
- throw new CmisConnectionException("Cannot access " + url + ": " + e.getMessage(), e);
- }
- }
-
- /**
- * @author <a href="mailto:fmueller@opentext.com">Florian Müller</a>
- *
- */
- public static class Response {
- private int fResponseCode;
- private String fResponseMessage;
- private Map<String, List<String>> fHeaders;
- private InputStream fStream;
- private String fErrorContent;
-
- public Response(int responseCode, String responseMessage, Map<String, List<String>> headers,
- InputStream stream, InputStream errorStream) {
- fResponseCode = responseCode;
- fResponseMessage = responseMessage;
- fStream = stream;
-
- fHeaders = new HashMap<String, List<String>>();
- if (headers != null) {
- for (Map.Entry<String, List<String>> e : headers.entrySet()) {
- fHeaders.put(e.getKey() == null ? null : e.getKey().toLowerCase(), e.getValue());
- }
- }
-
- // if there is an error page, get it
- if (errorStream != null) {
- String contentType = getContentTypeHeader();
- if ((contentType != null) && (contentType.toLowerCase().startsWith("text/"))) {
- StringBuilder sb = new StringBuilder();
-
- try {
- InputStreamReader reader = new InputStreamReader(errorStream);
- char[] buffer = new char[4096];
- int b;
- while ((b = reader.read(buffer)) > -1) {
- sb.append(buffer, 0, b);
- }
- reader.close();
-
- fErrorContent = sb.toString();
- } catch (IOException e) {
- fErrorContent = "Unable to retrieve content: " + e.getMessage();
- }
- }
- }
- }
-
- public int getResponseCode() {
- return fResponseCode;
- }
-
- public String getResponseMessage() {
- return fResponseMessage;
- }
-
- public Map<String, List<String>> getHeaders() {
- return fHeaders;
- }
-
- public String getHeader(String name) {
- List<String> list = fHeaders.get(name.toLowerCase(Locale.US));
- if ((list == null) || (list.isEmpty())) {
- return null;
- }
-
- return list.get(0);
- }
-
- public String getContentTypeHeader() {
- return getHeader("Content-Type");
- }
-
- public BigInteger getContentLengthHeader() {
- String lengthStr = getHeader("Content-Length");
- if (lengthStr == null) {
- return null;
- }
-
- try {
- return new BigInteger(lengthStr);
- } catch (NumberFormatException e) {
- return null;
- }
- }
-
- public String getLocactionHeader() {
- return getHeader("Location");
- }
-
- public String getContentLocactionHeader() {
- return getHeader("Content-Location");
- }
-
- public BigInteger getContentLength() {
- String lenStr = getHeader("Content-Length");
- if (lenStr == null) {
- return null;
- }
-
- try {
- return new BigInteger(lenStr);
- } catch (NumberFormatException nfe) {
- return null;
- }
- }
-
- public InputStream getStream() {
- return fStream;
- }
-
- public String getErrorContent() {
- return fErrorContent;
- }
- }
-
- /**
- * @author <a href="mailto:fmueller@opentext.com">Florian Müller</a>
- *
- */
- public interface Output {
- void write(OutputStream out) throws Exception;
- }
+ public static Response invokeGET(UrlBuilder url, Session session) {
+ return invoke(url, "GET", null, null, session, null, null);
+ }
+
+ public static Response invokeGET(UrlBuilder url, Session session, BigInteger offset, BigInteger length) {
+ return invoke(url, "GET", null, null, session, offset, length);
+ }
+
+ public static Response invokePOST(UrlBuilder url, String contentType, Output writer, Session session) {
+ return invoke(url, "POST", contentType, writer, session, null, null);
+ }
+
+ public static Response invokePUT(UrlBuilder url, String contentType, Output writer, Session session) {
+ return invoke(url, "PUT", contentType, writer, session, null, null);
+ }
+
+ public static Response invokeDELETE(UrlBuilder url, Session session) {
+ return invoke(url, "DELETE", null, null, session, null, null);
+ }
+
+ private static Response invoke(UrlBuilder url, String method, String contentType, Output writer, Session session,
+ BigInteger offset, BigInteger length) {
+ try {
+ // log before connect
+ if (log.isDebugEnabled()) {
+ log.debug(method + " " + url);
+ }
+
+ // connect
+ HttpURLConnection conn = (HttpURLConnection) (new URL(url.toString())).openConnection();
+ conn.setRequestMethod(method);
+ conn.setDoInput(true);
+ conn.setDoOutput(writer != null);
+
+ // set content type
+ if (contentType != null) {
+ conn.setRequestProperty("Content-Type", contentType);
+ }
+
+ // authenticate
+ AbstractAuthenticationProvider authProvider = CmisBindingsHelper.getAuthenticationProvider(session);
+ if (authProvider != null) {
+ Map<String, List<String>> httpHeaders = authProvider.getHTTPHeaders(url.toString());
+ if (httpHeaders != null) {
+ for (Map.Entry<String, List<String>> header : httpHeaders.entrySet()) {
+ if (header.getValue() != null) {
+ for (String value : header.getValue()) {
+ conn.setRequestProperty(header.getKey(), value);
+ }
+ }
+ }
+ }
+ }
+
+ // range
+ if ((offset != null) || (length != null)) {
+ StringBuilder sb = new StringBuilder("bytes=");
+
+ if ((offset == null) || (offset.signum() == -1)) {
+ offset = BigInteger.ZERO;
+ }
+
+ sb.append(offset.toString());
+ sb.append("-");
+
+ if ((length != null) && (length.signum() == 1)) {
+ sb.append(offset.add(length.subtract(BigInteger.ONE)).toString());
+ }
+
+ conn.setRequestProperty("Range", sb.toString());
+ }
+
+ // send data
+ if (writer != null) {
+ OutputStream out = new BufferedOutputStream(conn.getOutputStream(), BUFFER_SIZE);
+ writer.write(out);
+ out.flush();
+ }
+
+ // connect
+ conn.connect();
+
+ // get stream, if present
+ int respCode = conn.getResponseCode();
+ InputStream inputStream = null;
+ if ((respCode == 200) || (respCode == 201) || (respCode == 203) || (respCode == 206)) {
+ inputStream = conn.getInputStream();
+ }
+
+ // get the response
+ return new Response(respCode, conn.getResponseMessage(), conn.getHeaderFields(), inputStream, conn
+ .getErrorStream());
+ } catch (Exception e) {
+ throw new CmisConnectionException("Cannot access " + url + ": " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * @author <a href="mailto:fmueller@opentext.com">Florian Müller</a>
+ *
+ */
+ public static class Response {
+ private int fResponseCode;
+ private String fResponseMessage;
+ private Map<String, List<String>> fHeaders;
+ private InputStream fStream;
+ private String fErrorContent;
+
+ public Response(int responseCode, String responseMessage, Map<String, List<String>> headers,
+ InputStream stream, InputStream errorStream) {
+ fResponseCode = responseCode;
+ fResponseMessage = responseMessage;
+ fStream = stream;
+
+ fHeaders = new HashMap<String, List<String>>();
+ if (headers != null) {
+ for (Map.Entry<String, List<String>> e : headers.entrySet()) {
+ fHeaders.put(e.getKey() == null ? null : e.getKey().toLowerCase(), e.getValue());
+ }
+ }
+
+ // if there is an error page, get it
+ if (errorStream != null) {
+ String contentType = getContentTypeHeader();
+ if ((contentType != null) && (contentType.toLowerCase().startsWith("text/"))) {
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ InputStreamReader reader = new InputStreamReader(errorStream);
+ char[] buffer = new char[4096];
+ int b;
+ while ((b = reader.read(buffer)) > -1) {
+ sb.append(buffer, 0, b);
+ }
+ reader.close();
+
+ fErrorContent = sb.toString();
+ } catch (IOException e) {
+ fErrorContent = "Unable to retrieve content: " + e.getMessage();
+ }
+ }
+ }
+ }
+
+ public int getResponseCode() {
+ return fResponseCode;
+ }
+
+ public String getResponseMessage() {
+ return fResponseMessage;
+ }
+
+ public Map<String, List<String>> getHeaders() {
+ return fHeaders;
+ }
+
+ public String getHeader(String name) {
+ List<String> list = fHeaders.get(name.toLowerCase(Locale.US));
+ if ((list == null) || (list.isEmpty())) {
+ return null;
+ }
+
+ return list.get(0);
+ }
+
+ public String getContentTypeHeader() {
+ return getHeader("Content-Type");
+ }
+
+ public BigInteger getContentLengthHeader() {
+ String lengthStr = getHeader("Content-Length");
+ if (lengthStr == null) {
+ return null;
+ }
+
+ try {
+ return new BigInteger(lengthStr);
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ public String getLocactionHeader() {
+ return getHeader("Location");
+ }
+
+ public String getContentLocactionHeader() {
+ return getHeader("Content-Location");
+ }
+
+ public BigInteger getContentLength() {
+ String lenStr = getHeader("Content-Length");
+ if (lenStr == null) {
+ return null;
+ }
+
+ try {
+ return new BigInteger(lenStr);
+ } catch (NumberFormatException nfe) {
+ return null;
+ }
+ }
+
+ public InputStream getStream() {
+ return fStream;
+ }
+
+ public String getErrorContent() {
+ return fErrorContent;
+ }
+ }
+
+ /**
+ * @author <a href="mailto:fmueller@opentext.com">Florian Müller</a>
+ *
+ */
+ public interface Output {
+ void write(OutputStream out) throws Exception;
+ }
}
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/LinkCache.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/LinkCache.java?rev=936922&r1=936921&r2=936922&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/LinkCache.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/LinkCache.java Thu Apr 22 16:04:19 2010
@@ -40,266 +40,266 @@ import org.apache.chemistry.opencmis.com
*/
public class LinkCache implements Serializable {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- private static final int CACHE_SIZE_REPOSITORIES = 10;
- private static final int CACHE_SIZE_TYPES = 100;
- private static final int CACHE_SIZE_OBJECTS = 400;
-
- private Cache fLinkCache;
- private Cache fTypeLinkCache;
- private Cache fCollectionLinkCache;
- private Cache fTemplateCache;
- private Cache fRepositoryLinkCache;
-
- /**
- * Constructor.
- */
- public LinkCache(Session session) {
- int repCount = session.get(SessionParameter.CACHE_SIZE_REPOSITORIES, CACHE_SIZE_REPOSITORIES);
- if (repCount < 1) {
- repCount = CACHE_SIZE_REPOSITORIES;
- }
-
- int typeCount = session.get(SessionParameter.CACHE_SIZE_TYPES, CACHE_SIZE_TYPES);
- if (typeCount < 1) {
- typeCount = CACHE_SIZE_TYPES;
- }
-
- int objCount = session.get(SessionParameter.CACHE_SIZE_OBJECTS, CACHE_SIZE_OBJECTS);
- if (objCount < 1) {
- objCount = CACHE_SIZE_OBJECTS;
- }
-
- fLinkCache = new CacheImpl("Link Cache");
- fLinkCache.initialize(new String[] {
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
- LruCacheLevelImpl.class.getName() + " " + LruCacheLevelImpl.MAX_ENTRIES + "=" + objCount, // id
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=16", // rel
- ContentTypeCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=3,"
- + MapCacheLevelImpl.SINGLE_VALUE + "=true" // type
- });
-
- fTypeLinkCache = new CacheImpl("Type Link Cache");
- fTypeLinkCache.initialize(new String[] {
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
- LruCacheLevelImpl.class.getName() + " " + LruCacheLevelImpl.MAX_ENTRIES + "=" + typeCount, // id
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=16", // rel
- ContentTypeCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=3,"
- + MapCacheLevelImpl.SINGLE_VALUE + "=true"// type
- });
-
- fCollectionLinkCache = new CacheImpl("Collection Link Cache");
- fCollectionLinkCache.initialize(new String[] {
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=8" // collection
- });
-
- fTemplateCache = new CacheImpl("URI Template Cache");
- fTemplateCache.initialize(new String[] {
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=6" // type
- });
-
- fRepositoryLinkCache = new CacheImpl("Repository Link Cache");
- fRepositoryLinkCache.initialize(new String[] {
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
- MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=6" // rel
- });
- }
-
- /**
- * Adds a link.
- */
- public void addLink(String repositoryId, String id, String rel, String type, String link) {
- fLinkCache.put(link, repositoryId, id, rel, type);
- }
-
- /**
- * Removes all links of an object.
- */
- public void removeLinks(String repositoryId, String id) {
- fLinkCache.remove(repositoryId, id);
- }
-
- /**
- * Gets a link.
- */
- public String getLink(String repositoryId, String id, String rel, String type) {
- return (String) fLinkCache.get(repositoryId, id, rel, type);
- }
-
- /**
- * Gets a link.
- */
- public String getLink(String repositoryId, String id, String rel) {
- return getLink(repositoryId, id, rel, null);
- }
-
- /**
- * Checks a link.
- */
- public int checkLink(String repositoryId, String id, String rel, String type) {
- return fLinkCache.check(repositoryId, id, rel, type);
- }
-
- /**
- * Locks the link cache.
- */
- public void lockLinks() {
- fLinkCache.writeLock();
- }
-
- /**
- * Unlocks the link cache.
- */
- public void unlockLinks() {
- fLinkCache.writeUnlock();
- }
-
- /**
- * Adds a type link.
- */
- public void addTypeLink(String repositoryId, String id, String rel, String type, String link) {
- fTypeLinkCache.put(link, repositoryId, id, rel, type);
- }
-
- /**
- * Removes all links of a type.
- */
- public void removeTypeLinks(String repositoryId, String id) {
- fTypeLinkCache.remove(repositoryId, id);
- }
-
- /**
- * Gets a type link.
- */
- public String getTypeLink(String repositoryId, String id, String rel, String type) {
- return (String) fTypeLinkCache.get(repositoryId, id, rel, type);
- }
-
- /**
- * Gets a type link.
- */
- public String getTypeLink(String repositoryId, String id, String rel) {
- return getLink(repositoryId, id, rel, null);
- }
-
- /**
- * Locks the type link cache.
- */
- public void lockTypeLinks() {
- fTypeLinkCache.writeLock();
- }
-
- /**
- * Unlocks the type link cache.
- */
- public void unlockTypeLinks() {
- fTypeLinkCache.writeUnlock();
- }
-
- /**
- * Adds a collection.
- */
- public void addCollection(String repositoryId, String collection, String link) {
- fCollectionLinkCache.put(link, repositoryId, collection);
- }
-
- /**
- * Gets a collection.
- */
- public String getCollection(String repositoryId, String collection) {
- return (String) fCollectionLinkCache.get(repositoryId, collection);
- }
-
- /**
- * Adds an URI template.
- */
- public void addTemplate(String repositoryId, String type, String link) {
- fTemplateCache.put(link, repositoryId, type);
- }
-
- /**
- * Gets an URI template and replaces place holders with the given
- * parameters.
- */
- public String getTemplateLink(String repositoryId, String type, Map<String, Object> parameters) {
- String template = (String) fTemplateCache.get(repositoryId, type);
- if (template == null) {
- return null;
- }
-
- StringBuilder result = new StringBuilder();
- StringBuilder param = new StringBuilder();
-
- boolean paramMode = false;
- for (int i = 0; i < template.length(); i++) {
- char c = template.charAt(i);
-
- if (paramMode) {
- if (c == '}') {
- paramMode = false;
-
- String paramValue = UrlBuilder.normalizeParameter(parameters.get(param.toString()));
- if (paramValue != null) {
- try {
- result.append(URLEncoder.encode(paramValue, "UTF-8"));
- } catch (UnsupportedEncodingException e) {
- result.append(paramValue);
- }
- }
-
- param = new StringBuilder();
- } else {
- param.append(c);
- }
- } else {
- if (c == '{') {
- paramMode = true;
- } else {
- result.append(c);
- }
- }
- }
-
- return result.toString();
- }
-
- /**
- * Adds a collection.
- */
- public void addRepositoryLink(String repositoryId, String rel, String link) {
- fRepositoryLinkCache.put(link, repositoryId, rel);
- }
-
- /**
- * Gets a collection.
- */
- public String getRepositoryLink(String repositoryId, String rel) {
- return (String) fRepositoryLinkCache.get(repositoryId, rel);
- }
-
- /**
- * Removes all entries of the given repository from the caches.
- */
- public void clearRepository(String repositoryId) {
- fLinkCache.remove(repositoryId);
- fTypeLinkCache.remove(repositoryId);
- fCollectionLinkCache.remove(repositoryId);
- fTemplateCache.remove(repositoryId);
- fRepositoryLinkCache.remove(repositoryId);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
- @Override
- public String toString() {
- return "Link Cache [link cache=" + fLinkCache + ", type link cache=" + fTypeLinkCache
- + ", collection link cache=" + fCollectionLinkCache + ", repository link cache=" + fRepositoryLinkCache
- + ", template cache=" + fTemplateCache + "]";
- }
+ private static final int CACHE_SIZE_REPOSITORIES = 10;
+ private static final int CACHE_SIZE_TYPES = 100;
+ private static final int CACHE_SIZE_OBJECTS = 400;
+
+ private Cache fLinkCache;
+ private Cache fTypeLinkCache;
+ private Cache fCollectionLinkCache;
+ private Cache fTemplateCache;
+ private Cache fRepositoryLinkCache;
+
+ /**
+ * Constructor.
+ */
+ public LinkCache(Session session) {
+ int repCount = session.get(SessionParameter.CACHE_SIZE_REPOSITORIES, CACHE_SIZE_REPOSITORIES);
+ if (repCount < 1) {
+ repCount = CACHE_SIZE_REPOSITORIES;
+ }
+
+ int typeCount = session.get(SessionParameter.CACHE_SIZE_TYPES, CACHE_SIZE_TYPES);
+ if (typeCount < 1) {
+ typeCount = CACHE_SIZE_TYPES;
+ }
+
+ int objCount = session.get(SessionParameter.CACHE_SIZE_OBJECTS, CACHE_SIZE_OBJECTS);
+ if (objCount < 1) {
+ objCount = CACHE_SIZE_OBJECTS;
+ }
+
+ fLinkCache = new CacheImpl("Link Cache");
+ fLinkCache.initialize(new String[] {
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
+ LruCacheLevelImpl.class.getName() + " " + LruCacheLevelImpl.MAX_ENTRIES + "=" + objCount, // id
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=16", // rel
+ ContentTypeCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=3,"
+ + MapCacheLevelImpl.SINGLE_VALUE + "=true" // type
+ });
+
+ fTypeLinkCache = new CacheImpl("Type Link Cache");
+ fTypeLinkCache.initialize(new String[] {
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
+ LruCacheLevelImpl.class.getName() + " " + LruCacheLevelImpl.MAX_ENTRIES + "=" + typeCount, // id
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=16", // rel
+ ContentTypeCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=3,"
+ + MapCacheLevelImpl.SINGLE_VALUE + "=true"// type
+ });
+
+ fCollectionLinkCache = new CacheImpl("Collection Link Cache");
+ fCollectionLinkCache.initialize(new String[] {
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=8" // collection
+ });
+
+ fTemplateCache = new CacheImpl("URI Template Cache");
+ fTemplateCache.initialize(new String[] {
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=6" // type
+ });
+
+ fRepositoryLinkCache = new CacheImpl("Repository Link Cache");
+ fRepositoryLinkCache.initialize(new String[] {
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=" + repCount, // repository
+ MapCacheLevelImpl.class.getName() + " " + MapCacheLevelImpl.CAPACITY + "=6" // rel
+ });
+ }
+
+ /**
+ * Adds a link.
+ */
+ public void addLink(String repositoryId, String id, String rel, String type, String link) {
+ fLinkCache.put(link, repositoryId, id, rel, type);
+ }
+
+ /**
+ * Removes all links of an object.
+ */
+ public void removeLinks(String repositoryId, String id) {
+ fLinkCache.remove(repositoryId, id);
+ }
+
+ /**
+ * Gets a link.
+ */
+ public String getLink(String repositoryId, String id, String rel, String type) {
+ return (String) fLinkCache.get(repositoryId, id, rel, type);
+ }
+
+ /**
+ * Gets a link.
+ */
+ public String getLink(String repositoryId, String id, String rel) {
+ return getLink(repositoryId, id, rel, null);
+ }
+
+ /**
+ * Checks a link.
+ */
+ public int checkLink(String repositoryId, String id, String rel, String type) {
+ return fLinkCache.check(repositoryId, id, rel, type);
+ }
+
+ /**
+ * Locks the link cache.
+ */
+ public void lockLinks() {
+ fLinkCache.writeLock();
+ }
+
+ /**
+ * Unlocks the link cache.
+ */
+ public void unlockLinks() {
+ fLinkCache.writeUnlock();
+ }
+
+ /**
+ * Adds a type link.
+ */
+ public void addTypeLink(String repositoryId, String id, String rel, String type, String link) {
+ fTypeLinkCache.put(link, repositoryId, id, rel, type);
+ }
+
+ /**
+ * Removes all links of a type.
+ */
+ public void removeTypeLinks(String repositoryId, String id) {
+ fTypeLinkCache.remove(repositoryId, id);
+ }
+
+ /**
+ * Gets a type link.
+ */
+ public String getTypeLink(String repositoryId, String id, String rel, String type) {
+ return (String) fTypeLinkCache.get(repositoryId, id, rel, type);
+ }
+
+ /**
+ * Gets a type link.
+ */
+ public String getTypeLink(String repositoryId, String id, String rel) {
+ return getLink(repositoryId, id, rel, null);
+ }
+
+ /**
+ * Locks the type link cache.
+ */
+ public void lockTypeLinks() {
+ fTypeLinkCache.writeLock();
+ }
+
+ /**
+ * Unlocks the type link cache.
+ */
+ public void unlockTypeLinks() {
+ fTypeLinkCache.writeUnlock();
+ }
+
+ /**
+ * Adds a collection.
+ */
+ public void addCollection(String repositoryId, String collection, String link) {
+ fCollectionLinkCache.put(link, repositoryId, collection);
+ }
+
+ /**
+ * Gets a collection.
+ */
+ public String getCollection(String repositoryId, String collection) {
+ return (String) fCollectionLinkCache.get(repositoryId, collection);
+ }
+
+ /**
+ * Adds an URI template.
+ */
+ public void addTemplate(String repositoryId, String type, String link) {
+ fTemplateCache.put(link, repositoryId, type);
+ }
+
+ /**
+ * Gets an URI template and replaces place holders with the given
+ * parameters.
+ */
+ public String getTemplateLink(String repositoryId, String type, Map<String, Object> parameters) {
+ String template = (String) fTemplateCache.get(repositoryId, type);
+ if (template == null) {
+ return null;
+ }
+
+ StringBuilder result = new StringBuilder();
+ StringBuilder param = new StringBuilder();
+
+ boolean paramMode = false;
+ for (int i = 0; i < template.length(); i++) {
+ char c = template.charAt(i);
+
+ if (paramMode) {
+ if (c == '}') {
+ paramMode = false;
+
+ String paramValue = UrlBuilder.normalizeParameter(parameters.get(param.toString()));
+ if (paramValue != null) {
+ try {
+ result.append(URLEncoder.encode(paramValue, "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ result.append(paramValue);
+ }
+ }
+
+ param = new StringBuilder();
+ } else {
+ param.append(c);
+ }
+ } else {
+ if (c == '{') {
+ paramMode = true;
+ } else {
+ result.append(c);
+ }
+ }
+ }
+
+ return result.toString();
+ }
+
+ /**
+ * Adds a collection.
+ */
+ public void addRepositoryLink(String repositoryId, String rel, String link) {
+ fRepositoryLinkCache.put(link, repositoryId, rel);
+ }
+
+ /**
+ * Gets a collection.
+ */
+ public String getRepositoryLink(String repositoryId, String rel) {
+ return (String) fRepositoryLinkCache.get(repositoryId, rel);
+ }
+
+ /**
+ * Removes all entries of the given repository from the caches.
+ */
+ public void clearRepository(String repositoryId) {
+ fLinkCache.remove(repositoryId);
+ fTypeLinkCache.remove(repositoryId);
+ fCollectionLinkCache.remove(repositoryId);
+ fTemplateCache.remove(repositoryId);
+ fRepositoryLinkCache.remove(repositoryId);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "Link Cache [link cache=" + fLinkCache + ", type link cache=" + fTypeLinkCache
+ + ", collection link cache=" + fCollectionLinkCache + ", repository link cache=" + fRepositoryLinkCache
+ + ", template cache=" + fTemplateCache + "]";
+ }
}