瀏覽代碼

HPCC-2839 Separate Package Validation warnings from erors

Signed-off-by: Anthony Fishbeck <Anthony.Fishbeck@lexisnexis.com>
Anthony Fishbeck 12 年之前
父節點
當前提交
adab9bfbf9

+ 11 - 8
common/workunit/package.cpp

@@ -110,23 +110,26 @@ void CPackageNode::loadEnvironment()
     }
 }
 
-bool CPackageNode::validate(IMultiException *me) const
+bool CPackageNode::validate(StringArray &warn, StringArray &err) const
 {
     if (!node)
         return true;
-    const char *packageId = node->queryProp("@id");
-    if (!packageId || !*packageId)
-        me->append(*MakeStringExceptionDirect(PACKAGE_MISSING_ID, "Package has no id attribute"));
+    StringAttr packageId = node->queryProp("@id");
+    if (packageId.isEmpty())
+        err.append("Package has no id attribute");
     Owned<IPropertyTreeIterator> files = node->getElements("SuperFile");
     ForEach(*files)
     {
         IPropertyTree &super = files->query();
-        const char *superId = super.queryProp("@id");
-        if (!superId || !*superId)
-            me->append(*MakeStringExceptionDirect(PACKAGE_MISSING_ID, "SuperFile has no id attribute"));
+        StringAttr superId = super.queryProp("@id");
+        if (superId.isEmpty())
+            err.append("SuperFile has no id attribute");
 
         if (!super.hasProp("SubFile"))
-            me->append(*MakeStringException(PACKAGE_NO_SUBFILES, "Warning: Package['%s']/SuperFile['%s'] has no SubFiles defined", packageId, superId ? superId : ""));
+        {
+            VStringBuffer msg("Package['%s']/SuperFile['%s'] has no SubFiles defined", packageId.sget(), superId.sget());
+            warn.append(msg.str());
+        }
     }
     return true;
 }

+ 1 - 1
common/workunit/package.h

@@ -45,7 +45,7 @@ interface IHpccPackageMap : extends IInterface
     virtual const IHpccPackage *matchPackage(const char *name) const = 0;
     virtual const char *queryPackageId() const = 0;
     virtual bool isActive() const = 0;
-    virtual bool validate(IMultiException *me, StringArray &unmatchedQueries, StringArray &unusedPackages) const = 0;
+    virtual bool validate(StringArray &warn, StringArray &err, StringArray &unmatchedQueries, StringArray &unusedPackages) const = 0;
 };
 
 interface IHpccPackageSet : extends IInterface

+ 11 - 5
common/workunit/pkgimpl.hpp

@@ -148,7 +148,7 @@ public:
             return NULL;
         return node->getPropTree("QuerySets");
     }
-    virtual bool validate(IMultiException *me) const;
+    virtual bool validate(StringArray &warn, StringArray &err) const;
 };
 
 enum baseResolutionState
@@ -256,9 +256,9 @@ public:
         return false;
     }
 
-    virtual bool validate(IMultiException *me) const
+    virtual bool validate(StringArray &warn, StringArray &err) const
     {
-        return TYPE::validate(me);
+        return TYPE::validate(warn, err);
     }
 };
 
@@ -363,7 +363,7 @@ public:
         load(getPackageMapById(id, true));
     }
 
-    virtual bool validate(IMultiException *me, StringArray &unmatchedQueries, StringArray &unusedPackages) const
+    virtual bool validate(StringArray &warn, StringArray &err, StringArray &unmatchedQueries, StringArray &unusedPackages) const
     {
         bool isValid = true;
         MapStringTo<bool> referencedPackages;
@@ -378,12 +378,18 @@ public:
             packageType *pkg = packages.getValue(packageId);
             if (!pkg)
                 continue;
-            if (!pkg->validate(me))
+            if (!pkg->validate(warn, err))
                 isValid = false;
             Owned<IPropertyTreeIterator> baseNodes = pkg->queryTree()->getElements("Base");
             ForEach(*baseNodes)
             {
                 const char *baseId = baseNodes->query().queryProp("@id");
+                if (!baseId || !*baseId)
+                {
+                    VStringBuffer msg("Package '%s' contains Base element with no id attribute", packageId);
+                    err.append(msg.str());
+                    continue;
+                }
                 if (!referencedPackages.getValue(baseId))
                     referencedPackages.setValue(baseId, true);
             }

+ 18 - 2
ecl/ecl-package/ecl-package.cpp

@@ -669,10 +669,26 @@ public:
         request->setTarget(optTarget);
 
         Owned<IClientValidatePackageResponse> resp = packageProcessClient->ValidatePackage(request);
-        if (resp->getExceptions().ordinality()==0)
+        if (resp->getExceptions().ordinality()>0)
+            outputMultiExceptions(resp->getExceptions());
+        StringArray &errors = resp->getErrors();
+        if (errors.ordinality()==0)
             fputs("   No errors found\n", stdout);
         else
-            outputMultiExceptions(resp->getExceptions());
+        {
+            fputs("   Error(s):\n", stderr);
+            ForEachItemIn(i, errors)
+                fprintf(stderr, "      %s\n", errors.item(i));
+        }
+        StringArray &warnings = resp->getWarnings();
+        if (warnings.ordinality()==0)
+            fputs("   No warnings found\n", stdout);
+        else
+        {
+            fputs("   Warning(s):\n", stderr);
+            ForEachItemIn(i, warnings)
+                fprintf(stderr, "      %s\n", warnings.item(i));
+        }
         StringArray &unmatchedQueries = resp->getQueries().getUnmatched();
         if (unmatchedQueries.ordinality()>0)
         {

+ 2 - 0
esp/scm/ws_packageprocess.ecm

@@ -129,6 +129,8 @@ ESPstruct ValidatePackageQueries
 ESPresponse [exceptions_inline] ValidatePackageResponse
 {
     ESPstruct BasePackageStatus status;
+    ESParray<string> Warnings;
+    ESParray<string> Errors;
     ESPstruct ValidatePackageInfo packages;
     ESPstruct ValidatePackageQueries queries;
 };

+ 8 - 9
esp/services/ws_packageprocess/ws_packageprocessService.cpp

@@ -529,18 +529,17 @@ bool CWsPackageProcessEx::onGetPackage(IEspContext &context, IEspGetPackageReque
 
 bool CWsPackageProcessEx::onValidatePackage(IEspContext &context, IEspValidatePackageRequest &req, IEspValidatePackageResponse &resp)
 {
-    Owned<IHpccPackageMap> map = createPackageMapFromXml(req.getInfo(), req.getTarget(), NULL);
-    Owned<IMultiException> me = MakeMultiException("PackageMap");
+    StringArray warnings;
+    StringArray errors;
     StringArray unmatchedQueries;
     StringArray unusedPackages;
-    map->validate(me, unmatchedQueries, unusedPackages);
+
+    Owned<IHpccPackageMap> map = createPackageMapFromXml(req.getInfo(), req.getTarget(), NULL);
+    map->validate(warnings, errors, unmatchedQueries, unusedPackages);
+
+    resp.setWarnings(warnings);
+    resp.setErrors(errors);
     resp.updateQueries().setUnmatched(unmatchedQueries);
     resp.updatePackages().setUnmatched(unusedPackages);
-    if (me->ordinality()>0)
-    {
-        IArrayOf<IException>& exceptions = me->getArray();
-        ForEachItemIn(i, exceptions)
-            resp.noteException(*LINK(&exceptions.item(i)));
-    }
     return true;
 }

+ 2 - 2
roxie/ccd/ccdstate.cpp

@@ -512,9 +512,9 @@ public:
     {
         return BASE::isActive();
     }
-    virtual bool validate(IMultiException *me, StringArray &unmatchedQueries, StringArray &unusedPackages) const
+    virtual bool validate(StringArray &wrn, StringArray &err, StringArray &unmatchedQueries, StringArray &unusedPackages) const
     {
-        return BASE::validate(me, unmatchedQueries, unusedPackages);
+        return BASE::validate(wrn, err, unmatchedQueries, unusedPackages);
     }
 
     virtual const IRoxiePackage *queryRoxiePackage(const char *name) const