001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/ogcwebservices/csw/manager/Transaction.java $
002: /*---------------- FILE HEADER ------------------------------------------
003:
004: This file is part of deegree.
005: Copyright (C) 2001-2008 by:
006: EXSE, Department of Geography, University of Bonn
007: http://www.giub.uni-bonn.de/deegree/
008: lat/lon GmbH
009: http://www.lat-lon.de
010:
011: This library is free software; you can redistribute it and/or
012: modify it under the terms of the GNU Lesser General Public
013: License as published by the Free Software Foundation; either
014: version 2.1 of the License, or (at your option) any later version.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: Contact:
026:
027: Andreas Poth
028: lat/lon GmbH
029: Aennchenstr. 19
030: 53115 Bonn
031: Germany
032: E-Mail: poth@lat-lon.de
033:
034: Prof. Dr. Klaus Greve
035: Department of Geography
036: University of Bonn
037: Meckenheimer Allee 166
038: 53115 Bonn
039: Germany
040: E-Mail: greve@giub.uni-bonn.de
041:
042: ---------------------------------------------------------------------------*/
043:
044: package org.deegree.ogcwebservices.csw.manager;
045:
046: import java.util.List;
047: import java.util.Map;
048:
049: import org.deegree.framework.log.ILogger;
050: import org.deegree.framework.log.LoggerFactory;
051: import org.deegree.framework.xml.NamespaceContext;
052: import org.deegree.framework.xml.XMLException;
053: import org.deegree.framework.xml.XMLParsingException;
054: import org.deegree.framework.xml.XMLTools;
055: import org.deegree.i18n.Messages;
056: import org.deegree.ogcbase.CommonNamespaces;
057: import org.deegree.ogcbase.ExceptionCode;
058: import org.deegree.ogcwebservices.AbstractOGCWebServiceRequest;
059: import org.deegree.ogcwebservices.InvalidParameterValueException;
060: import org.deegree.ogcwebservices.OGCWebServiceException;
061: import org.deegree.ogcwebservices.csw.CSWPropertiesAccess;
062: import org.deegree.ogcwebservices.csw.discovery.GetRecordByIdDocument;
063: import org.w3c.dom.Element;
064:
065: /**
066: * A Transaction defines an atomic unit of work and is a container for one or more insert, update
067: * and/or delete actions.
068: *
069: *
070: * @version $Revision: 9345 $
071: * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
072: * @author last edited by: $Author: apoth $
073: *
074: * @version $Revision: 9345 $, $Date: 2007-12-27 08:22:25 -0800 (Thu, 27 Dec 2007) $
075: *
076: */
077: public class Transaction extends AbstractOGCWebServiceRequest {
078:
079: private static final long serialVersionUID = -4393029325052150570L;
080:
081: protected static final ILogger LOG = LoggerFactory
082: .getLogger(Transaction.class);
083:
084: private static NamespaceContext nsContext = CommonNamespaces
085: .getNamespaceContext();
086:
087: private List<Operation> operations = null;
088:
089: private boolean verboseResponse = false;
090:
091: /**
092: * creates a Transaction object from its XML representation defined in OGC CS-W 2.0.0
093: * specification
094: * @param id uniquely identifies the given request
095: *
096: * @param root the root of the xml-encoded transaction request
097: * @return a Transaction with the values taken form the XML-Document.
098: * @throws OGCWebServiceException if the Transaction could not be created
099: */
100: public static final Transaction create(String id, Element root)
101: throws OGCWebServiceException {
102:
103: String version = null;
104: try {
105: // first try to read verdsion attribute which is optional for CSW 2.0.0 and 2.0.1
106: version = XMLTools.getNodeAsString(root, "./@version",
107: nsContext, null);
108: } catch (XMLParsingException e) {
109:
110: }
111: if (version == null) {
112: // if no version attribute has been set try mapping namespace URI to a version;
113: // this is not well defined for 2.0.0 and 2.0.1 which uses the same namespace.
114: // in this case 2.0.0 will be returned!
115: version = CSWPropertiesAccess.getString(root
116: .getNamespaceURI());
117: }
118:
119: // read class for version depenging parsing of Transaction request from properties
120: String className = CSWPropertiesAccess.getString("Transaction"
121: + version);
122: Class clzz = null;
123: try {
124: clzz = Class.forName(className);
125: } catch (ClassNotFoundException e) {
126: LOG.logError(e.getMessage(), e);
127: throw new InvalidParameterValueException(e.getMessage(), e);
128: }
129: TransactionDocument document = null;
130: try {
131: document = (TransactionDocument) clzz.newInstance();
132: } catch (InstantiationException e) {
133: LOG.logError(e.getMessage(), e);
134: throw new InvalidParameterValueException(e.getMessage(), e);
135: } catch (IllegalAccessException e) {
136: LOG.logError(e.getMessage(), e);
137: throw new InvalidParameterValueException(e.getMessage(), e);
138: }
139:
140: document.setRootElement(root);
141:
142: try {
143: return document.parse(id);
144: } catch (XMLException e) {
145: String msg = Messages.getMessage(
146: "CSW_ERROR_WHILE_PARSING_TRANSACTION", e
147: .getMessage());
148: LOG.logError(msg, e);
149: throw new OGCWebServiceException(msg,
150: ExceptionCode.INVALID_FORMAT);
151: } catch (XMLParsingException e) {
152: String msg = Messages.getMessage(
153: "CSW_ERROR_WHILE_PARSING_TRANSACTION", e
154: .getMessage());
155: LOG.logError(msg, e);
156: throw new OGCWebServiceException(msg,
157: ExceptionCode.INVALID_FORMAT);
158: }
159: }
160:
161: /**
162: *
163: * @param version
164: * @param id
165: * @param vendorSpecificParameter
166: * @param operations
167: * @param verboseResponse
168: */
169: public Transaction(String version, String id,
170: Map<String, String> vendorSpecificParameter,
171: List<Operation> operations, boolean verboseResponse) {
172: super (version, id, vendorSpecificParameter);
173: this .operations = operations;
174: this .verboseResponse = verboseResponse;
175: }
176:
177: /**
178: * @return the name of the service; always CSW
179: */
180: public String getServiceName() {
181: return "CSW";
182: }
183:
184: /**
185: * The verboseResponseattribute is a boolean that may be used by a client to indicate to a
186: * server the amount of detail to generate in the rsponse. A value of FALSE means that a CSW
187: * should generate a terse or brief transaction response. A value of TRUE, or the absence of the
188: * attribute, means that the normal detailed transaction response should be generated.
189: *
190: * @return true if the response should be verbose
191: */
192: public boolean verboseResponse() {
193: return verboseResponse;
194: }
195:
196: /**
197: * returns all operations being part of a transaction
198: *
199: * @return all operations being part of a transaction
200: */
201: public List<Operation> getOperations() {
202: return operations;
203: }
204: }
|