public void endElement()

in blocks/cocoon-xmldb/cocoon-xmldb-impl/src/main/java/org/apache/cocoon/transformation/XMLDBTransformer.java [411:539]


    public void endElement(String uri, String loc, String raw)
    throws SAXException {
        if (!processing) {
            super.endElement(uri,loc,raw);
        } else {
            if (XMLDB_URI.equals(uri) && XMLDB_QUERY_ELEMENT.equals(loc)) {
                processing = false;

                String document = null;
                if (this.queryHandler != null) {
                    // Finish building query. Remove existing prefix mappings.
                    Iterator i = prefixMap.entrySet().iterator();
                    while (i.hasNext()) {
                        Map.Entry entry = (Map.Entry) i.next();
                        this.queryHandler.endPrefixMapping((String)entry.getKey());
                    }
                    this.queryHandler.endDocument();
                    document = this.queryWriter.toString();
                }

                // Perform operation
                Collection collection = null;
                try {
                    // Obtain collection for the current operation
                    collection = (xbase != null)? DatabaseManager.getCollection(local_base + "/" + xbase, this.local_user, this.local_password) : this.collection;

                    if (collection == null) {
                        message = "Failed to " + operation + " resource " + this.key + ": Collection " + local_base + "/" + xbase + " not found.";
                        getLogger().debug(message);
                    } else if ("create".equals(operation)) {
                        if (key != null && key.endsWith("/")) {
                            try {
                                // Cut trailing '/'
                                String k = this.key.substring(0, this.key.length() - 1);
                                CollectionManagementService service =
                                        (CollectionManagementService) collection.getService("CollectionManagementService", "1.0");
                                service.createCollection(k);
                                result = "success";
                            } catch (XMLDBException e) {
                                message = "Failed to create collection " + this.key + ": " + e.errorCode;
                                getLogger().error(message, e);
                            }
                        } else {
                            try {
                                if (key == null) {
                                    key = collection.createId();
                                }
                                // Support of binary objects can be added. Content can be obtained using Source.
                                Resource resource = collection.createResource(key, "XMLResource");
                                resource.setContent(document);
                                collection.storeResource(resource);
                                result = "success";
                                key = resource.getId();
                            } catch (XMLDBException e) {
                                message = "Failed to create resource " + key + ": " + e.errorCode;
                                getLogger().debug(message, e);
                            }
                        }
                    } else if ("delete".equals(operation)) {
                        if (key != null && key.endsWith("/")) {
                            try {
                                // Cut trailing '/'
                                String k = this.key.substring(0, this.key.length() - 1);
                                CollectionManagementService service =
                                        (CollectionManagementService) collection.getService("CollectionManagementService", "1.0");
                                service.removeCollection(k);
                                result = "success";
                            } catch (XMLDBException e) {
                                message = "Failed to delete collection " + this.key + ": " + e.errorCode;
                                getLogger().error(message, e);
                            }
                        } else {
                            try {
                                Resource resource = collection.getResource(this.key);
                                if (resource == null) {
                                    message = "Resource " + this.key + " does not exist";
                                    getLogger().debug(message);
                                } else {
                                    collection.removeResource(resource);
                                    result = "success";
                                }
                            } catch (XMLDBException e) {
                                message = "Failed to delete resource " + key + ": " + e.errorCode;
                                getLogger().debug(message, e);
                            }
                        }
                    } else if ("update".equals(operation)) {
                        try {
                            XUpdateQueryService service =
                                    (XUpdateQueryService) collection.getService("XUpdateQueryService", "1.0");
                            long count = (this.key == null)?
                                    service.update(document) : service.updateResource(this.key, document);
                            message = count + " entries updated.";
                            result = "success";
                        } catch (XMLDBException e) {
                            message = "Failed to update resource " + key + ": " + e.errorCode;
                            getLogger().debug(message, e);
                        }
                    }
                } catch (XMLDBException e) {
                    message = "Failed to get context collection for the query (base: " + local_base + ", context: " + xbase + "): " + e.errorCode;
                    getLogger().debug(message, e);
                } finally {
                    if (xbase != null && collection != null) {
                        try {
                            collection.close();
                        } catch (XMLDBException ignored) {
                        }
                    }
                }

                // Report result
                AttributesImpl attrs = new AttributesImpl();
                attrs.addAttribute("", XMLDB_QUERY_OID_ATTRIBUTE,
                        XMLDB_QUERY_OID_ATTRIBUTE, "CDATA", this.key);
                attrs.addAttribute("", XMLDB_QUERY_TYPE_ATTRIBUTE,
                        XMLDB_QUERY_TYPE_ATTRIBUTE, "CDATA", this.operation);
                attrs.addAttribute("", XMLDB_QUERY_RESULT_ATTRIBUTE,
                        XMLDB_QUERY_RESULT_ATTRIBUTE, "CDATA", result);
                super.startElement(uri, loc, raw, attrs);
                if (message != null) {
                    super.characters(message.toCharArray(), 0, message.length());
                }
                super.endElement(uri, loc, raw);
            } else if (this.queryHandler != null) {
                this.queryHandler.endElement(uri, loc, raw);
            }
        }
    }