Blame DMR.h

Packit a4aae4
// -*- mode: c++; c-basic-offset:4 -*-
Packit a4aae4
Packit a4aae4
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
Packit a4aae4
// Access Protocol.
Packit a4aae4
Packit a4aae4
// Copyright (c) 2013 OPeNDAP, Inc.
Packit a4aae4
// Author: James Gallagher <jgallagher@opendap.org>
Packit a4aae4
//
Packit a4aae4
// This library is free software; you can redistribute it and/or
Packit a4aae4
// modify it under the terms of the GNU Lesser General Public
Packit a4aae4
// License as published by the Free Software Foundation; either
Packit a4aae4
// version 2.1 of the License, or (at your option) any later version.
Packit a4aae4
//
Packit a4aae4
// This library is distributed in the hope that it will be useful,
Packit a4aae4
// but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a4aae4
// Lesser General Public License for more details.
Packit a4aae4
//
Packit a4aae4
// You should have received a copy of the GNU Lesser General Public
Packit a4aae4
// License along with this library; if not, write to the Free Software
Packit a4aae4
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit a4aae4
//
Packit a4aae4
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
Packit a4aae4
Packit a4aae4
#ifndef _dmr_h
Packit a4aae4
#define _dmr_h 1
Packit a4aae4
Packit a4aae4
#include <cassert>
Packit a4aae4
Packit a4aae4
#include <iostream>
Packit a4aae4
#include <string>
Packit a4aae4
#include <vector>
Packit a4aae4
Packit a4aae4
//#include "D4Group.h"
Packit a4aae4
//#include "XMLWriter.h"
Packit a4aae4
#include "DapObj.h"
Packit a4aae4
Packit a4aae4
namespace libdap
Packit a4aae4
{
Packit a4aae4
Packit a4aae4
class D4Group;
Packit a4aae4
class D4BaseTypeFactory;
Packit a4aae4
class XMLWriter;
Packit a4aae4
Packit a4aae4
class DDS;
Packit a4aae4
Packit a4aae4
/** DMR is root object for a DAP4 dataset. It holds a D4Group and other
Packit a4aae4
 * information about the dataset (DAP protocol number, DMR version, etc.).
Packit a4aae4
 *
Packit a4aae4
 * @note This class holds the dataset name and filename (which might
Packit a4aae4
 * actually be a database name, but it's usually a filename). The variables
Packit a4aae4
 * of a DAP4 dataset are held by the D4Group instance (which is a child
Packit a4aae4
 * of Constructor).
Packit a4aae4
 */
Packit a4aae4
class DMR : public DapObj
Packit a4aae4
{
Packit a4aae4
private:
Packit a4aae4
    D4BaseTypeFactory *d_factory;
Packit a4aae4
Packit a4aae4
    /// The name of the dataset. This should not be the pathname to a file
Packit a4aae4
    string d_name;
Packit a4aae4
    /// The pathname or other system identifier for the dataset
Packit a4aae4
    string d_filename;
Packit a4aae4
Packit a4aae4
    /// DAP protocol major version number. Should be '4'
Packit a4aae4
    int d_dap_major;
Packit a4aae4
    /// DAP protocol minor version number.
Packit a4aae4
    int d_dap_minor;
Packit a4aae4
    /// String version of the DAP protocol number
Packit a4aae4
    string d_dap_version;
Packit a4aae4
Packit a4aae4
    /// The version of the DMR document
Packit a4aae4
    string d_dmr_version;
Packit a4aae4
Packit a4aae4
    /// The URL for the request base
Packit a4aae4
    string d_request_xml_base;
Packit a4aae4
Packit a4aae4
    /// The namespace to use when printing the XML serialization
Packit a4aae4
    string d_namespace;
Packit a4aae4
Packit a4aae4
    /// The maximum response size (in Kilo bytes)
Packit a4aae4
    long d_max_response_size;
Packit a4aae4
Packit a4aae4
    /// The root group; holds dimensions, enums, variables, groups, ...
Packit a4aae4
    D4Group *d_root;
Packit a4aae4
Packit a4aae4
    friend class DMRTest;
Packit a4aae4
Packit a4aae4
protected:
Packit a4aae4
    void m_duplicate(const DMR &dmr);
Packit a4aae4
Packit a4aae4
public:
Packit a4aae4
    DMR();
Packit a4aae4
    DMR(const DMR &dmr);
Packit a4aae4
    DMR(D4BaseTypeFactory *factory, const string &name = "");
Packit a4aae4
Packit a4aae4
    DMR(D4BaseTypeFactory *factory, DDS &dds;;
Packit a4aae4
Packit a4aae4
    virtual ~DMR();
Packit a4aae4
Packit a4aae4
    DMR &operator=(const DMR &rhs;;
Packit a4aae4
Packit a4aae4
    virtual void build_using_dds(DDS &dds;;
Packit a4aae4
Packit a4aae4
    /**
Packit a4aae4
     * Class invariant. If true, any method can be used.
Packit a4aae4
     * @return True if the instance is OK to use, false otherwise.
Packit a4aae4
     */
Packit a4aae4
    bool OK() const { return (d_factory && d_root && !d_dap_version.empty()); }
Packit a4aae4
Packit a4aae4
    /** Get and set the DMR's name. This is effectively the 'dataset' name.
Packit a4aae4
     * It should not be used to reference the dataset's data store
Packit a4aae4
     * (e.g., it should not be a pathname to a file). This will be used in
Packit a4aae4
     * error messages.
Packit a4aae4
     */
Packit a4aae4
    //@{
Packit a4aae4
    string name() const { return d_name; }
Packit a4aae4
    void set_name(const string &n) { d_name = n; }
Packit a4aae4
    //@}
Packit a4aae4
Packit a4aae4
    /** Get/set the factory which makes instances of the variables.
Packit a4aae4
        Specialize D4BaseTypeFactory so that a DMR will be
Packit a4aae4
        populated with your client or server's specialized types.*/
Packit a4aae4
    //@{
Packit a4aae4
    virtual D4BaseTypeFactory *factory() { return d_factory; }
Packit a4aae4
    virtual void set_factory(D4BaseTypeFactory *f) { d_factory = f; }
Packit a4aae4
    //@}
Packit a4aae4
Packit a4aae4
    /** get/set the dataset's 'filename.' The filename is a string that can
Packit a4aae4
     * be used to access the dataset's actual data store (it's usually a
Packit a4aae4
     * pathname to a file, but it might be a database key.
Packit a4aae4
     */
Packit a4aae4
    //@{
Packit a4aae4
    string filename() const { return d_filename; }
Packit a4aae4
    void set_filename(const string &fn) { d_filename = fn;}
Packit a4aae4
    //@}
Packit a4aae4
Packit a4aae4
    string dap_version() const { return d_dap_version; }
Packit a4aae4
    void set_dap_version(const string &version_string);
Packit a4aae4
    int dap_major() const { return d_dap_major; }
Packit a4aae4
    int dap_minor() const { return d_dap_minor; }
Packit a4aae4
Packit a4aae4
    string dmr_version() const { return d_dmr_version; }
Packit a4aae4
    void set_dmr_version(const string &v) { d_dmr_version = v; }
Packit a4aae4
Packit a4aae4
    /// Get the URL that will return this DMR/DDX/DataThing
Packit a4aae4
    string request_xml_base() const { return d_request_xml_base; }
Packit a4aae4
Packit a4aae4
    /// @see get_request_xml_base
Packit a4aae4
    void set_request_xml_base(const string &xb) { d_request_xml_base = xb; }
Packit a4aae4
Packit a4aae4
    /// Get the namespace associated with the DDS - likely set only by DDX responses
Packit a4aae4
    string get_namespace() const { return d_namespace; }
Packit a4aae4
Packit a4aae4
    /// Set the namespace for this DDS/DDX object/response
Packit a4aae4
    void set_namespace(const string &ns) { d_namespace = ns; }
Packit a4aae4
Packit a4aae4
    // TODO Move the response_limit methods to D4ResponseBuilder? jhrg 5/1/13
Packit a4aae4
    /// Get the maximum response size, in KB. Zero indicates no limit.
Packit a4aae4
    long response_limit() { return d_max_response_size; }
Packit a4aae4
Packit a4aae4
    /** Set the maximum response size. Zero is the default value. The size
Packit a4aae4
        is given in kilobytes.
Packit a4aae4
        @param size The maximum size of the response in kilobytes. */
Packit a4aae4
    void set_response_limit(long size) { d_max_response_size = size; }
Packit a4aae4
Packit a4aae4
    /// Get the estimated response size, in kilo bytes
Packit a4aae4
    long request_size(bool constrained);
Packit a4aae4
Packit a4aae4
    /** Return the root group of this Dataset. If no root group has been
Packit a4aae4
     * set, use the D4BaseType factory to make it.
Packit a4aae4
     * @return The root group of the dataset.
Packit a4aae4
     */
Packit a4aae4
    D4Group *root();
Packit a4aae4
Packit a4aae4
    static DDS *getDDS(DMR &dmr);
Packit a4aae4
    virtual DDS *getDDS();
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
    void print_dap4(XMLWriter &xml, bool constrained = false);
Packit a4aae4
Packit a4aae4
    virtual void dump(ostream &strm) const ;
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
} // namespace libdap
Packit a4aae4
Packit a4aae4
#endif // _dmr_h