001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.lenya.cms.editors;
019:
020: import org.apache.lenya.cms.cocoon.source.SourceUtil;
021: import org.apache.lenya.cms.publication.Document;
022: import org.apache.lenya.cms.publication.ResourceType;
023: import org.apache.lenya.cms.repository.Node;
024: import org.apache.lenya.cms.usecase.DocumentUsecase;
025: import org.apache.lenya.cms.usecase.UsecaseException;
026: import org.apache.lenya.cms.usecase.xml.UsecaseErrorHandler;
027: import org.apache.lenya.cms.workflow.WorkflowUtil;
028: import org.apache.lenya.xml.Schema;
029: import org.apache.lenya.xml.ValidationUtil;
030:
031: /**
032: * <p>
033: * You can use this usecase to save a document. It reads XML data from a source
034: * and saves as the content of the current document.
035: * </p>
036: * <ul>
037: * <li>If the document's resource type supports validation, the XML document is
038: * validated and not saved if validation errors occur.</li>
039: * <li>All URL-based internal links in the XML source are converted to
040: * UUID-based links before saving.</li>
041: * <li>A workflow event is invoked. The event defaults to "edit", you can
042: * override it using the <em>event</em> parameter.</li>
043: * </ul>
044: * <p>
045: * Parameters:
046: * </p>
047: * <ul>
048: * <li><em>sourceUri</em> - the URI to read the XML data from</li>
049: * <li><em>event</em> - the workflow event to invoke</li>
050: * </ul>
051: * <p>
052: * A typical usage scenario is to save XML data entered in a form. In this case,
053: * the <em>sourceUri</em> parameter refers to a Cocoon pipeline featuring the
054: * stream generator.
055: * </p>
056: *
057: * @version $Id: EditDocument.java 509150 2007-02-19 10:43:07Z andreas $
058: */
059: public class EditDocument extends DocumentUsecase {
060:
061: protected static final String EVENT = "event";
062: protected static final String DEFAULT_EVENT = "edit";
063:
064: /**
065: * The URI to copy the document source from.
066: */
067: public static final String SOURCE_URI = "sourceUri";
068:
069: /**
070: * @see org.apache.lenya.cms.usecase.AbstractUsecase#doExecute()
071: */
072: protected void doExecute() throws Exception {
073: super .doExecute();
074:
075: Document sourceDoc = getSourceDocument();
076:
077: String sourceUri = getParameterAsString(SOURCE_URI);
078: org.w3c.dom.Document xmlDoc = SourceUtil.readDOM(sourceUri,
079: this .manager);
080:
081: ResourceType resourceType = sourceDoc.getResourceType();
082: Schema schema = resourceType.getSchema();
083: ValidationUtil.validate(this .manager, xmlDoc, schema,
084: new UsecaseErrorHandler(this ));
085:
086: if (!hasErrors()) {
087: SourceUtil.writeDOM(xmlDoc, sourceDoc.getOutputStream());
088: String event = getParameterAsString(EVENT, DEFAULT_EVENT);
089: WorkflowUtil.invoke(this .manager, getSession(),
090: getLogger(), getSourceDocument(), event);
091: }
092: }
093:
094: /**
095: * @see org.apache.lenya.cms.usecase.AbstractUsecase#getNodesToLock()
096: */
097: protected Node[] getNodesToLock() throws UsecaseException {
098: Node[] objects = { getSourceDocument().getRepositoryNode() };
099: return objects;
100: }
101:
102: }
|