kevinross 2003/07/10 07:32:55
Modified: java/src/org/apache/xindice/core Collection.java Log: PR: 21463 Patch Submitted by: Kevin O'Neill ([EMAIL PROTECTED]) Reviewed by: Kevin Ross When a call is made to fetch resource list from a collection without a filer (like the database root collection) an error is thrown. The makes writing a generic collection browser most bothersome as you have to "know" that the root collection will throw exceptions with you ask for the number of resource it contains. A better option is to return empty constants in these cases. For example getResourceCount() will always return 0 when called on a collection without a filer. This patch enables that. Revision Changes Path 1.19 +42 -18 xml-xindice/java/src/org/apache/xindice/core/Collection.java Index: Collection.java =================================================================== RCS file: /home/cvs/xml-xindice/java/src/org/apache/xindice/core/Collection.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- Collection.java 13 Jun 2003 14:09:13 -0000 1.18 +++ Collection.java 10 Jul 2003 14:32:54 -0000 1.19 @@ -60,6 +60,8 @@ */ import org.apache.xindice.core.data.DocumentSet; +import org.apache.xindice.core.data.EmptyDocumentSet; +import org.apache.xindice.core.data.EmptyNodeSet; import org.apache.xindice.core.data.Key; import org.apache.xindice.core.data.NodeSet; import org.apache.xindice.core.data.Record; @@ -117,6 +119,10 @@ private static final String SYMBOLS = "symbols"; private static final String CLASSNAME = "xindice-class"; + private static final DocumentSet EMPTY_DOCUMENTSET = new EmptyDocumentSet(); + private static final NodeSet EMPTY_NODESET = new EmptyNodeSet(); + private static final String[] EMPTY_STRING_ARRAY = {}; + private static Log log = LogFactory.getLog("org.apache.xindice.core"); private static int host_id; @@ -1225,8 +1231,10 @@ * @return The resulting NodeSet */ public final NodeSet queryCollection(String style, String query, NamespaceMap nsMap) throws DBException { - checkFiler(FaultCodes.QRY_STYLE_NOT_FOUND); - return getQueryEngine().query(this, style, query, nsMap, null); + // a collection in which you are unable to file documents will have no filer + // (for example the root collection). Rather than throwing an exception return + // a constant result (nothing) + return null == filer ? EMPTY_NODESET : getQueryEngine().query(this, style, query, nsMap, null); } /** @@ -1256,9 +1264,10 @@ * @return The DocumentSet */ public final DocumentSet getDocumentSet() throws DBException { - checkFiler(FaultCodes.COL_NO_FILER); - - return new ColDocumentSet(filer.getRecordSet()); + // a collection in which you are unable to file documents will have no filer + // (for example the root collection). Rather than throwing an exception return + // a constant result (nothing) + return null == filer ? EMPTY_DOCUMENTSET : new ColDocumentSet(filer.getRecordSet()); } /** @@ -1268,17 +1277,31 @@ * @return the list of document keys */ public final String[] listDocuments() throws DBException { - checkFiler(FaultCodes.COL_NO_FILER); - - RecordSet set = filer.getRecordSet(); - ArrayList temp = new ArrayList(); - - while (set.hasMoreRecords()) { - Key key = set.getNextKey(); - temp.add(key.toString()); + // a collection in which you are unable to file documents will have no filer + // (for example the root collection). Rather than throwing an exception return + // a constant result (nothing) + if (null == filer) + { + return EMPTY_STRING_ARRAY; } + else + { + RecordSet set = filer.getRecordSet(); - return (String[]) temp.toArray(new String[0]); + // todo: what happens if the size if > than the size of an int. + // I'm pretty sure some sort of runtime exception will occur + // in the ArrayList.add method. + + // give a hint to the size of the record set, saves on arraylist array copies. + ArrayList temp = new ArrayList((int)filer.getRecordCount()); + + while (set.hasMoreRecords()) { + Key key = set.getNextKey(); + temp.add(key.toString()); + } + + return (String[]) temp.toArray(new String[0]); + } } /** @@ -1288,9 +1311,10 @@ * @return The Document count */ public final long getDocumentCount() throws DBException { - checkFiler(FaultCodes.COL_NO_FILER); - - return filer.getRecordCount(); + // a collection in which you are unable to file documents will have no filer + // (for example the root collection). Rather than throwing an exception return + // a constant result (nothing) + return null == filer ? 0 : filer.getRecordCount(); } public void dispose() {