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 <cstdio>
00031 
00032 #include "AISMerge.h"
00033 #include "AISExceptions.h"
00034 #include "Response.h"
00035 
00036 namespace libdap {
00037 
00050 Response *AISMerge::get_ais_resource(const string & res)
00051 {
00052     if (res.find("http:") == 0
00053         || res.find("file:") == 0 || res.find("https:") == 0) {
00054         return d_http.fetch_url(res);
00055     }
00056     else {
00057         FILE *s = fopen(res.c_str(), "r");
00058         if (!s)
00059             throw Error("I could not open local AIS resource '"
00060                         + res + "'.");
00061         return new Response(s, 0);
00062     }
00063 }
00064 
00078 void AISMerge::merge(const string & primary, DAS & das)
00079 {
00080     if (!d_ais_db.has_resource(primary))
00081         return;
00082 
00083     try {
00084         ResourceVector rv = d_ais_db.get_resource(primary);
00085 
00086         for (ResourceVectorIter i = rv.begin(); i != rv.end(); ++i) {
00087             Response *ais_resource = get_ais_resource(i->get_url());
00088             switch (i->get_rule()) {
00089             case Resource::overwrite:
00090                 das.parse(ais_resource->get_stream());
00091                 break;
00092             case Resource::replace:
00093                 das.erase();
00094                 das.parse(ais_resource->get_stream());
00095                 break;
00096             case Resource::fallback:
00097                 if (das.get_size() == 0)
00098                     das.parse(ais_resource->get_stream());
00099                 break;
00100             }
00101             delete ais_resource;
00102             ais_resource = 0;
00103         }
00104     }
00105     catch (NoSuchPrimaryResource & e) {
00106         throw
00107         InternalErr(string
00108                     ("I caught a 'NoSuchPrimaryResource' exception, it said:\n")
00109                     + e.get_error_message() + string("\n"));
00110     }
00111 }
00112 
00113 } // namespace libdap

Generated on Wed Mar 5 15:27:10 2008 for libdap++ by  doxygen 1.5.4