vgritsenko    2003/08/14 21:34:54

  Modified:    java/src/org/apache/xindice/client/xmldb
                        XindiceCollection.java
               java/src/org/apache/xindice/client/xmldb/embed
                        CollectionImpl.java DatabaseImpl.java
               java/src/org/apache/xindice/core Collection.java
                        CollectionManager.java FaultCodes.java
  Log:
  Improving exception handling:
   * add methods to FaultCodes
   * Use FaultCodes.createXMLDBException
  
  Revision  Changes    Path
  1.13      +2 -3      
xml-xindice/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java
  
  Index: XindiceCollection.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/XindiceCollection.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XindiceCollection.java    13 Aug 2003 18:51:15 -0000      1.12
  +++ XindiceCollection.java    15 Aug 2003 04:34:54 -0000      1.13
  @@ -220,7 +220,6 @@
       protected void checkOpen() throws XMLDBException {
   
           if (!isOpen()) {
  -
               throw new XMLDBException(ErrorCodes.COLLECTION_CLOSED);
           }
       }
  
  
  
  1.22      +62 -47    
xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/CollectionImpl.java
  
  Index: CollectionImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/CollectionImpl.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- CollectionImpl.java       13 Aug 2003 18:51:15 -0000      1.21
  +++ CollectionImpl.java       15 Aug 2003 04:34:54 -0000      1.22
  @@ -1,5 +1,3 @@
  -package org.apache.xindice.client.xmldb.embed;
  -
   /*
    * The Apache Software License, Version 1.1
    *
  @@ -58,6 +56,9 @@
    *
    * $Id$
    */
  +
  +package org.apache.xindice.client.xmldb.embed;
  +
   import java.util.Enumeration;
   import java.util.Hashtable;
   
  @@ -96,8 +97,8 @@
    */
   public class CollectionImpl extends XindiceCollection {
   
  -    Database db = null;
  -    Collection col = null;
  +    private Database db = null;
  +    private Collection col = null;
   
       /**
        * Creates new <code>CollectionImpl</code> instance representing 
connection
  @@ -114,10 +115,13 @@
           try {
               this.col = db.getCollection(collPath);
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, 
"Collection not found: " + collPath, e);
  +            throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                                  "Collection not available: 
" + collPath, e);
           }
  +
           if (this.col == null) {
  -            throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION, 
"Collection not found: " + collPath);
  +            throw new XMLDBException(ErrorCodes.NO_SUCH_COLLECTION,
  +                                     "Collection not found: " + collPath);
           }
       }
   
  @@ -146,17 +150,18 @@
                   Document doc = (Document) entry;
   
                   // This should probably just pass the document.
  -                return new XMLResourceImpl(id, id, this, ((DocumentImpl) 
doc).getSymbols(), ((DocumentImpl) doc).getDataBytes());
  +                return new XMLResourceImpl(id, id, this,
  +                                           ((DocumentImpl) doc).getSymbols(),
  +                                           ((DocumentImpl) 
doc).getDataBytes());
   
               } else if (entry instanceof byte[]) {
                   return new BinaryResourceImpl(id, entry);
               } else {
  -                throw new XMLDBException(
  -                    ErrorCodes.UNKNOWN_RESOURCE_TYPE,
  -                    "Internal error: unexpected type " + 
entry.getClass().getName());
  +                throw new XMLDBException(ErrorCodes.UNKNOWN_RESOURCE_TYPE,
  +                                         "Internal error: unexpected type " 
+ entry.getClass().getName());
               }
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, "Message: " + 
e.getMessage(), e);
  +            throw FaultCodes.createXMLDBException("Resource not available: " 
+ id, e);
           }
       }
   
  @@ -177,7 +182,7 @@
           try {
               return (int) col.getDocumentCount();
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -198,7 +203,8 @@
       public void storeResource(Resource res) throws XMLDBException {
   
           if (res.getContent() == null) {
  -            throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "no 
resource data");
  +            throw new XMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                     "No resource data");
           }
   
           checkOpen();
  @@ -209,7 +215,8 @@
               if (content instanceof byte[]) {
                   bytes = (byte[]) content;
               } else {
  -                throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "The 
contents of a binary resource must have type byte[].");
  +                throw new XMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                         "The contents of a binary resource 
must have type byte[].");
               }
   
               try {
  @@ -219,8 +226,9 @@
                       String name = col.insertBinary(bytes).toString();
                       ((BinaryResourceImpl) res).setId(name);
                   }
  -            } catch (DBException e) {
  -                throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            } catch (Exception e) {
  +                throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                                      "Invalid resource:" + 
res.getId(), e);
               }
   
           } else if (res instanceof XMLResource) {
  @@ -236,13 +244,16 @@
                           ((XMLResourceImpl) res).setId(name);
                       }
                   } else {
  -                    throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "A 
resource must be a document in order to be stored.");
  +                    throw new XMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                             "A resource must be a document 
in order to be stored.");
                   }
               } catch (Exception e) {
  -                throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +                throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                                      "Invalid resource:" + 
res.getId(), e);
               }
           } else {
  -            throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, "Only 
XMLResource and BinaryResource supported");
  +            throw new XMLDBException(ErrorCodes.INVALID_RESOURCE,
  +                                     "Only XMLResource and BinaryResource 
supported");
           }
       }
   
  @@ -253,7 +264,7 @@
   
       /* see superclass for documentation */
       public String getURI() {
  -        return "xmldb:" + DatabaseImpl.DRIVER_NAME + "://" + collPath;
  +        return "xmldb:" + DatabaseImpl.DRIVER_NAME + "://" + 
getCanonicalName();
       }
   
       /**
  @@ -271,17 +282,21 @@
       public org.xmldb.api.base.Collection getChildCollection(String name) 
throws XMLDBException {
   
           if (name.indexOf('/') != -1) {
  -            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION);
  +            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                     "Invalid collection: " + name);
           }
   
           try {
  -            return new CollectionImpl(db, collPath + "/" + name);
  +            return new CollectionImpl(db, getCanonicalName() + "/" + name);
           } catch (XMLDBException e) {
               if (e.errorCode == ErrorCodes.NO_SUCH_COLLECTION) {
                   // per getChildCollection contract, return null if not found
                   return null;
               }
               throw e;
  +        } catch (Exception e) {
  +            throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                                  "Invalid collection: " + 
name, e);
           }
       }
   
  @@ -301,7 +316,7 @@
           try {
               return col.createNewOID().toString();
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -316,7 +331,7 @@
        *  <code>ErrorCodes.VENDOR_ERROR</code> for any vendor
        *  specific errors that occur.<br />
        */
  -    public void close() throws org.xmldb.api.base.XMLDBException {
  +    public void close() throws XMLDBException {
           col = null;
           db.flushConfig();
       }
  @@ -347,6 +362,8 @@
                   return null;
               }
               throw e;
  +        } catch (Exception e) {
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -381,7 +398,7 @@
           try {
               col.remove(res.getId());
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.NO_SUCH_RESOURCE, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -404,7 +421,7 @@
           try {
               return col.listCollections();
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -425,7 +442,7 @@
           try {
               return (int) col.countCollections();
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -446,7 +463,7 @@
           try {
               return col.listDocuments();
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.UNKNOWN_ERROR, e);
  +            throw FaultCodes.createXMLDBException(e);
           }
       }
   
  @@ -454,7 +471,6 @@
       public ResourceSet query(String name, String queryLang, String query, 
Hashtable nsMap) throws XMLDBException {
   
           checkOpen();
  -
           try {
               NodeSet result;
               if (name != null) {
  @@ -465,7 +481,8 @@
   
               return new ResourceSetImpl(this, nodesetToDocument(result));
           } catch (Exception e) {
  -            throw 
FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR, "Query error: 
" + e.getMessage(), e);
  +            throw 
FaultCodes.createXMLDBException(FaultCodes.QRY_PROCESSING_ERROR,
  +                                                  "Query error: " + 
e.getMessage(), e);
           }
       }
   
  @@ -487,7 +504,9 @@
   
               return createCollection(name, doc);
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot 
create child collection", e);
  +            throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                                  FaultCodes.GEN_UNKNOWN,
  +                                                  "Cannot create child 
collection", e);
           }
       }
   
  @@ -500,7 +519,9 @@
   
               return getChildCollection(name);
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot 
create child collection", e);
  +            throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                                  FaultCodes.GEN_UNKNOWN,
  +                                                  "Cannot create child 
collection", e);
           }
       }
   
  @@ -511,7 +532,9 @@
           try {
               col.dropCollection(col.getCollection(childName));
           } catch (Exception e) {
  -            throw new XMLDBException(ErrorCodes.INVALID_COLLECTION, "Cannot 
remove child collection", e);
  +            throw 
FaultCodes.createXMLDBException(ErrorCodes.INVALID_COLLECTION,
  +                                                  FaultCodes.GEN_UNKNOWN,
  +                                                  "Cannot remove child 
collection", e);
           }
       }
   
  @@ -565,8 +588,7 @@
           int count = 0;
           while (ns != null && ns.hasMoreNodes()) {
               final Object element = ns.getNextNode();
  -            if (element instanceof Node)
  -            {
  +            if (element instanceof Node) {
                   Node n = (Node) element;
       
                   if (n.getNodeType() == Node.DOCUMENT_NODE) {
  @@ -578,17 +600,11 @@
                   }
       
                   root.appendChild(doc.importNode(n, true));
  -            }
  -            else if (element instanceof Boolean || element instanceof Double)
  -            {
  +            } else if (element instanceof Boolean || element instanceof 
Double) {
                   root.appendChild(doc.createTextNode(element.toString()));
  -            }
  -            else if (element instanceof String)
  -            {
  +            } else if (element instanceof String) {
                   root.appendChild(doc.createTextNode((String) element));
  -            }
  -            else
  -            {
  +            } else {
                   throw new XindiceRuntimeException("Unknown result type (" + 
element.getClass().getName() + "in nodeset");   
               }
   
  @@ -596,7 +612,6 @@
           }
   
           root.setAttribute("count", Integer.toString(count));
  -
           return doc;
       }
   
  
  
  
  1.19      +3 -2      
xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java
  
  Index: DatabaseImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/client/xmldb/embed/DatabaseImpl.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- DatabaseImpl.java 9 Aug 2003 02:44:23 -0000       1.18
  +++ DatabaseImpl.java 15 Aug 2003 04:34:54 -0000      1.19
  @@ -56,6 +56,7 @@
    *
    * CVS $Id$
    */
  +
   package org.apache.xindice.client.xmldb.embed;
   
   import org.apache.commons.logging.Log;
  
  
  
  1.37      +6 -5      
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.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- Collection.java   15 Aug 2003 03:06:02 -0000      1.36
  +++ Collection.java   15 Aug 2003 04:34:54 -0000      1.37
  @@ -1326,7 +1326,8 @@
           }
   
           if (!filer.deleteRecord(objKey)) {
  -            throw new DBException(FaultCodes.COL_DOCUMENT_NOT_FOUND, 
"Document Does Not Exist");
  +            throw new DBException(FaultCodes.COL_DOCUMENT_NOT_FOUND,
  +                                  "Document Does Not Exist");
           }
   
           // update the meta for this collection if necessary
  @@ -1369,7 +1370,7 @@
                   throw new DBException(FaultCodes.GEN_UNKNOWN,
                                         "Mismatch type of meta data for 
collection " + getCanonicalName());
               }
  -            
  +
               MetaSystemCollection metacol = getMetaSystemCollection();
               MetaData current = metacol.getCollectionMeta(this);
               current.copyDataFrom(meta);
  @@ -1540,7 +1541,7 @@
                   throw new DBException(FaultCodes.GEN_UNKNOWN,
                                         "Mismatch type of meta data for 
document " + getCanonicalDocumentName(id));
               }
  -            
  +
               MetaSystemCollection metacol = getMetaSystemCollection();
               MetaData current = metacol.getDocumentMeta(this, id);
               current.copyDataFrom(meta);
  
  
  
  1.19      +4 -3      
xml-xindice/java/src/org/apache/xindice/core/CollectionManager.java
  
  Index: CollectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/CollectionManager.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- CollectionManager.java    12 Aug 2003 02:57:30 -0000      1.18
  +++ CollectionManager.java    15 Aug 2003 04:34:54 -0000      1.19
  @@ -241,8 +241,9 @@
                   cm = (CollectionManager) cm.collections.get(path);
               }
               return (Collection) cm;
  -        } else
  +        } else {
               return (Collection) collections.get(path);
  +        }
       }
   
       /**
  
  
  
  1.17      +31 -9     
xml-xindice/java/src/org/apache/xindice/core/FaultCodes.java
  
  Index: FaultCodes.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/FaultCodes.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- FaultCodes.java   15 Aug 2003 03:08:36 -0000      1.16
  +++ FaultCodes.java   15 Aug 2003 04:34:54 -0000      1.17
  @@ -238,12 +238,27 @@
        * @return An XMLDBException instance
        */
       public static XMLDBException createXMLDBException(Exception e) {
  -        if (e instanceof XMLDBException) {
  -            return (XMLDBException) e;
  -        }
  +        return createXMLDBException(null, e);
  +    }
  +
  +    /**
  +     * createXMLDBException creates an XMLDBException instance based
  +     * on the specified Exception.  If the Exception is a DBException,
  +     * it will extract any important information from it (like fault
  +     * codes and messages)
  +     *
  +     * @param e The Exception to use
  +     * @param message The Message to use
  +     * @return An XMLDBException instance
  +     */
  +    public static XMLDBException createXMLDBException(String message, 
Exception e) {
   
           int faultCode = e instanceof RuntimeException ? JAVA_RUNTIME_ERROR : 
GEN_UNKNOWN;
  -        return createXMLDBException(faultCode, null, e);
  +        return createXMLDBException(faultCode, message, e);
  +    }
  +
  +    public static XMLDBException createXMLDBException(int faultCode, String 
message, Exception e) {
  +        return createXMLDBException(ErrorCodes.VENDOR_ERROR, faultCode, 
message, e);
       }
   
       /**
  @@ -256,6 +271,7 @@
        * into the message. If a chain of wrapped XindiceExceptions is 
available,
        * the chain will be followed incorporating the class name and message
        * at each level.
  +     *
        * TODO: This should only be considered a temporary fix
        * TODO: until such time as the xmldb API can be refined to allow for 
wrapped
        * TODO: throwables in XMLDBException.
  @@ -264,7 +280,7 @@
        * @param e The Exception to use
        * @return An XMLDBException instance
        */
  -    public static XMLDBException createXMLDBException(int faultCode, String 
message, Exception e) {
  +    public static XMLDBException createXMLDBException(int errorCode, int 
faultCode, String message, Exception e) {
           if (e instanceof XMLDBException) {
               return (XMLDBException) e;
           }
  @@ -273,7 +289,13 @@
               faultCode = ((DBException) e).faultCode;
           }
   
  -        return new XMLDBException(ErrorCodes.VENDOR_ERROR, faultCode, 
message, e);
  +        if (message == null) {
  +            message = e.getMessage();
  +        }
  +
  +        // TODO: Mapping FaultCodes.COL_DOCUMENT_NOT_FOUND -> 
ErrorCodes.NO_SUCH_RESOURCE etc
  +
  +        return new XMLDBException(errorCode, faultCode, message, e);
       }
   
       /**
  @@ -312,7 +334,7 @@
           if (e instanceof DBException) {
               code = ((DBException) e).faultCode;
           }
  -        
  +
           // Strip it to the series
           code = code - (code % 100);
           return code;
  
  
  

Reply via email to