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