00001
00002
00003
00004
00005
00006
00007 #include <xercesc/validators/schema/SchemaSymbols.hpp>
00008 #include "xmlBase/EResolver.h"
00009 #include "xmlBase/Dom.h"
00010 #include <xercesc/util/XMLUniDefs.hpp>
00011 #include <xercesc/util/XMLString.hpp>
00012 #include "facilities/Util.h"
00013
00014 #include <xercesc/framework/LocalFileInputSource.hpp>
00015 #include <xercesc/internal/XMLScanner.hpp>
00016 #include <xercesc/sax/Locator.hpp>
00017
00018 namespace xmlBase {
00019 XERCES_CPP_NAMESPACE_USE
00020
00021 EResolver::EResolver() : m_nEntity(0) {
00022 m_entities.clear();
00023 }
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 InputSource*
00038 EResolver::resolveEntity(XERCES_CPP_NAMESPACE_QUALIFIER XMLResourceIdentifier* xmlRI) {
00039 const XMLCh* publicId = xmlRI->getPublicId();
00040 const XMLCh* systemId = xmlRI->getSystemId();
00041 const XMLCh* baseURI = xmlRI->getBaseURI();
00042 if (publicId != 0) {
00043 if (XMLString::stringLen(publicId) > 0) {
00044 return translateEnv(publicId, baseURI);
00045 }
00046 }
00047 return translateEnv(systemId, baseURI);
00048 }
00049
00050 InputSource* EResolver::translateEnv(const XMLCh * id, const XMLCh * baseURI)
00051 {
00052
00053 char* chId = XMLString::transcode(id);
00054 std::string *idStr = new std::string(chId);
00055 XMLString::release(&chId);
00056 int nSub = facilities::Util::expandEnvVar(idStr);
00057
00058 m_entities.push_back(idStr);
00059
00060 if (!nSub) return 0;
00061 else if (nSub < 0) {
00062 std::cout << "Bad entity name " << idStr << std::endl;
00063 return 0;
00064 }
00065
00066
00067
00068 XMLCh* realName = XMLString::transcode(idStr->c_str());
00069
00070
00071
00072 LocalFileInputSource* src = new LocalFileInputSource(baseURI, realName);
00073 XMLString::release(&realName);
00074 return src;
00075
00076 }
00077
00078 void EResolver::clean() {
00079 for (unsigned i = 0; i < m_entities.size(); i++) {
00080 delete m_entities[i];
00081 }
00082 m_entities.clear();
00083 m_nEntity = 0;
00084 }
00085
00086 EResolver::~EResolver() {
00087 clean();
00088 }
00089 }