You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2009/07/24 17:01:17 UTC
svn commit: r797514 - in /incubator/chemistry/trunk/chemistry:
chemistry-api/src/main/java/org/apache/chemistry/
chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/
chemistry-atompub-client/src/main/java/org/apache/chemistry/ato...
Author: fguillaume
Date: Fri Jul 24 15:01:16 2009
New Revision: 797514
URL: http://svn.apache.org/viewvc?rev=797514&view=rev
Log:
CMIS-44: cleaned up types children/descendants, factored out common implementation
Added:
incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java (with props)
incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java (with props)
Modified:
incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/Repository.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/TypeFeedReader.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/AbstractFeedReader.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/FeedReader.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/TypeFeedReaderTest.java
incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISTypesCollection.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/base/BaseRepository.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/impl/simple/TestSimpleRepository.java
incubator/chemistry/trunk/chemistry/chemistry-jcr/src/main/java/org/apache/chemistry/jcr/JcrRepository.java
Modified: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/Repository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/Repository.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/Repository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/Repository.java Fri Jul 24 15:01:16 2009
@@ -17,14 +17,16 @@
package org.apache.chemistry;
import java.io.Serializable;
-import java.util.Collection;
-import java.util.List;
import java.util.Map;
/**
* A CMIS Repository.
+ * <p>
+ * Basic repository information is available through {@link RepositoryEntry}.
+ * <p>
+ * Types are managed through {@link TypeManager}.
*/
-public interface Repository extends RepositoryEntry {
+public interface Repository extends RepositoryEntry, TypeManager {
/**
* Gets a new connection to this repository.
@@ -66,50 +68,4 @@
*/
RepositoryInfo getInfo();
- /**
- * Gets the type definitions of the repository.
- * <p>
- * If typeId is provided, only the specific type and its descendants are
- * returned, otherwise all types are returned.
- * <p>
- * If returnPropertyDefinitions is {@code false}, then the
- * {@link PropertyDefinition}s will not be returned in each {@link Type}.
- *
- * @param typeId the base type ID, or {@code null}
- * @return the repository's types
- */
- Collection<Type> getTypes(String typeId, boolean returnPropertyDefinitions);
-
- /**
- * Gets the type definitions of the repository.
- * <p>
- * If typeId is provided, only the specific type and its descendants are
- * returned, otherwise all types are returned.
- * <p>
- * If returnPropertyDefinitions is {@code false}, then the
- * {@link PropertyDefinition}s will not be returned in each {@link Type}.
- * <p>
- * If maxItems is {@code 0} then a repository-specific maximum will be used.
- *
- * @param typeId the base type ID, or {@code null}
- * @param returnPropertyDefinitions {@code false} to skip property
- * definitions
- * @param maxItems the maximum number of items, or {@code 0}
- * @param skipCount the number of results to skip in the list
- * @param hasMoreItems a 1-value boolean array to return a flag stating if
- * there are more items
- * @return the repository's types, or a subset of them
- */
- // this API is present to mirror the wire protocol
- List<Type> getTypes(String typeId, boolean returnPropertyDefinitions,
- int maxItems, int skipCount, boolean[] hasMoreItems);
-
- /**
- * Gets the definition for the specified type.
- *
- * @param typeId the type ID
- * @return the type definition
- */
- Type getType(String typeId);
-
}
Added: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java?rev=797514&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java Fri Jul 24 15:01:16 2009
@@ -0,0 +1,81 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors:
+ * Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry;
+
+import java.util.Collection;
+
+/**
+ * A manager of types.
+ */
+public interface TypeManager {
+
+ /**
+ * Adds a new type to the type manager.
+ * <p>
+ * In most cases, this method will throw
+ * {@link UnsupportedOperationException}.
+ *
+ * @param type the new type.
+ */
+ void addType(Type type);
+
+ /**
+ * Gets the specified type.
+ *
+ * @param typeId the type ID
+ * @return the type, or {@code null} if not found
+ */
+ Type getType(String typeId);
+
+ /**
+ * Gets the types.
+ * <p>
+ * If typeId is provided, only the specific type and its descendants are
+ * returned, otherwise all types are returned.
+ *
+ * @param typeId the base type ID, or {@code null}
+ * @return the types, or a subset of them
+ */
+ Collection<Type> getTypes(String typeId);
+
+ /**
+ * Gets the types.
+ * <p>
+ * If typeId is provided, only the specific type and its descendants are
+ * returned, otherwise all types are returned.
+ * <p>
+ * The depth parameter controls the number of levels of the type hierarchy
+ * to return:
+ * <ul>
+ * <li>-1: all descendants at all depths,</li>
+ * <li>1: only children of the type,</li>
+ * <li>more than 1: grand-children up to that depth,</li>
+ * </ul>
+ * If returnPropertyDefinitions is {@code false}, then the
+ * {@link PropertyDefinition}s will not be returned in each {@link Type}.
+ *
+ * @param typeId the base type ID, or {@code null}
+ * @param depth the number of levels of depth in the type hierarchy from
+ * which to return results
+ * @param returnPropertyDefinitions {@code false} to skip property
+ * definitions
+ * @return the types, or a subset of them
+ */
+ Collection<Type> getTypes(String typeId, int depth,
+ boolean returnPropertyDefinitions);
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: incubator/chemistry/trunk/chemistry/chemistry-api/src/main/java/org/apache/chemistry/TypeManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPRepository.java Fri Jul 24 15:01:16 2009
@@ -13,6 +13,7 @@
*
* Authors:
* Bogdan Stefanescu, Nuxeo
+ * Florent Guillaume, Nuxeo
*/
package org.apache.chemistry.atompub.client;
@@ -22,9 +23,9 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
-import java.util.List;
import java.util.Map;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.Connection;
import org.apache.chemistry.Repository;
import org.apache.chemistry.RepositoryInfo;
@@ -47,7 +48,7 @@
protected String id;
- protected Map<String, Type> typeRegistry;
+ protected TypeManager typeManager;
protected Map<String, String> collections = new HashMap<String, String>();
@@ -103,22 +104,23 @@
return info;
}
+ public void addType(Type type) {
+ throw new UnsupportedOperationException("Cannot add types");
+ }
+
public Type getType(String typeId) {
loadTypes();
- return typeRegistry.get(typeId);
+ return typeManager.getType(typeId);
}
- public List<Type> getTypes(String typeId,
- boolean returnPropertyDefinitions, int maxItems, int skipCount,
- boolean[] hasMoreItems) {
- loadTypes();
- throw new UnsupportedOperationException("Not yet Implemented");
+ public Collection<Type> getTypes(String typeId) {
+ return typeManager.getTypes(typeId);
}
- public Collection<Type> getTypes(String typeId,
+ public Collection<Type> getTypes(String typeId, int depth,
boolean returnPropertyDefinitions) {
loadTypes();
- throw new UnsupportedOperationException("Not yet Implemented");
+ return typeManager.getTypes(typeId, depth, returnPropertyDefinitions);
}
public String getRelationshipName() {
@@ -132,36 +134,37 @@
/** type API */
public void addType(APPType type) {
- typeRegistry.put(type.getId(), type);
+ typeManager.addType(type);
}
protected void loadTypes() {
- if (typeRegistry == null) {
+ if (typeManager != null) {
+ return;
+ }
+ try {
+ String href = getCollectionHref(CMIS.COL_TYPES_CHILDREN);
+ if (href == null) {
+ throw new IllegalArgumentException(
+ "Invalid CMIS repository. No types children collection defined");
+ }
+ // TODO lazy load property definition
+ Request req = new Request(href + "?includePropertyDefinitions=true");
+ Response resp = cm.getConnector().get(req);
+ if (!resp.isOk()) {
+ throw new ContentManagerException(
+ "Remote server returned error code: "
+ + resp.getStatusCode());
+ }
+ InputStream in = resp.getStream();
try {
- String href = getCollectionHref(CMIS.COL_TYPES_CHILDREN);
- if (href == null) {
- throw new IllegalArgumentException(
- "Invalid CMIS repository. No types children collection defined");
- }
- // TODO lazy load property definition
- Request req = new Request(href + "?includePropertyDefinitions=true");
- Response resp = cm.getConnector().get(req);
- if (!resp.isOk()) {
- throw new ContentManagerException(
- "Remote server returned error code: "
- + resp.getStatusCode());
- }
- InputStream in = resp.getStream();
- try {
- typeRegistry = TypeFeedReader.INSTANCE.read(
- new ReadContext(this), in);
- } finally {
- in.close();
- }
- } catch (Exception e) { // TODO how to handle exceptions?
- throw new RuntimeException(
- "Failed to load repository types for " + getName(), e);
+ typeManager = TypeFeedReader.INSTANCE.read(
+ new ReadContext(this), in);
+ } finally {
+ in.close();
}
+ } catch (Exception e) { // TODO how to handle exceptions?
+ throw new RuntimeException("Failed to load repository types for "
+ + getName(), e);
}
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPType.java Fri Jul 24 15:01:16 2009
@@ -35,11 +35,13 @@
*/
public class APPType extends APPObjectEntry implements Type {
+ private static final String UNDEFINED = "\0\0\0";
+
protected Map<String, String> map;
protected BaseType baseType;
- protected String parentId;
+ protected String parentId = UNDEFINED;
protected Map<String, PropertyDefinition> propertyDefs;
@@ -88,8 +90,11 @@
}
public String getParentId() {
- if (parentId == null) {
+ if (parentId == UNDEFINED) {
parentId = map.get(CMIS.PARENT_ID.getLocalPart());
+ if ("".equals(parentId)) {
+ parentId = null;
+ }
}
return parentId;
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/TypeFeedReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/TypeFeedReader.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/TypeFeedReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/TypeFeedReader.java Fri Jul 24 15:01:16 2009
@@ -13,21 +13,19 @@
*
* Authors:
* Bogdan Stefanescu, Nuxeo
+ * Florent Guillaume, Nuxeo
*/
package org.apache.chemistry.atompub.client;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.chemistry.Type;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.atompub.client.stax.AbstractFeedReader;
+import org.apache.chemistry.impl.simple.SimpleTypeManager;
import org.apache.chemistry.xml.stax.StaxReader;
/**
- *
+ * Reader for a feed of types.
*/
-public class TypeFeedReader extends
- AbstractFeedReader<Map<String, Type>, APPType> {
+public class TypeFeedReader extends AbstractFeedReader<TypeManager, APPType> {
public static final TypeFeedReader INSTANCE = new TypeFeedReader();
@@ -40,13 +38,13 @@
}
@Override
- protected void addEntry(Map<String, Type> feed, APPType entry) {
- feed.put(entry.getId(), entry);
+ protected void addEntry(TypeManager typeManager, APPType type) {
+ typeManager.addType(type);
}
@Override
- protected Map<String, Type> createFeed(StaxReader reader) {
- return new HashMap<String, Type>();
+ protected TypeManager createFeed(StaxReader reader) {
+ return new SimpleTypeManager();
}
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/DefaultIOProvider.java Fri Jul 24 15:01:16 2009
@@ -19,8 +19,8 @@
package org.apache.chemistry.atompub.client.connector;
import java.util.List;
-import java.util.Map;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.ObjectEntry;
import org.apache.chemistry.Type;
import org.apache.chemistry.atompub.client.APPObjectEntryReader;
@@ -29,9 +29,9 @@
import org.apache.chemistry.atompub.client.APPServiceDocumentReader;
import org.apache.chemistry.atompub.client.TypeEntryReader;
import org.apache.chemistry.atompub.client.TypeFeedReader;
-import org.apache.chemistry.atompub.client.stax.QueryWriter;
import org.apache.chemistry.atompub.client.stax.EntryReader;
import org.apache.chemistry.atompub.client.stax.FeedReader;
+import org.apache.chemistry.atompub.client.stax.QueryWriter;
import org.apache.chemistry.atompub.client.stax.ServiceDocumentReader;
import org.apache.chemistry.atompub.client.stax.XmlObjectWriter;
@@ -65,7 +65,7 @@
return serviceDocumentReader;
}
- public FeedReader<Map<String, Type>> getTypeFeedReader() {
+ public FeedReader<TypeManager> getTypeFeedReader() {
return typeFeedReader;
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/HttpClientResponse.java Fri Jul 24 15:01:16 2009
@@ -20,10 +20,10 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
-import java.util.Map;
import javax.xml.stream.XMLStreamException;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.ObjectEntry;
import org.apache.chemistry.Repository;
import org.apache.chemistry.Type;
@@ -136,7 +136,7 @@
}
}
- public Map<String, Type> getTypeFeed(ReadContext ctx)
+ public TypeManager getTypeFeed(ReadContext ctx)
throws ContentManagerException {
try {
return io.getTypeFeedReader().read(ctx, getStream());
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/IOProvider.java Fri Jul 24 15:01:16 2009
@@ -18,8 +18,8 @@
package org.apache.chemistry.atompub.client.connector;
import java.util.List;
-import java.util.Map;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.ObjectEntry;
import org.apache.chemistry.Type;
import org.apache.chemistry.atompub.client.stax.EntryReader;
@@ -41,7 +41,7 @@
FeedReader<List<ObjectEntry>> getObjectFeedReader();
- FeedReader<Map<String, Type>> getTypeFeedReader();
+ FeedReader<TypeManager> getTypeFeedReader();
XmlObjectWriter<ObjectEntry> getObjectEntryWriter();
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/connector/Response.java Fri Jul 24 15:01:16 2009
@@ -18,8 +18,8 @@
import java.io.InputStream;
import java.util.List;
-import java.util.Map;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.ObjectEntry;
import org.apache.chemistry.Repository;
import org.apache.chemistry.Type;
@@ -51,8 +51,7 @@
List<ObjectEntry> getObjectFeed(ReadContext ctx)
throws ContentManagerException;
- Map<String, Type> getTypeFeed(ReadContext ctx)
- throws ContentManagerException;
+ TypeManager getTypeFeed(ReadContext ctx) throws ContentManagerException;
ObjectEntry getObject(ReadContext ctx) throws ContentManagerException;
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/AbstractFeedReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/AbstractFeedReader.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/AbstractFeedReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/AbstractFeedReader.java Fri Jul 24 15:01:16 2009
@@ -30,7 +30,7 @@
import org.apache.chemistry.xml.stax.StaxReader;
/**
- *
+ * Feed reader that returns a generic type T built of entries of generic type E.
*/
public abstract class AbstractFeedReader<T, E> implements FeedReader<T> {
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/FeedReader.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/FeedReader.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/FeedReader.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/stax/FeedReader.java Fri Jul 24 15:01:16 2009
@@ -24,7 +24,7 @@
import org.apache.chemistry.xml.stax.StaxReader;
/**
- *
+ * Feed reader that returns a generic type T.
*/
public interface FeedReader<T> {
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/TypeFeedReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/TypeFeedReaderTest.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/TypeFeedReaderTest.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/test/java/org/apache/chemistry/atompub/client/TypeFeedReaderTest.java Fri Jul 24 15:01:16 2009
@@ -18,21 +18,20 @@
package org.apache.chemistry.atompub.client;
import java.io.InputStream;
-import java.util.Map;
import junit.framework.TestCase;
import org.apache.chemistry.Repository;
-import org.apache.chemistry.Type;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.atompub.client.stax.ReadContext;
public class TypeFeedReaderTest extends TestCase {
public void testReadTypesFeed() throws Exception {
InputStream is = getClass().getResourceAsStream("/feed-types.xml");
- Map<String, Type> typeRegistry = TypeFeedReader.INSTANCE.read(
- new ReadContext((Repository) null), is);
- assertEquals(5, typeRegistry.size());
+ TypeManager typeManager = TypeFeedReader.INSTANCE.read(new ReadContext(
+ (Repository) null), is);
+ assertEquals(5, typeManager.getTypes(null).size());
}
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISTypesCollection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISTypesCollection.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISTypesCollection.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-server/src/main/java/org/apache/chemistry/atompub/server/CMISTypesCollection.java Fri Jul 24 15:01:16 2009
@@ -263,7 +263,7 @@
@Override
public Iterable<Type> getEntries(RequestContext request)
throws ResponseContextException {
- return repository.getTypes(null, true);
+ return repository.getTypes(null);
}
@Override
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/base/BaseRepository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/base/BaseRepository.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/base/BaseRepository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/base/BaseRepository.java Fri Jul 24 15:01:16 2009
@@ -16,13 +16,9 @@
*/
package org.apache.chemistry.impl.base;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import org.apache.chemistry.BaseType;
import org.apache.chemistry.ContentStreamPresence;
@@ -32,8 +28,10 @@
import org.apache.chemistry.RepositoryEntry;
import org.apache.chemistry.RepositoryInfo;
import org.apache.chemistry.Type;
+import org.apache.chemistry.TypeManager;
import org.apache.chemistry.impl.simple.SimpleProperty;
import org.apache.chemistry.impl.simple.SimpleType;
+import org.apache.chemistry.impl.simple.SimpleTypeManager;
/**
* Base implementation of a {@link Repository}. The implemented methods are
@@ -77,10 +75,10 @@
ContentStreamPresence.NOT_ALLOWED, null, null,
Collections.<PropertyDefinition> emptyList());
- protected final Map<String, Type> types = new HashMap<String, Type>();
-
protected final String name;
+ protected final TypeManager typeManager = new SimpleTypeManager();
+
protected BaseRepository(String name) {
this.name = name;
}
@@ -92,11 +90,7 @@
protected void addTypes(Collection<SimpleType> types) {
for (Type type : types) {
- String typeId = type.getId();
- if (this.types.containsKey(typeId)) {
- throw new RuntimeException("Type already defined: " + typeId);
- }
- this.types.put(typeId, type);
+ typeManager.addType(type);
}
}
@@ -120,59 +114,6 @@
return this;
}
- public Type getType(String typeId) {
- return types.get(typeId);
- }
-
- public Collection<Type> getTypes(String typeId,
- boolean returnPropertyDefinitions) {
- // TODO always returns property definitions for now
- if (typeId == null) {
- return Collections.unmodifiableCollection(types.values());
- }
- if (!types.containsKey(typeId)) {
- return null; // TODO
- }
- // TODO return all descendants as well
- return Collections.singleton(types.get(typeId));
- }
-
- public List<Type> getTypes(String typeId,
- boolean returnPropertyDefinitions, int maxItems, int skipCount,
- boolean[] hasMoreItems) {
- if (maxItems < 0) {
- throw new IllegalArgumentException(String.valueOf(maxItems));
- }
- if (skipCount < 0) {
- throw new IllegalArgumentException(String.valueOf(skipCount));
- }
- if (hasMoreItems.length < 1) {
- throw new IllegalArgumentException(
- "hasMoreItems parameter too small");
- }
-
- Collection<Type> t = getTypes(typeId, returnPropertyDefinitions);
- if (t == null) {
- hasMoreItems[0] = false;
- return Collections.emptyList();
- }
- List<Type> all = new ArrayList<Type>(t);
- int fromIndex = skipCount;
- if (fromIndex < 0 || fromIndex > all.size()) {
- hasMoreItems[0] = false;
- return Collections.emptyList();
- }
- if (maxItems == 0) {
- maxItems = all.size();
- }
- int toIndex = skipCount + maxItems;
- if (toIndex > all.size()) {
- toIndex = all.size();
- }
- hasMoreItems[0] = toIndex < all.size();
- return all.subList(fromIndex, toIndex);
- }
-
/*
* ----- RepositoryInfo -----
*/
@@ -202,4 +143,24 @@
return Collections.emptySet();
}
+ /*
+ * ----- TypeManager -----
+ */
+ public void addType(Type type) {
+ throw new UnsupportedOperationException("Cannot add types");
+ }
+
+ public Type getType(String typeId) {
+ return typeManager.getType(typeId);
+ }
+
+ public Collection<Type> getTypes(String typeId) {
+ return typeManager.getTypes(typeId);
+ }
+
+ public Collection<Type> getTypes(String typeId, int depth,
+ boolean returnPropertyDefinitions) {
+ return typeManager.getTypes(typeId, depth, returnPropertyDefinitions);
+ }
+
}
Added: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java?rev=797514&view=auto
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java (added)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java Fri Jul 24 15:01:16 2009
@@ -0,0 +1,113 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors:
+ * Florent Guillaume, Nuxeo
+ */
+package org.apache.chemistry.impl.simple;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.chemistry.BaseType;
+import org.apache.chemistry.Type;
+import org.apache.chemistry.TypeManager;
+
+public class SimpleTypeManager implements TypeManager {
+
+ protected final Map<String, Type> types = new HashMap<String, Type>();
+
+ protected final Map<String, Collection<Type>> typesChildren = new HashMap<String, Collection<Type>>();
+
+ public void addType(Type type) {
+ String typeId = type.getId();
+ if (types.containsKey(typeId)) {
+ throw new RuntimeException("Type already defined: " + typeId);
+ }
+ types.put(typeId, type);
+ typesChildren.put(typeId, new LinkedList<Type>());
+ String parentId = type.getParentId();
+ if (parentId == null) {
+ // check it's a base type
+ try {
+ BaseType.get(typeId);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Type: " + typeId
+ + " must have a parent type");
+ }
+ } else {
+ Collection<Type> siblings = typesChildren.get(parentId);
+ if (siblings == null) {
+ throw new IllegalArgumentException("Type: " + typeId
+ + " refers to unknown parent: " + parentId);
+ }
+ siblings.add(type);
+ // TODO check no cycle
+ }
+ }
+
+ public Type getType(String typeId) {
+ return types.get(typeId);
+ }
+
+ public Collection<Type> getTypes(String typeId) {
+ return getTypes(typeId, -1, true);
+ }
+
+ /*
+ * This implementation returns subtypes depth-first.
+ */
+ public Collection<Type> getTypes(String typeId, int depth,
+ boolean returnPropertyDefinitions) {
+ if (typeId == null) {
+ // ignore depth
+ // TODO returnPropertyDefinitions
+ return Collections.unmodifiableCollection(types.values());
+ }
+ if (!types.containsKey(typeId)) {
+ throw new IllegalArgumentException("No such type: " + typeId);
+ }
+ // TODO spec unclear on depth 0
+ List<Type> list = new LinkedList<Type>();
+ collectSubTypes(typeId, depth, returnPropertyDefinitions, list,
+ new HashSet<String>());
+ return list;
+ }
+
+ protected void collectSubTypes(String typeId, int depth,
+ boolean returnPropertyDefinitions, List<Type> list, Set<String> done) {
+ if (done.contains(typeId)) {
+ // TODO move cycles check to addType
+ throw new IllegalStateException("Types contain a cycle involving: "
+ + typeId);
+ }
+ // TODO returnPropertyDefinitions
+ list.add(types.get(typeId));
+ done.add(typeId);
+ if (depth == 0) {
+ return;
+ }
+ Collection<Type> children = typesChildren.get(typeId);
+ for (Type type : children) {
+ collectSubTypes(type.getId(), depth - 1, returnPropertyDefinitions,
+ list, done);
+ }
+ }
+
+}
Propchange: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleTypeManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/impl/simple/TestSimpleRepository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/impl/simple/TestSimpleRepository.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/impl/simple/TestSimpleRepository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/test/java/org/apache/chemistry/impl/simple/TestSimpleRepository.java Fri Jul 24 15:01:16 2009
@@ -69,7 +69,11 @@
"Fold", "My Folder Type", BaseType.FOLDER, "", true, true,
true, true, false, false, ContentStreamPresence.NOT_ALLOWED,
null, null, Arrays.asList(d1, d2));
- repo = new SimpleRepository("test", Arrays.asList(mt1, mt2), null);
+ SimpleType mt3 = new SimpleType("subdoc", "doc", "SubDoc",
+ "My SubDoc Type", BaseType.DOCUMENT, "", true, true, true,
+ true, true, true, ContentStreamPresence.ALLOWED, null, null,
+ Arrays.asList(d1, d2, d3));
+ repo = new SimpleRepository("test", Arrays.asList(mt1, mt2, mt3), null);
}
@@ -95,9 +99,30 @@
assertEquals(JoinCapability.NONE, capabilities.getJoinCapability());
assertEquals(QueryCapability.BOTH_COMBINED,
capabilities.getQueryCapability());
+ }
- Collection<Type> types = repo.getTypes(null, true);
- assertEquals(5 + 2, types.size()); // default types have been added
+ public void testTypes() {
+ Collection<Type> types = repo.getTypes(null);
+ assertEquals(5 + 3, types.size()); // default types have been added
+ assertNotNull(repo.getType("doc"));
+ assertNotNull(repo.getType("subdoc"));
+ assertNotNull(repo.getType("fold"));
+ assertNull(repo.getType("no-such-type"));
+ assertEquals(3,
+ repo.getTypes(BaseType.DOCUMENT.getId(), -1, false).size());
+ assertEquals(1, // TODO spec unclear on depth 0
+ repo.getTypes(BaseType.DOCUMENT.getId(), 0, false).size());
+ assertEquals(2,
+ repo.getTypes(BaseType.DOCUMENT.getId(), 1, false).size());
+ assertEquals(3,
+ repo.getTypes(BaseType.DOCUMENT.getId(), 2, false).size());
+ assertEquals(3,
+ repo.getTypes(BaseType.DOCUMENT.getId(), 3, false).size());
+ assertEquals(2, repo.getTypes("doc", -1, false).size());
+ assertEquals(1, repo.getTypes("doc", 0, false).size());
+ assertEquals(2, repo.getTypes("doc", 1, false).size());
+ assertEquals(2, repo.getTypes("doc", 2, false).size());
+ assertEquals(2, repo.getTypes("doc", 3, false).size());
}
public void testRoot() throws Exception {
Modified: incubator/chemistry/trunk/chemistry/chemistry-jcr/src/main/java/org/apache/chemistry/jcr/JcrRepository.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-jcr/src/main/java/org/apache/chemistry/jcr/JcrRepository.java?rev=797514&r1=797513&r2=797514&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-jcr/src/main/java/org/apache/chemistry/jcr/JcrRepository.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-jcr/src/main/java/org/apache/chemistry/jcr/JcrRepository.java Fri Jul 24 15:01:16 2009
@@ -89,6 +89,10 @@
return this;
}
+ public void addType(Type type) {
+ throw new UnsupportedOperationException("Cannot add types");
+ }
+
public Type getType(String typeId) {
try {
// TODO pass credentials as parameters
@@ -113,17 +117,15 @@
return null;
}
- public Collection<Type> getTypes(String typeId,
- boolean returnPropertyDefinitions) {
- boolean[] hasMoreItems = new boolean[1];
- return getTypes(typeId, returnPropertyDefinitions, 0, 0, hasMoreItems);
+ public Collection<Type> getTypes(String typeId) {
+ return getTypes(typeId, -1, true);
}
- public List<Type> getTypes(String typeId,
- boolean returnPropertyDefinitions, int maxItems,
- int skipCount, boolean[] hasMoreItems) {
+ public List<Type> getTypes(String typeId, int depth,
+ boolean returnPropertyDefinitions) {
// TODO dynamically discover and return types.
+ // TODO depth, returnPropertyDefinitions
try {
// TODO pass credentials as parameters