|
|||||||||||||||||||
| Source file | Conditionals | Statements | Methods | TOTAL | |||||||||||||||
| XindiceCollection.java | 64.3% | 72.1% | 88.9% | 72.7% |
|
||||||||||||||
| 1 | /* | |
| 2 | * Licensed to the Apache Software Foundation (ASF) under one or more | |
| 3 | * contributor license agreements. See the NOTICE file distributed with | |
| 4 | * this work for additional information regarding copyright ownership. | |
| 5 | * The ASF licenses this file to You under the Apache License, Version 2.0 | |
| 6 | * (the "License"); you may not use this file except in compliance with | |
| 7 | * the License. You may obtain a copy of the License at | |
| 8 | * | |
| 9 | * http://www.apache.org/licenses/LICENSE-2.0 | |
| 10 | * | |
| 11 | * Unless required by applicable law or agreed to in writing, software | |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, | |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 14 | * See the License for the specific language governing permissions and | |
| 15 | * limitations under the License. | |
| 16 | * | |
| 17 | * $Id: XindiceCollection.java 643240 2008-04-01 01:53:39Z natalia $ | |
| 18 | */ | |
| 19 | ||
| 20 | package org.apache.xindice.client.xmldb; | |
| 21 | ||
| 22 | import org.apache.xindice.client.xmldb.resources.XMLResourceImpl; | |
| 23 | import org.apache.xindice.client.xmldb.resources.BinaryResourceImpl; | |
| 24 | import org.apache.xindice.client.xmldb.services.CollectionManagementServiceImpl; | |
| 25 | import org.apache.xindice.client.xmldb.services.MetaService; | |
| 26 | import org.apache.xindice.client.xmldb.services.TextQueryServiceImpl; | |
| 27 | import org.apache.xindice.client.xmldb.services.XPathQueryServiceImpl; | |
| 28 | import org.apache.xindice.client.xmldb.services.XUpdateQueryServiceImpl; | |
| 29 | import org.apache.xindice.client.xmldb.services.ResourceManagementService; | |
| 30 | import org.apache.xindice.client.xmldb.services.ResourceManagementServiceImpl; | |
| 31 | import org.apache.xindice.core.FaultCodes; | |
| 32 | import org.apache.xindice.core.meta.MetaData; | |
| 33 | import org.apache.xindice.xml.NodeSource; | |
| 34 | ||
| 35 | import org.w3c.dom.Document; | |
| 36 | import org.xmldb.api.base.Collection; | |
| 37 | import org.xmldb.api.base.ErrorCodes; | |
| 38 | import org.xmldb.api.base.Resource; | |
| 39 | import org.xmldb.api.base.ResourceSet; | |
| 40 | import org.xmldb.api.base.Service; | |
| 41 | import org.xmldb.api.base.XMLDBException; | |
| 42 | ||
| 43 | import java.util.Enumeration; | |
| 44 | import java.util.Hashtable; | |
| 45 | ||
| 46 | /** | |
| 47 | * This is a base XML:DB Collection that is extended by all Xindice | |
| 48 | * XML:DB API drivers. It includes the functionality that is common to | |
| 49 | * all drivers and abstract methods for all other driver specific methods. | |
| 50 | * This enables the implementation of drivers in just two classes and the | |
| 51 | * use of common services implementations. | |
| 52 | * | |
| 53 | * @author <a href="mailto:kstaken@xmldatabases.org">Kimbro Staken</a> | |
| 54 | * @author <a href="mailto:james.bates@amplexor.com">James Bates</a> | |
| 55 | * @version $Revision: 643240 $, $Date: 2008-04-01 01:53:39 +0000 (Tue, 01 Apr 2008) $ | |
| 56 | */ | |
| 57 | public abstract class XindiceCollection extends CommonConfigurable implements Collection { | |
| 58 | ||
| 59 | /** | |
| 60 | * Xindice query result meta-info namespace | |
| 61 | */ | |
| 62 | public static final String QUERY_NS = NodeSource.SOURCE_NS; | |
| 63 | ||
| 64 | /** | |
| 65 | * Instantiated named services map | |
| 66 | */ | |
| 67 | protected final Hashtable services = new Hashtable(); | |
| 68 | ||
| 69 | /** | |
| 70 | * Path to the collection on target server | |
| 71 | */ | |
| 72 | protected final String collPath; | |
| 73 | ||
| 74 | /** | |
| 75 | * Creates new <code>CollectionImpl</code> instance representing connection | |
| 76 | * to server collection. | |
| 77 | * | |
| 78 | * @exception XMLDBException thrown if a connection could not be established, | |
| 79 | * because of URL syntax errors, or connection failure, or if no | |
| 80 | * collection with path <code>collPath</code> could be located. | |
| 81 | */ | |
| 82 | 3418 | public XindiceCollection(String collPath) throws XMLDBException { |
| 83 | 3418 | this.collPath = collPath.endsWith("/") ? collPath.substring(0, collPath.length() - 1) : collPath; |
| 84 | ||
| 85 | // Register all services supported by this collection implementation. | |
| 86 | 3418 | final XPathQueryServiceImpl xpath = new XPathQueryServiceImpl(); |
| 87 | // xpath.setSymbolDeserializer(syms); | |
| 88 | 3418 | registerService(xpath); |
| 89 | ||
| 90 | 3418 | final XUpdateQueryServiceImpl xupdate = new XUpdateQueryServiceImpl(); |
| 91 | 3418 | registerService(xupdate); |
| 92 | ||
| 93 | 3418 | final TextQueryServiceImpl text = new TextQueryServiceImpl(); |
| 94 | 3418 | registerService(text); |
| 95 | ||
| 96 | // TODO if (this.col.isMetaEnabled()) { | |
| 97 | 3418 | final MetaService meta = new MetaService(); |
| 98 | 3418 | registerService(meta); |
| 99 | ||
| 100 | 3418 | final ResourceManagementService rms = new ResourceManagementServiceImpl(); |
| 101 | 3418 | registerService(rms); |
| 102 | ||
| 103 | 3418 | try { |
| 104 | 3418 | final CollectionManagementServiceImpl manager = new CollectionManagementServiceImpl(); |
| 105 | 3418 | registerService(manager); |
| 106 | ||
| 107 | // CollectionManagementServiceImpl provides both standard access as a | |
| 108 | // CollectionManagementService and Xindice specific access as a | |
| 109 | // CollectionManager and DatabaseInstanceManager. | |
| 110 | // We need to register it explicitly to make it available | |
| 111 | 3418 | services.put("CollectionManager" + manager.getVersion(), manager); |
| 112 | 3418 | services.put("DatabaseInstanceManager" + manager.getVersion(), manager); |
| 113 | } catch (Exception e) { | |
| 114 | 0 | throw FaultCodes.createXMLDBException(e); |
| 115 | } | |
| 116 | } | |
| 117 | ||
| 118 | /** | |
| 119 | * Provides a list of all services known to the collection. If no services | |
| 120 | * are known an empty list is returned. | |
| 121 | * | |
| 122 | * @return An array of registered <code>Service</code> implementations. | |
| 123 | * @exception XMLDBException with expected error codes.<br /> | |
| 124 | * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor | |
| 125 | * specific errors that occur.<br /> | |
| 126 | * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> | |
| 127 | * method has been called on the <code>Collection</code><br /> | |
| 128 | */ | |
| 129 | 0 | public Service[] getServices() throws XMLDBException { |
| 130 | 0 | checkOpen(); |
| 131 | ||
| 132 | 0 | Enumeration e = services.elements(); |
| 133 | 0 | Service[] result = new Service[services.size()]; |
| 134 | ||
| 135 | 0 | int i = 0; |
| 136 | 0 | while (e.hasMoreElements()) { |
| 137 | 0 | result[i] = (Service) e.nextElement(); |
| 138 | 0 | i++; |
| 139 | } | |
| 140 | ||
| 141 | 0 | return result; |
| 142 | } | |
| 143 | ||
| 144 | /** | |
| 145 | * Returns a <code>Service</code> instance for the requested service name and version. If | |
| 146 | * no <code>Service</code> exists for those parameters a null value is returned. | |
| 147 | * | |
| 148 | * @param name Description of Parameter | |
| 149 | * @param version Description of Parameter | |
| 150 | * @return the Service instance or null if no Service could be found. | |
| 151 | * @exception XMLDBException with expected error codes.<br /> | |
| 152 | * <code>ErrorCodes.VENDOR_ERROR</code> for any vendor | |
| 153 | * specific errors that occur.<br /> | |
| 154 | * <code>ErrorCodes.COLLECTION_CLOSED</code> if the <code>close</code> | |
| 155 | * method has been called on the <code>Collection</code><br /> | |
| 156 | */ | |
| 157 | 1179 | public org.xmldb.api.base.Service getService(String name, String version) throws XMLDBException { |
| 158 | 1179 | checkOpen(); |
| 159 | ||
| 160 | 1179 | return (Service) services.get(name + version); |
| 161 | } | |
| 162 | ||
| 163 | /** | |
| 164 | * Registers a new Service with this Collection. | |
| 165 | * | |
| 166 | * @param service Description of Parameter | |
| 167 | * @exception XMLDBException | |
| 168 | */ | |
| 169 | 20508 | public void registerService(org.xmldb.api.base.Service service) throws XMLDBException { |
| 170 | ||
| 171 | 20508 | service.setCollection(this); |
| 172 | 20508 | services.put(service.getName() + service.getVersion(), service); |
| 173 | } | |
| 174 | ||
| 175 | /** | |
| 176 | * Checks if the collection is still open. Only open collections are safe | |
| 177 | * to work with. | |
| 178 | * | |
| 179 | * @return whether the collection is still open | |
| 180 | */ | |
| 181 | public abstract boolean isOpen(); | |
| 182 | ||
| 183 | /** | |
| 184 | * Throws an exception if collection is no longer open | |
| 185 | * | |
| 186 | * @exception XMLDBException thrown if collection is closed | |
| 187 | */ | |
| 188 | 4866 | protected void checkOpen() throws XMLDBException { |
| 189 | 4866 | if (!isOpen()) { |
| 190 | 0 | throw new XMLDBException(ErrorCodes.COLLECTION_CLOSED); |
| 191 | } | |
| 192 | } | |
| 193 | ||
| 194 | /** | |
| 195 | * Returns the name associated with the <code>Collection</code> instance. | |
| 196 | * | |
| 197 | * @return the name of the object. | |
| 198 | */ | |
| 199 | 15 | public String getName() { |
| 200 | 15 | return collPath.substring(collPath.lastIndexOf('/') + 1); |
| 201 | } | |
| 202 | ||
| 203 | /** | |
| 204 | * Returns complete path to collection | |
| 205 | * | |
| 206 | * @return the collection path | |
| 207 | */ | |
| 208 | 254 | public String getCanonicalName() { |
| 209 | 254 | return collPath; |
| 210 | } | |
| 211 | ||
| 212 | /** | |
| 213 | * Returns XML:DB URI that would retrieve this collection | |
| 214 | * | |
| 215 | * @return a complete XML:DB URI | |
| 216 | */ | |
| 217 | public abstract String getURI(); | |
| 218 | ||
| 219 | /** | |
| 220 | * Constructs a new resource that will belong in this collection. | |
| 221 | * | |
| 222 | * Only XML resources are supported. To save the resource to the database, you | |
| 223 | * must first set the resource's XML data, and then call | |
| 224 | * <code>storeResource()</code>. | |
| 225 | * | |
| 226 | * @param name Name for the new resource. If it is empty or <code>null</code>, a name | |
| 227 | * will be assigned when storing the resource in the database. | |
| 228 | * @param type Type must be either <code>XMLResource</code> or <code>BinaryResource</code>. | |
| 229 | * @exception XMLDBException thrown in case of an invalid resource type or name | |
| 230 | */ | |
| 231 | 1245 | public Resource createResource(String name, String type) throws XMLDBException { |
| 232 | 1245 | if (!"XMLResource".equals(type) && !"BinaryResource".equals(type)) { |
| 233 | 0 | throw new XMLDBException(ErrorCodes.UNKNOWN_RESOURCE_TYPE, |
| 234 | "Only XMLResource and BinaryResource supported"); | |
| 235 | } | |
| 236 | ||
| 237 | 1245 | if (name == null || name.length() == 0) { |
| 238 | // fulfill contract stating | |
| 239 | // "If id is null or its value is empty then an id is generated by calling createId()." | |
| 240 | 12 | name = createId(); |
| 241 | 1233 | } else if (name.indexOf('/') != -1) { |
| 242 | 0 | throw new XMLDBException(ErrorCodes.INVALID_RESOURCE, |
| 243 | "Name cannot contain '/'"); | |
| 244 | } | |
| 245 | ||
| 246 | 1245 | if ("XMLResource".equals(type)) { |
| 247 | 1233 | return new XMLResourceImpl(name, this); |
| 248 | } else { | |
| 249 | 12 | return new BinaryResourceImpl(name, this, null); |
| 250 | } | |
| 251 | } | |
| 252 | ||
| 253 | /** | |
| 254 | * Queries the entire collection and resturns the result | |
| 255 | * | |
| 256 | * @param queryLang <code>XUpdate</code> or <code>XPath</code> | |
| 257 | * @param query the text of the query statement | |
| 258 | * @param nsMap namespace bindings to use when evaluating query | |
| 259 | * @return set containing result of query | |
| 260 | * @throws XMLDBException thrown in case of invalid query or other error | |
| 261 | */ | |
| 262 | 351 | public ResourceSet query(String queryLang, String query, Hashtable nsMap) throws XMLDBException { |
| 263 | 351 | return query(null, queryLang, query, nsMap); |
| 264 | } | |
| 265 | ||
| 266 | /** | |
| 267 | * Queries a specific document or the entire collection and returns result | |
| 268 | * | |
| 269 | * @param name name of document to query, or <code>null</code> to query | |
| 270 | * entire collection. | |
| 271 | * @param queryLang <code>XUpdate</code> or <code>XPath</code>. | |
| 272 | * @param query the text of the query statement | |
| 273 | * @param nsMap namespace bindings to use when evaluating query | |
| 274 | * @return set containing result of query | |
| 275 | * @throws XMLDBException thrown in case of invalid query or other error | |
| 276 | */ | |
| 277 | public abstract ResourceSet query(String name, String queryLang, String query, Hashtable nsMap) throws XMLDBException; | |
| 278 | ||
| 279 | /** | |
| 280 | * Creates a new child collection in this collection | |
| 281 | * | |
| 282 | * @param name The name for new child collection | |
| 283 | * @return object representing newly created collection | |
| 284 | * @exception XMLDBException thrown if collection creation fails for some | |
| 285 | * reason | |
| 286 | */ | |
| 287 | public abstract Collection createCollection(String name) throws XMLDBException; | |
| 288 | ||
| 289 | /** | |
| 290 | * Creates a new child collection. | |
| 291 | * If path is a simple name (no '/' character), collection will be created | |
| 292 | * in this collection. If path contains more then one element, collection will be | |
| 293 | * created in the corresponding sub-collection of this collection (which must | |
| 294 | * already exist). | |
| 295 | * | |
| 296 | * @param path The path for new child collection | |
| 297 | * @return object representing newly created collection | |
| 298 | * @exception XMLDBException thrown if collection creation fails for some | |
| 299 | * reason | |
| 300 | */ | |
| 301 | public abstract Collection createCollection(String path, Document configuration) throws XMLDBException; | |
| 302 | ||
| 303 | /** | |
| 304 | * Removes child collection from this collection | |
| 305 | * | |
| 306 | * @param name name of child collection | |
| 307 | * @exception XMLDBException thrown if collection creation fails for some | |
| 308 | * reason | |
| 309 | */ | |
| 310 | public abstract void removeCollection(String name) throws XMLDBException; | |
| 311 | ||
| 312 | /** | |
| 313 | * Returns a list of all indexers for this collection. | |
| 314 | * | |
| 315 | * @return the list of indexers | |
| 316 | * @exception XMLDBException | |
| 317 | */ | |
| 318 | public abstract String[] listIndexers() throws XMLDBException; | |
| 319 | ||
| 320 | /** | |
| 321 | * Creates a new Indexer for this collection. | |
| 322 | * | |
| 323 | * @param configuration The configuration to use for this indexer. | |
| 324 | * @exception XMLDBException | |
| 325 | */ | |
| 326 | public abstract void createIndexer(Document configuration) throws XMLDBException; | |
| 327 | ||
| 328 | /** | |
| 329 | * Drops the indexer from the collection | |
| 330 | * | |
| 331 | * @param name The name of the indexer to drop. | |
| 332 | * @exception XMLDBException | |
| 333 | */ | |
| 334 | public abstract void dropIndexer(String name) throws XMLDBException; | |
| 335 | ||
| 336 | /** | |
| 337 | * Shutsdown the Database instance | |
| 338 | * | |
| 339 | * @exception XMLDBException | |
| 340 | */ | |
| 341 | public abstract void shutdown() throws XMLDBException; | |
| 342 | ||
| 343 | /** | |
| 344 | * Returns {@link MetaData} object for the specified document or the current | |
| 345 | * collection | |
| 346 | * @param name name of document to get meta, or <code>null</code> to get meta | |
| 347 | * of the collection. | |
| 348 | * @return Requested meta data object | |
| 349 | * @exception XMLDBException thrown if unable to obtain meta information | |
| 350 | */ | |
| 351 | public abstract MetaData getMetaData(String name) throws XMLDBException; | |
| 352 | ||
| 353 | /** | |
| 354 | * Updates {@link MetaData} object for the specified document or the current | |
| 355 | * collection | |
| 356 | * @param name name of document to update meta, or <code>null</code> to update meta | |
| 357 | * of the collection. | |
| 358 | * @param meta meta data object | |
| 359 | * @exception XMLDBException thrown if unable to obtain meta information | |
| 360 | */ | |
| 361 | public abstract void setMetaData(String name, MetaData meta) throws XMLDBException; | |
| 362 | ||
| 363 | public abstract void insertResource(Resource resource) throws XMLDBException; | |
| 364 | ||
| 365 | public abstract void updateResource(Resource resource) throws XMLDBException; | |
| 366 | } |
|
||||||||||