00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "config.h"
00029
00030 #include <cstdio>
00031 #include <fstream>
00032
00033 #include "AISMerge.h"
00034 #include "AISExceptions.h"
00035 #include "Response.h"
00036
00037 namespace libdap {
00038
00051 Response *AISMerge::get_ais_resource(const string & res)
00052 {
00053 if (res.find("http:") == 0
00054 || res.find("file:") == 0 || res.find("https:") == 0) {
00055 return d_http.fetch_url(res);
00056 }
00057 else {
00058 #if 0
00059 ifstream s(res);
00060 #endif
00061 FILE *s = fopen(res.c_str(), "r");
00062 if (!s)
00063 throw Error("I could not open local AIS resource '"
00064 + res + "'.");
00065 return new Response(s, 0);
00066 }
00067 }
00068
00082 void AISMerge::merge(const string & primary, DAS & das)
00083 {
00084 if (!d_ais_db.has_resource(primary))
00085 return;
00086
00087 try {
00088 ResourceVector rv = d_ais_db.get_resource(primary);
00089
00090 for (ResourceVectorIter i = rv.begin(); i != rv.end(); ++i) {
00091 Response *ais_resource = get_ais_resource(i->get_url());
00092 switch (i->get_rule()) {
00093 case Resource::overwrite:
00094 das.parse(ais_resource->get_stream());
00095 break;
00096 case Resource::replace:
00097 das.erase();
00098 das.parse(ais_resource->get_stream());
00099 break;
00100 case Resource::fallback:
00101 if (das.get_size() == 0)
00102 das.parse(ais_resource->get_stream());
00103 break;
00104 }
00105 delete ais_resource;
00106 ais_resource = 0;
00107 }
00108 }
00109 catch (NoSuchPrimaryResource & e) {
00110 throw
00111 InternalErr(string
00112 ("I caught a 'NoSuchPrimaryResource' exception, it said:\n")
00113 + e.get_error_message() + string("\n"));
00114 }
00115 }
00116
00117 }