    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/ogcwebservices/csw/capabilities/CatalogueOperationsMetadata.java $
    002    /*----------------------------------------------------------------------------
    003     This file is part of deegree, http://deegree.org/
    004     Copyright (C) 2001-2009 by:
    005       Department of Geography, University of Bonn
    006     and
    007       lat/lon GmbH
    008
    009     This library is free software; you can redistribute it and/or modify it under
    010     the terms of the GNU Lesser General Public License as published by the Free
    011     Software Foundation; either version 2.1 of the License, or (at your option)
    012     any later version.
    013     This library is distributed in the hope that it will be useful, but WITHOUT
    014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
    016     details.
    017     You should have received a copy of the GNU Lesser General Public License
    018     along with this library; if not, write to the Free Software Foundation, Inc.,
    019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    020
    021     Contact information:
    022
    023     lat/lon GmbH
    024     Aennchenstr. 19, 53177 Bonn
    025     Germany
    026     http://lat-lon.de/
    027
    028     Department of Geography, University of Bonn
    029     Prof. Dr. Klaus Greve
    030     Postfach 1147, 53001 Bonn
    031     Germany
    032     http://www.geographie.uni-bonn.de/deegree/
    033
    034     e-mail: info@deegree.org
    035    ----------------------------------------------------------------------------*/
    036    package org.deegree.ogcwebservices.csw.capabilities;
    037
    038    import java.util.ArrayList;
    039    import java.util.List;
    040
    041    import org.deegree.ogcwebservices.csw.discovery.GetRepositoryItem;
    042    import org.deegree.ogcwebservices.getcapabilities.Operation;
    043    import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
    044    import org.deegree.owscommon.OWSDomainType;
    045
    046    /**
    047     * Represents the <code>OperationMetadata</code> part in the capabilities document of an OGC-CSW
    048     * according to the <code>OpenGIS�
    049     * Catalogue Services Specification 2.0</code>.
    050     * <p>
    051     * In addition to the <code>GetCapabilities</code> operation that all <code>OWS 0.2</code>
    052     * compliant services must implement, it may define some or all of the following operations: <table
    053     * border="1">
    054     * <tr>
    055     * <th>Name</th>
    056     * <th>Mandatory?</th>
    057     * <th>Function</th>
    058     * </tr>
    059     * <tr>
    060     * <td>DescribeRecord</td>
    061     * <td align="center">X</td>
    062     * <td>Allows a client to discover elements of the information model supported by the target
    063     * catalogue service.</td>
    064     * </tr>
    065     * <tr>
    066     * <td>GetDomain</td>
    067     * <td align="center">-</td>
    068     * <td>The optional GetDomain operation is used to obtain runtime information about the range of
    069     * values of a metadata record element or request parameter. The runtime range of values for a
    070     * property or request parameter is typically much smaller than the value space for that property or
    071     * parameter based on its static type definition. For example, a property or request parameter
    072     * defined as a 16bit positive integer in a database may have a value space of 65535 distinct
    073     * integers but the actual number of distinct values existing in the database may be much smaller.
    074     * This type of runtime information about the range of values of a property or request parameter is
    075     * useful for generating user interfaces with meaningful pick lists or for generating query
    076     * predicates that have a higher chance of actually identifying a result set. It should be noted
    077     * that the GetDomain operation is a �best-effort� operation. That is to say that a catalogue tries
    078     * to generate useful information about the specified request parameter or property if it can. It is
    079     * entirely possible that a catalogue may not be able to determine anything about the values of a
    080     * property or request parameter in which case an empty response should be generated.</td>
    081     * </tr>
    082     * <tr>
    083     * <td>GetRecords</td>
    084     * <td align="center">X</td>
    085     * <td>The primary means of resource discovery in the general model are the two operations search
    086     * and present. In the HTTP protocol binding these are combined in the form of the mandatory
    087     * GetRecords operation, which does a search and a piggybacked present.</td>
    088     * </tr>
    089     * <tr>
    090     * <td>GetRecordById</td>
    091     * <td align="center">X</td>
    092     * <td>The mandatory GetRecordById request retrieves the default representation of catalogue
    093     * records using their identifier. The GetRecordById operation is an implementation of the Present
    094     * operation from the general model. This operation presumes that a previous query has been
    095     * performed in order to obtain the identifiers that may be used with this operation. For example,
    096     * records returned by a GetRecords operation may contain references to other records in the
    097     * catalogue that may be retrieved using the GetRecordById operation. This operation is also a
    098     * subset of the GetRecords operation, and is included as a convenient short form for retrieving and
    099     * linking to records in a catalogue.</td>
    100     * </tr>
    101     * <tr>
    102     * <td>Transaction</td>
    103     * <td align="center">-</td>
    104     * <td>The optional Transaction operation defines an interface for creating, modifying and deleting
    105     * catalogue records. The specific payload being manipulated must be defined in a profile.</td>
    106     * </tr>
    107     * <tr>
    108     * <td>Harvest</td>
    109     * <td align="center">-</td>
    110     * <td>The optional Harvest operation is an operation that "pulls" data into the catalogue. That
    111     * is, this operation only references the data to be inserted or updated in the catalogue, and it is
    112     * the job of the catalogue service to resolve the reference, fetch that data, and process it into
    113     * the catalogue. The Harvest operation has two modes of operation, controlled by a flag in the
    114     * request. The first mode of operation is a synchronous mode in which the CSW receives a Harvest
    115     * request from the client, processes it immediately, and sends the results to the client while the
    116     * client waits. The second mode of operation is asynchronous in that the server receives a Harvest
    117     * request from the client, and sends the client an immediate acknowledgement that the request has
    118     * been successfully received. The server can then process the Harvest request whenever it likes,
    119     * taking as much time as is required and then send the results of the processing to a URI specified
    120     * in the original Harvest request. This latter mode of operation is included to support Harvest
    121     * requests that could run for a period of time longer than most HTTP timeout's will allow.
    122     * Processing a Harvest request means that the CSW resolves the URI pointing to the metadata
    123     * resource, parses the resource, and then creates or modifies metadata records in the catalogue in
    124     * order to register the resource. This operation may be performed only once or periodically
    125     * depending on how the client invokes the operation.</td>
    126     * </tr>
    127     * </table>
    128     *
    129     * @see org.deegree.ogcwebservices.getcapabilities.OperationsMetadata
    130     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
    131     * @author last edited by: $Author: mschneider $
    132     *
    133     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
    134     */
    135
    136    public class CatalogueOperationsMetadata extends OperationsMetadata {
    137
    138        private static final long serialVersionUID = -125538317075396593L;
    139
    140        /**
    141         *
    142         */
    143        public static final String DESCRIBE_RECORD_NAME = "DescribeRecord";
    144
    145        /**
    146         *
    147         */
    148        public static final String GET_DOMAIN_NAME = "GetDomain";
    149
    150        /**
    151         *
    152         */
    153        public static final String GET_RECORDS_NAME = "GetRecords";
    154
    155        /**
    156         *
    157         */
    158        public static final String GET_RECORD_BY_ID_NAME = "GetRecordById";
    159
    160        /**
    161         * Identifier for a {@link GetRepositoryItem} request.
    162         */
    163        public static final String GET_REPOSITORY_ITEM = "GetRepositoryItem";
    164
    165        /**
    166         *
    167         */
    168        public static final String TRANSACTION_NAME = "Transaction";
    169
    170        /**
    171         *
    172         */
    173        public static final String HARVEST_NAME = "Harvest";
    174
    175        private Operation describeRecord;
    176
    177        private Operation getDomain;
    178
    179        private Operation getRecords;
    180
    181        private Operation getRecordById;
    182
    183        private Operation transaction;
    184
    185        private Operation harvest;
    186
    187        /**
    188         * Constructs a new <code>CatalogOperationsMetadata</code> from the given parameters.
    189         *
    190         * @param getCapabilities
    191         * @param describeRecord
    192         * @param getDomain
    193         * @param getRecords
    194         * @param getRecordById
    195         * @param transaction
    196         * @param harvest
    197         * @param parameters
    198         * @param constraints
    199         */
    200        public CatalogueOperationsMetadata( Operation getCapabilities, Operation describeRecord, Operation getDomain,
    201                                            Operation getRecords, Operation getRecordById, Operation transaction,
    202                                            Operation harvest, OWSDomainType[] parameters, OWSDomainType[] constraints ) {
    203            super( getCapabilities, parameters, constraints );
    204            this.describeRecord = describeRecord;
    205            this.getDomain = getDomain;
    206            this.getRecords = getRecords;
    207            this.getRecordById = getRecordById;
    208            this.transaction = transaction;
    209            this.harvest = harvest;
    210        }
    211
    212        /**
    213         * Returns all <code>Operations</code>.
    214         *
    215         * @return all <code>Operations</code>.
    216         */
    217        @Override
    218        public Operation[] getOperations() {
    219            List<Operation> list = new ArrayList<Operation>();
    220            list.add( getCapabilitiesOperation );
    221            list.add( describeRecord );
    222            list.add( getRecords );
    223            if ( getRecordById != null ) {
    224                list.add( getRecordById );
    225            }
    226            if ( getDomain != null ) {
    227                list.add( getDomain );
    228            }
    229            if ( transaction != null ) {
    230                list.add( transaction );
    231            }
    232            if ( harvest != null ) {
    233                list.add( harvest );
    234            }
    235            return list.toArray( new Operation[list.size()] );
    236        }
    237
    238        /**
    239         * @return the describeRecord.
    240         *
    241         */
    242        public Operation getDescribeRecord() {
    243            return describeRecord;
    244        }
    245
    246        /**
    247         * @param describeRecord
    248         *            The describeRecord to set.
    249         *
    250         */
    251        public void setDescribeRecord( Operation describeRecord ) {
    252            this.describeRecord = describeRecord;
    253        }
    254
    255        /**
    256         * @return the getDomain.
    257         *
    258         */
    259        public Operation getGetDomain() {
    260            return getDomain;
    261        }
    262
    263        /**
    264         * @param getDomain
    265         *            The getDomain to set.
    266         *
    267         */
    268        public void setGetDomain( Operation getDomain ) {
    269            this.getDomain = getDomain;
    270        }
    271
    272        /**
    273         * @return the getRecordById.
    274         *
    275         */
    276        public Operation getGetRecordById() {
    277            return getRecordById;
    278        }
    279
    280        /**
    281         * @param getRecordById
    282         *            The getRecordId to set.
    283         *
    284         */
    285        public void setGetRecordById( Operation getRecordById ) {
    286            this.getRecordById = getRecordById;
    287        }
    288
    289        /**
    290         * @return the getRecords.
    291         *
    292         */
    293        public Operation getGetRecords() {
    294            return getRecords;
    295        }
    296
    297        /**
    298         * @param getRecords
    299         *            The getRecords to set.
    300         *
    301         */
    302        public void setGetRecords( Operation getRecords ) {
    303            this.getRecords = getRecords;
    304        }
    305
    306        /**
    307         * @return the harvest.
    308         *
    309         */
    310        public Operation getHarvest() {
    311            return harvest;
    312        }
    313
    314        /**
    315         * @param harvest
    316         *            The harvest to set.
    317         *
    318         */
    319        public void setHarvest( Operation harvest ) {
    320            this.harvest = harvest;
    321        }
    322
    323        /**
    324         * @return the transaction.
    325         *
    326         */
    327        public Operation getTransaction() {
    328            return transaction;
    329        }
    330
    331        /**
    332         * @param transaction
    333         *            The transaction to set.
    334         *
    335         */
    336        public void setTransaction( Operation transaction ) {
    337            this.transaction = transaction;
    338        }
    339
    340    }