瀏覽代碼

HPCC-13495 Add/use environment methods to get target dir

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 10 年之前
父節點
當前提交
2e10ccd73c
共有 3 個文件被更改,包括 160 次插入30 次删除
  1. 137 0
      common/environment/environment.cpp
  2. 9 0
      common/environment/environment.hpp
  3. 14 30
      esp/services/ws_fs/ws_fsService.cpp

+ 137 - 0
common/environment/environment.cpp

@@ -46,6 +46,7 @@ private:
     Owned<IPropertyTree> p;
     mutable MapStringToMyClass<IConstEnvBase> cache;
     mutable Mutex safeCache;
+    mutable bool dropZoneCacheBuilt;
     mutable bool machineCacheBuilt;
    StringBuffer xPath;
 
@@ -53,6 +54,7 @@ private:
     IConstEnvBase * getCache(const char *path) const;
     void setCache(const char *path, IConstEnvBase *value) const;
     void buildMachineCache() const;
+    void buildDropZoneCache() const;
 
 public:
     IMPLEMENT_IINTERFACE;
@@ -68,6 +70,9 @@ public:
     virtual IConstDomainInfo * getDomain(const char * name) const;
     virtual IConstMachineInfo * getMachine(const char * name) const;
     virtual IConstMachineInfo * getMachineByAddress(const char * name) const;
+    virtual IConstMachineInfo * getMachineForLocalHost() const;
+    virtual IConstDropZoneInfo * getDropZone(const char * name) const;
+    virtual IConstDropZoneInfo * getDropZoneByComputer(const char * computer) const;
     virtual IConstInstanceInfo * getInstance(const char * type, const char * version, const char *domain) const;
     virtual CConstInstanceInfo * getInstanceByIP(const char *type, const char *version, IpAddress &ip) const;
     virtual IConstComputerTypeInfo * getComputerType(const char * name) const;
@@ -164,6 +169,12 @@ public:
             { return c->getMachine(name); }
     virtual IConstMachineInfo * getMachineByAddress(const char * name) const
             { return c->getMachineByAddress(name); }
+    virtual IConstMachineInfo * getMachineForLocalHost() const
+            { return c->getMachineForLocalHost(); }
+    virtual IConstDropZoneInfo * getDropZone(const char * name) const
+            { return c->getDropZone(name); }
+    virtual IConstDropZoneInfo * getDropZoneByComputer(const char * computer) const
+            { return c->getDropZoneByComputer(computer); }
     virtual IConstInstanceInfo * getInstance(const char *type, const char *version, const char *domain) const
             { return c->getInstance(type, version, domain); }
     virtual bool getRunInfo(IStringVal & path, IStringVal & dir, const char *type, const char *version, const char *machineaddr,const char *defprogname) const
@@ -797,6 +808,30 @@ public:
 
 };
 
+class CConstDropZoneInfo : public CConstEnvBase, implements IConstDropZoneInfo
+{
+public:
+    IMPLEMENT_IINTERFACE;
+    IMPLEMENT_ICONSTENVBASE;
+    CConstDropZoneInfo(CLocalEnvironment *env, IPropertyTree *root) : CConstEnvBase(env, root) {}
+
+    virtual IStringVal&     getComputerName(IStringVal &str) const
+    {
+        str.set(root->queryProp("@computer"));
+        return str;
+    }
+    virtual IStringVal&     getDescription(IStringVal &str) const
+    {
+        str.set(root->queryProp("@description"));
+        return str;
+    }
+    virtual IStringVal&     getDirectory(IStringVal &str) const
+    {
+        str.set(root->queryProp("@directory"));
+        return str;
+    }
+};
+
 #if 0
 //==========================================================================================
 
@@ -945,6 +980,9 @@ IConstDomainInfo * CLocalEnvironment::getDomain(const char * name) const
 
 void CLocalEnvironment::buildMachineCache() const
 {
+    StringBuffer localHostIP;
+    queryHostIP().getIpText(localHostIP);
+
     synchronized procedure(safeCache);
     if (!machineCacheBuilt)
     {
@@ -966,12 +1004,42 @@ void CLocalEnvironment::buildMachineCache() const
                 x.append(name).append("\"]");
                 Owned<IConstEnvBase> cached = new CConstMachineInfo((CLocalEnvironment *) this, &it->query());
                 cache.setValue(x.str(), cached);
+                if (streq(".", name) || strieq("localhost", name) || streq("127.0.0.1", name) || streq(name, localHostIP.str()))
+                    cache.setValue("Hardware/Computer[@netAddress='.']", cached);
             }
         }
         machineCacheBuilt = true;
     }
 }
 
+void CLocalEnvironment::buildDropZoneCache() const
+{
+    synchronized procedure(safeCache);
+    if (!dropZoneCacheBuilt)
+    {
+        Owned<IPropertyTreeIterator> it = p->getElements("Software/DropZone");
+        ForEach(*it)
+        {
+            const char *name = it->query().queryProp("@name");
+            if (name)
+            {
+                StringBuffer x("Software/DropZone[@name=\"");
+                x.append(name).append("\"]");
+                Owned<IConstEnvBase> cached = new CConstDropZoneInfo((CLocalEnvironment *) this, &it->query());
+                cache.setValue(x.str(), cached);
+            }
+            name = it->query().queryProp("@computer");
+            if (name)
+            {
+                StringBuffer x("Software/DropZone[@computer=\"");
+                x.append(name).append("\"]");
+                Owned<IConstEnvBase> cached = new CConstDropZoneInfo((CLocalEnvironment *) this, &it->query());
+                cache.setValue(x.str(), cached);
+            }
+        }
+        dropZoneCacheBuilt = true;
+    }
+}
 
 IConstComputerTypeInfo * CLocalEnvironment::getComputerType(const char * name) const
 {
@@ -1058,6 +1126,75 @@ IConstMachineInfo * CLocalEnvironment::getMachineByAddress(const char * name) co
     return (CConstMachineInfo *) cached;
 }
 
+IConstMachineInfo * CLocalEnvironment::getMachineForLocalHost() const
+{
+    IConstEnvBase *cached = getCache("Hardware/Computer[@netAddress='.']");
+    if (!cached)
+    {
+        StringBuffer localHostIP;
+        queryHostIP().getIpText(localHostIP);
+
+        StringArray possibleIPs;
+        possibleIPs.append(".");
+        possibleIPs.append("localhost");
+        possibleIPs.append("127.0.0.1");
+        possibleIPs.append(localHostIP.str());
+
+        synchronized procedure(safeCache);
+        ForEachItemIn(i, possibleIPs)
+        {
+            VStringBuffer xpath("Hardware/Computer[@netAddress='%s']", possibleIPs.item(i));
+            IPropertyTree *d = p->queryPropTree(xpath.str());
+            if (d)
+            {
+                cached = new CConstMachineInfo((CLocalEnvironment *) this, d);
+                setCache("Hardware/Computer[@netAddress='.']", cached);
+                break;
+            }
+        }
+    }
+    return (CConstMachineInfo *) cached;
+}
+
+IConstDropZoneInfo * CLocalEnvironment::getDropZone(const char * name) const
+{
+    if (!name)
+        return NULL;
+    buildDropZoneCache();
+    VStringBuffer xpath("Software/DropZone[@name=\"%s\"]", name);
+    synchronized procedure(safeCache);
+    IConstEnvBase *cached = getCache(xpath.str());
+    if (!cached)
+    {
+        IPropertyTree *d = p->queryPropTree(xpath.str());
+        if (!d)
+            return NULL;
+        cached = new CConstDropZoneInfo((CLocalEnvironment *) this, d);
+        setCache(xpath.str(), cached);
+    }
+    return (CConstDropZoneInfo *) cached;
+}
+
+
+IConstDropZoneInfo * CLocalEnvironment::getDropZoneByComputer(const char * computer) const
+{
+    if (!computer)
+        return NULL;
+    buildDropZoneCache();
+    VStringBuffer xpath("Software/DropZone[@computer='%s']", computer);
+    synchronized procedure(safeCache);
+    IConstEnvBase *cached = getCache(xpath.str());
+    if (!cached)
+    {
+        IPropertyTree *d = p->queryPropTree(xpath.str());
+        if (!d)
+            return NULL;
+        cached = new CConstDropZoneInfo((CLocalEnvironment *) this, d);
+        setCache(xpath.str(), cached);
+    }
+    return (CConstDropZoneInfo *) cached;
+}
+
 IConstInstanceInfo * CLocalEnvironment::getInstance(const char *type, const char *version, const char *domain) const
 {
     StringBuffer xpath("Software/");

+ 9 - 0
common/environment/environment.hpp

@@ -103,12 +103,21 @@ interface IConstInstanceInfo : extends IConstEnvBase
     virtual bool getRunInfo(IStringVal & progpath, IStringVal & workdir, const char * defaultprogname) const = 0;
 };
 
+interface IConstDropZoneInfo : extends IConstEnvBase
+{
+    virtual IStringVal & getComputerName(IStringVal & str) const = 0;
+    virtual IStringVal & getDescription(IStringVal & str) const = 0;
+    virtual IStringVal & getDirectory(IStringVal & str) const = 0;
+};
 
 interface IConstEnvironment : extends IConstEnvBase
 {
     virtual IConstDomainInfo * getDomain(const char * name) const = 0;
     virtual IConstMachineInfo * getMachine(const char * name) const = 0;
     virtual IConstMachineInfo * getMachineByAddress(const char * netaddress) const = 0;
+    virtual IConstMachineInfo * getMachineForLocalHost() const = 0;
+    virtual IConstDropZoneInfo * getDropZone(const char * name) const = 0;
+    virtual IConstDropZoneInfo * getDropZoneByComputer(const char * computer) const = 0;
     virtual IConstInstanceInfo * getInstance(const char * type, const char * version, const char * domain) const = 0;
     virtual IConstComputerTypeInfo * getComputerType(const char * name) const = 0;
     virtual bool getRunInfo(IStringVal & path, IStringVal & dir, const char * type, const char * version, const char * machineaddr, const char * defaultprogname) const = 0;

+ 14 - 30
esp/services/ws_fs/ws_fsService.cpp

@@ -2288,43 +2288,27 @@ const char* CFileSprayEx::getDropZoneDirByIP(const char* ip, StringBuffer& dir)
     if (!env)
         return NULL;
 
-    Owned<IPropertyTree> root = &env->getPTree();
-    VStringBuffer xPath("Hardware/Computer[@netAddress='%s']/@name", ip);
-    const char* computer = root->queryProp(xPath.str());
-    if (!computer || !*computer)
+    Owned<IConstMachineInfo> machine = env->getMachineByAddress(ip);
+    if (!machine)
     {
         StringBuffer localHostIP;
         queryHostIP().getIpText(localHostIP);
         if (!strieq(".", ip) && !strieq("localhost", ip) && !strieq("127.0.0.1", ip) && !strieq(ip, localHostIP.str()))
             return NULL;
-
-        StringArray possibleIPs;
-        if (!strieq(".", ip))
-            possibleIPs.append(".");
-        if (!strieq("localhost", ip))
-            possibleIPs.append("localhost");
-        if (!strieq("127.0.0.1", ip))
-            possibleIPs.append("127.0.0.1");
-        if (!strieq(localHostIP.str(), ip))
-            possibleIPs.append(localHostIP.str());
-
-        ForEachItemIn(i, possibleIPs)
-        {
-            xPath.setf("Hardware/Computer[@netAddress='%s']/@name", possibleIPs.item(i));
-            computer = root->queryProp(xPath.str());
-            if (computer && *computer)
-                break;
-        }
-        if (!computer || !*computer)
+        machine.setown(env->getMachineForLocalHost());
+        if (!machine)
             return NULL;
     }
-
-    xPath.setf("Software/DropZone[@computer='%s']/@directory", computer);
-    const char* path = root->queryProp(xPath.str());
-    if (!path || !*path)
+    SCMStringBuffer computer, directory;
+    machine->getName(computer);
+    if (!computer.length())
         return NULL;
 
-    return dir.append(path).str();
+    Owned<IConstDropZoneInfo> dropZone = env->getDropZoneByComputer(computer.str());
+    if (!dropZone)
+        return NULL;
+    dropZone->getDirectory(directory);
+    return dir.set(directory.str()).str();
 }
 
 bool CFileSprayEx::onDespray(IEspContext &context, IEspDespray &req, IEspDesprayResponse &resp)
@@ -2380,8 +2364,8 @@ bool CFileSprayEx::onDespray(IEspContext &context, IEspDespray &req, IEspDespray
             {
                 StringBuffer buf;
                 getDropZoneDirByIP(destip, buf);
-                if (buf.length() && buf.charAt(buf.length()-1) != PATHSEPCHAR)
-                    buf.append(PATHSEPCHAR);
+                if (buf.length())
+                    addPathSepChar(buf);
                 rfn.setPath(ep, buf.append(destfile).str());
             }
             destination->setSingleFilename(rfn);