AISMerge.cc

Go to the documentation of this file.
00001 
00002 // -*- mode: c++; c-basic-offset:4 -*-
00003 
00004 // This file is part of libdap, A C++ implementation of the OPeNDAP Data
00005 // Access Protocol.
00006 
00007 // Copyright (c) 2003 OPeNDAP, Inc.
00008 // Author: James Gallagher <jgallagher@opendap.org>
00009 //         Dan Holloway <dan@hollywood.gso.uri.edu>
00010 //         Reza Nekovei <reza@intcomm.net>
00011 //
00012 // This library is free software; you can redistribute it and/or
00013 // modify it under the terms of the GNU Lesser General Public
00014 // License as published by the Free Software Foundation; either
00015 // version 2.1 of the License, or (at your option) any later version.
00016 //
00017 // This library is distributed in the hope that it will be useful,
00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020 // Lesser General Public License for more details.
00021 //
00022 // You should have received a copy of the GNU Lesser General Public
00023 // License along with this library; if not, write to the Free Software
00024 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00025 //
00026 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
00027 
00028 #include "config.h"
00029 
00030 #include <stdio.h>
00031 
00032 #include "AISMerge.h"
00033 #include "AISExceptions.h"
00034 #include "Response.h"
00035 
00048 Response *AISMerge::get_ais_resource(const string & res)
00049 {
00050     if (res.find("http:") == 0
00051         || res.find("file:") == 0 || res.find("https:") == 0) {
00052         return d_http.fetch_url(res);
00053     }
00054     else {
00055         FILE *s = fopen(res.c_str(), "r");
00056         if (!s)
00057             throw Error("I could not open local AIS resource '"
00058                         + res + "'.");
00059         return new Response(s);
00060     }
00061 }
00062 
00076 void AISMerge::merge(const string & primary, DAS & das)
00077 {
00078     if (!d_ais_db.has_resource(primary))
00079         return;
00080 
00081     try {
00082         ResourceVector rv = d_ais_db.get_resource(primary);
00083 
00084         for (ResourceVectorIter i = rv.begin(); i != rv.end(); ++i) {
00085             Response *ais_resource = get_ais_resource(i->get_url());
00086             switch (i->get_rule()) {
00087             case Resource::overwrite:
00088                 das.parse(ais_resource->get_stream());
00089                 break;
00090             case Resource::replace:
00091                 das.erase();
00092                 das.parse(ais_resource->get_stream());
00093                 break;
00094             case Resource::fallback:
00095                 if (das.get_size() == 0)
00096                     das.parse(ais_resource->get_stream());
00097                 break;
00098             }
00099             delete ais_resource;
00100             ais_resource = 0;
00101         }
00102     }
00103     catch (NoSuchPrimaryResource & e) {
00104         throw
00105         InternalErr(string
00106                     ("I caught a 'NoSuchPrimaryResource' exception, it said:\n")
00107                     + e.get_error_message() + string("\n"));
00108     }
00109 }

Generated on Wed Jun 27 12:56:38 2007 for libdap++ by  doxygen 1.4.7