/** \file
 *
 *  Contains the UniversalURI class definition.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#ifndef UNIVERSALURI_H_
#define UNIVERSALURI_H_

#include "utils/Str.h"
//#include "logger/Logger.h"

#include "ElementURI.h"

class Logger;
class UniversalBlobURI;

/**
 *  Code unit that represents a unique name for a measured quantity.
 *  Nominally, the names come from the CF-Metadata standard name table
 *  http://cf-pcmdi.llnl.gov/documents/cf-standard-names/, although
 *  there have been many additions specific to this vehicle in this list.
 *
 *  \ingroup data
 */
class UniversalURI : public ElementURI //, public DataIF
{
public:

    /// Destructor
    virtual ~UniversalURI();

    static UniversalURI* FindURI( const Str& name );

    static UniversalURI* FindURI( const char* candidate );

    virtual bool isUniversal() const
    {
        return true;
    }

    /// The "component" name of the Universals
    static const Str NAME;

    /// Represents no abstract name.
    /*static const UniversalURI NONE;*/

    ///
    static const UniversalURI ACOUSTIC_RECEIVE_TIME;

    ///
    static const UniversalURI ACOUSTIC_TRANSMIT_TIME;

    ///
    static const UniversalBlobURI ACOUSTIC_CONTACT_DIRECTION_VF;

    /// Address, as received from the remote acoustic contact
    static const UniversalURI ACOUSTIC_CONTACT_ADDRESS_READING;

    /// Range in meters to the remote acoustic contact
    static const UniversalURI ACOUSTIC_CONTACT_RANGE_READING;

    /// concentration_of_colored_dissolved_organic_matter_in_sea_water
    /// The quantity with standard name (as defined by CF-metadata)
    /// concentration_of_colored_dissolved_organic_matter_in_sea_water_expressed_as_equivalent_mass_fraction_of_quinine_sulfate_dihydrate
    /// is also commonly known as Colored Dissolved Organic Matter (CDOM).
    /// CDOM plays an important role in the carbon cycling and biogeochemistry
    /// of coastal waters. It occurs naturally in aquatic environments primarily
    /// as a result of tannins released from decaying plant and animal matter,
    /// which can enter coastal areas in river run-off containing organic
    /// materials leached from soils. When present in high concentrations, it
    /// imparts a brown or yellowish color to water. Its presence can negatively
    /// impact fish populations by reducing dissolved oxygen concentrations to
    /// harmful levels and by releasing nutrients and metals that contaminate
    /// the water. Increased understanding of the role of CDOM will further our
    /// ability to manage and protect coastal ecosystems. Sensors are commonly
    /// calibrated against a 100 parts per billion (ppb) quinine sulfate
    /// dihydrate solution, a fluorescent reference standard commonly used with
    /// CDOM sensors. CDOM sensors therefore report in "QSDE" (quinine sulfate
    /// dihydrate equivalents). It is important to note, however, that CDOM
    /// concentrations in QSDE are not necessarily equivalent to the in situ
    /// CDOM concentrations in ppb.
    static const UniversalURI CONCENTRATION_OF_COLORED_DISSOLVED_ORGANIC_MATTER_IN_SEA_WATER;

    /// depth, as defined by CF-metadata
    /// Depth is the vertical distance below the surface.
    static const UniversalURI DEPTH;

    /// depth_rate, as internally defined
    static const UniversalURI DEPTH_RATE;

    /// direction_of_sea_water_velocity, as defined by CF-metadata
    /// "direction_of_X" means direction of a vector, a bearing.
    /// A velocity is a vector quantity.
    static const UniversalURI DIRECTION_OF_SEA_WATER_VELOCITY;

    /// distance_from_shore, as internally defined
    static const UniversalURI DISTANCE_FROM_SHORE;

    /// downwelling_photosynthetic_photon_flux_in_sea_water, as defined by CF-metadata
    /// Downwelling radiation is radiation from above. It does not mean
    /// "net downward". "Photosynthetic" radiation is the part of the
    /// spectrum which is used in photosynthesis e.g. 300-700 nm.
    /// The range of wavelengths could be specified precisely by
    /// the bounds of a coordinate of radiation_wavelength. A photon flux
    /// is specified in terms of numbers of photons expressed in moles.
    /// In accordance with common usage in geophysical disciplines,
    /// "flux" implies per unit area, called "flux density" in physics.
    static const UniversalURI DOWNWELLING_PHOTOSYNTHETIC_PHOTON_FLUX_IN_SEA_WATER;

    /// downward_sea_water_velocity, as internally defined
    static const UniversalURI DOWNWARD_SEA_WATER_VELOCITY;

    /// eastward_sea_water_velocity, as defined by CF-metadata
    /// A velocity is a vector quantity. "Eastward" indicates a
    /// vector component which is positive when directed eastward
    /// (negative westward).
    static const UniversalURI EASTWARD_SEA_WATER_VELOCITY;

    /// how long has it been since you successfully read nav inputs?
//    static const UniversalURI ELAPSED_TIME_SINCE_ORIENTATION_READ;
//    static const UniversalURI ELAPSED_TIME_SINCE_VELOCITY_READ;

    /// Distance made good between this fix location and the last.
    static const UniversalURI FIX_DISTANCE_MADE_GOOD;

    /// Length of the path the vehicle has taken between its most recent
    /// external fix and the one before.
    static const UniversalURI FIX_HORIZONTAL_PATH_LENGTH_SINCE_LAST_FIX;

    /// The distance (on the surface of the globe) between the current
    /// location estimate and an external fix.
    static const UniversalURI FIX_RESIDUAL_DISTANCE;

    /// Bearing from current location estimate to an external fix.
    static const UniversalURI FIX_RESIDUAL_BEARING;

    /// Distance between the current location estimate and an external
    /// fix, expressed as a percentage of the estimated distance
    /// traveled between fixes.
    static const UniversalURI FIX_RESIDUAL_PERCENT_DISTANCE_TRAVELED;

    /** Latitude is positive northward; its units of degree_north
     * (or equivalent) indicate this explicitly. In a latitude-longitude
     * system defined with respect to a rotated North Pole, the standard
     * name of grid_latitude should be used instead of latitude. Grid
     * latitude is positive in the grid-northward direction, but its units
     * should be plain degree.
     */
    static const UniversalURI GRID_LATITUDE;

    /** longitude is positive eastward; its units of degree_east
     * (or equivalent) indicate this explicitly. In a latitude-longitude
     * system defined with respect to a rotated North Pole, the standard
     * name of grid_longitude should be used instead of longitude. Grid
     * longitude is positive in the grid-eastward direction, but its units
     * should be plain degree.
     */
    static const UniversalURI GRID_LONGITUDE;

    /// height_above_sea_floor, as defined by CF-metadata
    static const UniversalURI HEIGHT_ABOVE_SEA_FLOOR;

    /// Length of the path the vehicle has taken since its most recent
    /// external fix.
    static const UniversalURI HORIZONTAL_PATH_LENGTH_SINCE_LAST_FIX;

    /** latitude is positive northward; its units of degree_north
     * (or equivalent) indicate this explicitly. In a latitude-longitude
     * system defined with respect to a rotated North Pole, the standard
     * name of grid_latitude should be used instead of latitude. Grid
     * latitude is positive in the grid-northward direction, but its units
     * should be plain degree.
     */
    static const UniversalURI LATITUDE;

    /** latitude_fix, as internally defined as a location measurement obtained
     * by an absolute positioning sensor such as GPS or LBL, but not by
     * dead reckoning
     */
    static const UniversalURI LATITUDE_FIX;

    /** location_fix, as internally defined as a combination of
     * latitude and longitude represented by the Location structure
     * a location fix can be obtained by an absolute positioning
     * sensor such as GPS or LBL, but not by dead reckoning
     */
    static const UniversalBlobURI LOCATION_FIX;

    /** longitude is positive eastward; its units of degree_east
     * (or equivalent) indicate this explicitly. In a latitude-longitude
     * system defined with respect to a rotated North Pole, the standard
     * name of grid_longitude should be used instead of longitude. Grid
     * longitude is positive in the grid-eastward direction, but its units
     * should be plain degree.
     */
    static const UniversalURI LONGITUDE;

    /** longitude_fix, as internally defined as a location measurement obtained
     * by an absolute positioning sensor such as GPS or LBL, but not by
     * dead reckoning
     */
    static const UniversalURI LONGITUDE_FIX;

    /// Flag to denote when missions start
    static const UniversalURI MISSION_STARTED;

    /** mass_concentration_of_chlorophyll_in_sea_water, as defined by CF-metadata
     */
    static const UniversalURI MASS_CONCENTRATION_OF_CHLOROPHYLL_IN_SEA_WATER;

    /// Mass concentration means mass per unit volume and is used in the
    /// construction mass_concentration_of_X_in_Y, where X is a material
    //// constituent of Y.
    static const UniversalURI MASS_CONCENTRATION_OF_OXYGEN_IN_SEA_WATER;

    /** mass_concentration_of_petroleum_hydrocarbons_in_sea_water, as defined by CF-metadata
     *
     */
    static const UniversalURI MASS_CONCENTRATION_OF_PETROLEUM_HYDROCARBONS_IN_SEA_WATER;

    /** mole_concentration_of_nitrate_in_sea_water, as defined by CF-metadata
     *  Mole concentration means moles (amount of substance) per unit volume and
     *  is used in the construction mole_concentration_of_X_in_Y, where X is a
     *  material constituent of Y.
     */
    static const UniversalURI MOLE_CONCENTRATION_OF_NITRATE_IN_SEA_WATER;

    /// northward_sea_water_velocity, as defined by CF-metadata
    /// A velocity is a vector quantity. "Northward" indicates a
    /// vector component which is positive when directed northward
    /// (negative southward).
    static const UniversalURI NORTHWARD_SEA_WATER_VELOCITY;

    // Current taken from Onboard A/D and averaged over n number of samples
    static const UniversalURI PLATFORM_AVERAGE_CURRENT;

    /// Current and voltage taken from fuel gauge and averaged over n number of samples
    static const UniversalURI PLATFORM_AVERAGE_POWER;

    /// platform_battery_charge, as internally defined
    static const UniversalURI PLATFORM_BATTERY_CHARGE;

    /// platform_battery_charge_usage, as internally defined
    static const UniversalURI PLATFORM_BATTERY_CHARGE_USAGE;

    /// platform_battery_energy_usage, as internally defined
    static const UniversalURI PLATFORM_BATTERY_ENERGY_USAGE;

    /// platform_battery_voltage, as internally defined
    static const UniversalURI PLATFORM_BATTERY_VOLTAGE;

    // True == battery or batteries are discharging. False == no battery is discharging
    static const UniversalURI PLATFORM_BATTERY_DISCHARGING;

    // True == all batteries are fully charged. False == not all batteries are fully charged
    static const UniversalURI PLATFORM_BATTERY_FULLY_CHARGED;

    /// position of the buoyancy control volume (internal vs. external)
    static const UniversalURI PLATFORM_BUOYANCY_POSITION;

    /// platform_communications, as internally defined
    /// represents communications between the outside world
    /// and this robot.
    static const UniversalURI PLATFORM_COMMUNICATIONS;

    /// platform_conversation, as internally defined
    /// equals true during INTERACTIVE communications between
    /// this platform and the outside world, false during
    /// normal, automated operations.
    static const UniversalURI PLATFORM_CONVERSATION;

    /// platform_course, as defined by CF-metadata
    /// The platform course is the direction in which the platform is
    /// travelling (not necessarily the same as the direction in which
    /// it is pointing, called platform_orientation).
    static const UniversalURI PLATFORM_COURSE;

    /// platform_distance_wrt_ground, as internally defined
    /// Integral of platform_speed_wrt_ground over time.
    static const UniversalURI PLATFORM_DISTANCE_WRT_GROUND;

    /// platform_distance_wrt_sea_water
    /// Integral of platform_speed_wrt_sea_water over time
    /// Only the horizontal component of speed through water is integrated here.
    static const UniversalURI PLATFORM_DISTANCE_WRT_SEA_WATER;

    /// platform_elevator_angle, as internally defined
    static const UniversalURI PLATFORM_ELEVATOR_ANGLE;

    /// platform_fault, as internally defined
    /// This goes to "true" (non-zero) if any platform fault exists
    static const UniversalURI PLATFORM_FAULT;

    /// platform_fault_leak, as internally defined
    /// This goes to "true" (non-zero) if a platform leak fault exists
    static const UniversalURI PLATFORM_FAULT_LEAK;

    /// platform_magnetic_orientation, as internally defined
    /// compass orientation +/- deviation due to vehicle = Magnetic orientation
    /// magnetic orientation +/- variation from map = True orientation
    static const UniversalURI PLATFORM_MAGNETIC_ORIENTATION;

    /// platform_mass_position, as internally defined
    static const UniversalURI PLATFORM_MASS_POSITION;

    /// platform_orientation, as defined by CF-metadata
    /// The platform orientation is the direction in which the "front"
    /// or longitudinal axis of the platform is pointing (not necessarily
    /// the same as the direction in which it is travelling, called
    /// platform_course).
    /// compass orientation +/- deviation due to vehicle = Magnetic orientation
    /// magnetic orientation +/- variation from map = True orientation
    static const UniversalURI PLATFORM_ORIENTATION;

    /// platform_orientation_matrix, as internally defined, is a rotation
    /// matrix_from the vehicle frame to the navigation frame, where vehicle
    /// frame is FSK (Forward, Starboard, Keel) and navigation frame is
    /// NED (North, East, Down).
    static const UniversalBlobURI PLATFORM_ORIENTATION_MATRIX;

    /// platform_pitch_angle, as defined by CF-metadata
    static const UniversalURI PLATFORM_PITCH_ANGLE;

    /// platform_pitch_rate, as defined by CF-metadata
    static const UniversalURI PLATFORM_PITCH_RATE;

    /// platform_position_vector, as internally defined by a combination of
    /// x, y, and z position and yz, zx, and xy rotation
    //static const UniversalURI PLATFORM_POSITION_VECTOR;

    /// platform_pressure, as internally defined
    static const UniversalURI PLATFORM_PRESSURE;

    /// platform_propeller_rotation_rate, as internally defined
    static const UniversalURI PLATFORM_PROPELLER_ROTATION_RATE;

    /// platform_rate_vector, as internally defined by a combination of
    /// u, v, and w position and p, q, r rotation
    //static const UniversalURI PLATFORM_RATE_VECTOR;

    /// platform_relative_humidity, as internally defined
    static const UniversalURI PLATFORM_RELATIVE_HUMIDITY;

    /// platform_roll_angle, as defined by CF-metadata
    static const UniversalURI PLATFORM_ROLL_ANGLE;

    /// platform_roll_rate, as defined by CF-metadata
    static const UniversalURI PLATFORM_ROLL_RATE;

    /// platform_rudder_angle, as internally defined
    static const UniversalURI PLATFORM_RUDDER_ANGLE;

    /// platform_speed_wrt_ground, as defined by CF-metadata
    /// "wrt" means with respect to. Speed is the magnitude of velocity.
    /// The platform speed with respect to ground is relative to the
    /// solid Earth beneath it i.e. the sea floor for a ship. It is often
    /// called the "ground speed" of the platform.
    static const UniversalURI PLATFORM_SPEED_WRT_GROUND;

    /// platform_speed_wrt_sea_water, as defined by CF-metadata
    /// "wrt" means with respect to. Speed is the magnitude of velocity.
    /// The platform speed with respect to sea water is often called the
    /// "sea water speed" of the platform.
    static const UniversalURI PLATFORM_SPEED_WRT_SEA_WATER;

    /// PLATFORM_SPEED_WRT_PROPELLER is the calculated speed through the water
    /// based on propeller turns only
    static const UniversalURI PLATFORM_SPEED_WRT_PROPELLER;

    /// platform_temperature, as internally defined
    static const UniversalURI PLATFORM_TEMPERATURE;

    /// platform_vehicle_power, as internally defined
    static const UniversalURI PLATFORM_VEHICLE_POWER;

    /// platform velocity with respect to ground (vector) Forward, Starboard, Keel
    static const UniversalBlobURI PLATFORM_VELOCITY_WRT_GROUND;

    /// platform velocity with respect to sea water (vector) Forward, Starboard, Keel
    static const UniversalBlobURI PLATFORM_VELOCITY_WRT_SEA_WATER;

    /// TODO: Should there also be similar universals in the navigation frame instead of the vehicle frame?

    /// platform_x_sea_water_velocity, as internally defined
    static const UniversalURI PLATFORM_X_SEA_WATER_VELOCITY;

    /// platform_x_velocity_wrt_ground, as internally defined
    static const UniversalURI PLATFORM_X_VELOCITY_WRT_GROUND;

    /// platform_x_velocity_wrt_sea_water, as internally defined
    static const UniversalURI PLATFORM_X_VELOCITY_WRT_SEA_WATER;

    /// platform_x_velocity_current, as internally defined.
    static const UniversalURI PLATFORM_X_VELOCITY_CURRENT;

    /// platform_y_sea_water_velocity, as internally defined
    static const UniversalURI PLATFORM_Y_SEA_WATER_VELOCITY;

    /// platform_y_velocity_wrt_ground, as internally defined
    static const UniversalURI PLATFORM_Y_VELOCITY_WRT_GROUND;

    /// platform_y_velocity_wrt_sea_water, as internally defined
    static const UniversalURI PLATFORM_Y_VELOCITY_WRT_SEA_WATER;

    /// platform_y_velocity_current, as internally defined.
    static const UniversalURI PLATFORM_Y_VELOCITY_CURRENT;

    /// platform_yaw_angle, as defined by CF-metadata
    static const UniversalURI PLATFORM_YAW_ANGLE;

    /// platform_yaw_rate, as defined by CF-metadata
    static const UniversalURI PLATFORM_YAW_RATE;

    /// platform_z_sea_water_velocity, as internally defined
    static const UniversalURI PLATFORM_Z_SEA_WATER_VELOCITY;

    /// platform_z_velocity_wrt_ground, as internally defined
    static const UniversalURI PLATFORM_Z_VELOCITY_WRT_GROUND;

    /// platform_z_velocity_wrt_sea_water, as internally defined
    static const UniversalURI PLATFORM_Z_VELOCITY_WRT_SEA_WATER;

    /// platform_z_velocity_current, as internally defined.
    static const UniversalURI PLATFORM_Z_VELOCITY_CURRENT;

    /// projection_x_coordinate, as defined by CF-metadata
    /// "x" indicates a vector component along the grid x-axis, when this is not
    /// true longitude, positive with increasing x. Projection coordinates are
    /// distances in the x- and y-directions on a plane onto which the surface
    /// of the Earth has been projected according to a map projection. The
    /// relationship between the projection coordinates and latitude and
    /// longitude is described by the grid_mapping.
    static const UniversalURI PROJECTION_X_COORDINATE;

    /// projection_y_coordinate, as defined by CF-metadata
    /// "y" indicates a vector component along the grid y-axis, when this is not
    /// true latitude, positive with increasing y. Projection coordinates are
    /// distances in the x- and y-directions on a plane onto which the surface
    /// of the Earth has been projected according to a map projection. The
    /// relationship between the projection coordinates and latitude and
    /// longitude is described by the grid_mapping.
    static const UniversalURI PROJECTION_Y_COORDINATE;

    /// projection_zone, as proposed to CF-metadata
    static const UniversalURI PROJECTION_ZONE;

    /// sea_floor_depth_below_geoid, as defined by CF-metadata
    /// The geoid is a surface of constant geopotential with which mean
    /// sea level would coincide if the ocean were at rest.
    /// (The volume enclosed between the geoid and the sea floor equals
    /// the mean volume of water in the ocean.) In an ocean GCM the
    /// geoid is the surface of zero depth, or the rigid lid if the
    /// model uses that approximation.
    static const UniversalURI SEA_FLOOR_DEPTH_BELOW_GEOID;

    /// sea_water_density, as defined by CF-metadata
    /// Sea water density is the in-situ density (not the potential density).
    /// If 1000 kg m-3 is subtracted, the standard name sea_water_sigma_t
    /// should be chosen instead.
    static const UniversalURI SEA_WATER_DENSITY;

    /// sea_water_electrical_conductivity, as defined by CF-metadata
    static const UniversalURI SEA_WATER_ELECTRICAL_CONDUCTIVITY;

    /// sea_water_potential_density, as defined by CF-metadata
    /// Potential density is the density a parcel of air or sea water would
    /// have if moved adiabatically to a reference pressure, by default assumed
    /// to be sea level pressure. For sea water potential density, if 1000 kg m-3
    /// is subtracted, the standard name sea_water_sigma_theta should be chosen
    /// instead.
    static const UniversalURI SEA_WATER_POTENTIAL_DENSITY;

    /// sea_water_potential_temperature, as defined by CF-metadata
    /// Potential temperature is the temperature a parcel of air or sea water
    /// would have if moved adiabatically to sea level pressure.
    static const UniversalURI SEA_WATER_POTENTIAL_TEMPERATURE;

    /// sea_water_pressure, as defined by CF-metadata
    static const UniversalURI SEA_WATER_PRESSURE;

    /// PPB of Rhodamine in the water
    static const UniversalURI SEA_WATER_RHODAMINE;

    /// sea_water_salinity, as defined by CF-metadata
    /// The unit of salinity is PSU, which is dimensionless. The units
    /// attribute should be given as 1e-3 or 0.001 i.e. parts per
    /// thousand if salinity is in PSU.
    static const UniversalURI SEA_WATER_SALINITY;

    /// sea_water_sigma_t, as defined by CF-metadata
    /// Sigma-t of sea water is the density of water at atmospheric
    /// pressure (i.e. the surface) having the same temperature and
    /// salinity, minus 1000 kg m-3.
    static const UniversalURI SEA_WATER_SIGMA_T;

    /// sea_water_sigma_theta, as defined by CF-metadata
    /// Sigma-theta of sea water is the potential density (i.e. the
    /// density when moved adiabatically to a reference pressure) of
    /// water having the same temperature and salinity, minus 1000 kg m-3.
    static const UniversalURI SEA_WATER_SIGMA_THETA;

    /// sea_water_speed, as defined by CF-metadata
    /// Speed is the magnitude of velocity.
    static const UniversalURI SEA_WATER_SPEED;

    /// sea_water_temperature, as defined by CF-metadata
    static const UniversalURI SEA_WATER_TEMPERATURE;

    /// speed_of_sound_in_sea_water, as defined by CF-metadata
    /// Speed is the magnitude of velocity.
    static const UniversalURI SPEED_OF_SOUND_IN_SEA_WATER;

    /// surface_eastward_sea_water_velocity, as defined by CF-metadata
    /// The surface called "surface" means the lower boundary of the atmosphere.
    /// "Water" means water in all phases, including frozen i.e. ice and snow.
    /// A velocity is a vector quantity. "Eastward" indicates a vector component
    /// which is positive when directed eastward (negative westward).
    static const UniversalURI SURFACE_EASTWARD_SEA_WATER_VELOCITY;

    /// surface_northward_sea_water_velocity, as defined by CF-metadata
    /// The surface called "surface" means the lower boundary of the atmosphere.
    /// "Water" means water in all phases, including frozen i.e. ice and snow.
    /// A velocity is a vector quantity. "Northward" indicates a vector component
    /// which is positive when directed northward (negative southward).
    static const UniversalURI SURFACE_NORTHWARD_SEA_WATER_VELOCITY;

    /// time, as defined by CF-metadata
    static const UniversalURI TIME;

    /// time_fix, as internally defined
    /// a time fix can be obtained by an absolute timing
    /// sensor such as GPS, but not by the internal clock
    static const UniversalURI TIME_FIX;

    /// upward_derivative_of_sea_water_temperature, i.e., dT/dz, where z points upward.
    static const UniversalURI UPWARD_DERIVATIVE_OF_SEA_WATER_TEMPERATURE;

    /// volume_backwards_scattering_coefficient_of_radiative_flux_in_sea_water, as defined by CF-metadata
    static const UniversalURI VOLUME_BACKWARDS_SCATTERING_COEFFICIENT_OF_RADIATIVE_FLUX_IN_SEA_WATER;

protected:

    friend class ElementURI;
    friend class ReadDataComponent;
    friend class Slate;

    /// Protected Constructor for use by ElementURI::Read
    UniversalURI( unsigned short code, const char* fullURI,
                  const Unit& unit = UNSPECIFIED_UNIT, BinaryDataType binaryType = NO_TYPE,
                  BlobType blobType = NOT_BLOB, unsigned short dimension1 = 0,
                  unsigned short dimension2 = 0, unsigned short dimension3 = 0 );

    /// Protected Constructor for use by static initializers
    UniversalURI( const char* fullURI,
                  const Unit& unit = UNSPECIFIED_UNIT, BinaryDataType binaryType = NO_TYPE,
                  BlobType blobType = NOT_BLOB, unsigned short dimension1 = 0,
                  unsigned short dimension2 = 0, unsigned short dimension3 = 0 );

};

class UniversalBlobURI: public UniversalURI
{
public:
    /// Destructor
    virtual ~UniversalBlobURI() {}

protected:

    friend class ElementURI;
    friend class UniversalURI;

    /// Protected Constructor for use by ElementURI::Read
    UniversalBlobURI( unsigned short code, const char* fullURI, const Unit& unit = UNSPECIFIED_UNIT,
                      BlobType blobType = NOT_BLOB, unsigned short dimension1 = 0,
                      unsigned short dimension2 = 0, unsigned short dimension3 = 0 );

    /// Protected Constructor for use by static initializers
    UniversalBlobURI( const char* fullURI, const Unit& unit,
                      BlobType blobType, unsigned short dimension1 = 0,
                      unsigned short dimension2 = 0, unsigned short dimension3 = 0 );

};


#endif /*UNIVERSALURI_H_*/
