From d4550d9f035077dc1a53316a01d204d872bdc12b Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 5 Dec 2016 14:40:57 +0100 Subject: [PATCH 01/27] Add support for third party gson library --- installation/build.xml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/installation/build.xml b/installation/build.xml index 438a559..ffefbce 100755 --- a/installation/build.xml +++ b/installation/build.xml @@ -33,6 +33,12 @@ + + + + + + @@ -44,8 +50,11 @@ srcdir="${fm.src}" destdir="${fm.classes}" failonerror="true" - nowarn="true"> - + nowarn="true"> + + + + From c7ee8572043c99e0581d4657ccdee140445a8ebb Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 5 Dec 2016 14:41:32 +0100 Subject: [PATCH 02/27] Have master snippet parsing directly map tag names to FM parameter names. Add support for XInclude. --- .../app/level1/HCALlevelOneEventHandler.java | 16 - src/rcms/fm/app/level1/HCALxmlHandler.java | 304 ++++++++++++------ 2 files changed, 214 insertions(+), 106 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java index 94dab1a..8a91b44 100755 --- a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java +++ b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java @@ -628,26 +628,10 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { String selectedRun = ((StringT)functionManager.getHCALparameterSet().get("RUN_CONFIG_SELECTED").getValue()).getString(); String CfgCVSBasePath = ((StringT)functionManager.getParameterSet().get("HCAL_CFGCVSBASEPATH").getValue()).getString(); - // Try to find a common masterSnippet from MasterSnippet - String CommonMasterSnippetFile =""; - try{ - String TagName="CommonMasterSnippet"; - String attribute="file"; - CommonMasterSnippetFile = xmlHandler.getHCALMasterSnippetTagAttribute(selectedRun,CfgCVSBasePath,TagName,attribute); - } - catch(UserActionException e){ - logger.error("[HCAL LVL1"+functionManager.FMname+"]: Found more than one CommonMasterSnippet tag in the mastersnippet! This is not allowed!"); - functionManager.goToError(e.getMessage()); - } //Check if the NUMBER_OF_EVENTS parameter is already set from GUI, if so, ignore settings from mastersnippet boolean NeventIsSetFromGUI = !xmlHandler.hasDefaultValue("NUMBER_OF_EVENTS",1000); - if(!CommonMasterSnippetFile.equals("")){ - //parse and set HCAL parameters from CommonMasterSnippet - logger.info("[HCAL LVL1 "+ functionManager.FMname +"] Going to parse CommonMasterSnippet : "+ CommonMasterSnippetFile); - xmlHandler.parseMasterSnippet(CommonMasterSnippetFile,CfgCVSBasePath,NeventIsSetFromGUI); - } //Parse and set HCAL parameters from MasterSnippet logger.info("[HCAL LVL1 "+ functionManager.FMname +"] Going to parse MasterSnippet : "+ selectedRun); xmlHandler.parseMasterSnippet(selectedRun,CfgCVSBasePath,NeventIsSetFromGUI); diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index ac779d3..3cd9c6d 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -1,8 +1,11 @@ package rcms.fm.app.level1; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.StringReader; +import java.util.Map; +import java.util.HashMap; import java.util.Arrays; import java.io.StringWriter; import java.nio.charset.Charset; @@ -31,13 +34,27 @@ import rcms.fm.fw.parameter.FunctionManagerParameter; import rcms.fm.fw.parameter.ParameterSet; import rcms.fm.fw.parameter.type.StringT; -import rcms.fm.fw.parameter.type.IntegerT; import rcms.fm.fw.parameter.type.BooleanT; +import rcms.fm.fw.parameter.type.ByteT; +import rcms.fm.fw.parameter.type.DateT; +import rcms.fm.fw.parameter.type.DoubleT; +import rcms.fm.fw.parameter.type.FloatT; +import rcms.fm.fw.parameter.type.IntegerT; +import rcms.fm.fw.parameter.type.LongT; +import rcms.fm.fw.parameter.type.MapT; +import rcms.fm.fw.parameter.type.ShortT; +import rcms.fm.fw.parameter.type.StringT; +import rcms.fm.fw.parameter.type.StructT; +import rcms.fm.fw.parameter.type.UnsignedIntegerT; +import rcms.fm.fw.parameter.type.UnsignedShortT; import rcms.fm.fw.parameter.type.VectorT; import rcms.resourceservice.db.resource.fm.FunctionManagerResource; import rcms.util.logger.RCMSLogger; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; /** * @author John Hakala * @@ -48,13 +65,14 @@ public class HCALxmlHandler { protected HCALFunctionManager functionManager = null; static RCMSLogger logger = null; public DocumentBuilder docBuilder; - public String[] ValidMasterSnippetTags = new String[] {"CfgScript","TCDSControl","TTCciControl","LPMControl","PIControl","LTCControl","AlarmerURL","AlarmerStatus","FedEnableMask","FMSettings"}; + //public String[] ValidMasterSnippetTags = new String[] {"CfgScript","TCDSControl","TTCciControl","LPMControl","PIControl","LTCControl","AlarmerURL","AlarmerStatus","FedEnableMask","FMSettings"}; public HCALxmlHandler(HCALFunctionManager parentFunctionManager) { this.logger = new RCMSLogger(HCALFunctionManager.class); logger.warn("Constructing xmlHandler."); this.functionManager = parentFunctionManager; logger.warn("Done constructing xmlHandler."); + } @@ -403,34 +421,206 @@ public String getHCALMasterSnippetTagAttribute(String selectedRun, String CfgCVS return tmpAttribute; } - // Fill parameters from MasterSnippet - public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolean NeventIsSetFromGUI ) throws UserActionException{ - try{ - // Get ControlSequences from mastersnippet - docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - Document masterSnippet = docBuilder.parse(new File(CfgCVSBasePath + selectedRun + "/pro")); + public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolean NeventIsSetFromGUI) throws UserActionException { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setXIncludeAware(true); // This is needed for xi:include to work + factory.setNamespaceAware(true); + DocumentBuilder docBuilder = factory.newDocumentBuilder(); + String masterUriActual = CfgCVSBasePath + selectedRun + "/pro"; + String masterUriSystem = CfgCVSBasePath + "/master.xml"; // This is needed for relative resolution of includes to be based on CfgCVSBasePath, rather than the working directory + InputSource masterInputSource = new InputSource(new FileInputStream(masterUriActual)); + Document masterSnippet = docBuilder.parse(masterInputSource.getByteStream(), masterUriSystem); + masterSnippet.getDocumentElement().normalize(); + Element masterSnippetElement = masterSnippet.getDocumentElement(); + NodeList elements = masterSnippetElement.getChildNodes(); + + // Look for common master + // Try to find a common masterSnippet from MasterSnippet + String commonMasterSnippetFile = ""; + for (int iNode = 0; iNode < elements.getLength(); iNode++) { + if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { + if (elements.item(iNode).getNodeName() == "CommonMasterSnippet") { + // Check that it has not already been set + if (commonMasterSnippetFile != "") { + String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: Found multiple instances of CommonMasterSnippet. Only one is allowed."; + throw new UserActionException(errMessage); + } + commonMasterSnippetFile = ((Element)elements.item(iNode)).getAttributes().getNamedItem("file").getNodeValue(); + } + } + } + if (commonMasterSnippetFile != "") { + this.parseMasterSnippet(commonMasterSnippetFile,CfgCVSBasePath,NeventIsSetFromGUI); + } + + // Parse parameters from main file + Gson gson = new Gson(); + for (int iNode = 0; iNode < elements.getLength(); iNode++) { + if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { + Element parameterElement = (Element)elements.item(iNode); + + // Get parameter name and check against whitelist + String parameterName = parameterElement.getNodeName(); + if (!functionManager.getHCALparameterSet().contains(parameterName)) { + String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippetTest: Invalid parameter found in master snippet! Parameter name = " + parameterName + "."; + throw new UserActionException(errMessage); + } + + // Determine type, extract value, and set + //String parameterType = fmParameterTypes.get(parameterName); + String parameterType = functionManager.getHCALparameterSet().get(parameterName).getType().getName(); + String parameterValue = parameterElement.getTextContent(); - masterSnippet.getDocumentElement().normalize(); - Element masterSnippetElement = masterSnippet.getDocumentElement(); - - NodeList listOfTags = masterSnippetElement.getChildNodes(); - for(int i =0;i< listOfTags.getLength();i++){ - if( listOfTags.item(i).getNodeType()== Node.ELEMENT_NODE){ - Element iElement = (Element) listOfTags.item(i); - String iTagName = iElement.getNodeName(); - Boolean isValidTag = Arrays.asList(ValidMasterSnippetTags).contains( iTagName ); - logger.info("[HCAL "+functionManager.FMname+" ] parseMasterSnippet: Found TagName = "+ iTagName ); - - if(isValidTag){ - NodeList iNodeList = masterSnippetElement.getElementsByTagName( iTagName ); - SetHCALParameterFromTagName( iTagName , iNodeList, CfgCVSBasePath, NeventIsSetFromGUI); + logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); + + switch (parameterType) { + case "BooleanT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new BooleanT(parameterValue))); + break; + } + case "ByteT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new ByteT(parameterValue))); + break; + } + case "DateT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new DateT(parameterValue))); + break; + } + case "DoubleT ": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new DoubleT(parameterValue))); + break; + } + case "FloatT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new FloatT(parameterValue))); + break; + } + case "IntegerT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new IntegerT(parameterValue))); + break; + } + case "LongT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new LongT(parameterValue))); + break; + } + case "ShortT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new ShortT(parameterValue))); + break; + } + case "StringT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(parameterValue))); + break; + } + case "UnsignedIntegerT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new UnsignedIntegerT(parameterValue))); + break; + } + case "UnsignedShortT": + { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new UnsignedShortT(parameterValue))); + break; + } + case "VectorT": + { + Type type = new TypeToken >(){}.getType(); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); + //VectorT myMap = gson.fromJson(parameterValue, type); + + //VectorT tmpVector = new VectorT(); + //for (String vectorElement : vectorValues) { + // tmpVector.add(new StringT(vectorElement)); + //} + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + break; + } + case "VectorT": + { + Type type = new TypeToken >(){}.getType(); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); + //VectorT tmpVector = new VectorT(); + //for (String vectorElement : vectorValues) { + //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); + //} + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + break; + } + case "MapT": + { + Type type = new TypeToken >(){}.getType(); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); + //VectorT tmpVector = new VectorT(); + //for (String vectorElement : vectorValues) { + //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); + //} + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + break; + } + case "MapT": + { + Type type = new TypeToken >(){}.getType(); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); + //VectorT tmpVector = new VectorT(); + //for (String vectorElement : vectorValues) { + //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); + //} + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + break; + } + case "MapT >": + { + Type type = new TypeToken > >(){}.getType(); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(gson.fromJson(parameterValue, type))); + //VectorT tmpVector = new VectorT(); + //for (String vectorElement : vectorValues) { + //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); + //} + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + break; + } +// case "MapT(StringT)": +// { +// MapT< StringT> tmpMap = new MapT(); +// for (Map.Entry entry : mapValues.entrySet()) { +// tmpMap.put(new StringT(entry.getKey()), new StringT(entry.getValue())); +// } +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpMap)); +// break; +// } +// case "MapT(VectorT(IntegerT))": +// { +// MapT< VectorT > tmpMap = new MapT< VectorT >(); +// for (Map.Entry entry : mapValues.entrySet()) { +// VectorT tmpVector = new VectorT(); +// for (String vectorEntry : entry.getValue().split(",")) { +// tmpVector.add(new IntegerT(Integer.parseInt(vectorEntry))); +// } +// tmpMap.put(entry.getKey(), tmpVector); +// } +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(parameterName, tmpMap)); +// break; +// } + default: + { + String errMessage="[David log HCAL " + functionManager.FMname + "] Unknown FMParameter type (" + parameterType + ") for FMParameter named " + parameterName; + throw new UserActionException(errMessage); } } } - } - catch ( DOMException | ParserConfigurationException | SAXException | IOException e) { + } + } catch ( DOMException | ParserConfigurationException | SAXException | IOException e) { logger.error("[HCAL " + functionManager.FMname + "]: Got a error when parsing masterSnippet:: " + e.getMessage()); } + } public String getHCALParameterFromTagName(String TagName){ @@ -444,72 +634,6 @@ public String getHCALParameterFromTagName(String TagName){ return emptyString; } - - public void SetHCALParameterFromTagName(String TagName, NodeList NodeListOfTagName ,String CfgCVSBasePath, boolean NeventIsSetFromGUI){ - try{ - if(TagName.equals("TCDSControl")|| TagName.equals("LPMControl")|| TagName.equals("PIControl")|| TagName.equals("TTCciControl") || TagName.equals("LTCControl") ){ - String HCALParameter = getHCALParameterFromTagName(TagName); - String ControlSequence = getIncludeFiles( NodeListOfTagName, CfgCVSBasePath ,TagName ); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter(HCALParameter ,new StringT(ControlSequence))); - } - if(TagName.equals("AlarmerURL")){ - functionManager.alarmerURL = getTagTextContent(NodeListOfTagName, TagName ); - } - if(TagName.equals("AlarmerStatus")) { - functionManager.alarmerPartition = getTagAttribute(NodeListOfTagName,TagName,"partition" ); - } - if(TagName.equals("FMSettings")){ - //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - String StringNumberOfEvents = getTagAttribute(NodeListOfTagName, TagName,"NumberOfEvents"); - if(NeventIsSetFromGUI){ - logger.info("[HCAL LVL1 "+functionManager.FMname+" Number of Events already set to "+ functionManager.getHCALparameterSet().get("NUMBER_OF_EVENTS").getValue()+" from GUI. Not over-writting"); - } - else{ - if( !StringNumberOfEvents.equals("")){ - Integer NumberOfEvents = Integer.valueOf(StringNumberOfEvents); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter("NUMBER_OF_EVENTS",new IntegerT(NumberOfEvents))); - } - } - //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - String StringRunInfoPublish = getTagAttribute(NodeListOfTagName, TagName,"RunInfoPublish"); - if( !StringRunInfoPublish.equals("")){ - Boolean RunInfoPublish = Boolean.valueOf(StringRunInfoPublish); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_RUNINFOPUBLISH",new BooleanT(RunInfoPublish))); - } - - //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - String StringOfficialRunNumbers = getTagAttribute(NodeListOfTagName, TagName,"OfficialRunNumbers"); - if( !StringOfficialRunNumbers.equals("")){ - Boolean OfficialRunNumbers = Boolean.valueOf(StringOfficialRunNumbers); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter("OFFICIAL_RUN_NUMBERS",new BooleanT(OfficialRunNumbers))); - } - } - if(TagName.equals("CfgScript")){ - String tmpCfgScript =""; - if( !hasDefaultValue("HCAL_CFGSCRIPT","not set") ){ - //If the parameter is filled (by CommonMasterSnippet), add that first instead of overwriting - tmpCfgScript = ((StringT)functionManager.getHCALparameterSet().get("HCAL_CFGSCRIPT").getValue()).getString(); - tmpCfgScript += getTagTextContent( NodeListOfTagName, TagName); - } - else{ - //If the parameter has defaultValue, put what is in the current mastersnippet in the parameter - tmpCfgScript = getTagTextContent( NodeListOfTagName, TagName); - } - functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_CFGSCRIPT",new StringT(tmpCfgScript))); - } - if(TagName.equals("FedEnableMask")){ - if (functionManager.RunType.equals("local")){ - String tmpFedEnableMask = getTagTextContent( NodeListOfTagName, TagName); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter("FED_ENABLE_MASK",new StringT(tmpFedEnableMask))); - } - } - } - catch ( UserActionException e){ - // Warn when found more than one tag name in mastersnippet - functionManager.goToError(e.getMessage()); - } - } - public boolean hasDefaultValue(String pam, String def_value){ String present_value = ((StringT)functionManager.getHCALparameterSet().get(pam).getValue()).getString(); //logger.info("[Martin log HCAL "+functionManager.FMname+"] the present value of "+pam+" is "+present_value); From 6b925faf24cbf7fb64a30786020e81de381b7129 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 5 Dec 2016 16:58:55 +0100 Subject: [PATCH 03/27] Adding FM parameter HCAL_ALARM_URL, replaces alarmerURL member variable --- src/rcms/fm/app/level1/HCALParameters.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rcms/fm/app/level1/HCALParameters.java b/src/rcms/fm/app/level1/HCALParameters.java index f5294f4..cfabab9 100755 --- a/src/rcms/fm/app/level1/HCALParameters.java +++ b/src/rcms/fm/app/level1/HCALParameters.java @@ -68,6 +68,7 @@ public synchronized void initializeParameters() throws ParameterException { this.put( new FunctionManagerParameter ("CONFIGURED_WITH_RUN_KEY" , new StringT("not set") , FunctionManagerParameter.Exported.READONLY) ); // Configuration information for l0: Global configuration key at last configure this.put( new FunctionManagerParameter ("CONFIGURED_WITH_TPG_KEY" , new StringT("not set") , FunctionManagerParameter.Exported.READONLY) ); // Configuration information for l0: Trigger key at last configure this.put( new FunctionManagerParameter ("CONFIGURED_WITH_FED_ENABLE_MASK" , new StringT("not set") , FunctionManagerParameter.Exported.READONLY) ); // Configuration information for l0: FED enable mask at last configure + this.put( new FunctionManagerParameter ("HCAL_ALARMER_URL" , new StringT("not set") , FunctionManagerParameter.Exported.READONLY) ); // Configuration information for l0: FED enable mask at last configure this.put( new FunctionManagerParameter ("USE_PRIMARY_TCDS" , new BooleanT(true) , FunctionManagerParameter.Exported.READONLY) ); // Switch for using the secondary TCDS system this.put( new FunctionManagerParameter ("HCAL_RUNINFOPUBLISH" , new BooleanT(false) , FunctionManagerParameter.Exported.READONLY) ); // Switch for publishing RunInfo From 3235dcfdfb80d38c62e643643a13e4ffba984323 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 5 Dec 2016 16:59:05 +0100 Subject: [PATCH 04/27] Adding FM parameter HCAL_ALARM_URL, replaces alarmerURL member variable --- src/rcms/fm/app/level1/HCALFunctionManager.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALFunctionManager.java b/src/rcms/fm/app/level1/HCALFunctionManager.java index 2b8e94b..e423b40 100755 --- a/src/rcms/fm/app/level1/HCALFunctionManager.java +++ b/src/rcms/fm/app/level1/HCALFunctionManager.java @@ -217,8 +217,6 @@ public class HCALFunctionManager extends UserFunctionManager { public String rcmsStateListenerURL = ""; - public String alarmerURL = ""; - public String alarmerPartition = ""; public HCALFunctionManager() { From 06358728ec4df409c6d02d7031247ac6b47de54a Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 5 Dec 2016 16:59:32 +0100 Subject: [PATCH 05/27] Adding FM parameter HCAL_ALARM_URL, replaces alarmerURL member variable --- src/rcms/fm/app/level1/HCALEventHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALEventHandler.java b/src/rcms/fm/app/level1/HCALEventHandler.java index 41c8a91..764ed80 100755 --- a/src/rcms/fm/app/level1/HCALEventHandler.java +++ b/src/rcms/fm/app/level1/HCALEventHandler.java @@ -2603,11 +2603,11 @@ public AlarmerWatchThread() { public void run() { stopAlarmerWatchThread = false; try { - URL alarmerURL = new URL(functionManager.alarmerURL); + URL alarmerURL = new URL(((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue()).getString()); } catch (MalformedURLException e) { // in case the URL is bogus, just don't run the thread stopAlarmerWatchThread = true; - logger.warn("[HCAL " + functionManager.FMname + "] HCALEventHandler: alarmerWatchThread: value of alarmerURL is not valid: " + functionManager.alarmerURL + "; not checking alarmer status"); + logger.warn("[HCAL " + functionManager.FMname + "] HCALEventHandler: alarmerWatchThread: value of alarmerURL is not valid: " + ((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue() .getString())+ "; not checking alarmer status"); } // poll alarmer status in the Running/RunningDegraded states every 30 sec to see if it is still OK/alive @@ -2619,7 +2619,7 @@ public void run() { try { // ask for the status of the HCAL alarmer // ("http://hcalmon.cms:9945","hcalAlarmer",0); - XDAQParameter pam = new XDAQParameter(functionManager.alarmerURL,"hcalAlarmer",0); + XDAQParameter pam = new XDAQParameter(((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue(),.getString())"hcalAlarmer",0); // this does a lazy get. do we need to force the update before getting it? //logger.info("[SethLog] HCALEventHandler: alarmerWatchThread: value of alarmer parameter GlobalStatus is " + pam.getValue("GlobalStatus")); String alarmerStatusValue = ""; From f764aea617f381bc388d1567a9c2560119478a94 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:07:35 +0100 Subject: [PATCH 06/27] First working build of new parser, supporting XInclude, VectorT and MapT --- src/rcms/fm/app/level1/HCALxmlHandler.java | 190 ++++++++++++++------- 1 file changed, 131 insertions(+), 59 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index c24990f..c53181e 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.HashMap; import java.util.Arrays; +import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.io.StringWriter; @@ -34,6 +35,8 @@ import rcms.fm.fw.user.UserActionException; import rcms.fm.fw.parameter.FunctionManagerParameter; +import rcms.fm.fw.parameter.type.ParameterType; +import rcms.fm.fw.parameter.type.ParameterTypeFactory; import rcms.fm.fw.parameter.ParameterSet; import rcms.fm.fw.parameter.type.StringT; import rcms.fm.fw.parameter.type.BooleanT; @@ -59,13 +62,16 @@ import rcms.fm.fw.parameter.type.UnsignedIntegerT; import rcms.fm.fw.parameter.type.UnsignedShortT; import rcms.fm.fw.parameter.type.MapT; +import rcms.fm.fw.parameter.util.JsonUtil; import rcms.resourceservice.db.resource.fm.FunctionManagerResource; import rcms.util.logger.RCMSLogger; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +//import com.google.gson.Gson; +//import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Field; /** * @author John Hakala * @@ -463,25 +469,33 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } } if (commonMasterSnippetFile != "") { + logger.info("[HCAL " + functionManager.FMname + "]: Parsing the common master snippet from " + commonMasterSnippetFile + "."); this.parseMasterSnippet(commonMasterSnippetFile,CfgCVSBasePath,NeventIsSetFromGUI); + logger.info("[HCAL " + functionManager.FMname + "]: Done parsing common master snippet."); } // Parse parameters from main file - Gson gson = new Gson(); + //Gson gson = new Gson(); for (int iNode = 0; iNode < elements.getLength(); iNode++) { if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { Element parameterElement = (Element)elements.item(iNode); // Get parameter name and check against whitelist String parameterName = parameterElement.getNodeName(); + if (parameterName == "CommonMasterSnippet") { + continue; + } + //logger.info("[HCAL " + functionManager.FMname + "]: Found parameter " + parameterName); + if (!functionManager.getHCALparameterSet().contains(parameterName)) { String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippetTest: Invalid parameter found in master snippet! Parameter name = " + parameterName + "."; throw new UserActionException(errMessage); } - // Determine type, extract value, and set - //String parameterType = fmParameterTypes.get(parameterName); - String parameterType = functionManager.getHCALparameterSet().get(parameterName).getType().getName(); + + //logger.info("[HCAL " + functionManager.FMname + "]: Parameter type = " + functionManager.getHCALparameterSet().get(parameterName).getType().getName()); + String[] parameterTypeLong = functionManager.getHCALparameterSet().get(parameterName).getType().getName().split("\\."); + String parameterType = parameterTypeLong[parameterTypeLong.length - 1]; String parameterValue = parameterElement.getTextContent(); logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); @@ -542,63 +556,101 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new UnsignedShortT(parameterValue))); break; } - case "VectorT": - { - Type type = new TypeToken >(){}.getType(); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); - //VectorT myMap = gson.fromJson(parameterValue, type); - - //VectorT tmpVector = new VectorT(); - //for (String vectorElement : vectorValues) { - // tmpVector.add(new StringT(vectorElement)); - //} - //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); - break; - } - case "VectorT": - { - Type type = new TypeToken >(){}.getType(); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); - //VectorT tmpVector = new VectorT(); - //for (String vectorElement : vectorValues) { - //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); - //} - //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); - break; - } - case "MapT": - { - Type type = new TypeToken >(){}.getType(); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); - //VectorT tmpVector = new VectorT(); - //for (String vectorElement : vectorValues) { - //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); - //} - //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); - break; - } - case "MapT": + // MapT parsing : use JsonUtil from the rcms framework, as suggested by Hannes. + // Note that we have no smart way to determine the type of the MapT value, so this is hacked in at the moment... + case "VectorT": { - Type type = new TypeToken >(){}.getType(); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); - //VectorT tmpVector = new VectorT(); - //for (String vectorElement : vectorValues) { - //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); - //} - //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + Object parsedVector = JsonUtil.decode(parameterValue); + //logger.info("[HCAL " + functionManager.FMname + "]: Result of parsing vector is " + parsedVector); + if (parsedVector instanceof ArrayList) { + VectorT tmpVectorT = new VectorT((ArrayList)parsedVector); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpVectorT)); + } else { + String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: parsed vector failed instanceof ArrayList. Parsed result = " + parsedVector; + throw new UserActionException(errMessage); + } break; } - case "MapT >": + case "MapT": { - Type type = new TypeToken > >(){}.getType(); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(gson.fromJson(parameterValue, type))); - //VectorT tmpVector = new VectorT(); - //for (String vectorElement : vectorValues) { - //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); - //} - //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); + Object parsedMap = JsonUtil.decode(parameterValue); + //logger.info("[HCAL " + functionManager.FMname + "]: Result of parsing map is " + parsedMap); + if (parsedMap instanceof HashMap) { + //Map> castMap = (Map>)parsedMap; + //logger.info("[HCAL " + functionManager.FMname + "]: Cast map is " + castMap); +// + //for (Map.Entry> entry : castMap.entrySet()) { + // logger.info("[HCAL " + functionManager.FMname + "]: On entry " + entry); + // ((MapT)functionManager.getHCALparameterSet().get(parameterName).getValue()).put(new StringT(entry.//getKey()), entry.getValue()); + //} + MapT tmpMapT = MapT.createFromMap((HashMap)parsedMap); + //logger.info("[HCAL " + functionManager.FMname + "]: MapT from map = " + tmpMapT); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpMapT)); + //logger.info("[HCAL " + functionManager.FMname + "]: Done with this map parsing"); + } else { + String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: parsed map failed instanceof HashMap. Parsed result = " + parsedMap; + throw new UserActionException(errMessage); + } break; } + +// case "VectorT": +// { +// Type type = new TypeToken >(){}.getType(); +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); +// //VectorT myMap = gson.fromJson(parameterValue, type); +// +// //VectorT tmpVector = new VectorT(); +// //for (String vectorElement : vectorValues) { +// // tmpVector.add(new StringT(vectorElement)); +// //} +// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); +// break; +// } +// case "VectorT": +// { +// Type type = new TypeToken >(){}.getType(); +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); +// //VectorT tmpVector = new VectorT(); +// //for (String vectorElement : vectorValues) { +// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); +// //} +// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); +// break; +// } +// case "MapT": +// { +// Type type = new TypeToken >(){}.getType(); +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); +// //VectorT tmpVector = new VectorT(); +// //for (String vectorElement : vectorValues) { +// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); +// //} +// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); +// break; +// } +// case "MapT": +// { +// Type type = new TypeToken >(){}.getType(); +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); +// //VectorT tmpVector = new VectorT(); +// //for (String vectorElement : vectorValues) { +// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); +// //} +// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); +// break; +// } +// case "MapT >": +// { +// Type type = new TypeToken > >(){}.getType(); +// functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(gson.fromJson(parameterValue, type))); +// //VectorT tmpVector = new VectorT(); +// //for (String vectorElement : vectorValues) { +// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); +// //} +// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); +// break; +// } // case "MapT(StringT)": // { // MapT< StringT> tmpMap = new MapT(); @@ -623,14 +675,34 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea // } default: { - String errMessage="[David log HCAL " + functionManager.FMname + "] Unknown FMParameter type (" + parameterType + ") for FMParameter named " + parameterName; + String errMessage="[David log HCAL " + functionManager.FMname + "] Error in master snippet parsing: for parameter " + parameterName + ", parameter type " + parameterType + " is not supported."; throw new UserActionException(errMessage); } } } } + + // Print test parameters + //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_STRINGT")) { + // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_STRINGT: " + //functionManager.getHCALparameterSet().get("TEST_VECTORT_STRINGT").getValue()); + //} + //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_INTEGERT")) { + // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_INTEGERT: " + //functionManager.getHCALparameterSet().get("TEST_VECTORT_INTEGERT").getValue()); + //} + //if (functionManager.getHCALparameterSet().contains("TEST_MAPT_STRINGT")) { + // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_MAPT_STRINGT: " + //functionManager.getHCALparameterSet().get("TEST_MAPT_STRINGT").getValue()); + //} + //if (functionManager.getHCALparameterSet().contains("TEST_MAPT_INTEGERT")) { + // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_MAPT_INTEGERT: " + //functionManager.getHCALparameterSet().get("TEST_MAPT_INTEGERT").getValue()); + //} + + // Write a vector by hand + VectorT testVector = new VectorT(); + testVector.add(new IntegerT(1)); + testVector.add(new IntegerT(2)); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter>("TEST_VECTORT_INTEGERT", testVector)); } catch ( DOMException | ParserConfigurationException | SAXException | IOException e) { - logger.error("[HCAL " + functionManager.FMname + "]: Got a error when parsing masterSnippet:: " + e.getMessage()); + logger.error("[HCAL " + functionManager.FMname + "]: Got an error when parsing masterSnippet: " + e.getMessage()); } } From e9e3ae599601a75329d6584131d3c92031e78b40 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:11:56 +0100 Subject: [PATCH 07/27] functionManager.alarmerURL is now a FM parameter --- src/rcms/fm/app/level1/HCALlevelOneEventHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java index 3c2278c..3a966ef 100755 --- a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java +++ b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java @@ -686,7 +686,7 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final PIControlSequence is like this: \n" +FullPIControlSequence ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final TTCciControlSequence is like this: \n" +FullTTCciControlSequence ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final LTCControlSequence is like this: \n" +FullLTCControlSequence ); - logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerURL is " +functionManager.alarmerURL ); + //logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerURL is " +functionManager.alarmerURL ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerPartition is " +functionManager.alarmerPartition ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The FED_ENABLE_MASK used by the level-1 is: " +FedEnableMask ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The RunInfoPublish value is : " +RunInfoPublish ); From e86204f21841d4c774e65ab929559ae9f4c3fd28 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:12:24 +0100 Subject: [PATCH 08/27] Add MapT support, plus some commented-out test parameters --- src/rcms/fm/app/level1/HCALParameters.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/rcms/fm/app/level1/HCALParameters.java b/src/rcms/fm/app/level1/HCALParameters.java index f7f64a1..2069b54 100755 --- a/src/rcms/fm/app/level1/HCALParameters.java +++ b/src/rcms/fm/app/level1/HCALParameters.java @@ -11,6 +11,7 @@ import rcms.fm.fw.parameter.type.BooleanT; import rcms.fm.fw.parameter.type.StringT; import rcms.fm.fw.parameter.type.VectorT; +import rcms.fm.fw.parameter.type.MapT; import rcms.util.logger.RCMSLogger; @@ -97,6 +98,11 @@ public synchronized void initializeParameters() throws ParameterException { this.put( new FunctionManagerParameter> ("MASKED_RESOURCES" , new VectorT() ) ); // List of masked resources this.put( new FunctionManagerParameter> ("MASK_SUMMARY" , new VectorT() ) ); // Summary of masked FMs for user understandability this.put( new FunctionManagerParameter> ("EMPTY_FMS" , new VectorT() ) ); // LV2 FMs without XDAQs + + //this.put( new FunctionManagerParameter> ("TEST_VECTORT_STRINGT", new VectorT())); + //this.put( new FunctionManagerParameter> ("TEST_VECTORT_INTEGERT", new VectorT())); + //this.put( new FunctionManagerParameter> ("TEST_MAPT_STRINGT", new MapT())); + //this.put( new FunctionManagerParameter> ("TEST_MAPT_INTEGERT", new MapT())); } public static HCALParameters getInstance() { From caf4c3d78a34aa691b917398a0afe6337f077a4a Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:13:19 +0100 Subject: [PATCH 09/27] Fix misplaced parentheses --- src/rcms/fm/app/level1/HCALEventHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALEventHandler.java b/src/rcms/fm/app/level1/HCALEventHandler.java index 1035661..2227ca0 100755 --- a/src/rcms/fm/app/level1/HCALEventHandler.java +++ b/src/rcms/fm/app/level1/HCALEventHandler.java @@ -2663,7 +2663,7 @@ public void run() { } catch (MalformedURLException e) { // in case the URL is bogus, just don't run the thread stopAlarmerWatchThread = true; - logger.warn("[HCAL " + functionManager.FMname + "] HCALEventHandler: alarmerWatchThread: value of alarmerURL is not valid: " + ((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue() .getString())+ "; not checking alarmer status"); + logger.warn("[HCAL " + functionManager.FMname + "] HCALEventHandler: alarmerWatchThread: value of alarmerURL is not valid: " + ((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue()).getString() + "; not checking alarmer status"); } // poll alarmer status in the Running/RunningDegraded states every 30 sec to see if it is still OK/alive @@ -2705,7 +2705,7 @@ public void run() { // ask for the status of the HCAL alarmer // ("http://hcalmon.cms:9945","hcalAlarmer",0); - XDAQParameter pam = new XDAQParameter(((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue(),.getString())"hcalAlarmer",0); + XDAQParameter pam = new XDAQParameter(((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue()).getString(), "hcalAlarmer", 0); // this does a lazy get. do we need to force the update before getting it? // Get the status for each watched alarm From dd4dc207445ed50b2e490c668bbb7fd0e7c7300d Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:14:44 +0100 Subject: [PATCH 10/27] Remove gson from build, but leave commented out stuff as reference --- installation/build.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/installation/build.xml b/installation/build.xml index ffefbce..dfbe60d 100755 --- a/installation/build.xml +++ b/installation/build.xml @@ -33,11 +33,13 @@ + @@ -52,7 +54,7 @@ failonerror="true" nowarn="true"> - + From ce3a954ce4547b1b1b4e3f823d569df548e07bdb Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 12 Dec 2016 18:21:23 +0100 Subject: [PATCH 11/27] Clean up comments and abandoned code --- src/rcms/fm/app/level1/HCALxmlHandler.java | 107 +-------------------- 1 file changed, 5 insertions(+), 102 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index c53181e..1c4d481 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -453,8 +453,7 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea Element masterSnippetElement = masterSnippet.getDocumentElement(); NodeList elements = masterSnippetElement.getChildNodes(); - // Look for common master - // Try to find a common masterSnippet from MasterSnippet + // Look for common master snippet and, if present, parse first String commonMasterSnippetFile = ""; for (int iNode = 0; iNode < elements.getLength(); iNode++) { if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { @@ -475,25 +474,22 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } // Parse parameters from main file - //Gson gson = new Gson(); for (int iNode = 0; iNode < elements.getLength(); iNode++) { if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { Element parameterElement = (Element)elements.item(iNode); - // Get parameter name and check against whitelist String parameterName = parameterElement.getNodeName(); if (parameterName == "CommonMasterSnippet") { continue; } - //logger.info("[HCAL " + functionManager.FMname + "]: Found parameter " + parameterName); + // Require that the parameter is declared in HCALParameters.java if (!functionManager.getHCALparameterSet().contains(parameterName)) { String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippetTest: Invalid parameter found in master snippet! Parameter name = " + parameterName + "."; throw new UserActionException(errMessage); } - - //logger.info("[HCAL " + functionManager.FMname + "]: Parameter type = " + functionManager.getHCALparameterSet().get(parameterName).getType().getName()); + // Parameter::getType() returns, e.g., rcms.fm.fw.parameter.type.StringT String[] parameterTypeLong = functionManager.getHCALparameterSet().get(parameterName).getType().getName().split("\\."); String parameterType = parameterTypeLong[parameterTypeLong.length - 1]; String parameterValue = parameterElement.getTextContent(); @@ -556,8 +552,8 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new UnsignedShortT(parameterValue))); break; } - // MapT parsing : use JsonUtil from the rcms framework, as suggested by Hannes. - // Note that we have no smart way to determine the type of the MapT value, so this is hacked in at the moment... + // VectorT and MapT parsing use JsonUtil from the rcms framework, as suggested by Hannes. + // The type is inferred from the content: Number, String, Boolean, Array. case "VectorT": { Object parsedVector = JsonUtil.decode(parameterValue); @@ -576,17 +572,8 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea Object parsedMap = JsonUtil.decode(parameterValue); //logger.info("[HCAL " + functionManager.FMname + "]: Result of parsing map is " + parsedMap); if (parsedMap instanceof HashMap) { - //Map> castMap = (Map>)parsedMap; - //logger.info("[HCAL " + functionManager.FMname + "]: Cast map is " + castMap); -// - //for (Map.Entry> entry : castMap.entrySet()) { - // logger.info("[HCAL " + functionManager.FMname + "]: On entry " + entry); - // ((MapT)functionManager.getHCALparameterSet().get(parameterName).getValue()).put(new StringT(entry.//getKey()), entry.getValue()); - //} MapT tmpMapT = MapT.createFromMap((HashMap)parsedMap); - //logger.info("[HCAL " + functionManager.FMname + "]: MapT from map = " + tmpMapT); functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpMapT)); - //logger.info("[HCAL " + functionManager.FMname + "]: Done with this map parsing"); } else { String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: parsed map failed instanceof HashMap. Parsed result = " + parsedMap; throw new UserActionException(errMessage); @@ -594,85 +581,6 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea break; } -// case "VectorT": -// { -// Type type = new TypeToken >(){}.getType(); -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); -// //VectorT myMap = gson.fromJson(parameterValue, type); -// -// //VectorT tmpVector = new VectorT(); -// //for (String vectorElement : vectorValues) { -// // tmpVector.add(new StringT(vectorElement)); -// //} -// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); -// break; -// } -// case "VectorT": -// { -// Type type = new TypeToken >(){}.getType(); -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); -// //VectorT tmpVector = new VectorT(); -// //for (String vectorElement : vectorValues) { -// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); -// //} -// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); -// break; -// } -// case "MapT": -// { -// Type type = new TypeToken >(){}.getType(); -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); -// //VectorT tmpVector = new VectorT(); -// //for (String vectorElement : vectorValues) { -// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); -// //} -// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); -// break; -// } -// case "MapT": -// { -// Type type = new TypeToken >(){}.getType(); -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(gson.fromJson(parameterValue, type))); -// //VectorT tmpVector = new VectorT(); -// //for (String vectorElement : vectorValues) { -// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); -// //} -// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); -// break; -// } -// case "MapT >": -// { -// Type type = new TypeToken > >(){}.getType(); -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(gson.fromJson(parameterValue, type))); -// //VectorT tmpVector = new VectorT(); -// //for (String vectorElement : vectorValues) { -// //tmpVector.add(new IntegerT(Integer.parseInt(vectorElement))); -// //} -// //functionManager.getHCALparameterSet().put(new FunctionManagerParameter >(parameterName, tmpVector)); -// break; -// } -// case "MapT(StringT)": -// { -// MapT< StringT> tmpMap = new MapT(); -// for (Map.Entry entry : mapValues.entrySet()) { -// tmpMap.put(new StringT(entry.getKey()), new StringT(entry.getValue())); -// } -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpMap)); -// break; -// } -// case "MapT(VectorT(IntegerT))": -// { -// MapT< VectorT > tmpMap = new MapT< VectorT >(); -// for (Map.Entry entry : mapValues.entrySet()) { -// VectorT tmpVector = new VectorT(); -// for (String vectorEntry : entry.getValue().split(",")) { -// tmpVector.add(new IntegerT(Integer.parseInt(vectorEntry))); -// } -// tmpMap.put(entry.getKey(), tmpVector); -// } -// functionManager.getHCALparameterSet().put(new FunctionManagerParameter > >(parameterName, tmpMap)); -// break; -// } default: { String errMessage="[David log HCAL " + functionManager.FMname + "] Error in master snippet parsing: for parameter " + parameterName + ", parameter type " + parameterType + " is not supported."; @@ -696,11 +604,6 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_MAPT_INTEGERT: " + //functionManager.getHCALparameterSet().get("TEST_MAPT_INTEGERT").getValue()); //} - // Write a vector by hand - VectorT testVector = new VectorT(); - testVector.add(new IntegerT(1)); - testVector.add(new IntegerT(2)); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter>("TEST_VECTORT_INTEGERT", testVector)); } catch ( DOMException | ParserConfigurationException | SAXException | IOException e) { logger.error("[HCAL " + functionManager.FMname + "]: Got an error when parsing masterSnippet: " + e.getMessage()); } From 7403a1864275bbb89b0cb23929275f09609ac7cc Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 14 Dec 2016 17:43:26 +0100 Subject: [PATCH 12/27] Add type resolution to VectorT parsing, to avoid HCALParameters::run() throwing errors. --- src/rcms/fm/app/level1/HCALxmlHandler.java | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index 1c4d481..df7a376 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -553,14 +553,29 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea break; } // VectorT and MapT parsing use JsonUtil from the rcms framework, as suggested by Hannes. - // The type is inferred from the content: Number, String, Boolean, Array. + // The type is inferred from the content: Double, Integer, String, Boolean. case "VectorT": { Object parsedVector = JsonUtil.decode(parameterValue); //logger.info("[HCAL " + functionManager.FMname + "]: Result of parsing vector is " + parsedVector); if (parsedVector instanceof ArrayList) { - VectorT tmpVectorT = new VectorT((ArrayList)parsedVector); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpVectorT)); + for (Object entry : (ArrayList)parsedVector) { + if (entry instanceof Double) { + ((VectorT)functionManager.getHCALparameterSet().get(parameterName).getValue()).add(new DoubleT((Double)entry)); + } else if (entry instanceof Integer) { + ((VectorT)functionManager.getHCALparameterSet().get(parameterName).getValue()).add(new IntegerT((Integer)entry)); + } else if (entry instanceof Boolean) { + ((VectorT)functionManager.getHCALparameterSet().get(parameterName).getValue()).add(new BooleanT((Boolean)entry)); + } else if (entry instanceof String) { + ((VectorT)functionManager.getHCALparameterSet().get(parameterName).getValue()).add(new StringT((String)entry)); + } else { + String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: Parameter " + parameterName + " was not parsed into a vector of Double, Integer, String, or Boolean."; + throw new UserActionException(errMessage); + } + } + // The following code unfortunately doesn't work: HCALParameters::run() starts throwing a `failed to update` error, somewhere in HCALParameters::getClonedParameterSet(). We suspect it's due to the wildcard ?, but don't understand why. + //VectorT tmpVectorT = new VectorT((ArrayList)parsedVector); + //functionManager.getHCALparameterSet().put(new FunctionManagerParameter>(parameterName, tmpVectorT)); } else { String errMessage = "[HCAL " + functionManager.FMname + "] parseMasterSnippet: parsed vector failed instanceof ArrayList. Parsed result = " + parsedVector; throw new UserActionException(errMessage); @@ -591,9 +606,9 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } // Print test parameters - //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_STRINGT")) { - // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_STRINGT: " + //functionManager.getHCALparameterSet().get("TEST_VECTORT_STRINGT").getValue()); - //} + if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_STRINGT")) { + logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_STRINGT: " + functionManager.getHCALparameterSet().get("TEST_VECTORT_STRINGT").getValue()); + } //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_INTEGERT")) { // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_INTEGERT: " + //functionManager.getHCALparameterSet().get("TEST_VECTORT_INTEGERT").getValue()); //} From 441f8ba0e548a159458601fd95fe82e7510c363b Mon Sep 17 00:00:00 2001 From: DryRun Date: Fri, 16 Dec 2016 11:51:36 -0800 Subject: [PATCH 13/27] Remove test vector --- src/rcms/fm/app/level1/HCALParameters.java | 8 ++++---- src/rcms/fm/app/level1/HCALxmlHandler.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALParameters.java b/src/rcms/fm/app/level1/HCALParameters.java index 2069b54..0325983 100755 --- a/src/rcms/fm/app/level1/HCALParameters.java +++ b/src/rcms/fm/app/level1/HCALParameters.java @@ -118,11 +118,11 @@ public static HCALParameters getInstance() { public synchronized HCALParameters getClonedParameterSet() { HCALParameters cloned = new HCALParameters(); - for (Map.Entry pair : this.getMap().entrySet()) { - if (pair.getValue() instanceof FunctionManagerParameter) { - cloned.put(new FunctionManagerParameter((FunctionManagerParameter) pair.getValue())); - } + for (Map.Entry pair : this.getMap().entrySet()) { + if (pair.getValue() instanceof FunctionManagerParameter) { + cloned.put(new FunctionManagerParameter((FunctionManagerParameter) pair.getValue())); } + } return cloned; } diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index df7a376..b11062b 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -606,9 +606,9 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } // Print test parameters - if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_STRINGT")) { - logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_STRINGT: " + functionManager.getHCALparameterSet().get("TEST_VECTORT_STRINGT").getValue()); - } + //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_STRINGT")) { + // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_STRINGT: " + functionManager.getHCALparameterSet().get("TEST_VECTORT_STRINGT").getValue()); + //} //if (functionManager.getHCALparameterSet().contains("TEST_VECTORT_INTEGERT")) { // logger.info("[HCAL " + functionManager.FMname + "] Printing test parameter TEST_VECTORT_INTEGERT: " + //functionManager.getHCALparameterSet().get("TEST_VECTORT_INTEGERT").getValue()); //} From f9113ed61a7f03916fb58d445738f2a1187e5288 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 19 Dec 2016 12:21:52 -0800 Subject: [PATCH 14/27] Add script for porting snippets to new FMParameter-based format --- PortSnippet.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 PortSnippet.py diff --git a/PortSnippet.py b/PortSnippet.py new file mode 100644 index 0000000..f90a1e3 --- /dev/null +++ b/PortSnippet.py @@ -0,0 +1,87 @@ +import os +import sys +import re + +def PortSnippet(input_path, output_path): + # Define regexes for more complicated remappings + re_FMSettings = re.compile("true|false)\"") + re_OfficialRunNumbers = re.compile("OfficialRunNumbers=\"(?Ptrue|false)\"") + re_NumberOfEvents = re.compile("NumberOfEvents=\"(?P\d+)\"") + + re_include = re.compile(".+?)\"") + re_include_version = re.compile("version=\"(?P.+?)\"") + + # Define a simple map for string.replaces + tag_mapping = { + "CfgScript":"HCAL_CFGSCRIPT", + "PIControl":"HCAL_PICONTROL", + "TCDSControl":"HCAL_TCDSCONTROL", + "LPMControl":"HCAL_LPMCONTROL", + "FedEnableMask":"FED_ENABLE_MASK", + "AlarmerURL":"HCAL_ALARMER_URL", + } + + input_snippet = open(input_path, 'r') + output_snippet_text = "" + for line in input_snippet: + # FMSettings + if re_FMSettings.search(line): + match_RunInfoPublish = re_RunInfoPublish.search(line) + if match_RunInfoPublish: + output_snippet_text += "{}\n".format(match_RunInfoPublish.group("RunInfoPublish")) + + match_OfficialRunNumbers = re_OfficialRunNumbers.search(line) + if match_OfficialRunNumbers: + output_snippet_text += "{}\n".format(match_OfficialRunNumbers.group("OfficialRunNumbers")) + + match_NumberOfEvents = re_NumberOfEvents.search(line) + if match_NumberOfEvents: + output_snippet_text += "{}\n".format(match_NumberOfEvents.group("OfficialRunNumbers")) + + # xi:includes + elif re_include.search(line): + match_include_file = re_include_file.search(line) + if not match_include_file: + raise ParsingError("Didn't find file in include line {}".format(line)) + include_file = match_include_file.group("file").replace("^/", "") + match_include_version = re_include_version.search(line) + if not match_include_version: + raise ParsingError("Didn't find version in include line {}".format(line)) + include_version = match_include_version.group("version") + output_snippet_text += "\n".format(include_file, include_version) + + # Tag replacements/nothing to change + else: + for input_tag, output_tag in tag_mapping.iteritems(): + line = line.replace(input_tag, output_tag) + output_snippet_text += line + input_snippet.close() + + output_snippet = open(output_path, 'w') + output_snippet.write(output_snippet_text) + output_snippet.close() + +class ParsingError(Exception): + def __init__(self, arg): + self.args = arg + + +if __name__ == "__main__": + import argparse + parser = argparse.ArgumentParser(description="Convert snippets to FM parameter-centric format") + parser.add_argument("input_path", type=str, help="Input snippet path") + parser.add_argument("output_path", type=str, help="Output snippet path") + args = parser.parse_args() + + try: + PortSnippet(args.input_path, args.output_path) + except ParsingError,e: + import time + print "Failed to parse snippet:" + print "".join(e.args) + sys.exit(1) + + #os.system("diff {} {}".format(args.input_path, args.output_path)) + os.system("cat {}".format(args.output_path)) \ No newline at end of file From 65d77b8d0cf0fb183dd8d7caa476b0174117c872 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 19 Dec 2016 12:25:32 -0800 Subject: [PATCH 15/27] Add example of new snippet format --- example_snippet.xml | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 example_snippet.xml diff --git a/example_snippet.xml b/example_snippet.xml new file mode 100644 index 0000000..13db24f --- /dev/null +++ b/example_snippet.xml @@ -0,0 +1,71 @@ + + +true +true + + include(/Common/Global.cfg:pro) + include(/Common/Connectivity.cfg:pro) + + include(/DCC/Settings-GlobalRun.cfg:pro) + include(/DCC/Firmware.cfg:pro) + + include(/HTR/Settings-GlobalRun.cfg:pro) + include(/HTR/Firmware.cfg:pro) + + include(/TTCfanout/HcalSlave.cfg:pro) + include(/TTCfanout/HcalMaster.cfg:pro) + include(/TTCfanout/RCTMaster.cfg:pro) + + include(/HLX/Settings.cfg:pro) + include(/SLB/Settings.cfg:pro) + + include(/Trigger/Pedestal.cfg:pro) + include(/Trigger/Laser-OrbitGap.cfg:pro) + + include(/Laser/uMNioQIE.cfg:pro) + include(/Laser/uMNioOrbitGap.cfg:pro) + include(/Laser/uMNioQIE-GlobalRun.cfg:pro) + + include(/RBX/Settings-GlobalRun.cfg:pro) + include(/RBX/RBXlists.cfg:pro) + include(/RBX/Tags_oracle.cfg:pro) + include(/RBX/RBXstatus.cfg:pro) + + include(/TechTrigProc/Firmware.cfg:pro) + include(/TechTrigProc/Settings-HO.cfg:pro) + include(/TechTrigProc/Settings-HF.cfg:pro) + include(/TechTrigProc/Settings-HBHE.cfg:pro) + + include(/Other/TSManager.cfg:pro) + include(/Other/HcalWriter.cfg:pro) + + include(/HTR/LUTs.cfg:pro) + include(/HTR/ZeroSuppression.cfg:pro) + #include(/HTR/SpecialZeroSuppression.cfg:pro) + + include(/Lumi/Settings.cfg:pro) + include(/Lumi/Settings-GlobalRun.cfg:pro) + + include(/TechTrigProc/Settings-HO-coinc-timeDiff.cfg:pro) + + include(/uTCA/Global.cfg:pro) + include(/uTCA/uHTR.cfg:pro) + include(/uTCA/uHTR-GlobalRun.cfg:pro) + include(/uTCA/DTC.cfg:pro) + include(/uTCA/DTC-CDAQ.cfg:pro) + + + + + + + + + + +700&3%701&3%702&3%703&3%704&3%705&3%706&3%707&3%708&3%709&3%710&3%711&3%712&3%713&3%714&3%715&3%716&3%1100&3%1102&3%1104&3%1106&3%1108&3%1110&3%1112&3%1114&3%1116&3%717&3%720&3%721&3%1118&3%1120&3%1122&3%724&3%725&3%726&3%727&3%728&3%729&3%730&3%731&3% + + +http://hcalmon.cms:9945 + + From 6cd08df0c879800640860b50445f0dbc2eff5608 Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 25 Jan 2017 15:14:11 +0100 Subject: [PATCH 16/27] Add support for concatenating rather than overwriting preexisting parameters --- src/rcms/fm/app/level1/HCALxmlHandler.java | 33 ++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index b11062b..6414f6c 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -440,6 +440,7 @@ public String getHCALMasterSnippetTagAttribute(String selectedRun, String CfgCVS } public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolean NeventIsSetFromGUI) throws UserActionException { + logger.info("[HCAL " + functionManager.FMname + "]: Welcome to parseMasterSnippet(" + selectedRun + ", " + CfgCVSBasePath + ", " + NeventIsSetFromGUI + ")"); try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setXIncludeAware(true); // This is needed for xi:include to work @@ -450,6 +451,7 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea InputSource masterInputSource = new InputSource(new FileInputStream(masterUriActual)); Document masterSnippet = docBuilder.parse(masterInputSource.getByteStream(), masterUriSystem); masterSnippet.getDocumentElement().normalize(); + Element masterSnippetElement = masterSnippet.getDocumentElement(); NodeList elements = masterSnippetElement.getChildNodes(); @@ -467,21 +469,24 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } } } + if (commonMasterSnippetFile != "") { logger.info("[HCAL " + functionManager.FMname + "]: Parsing the common master snippet from " + commonMasterSnippetFile + "."); this.parseMasterSnippet(commonMasterSnippetFile,CfgCVSBasePath,NeventIsSetFromGUI); logger.info("[HCAL " + functionManager.FMname + "]: Done parsing common master snippet."); } + // Parse parameters from main file for (int iNode = 0; iNode < elements.getLength(); iNode++) { if (elements.item(iNode).getNodeType() == Node.ELEMENT_NODE) { Element parameterElement = (Element)elements.item(iNode); - + String parameterName = parameterElement.getNodeName(); if (parameterName == "CommonMasterSnippet") { continue; } + logger.info("HCAL " + functionManager.FMname + "]: Found parameter " + parameterName); // Require that the parameter is declared in HCALParameters.java if (!functionManager.getHCALparameterSet().contains(parameterName)) { @@ -496,6 +501,17 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); + // Overwrite/concatenate flag + Boolean concatenate = false; + if (parameterElement.hasAttribute("conflict")) { + if (!parameterType.equals("StringT")) { + logger.warn("[HCAL " + functionManager.FMname + "]: attribute 'conflict' (=overwrite or concatenate) is only implemented for StringT parameters. This parameter will be overwritten."); + concatenate = false; + } else { + concatenate = (parameterElement.getAttributes().getNamedItem("conflict").getNodeValue().equals("concatenate")); + } + } + switch (parameterType) { case "BooleanT": { @@ -539,7 +555,20 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } case "StringT": { - functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(parameterValue))); + if (concatenate) { + logger.info("[HCAL " + functionManager.FMname + "]: Hold on to your butts, I am about to CONCATENATE a PARAMETER!"); + String oldString = ((StringT)functionManager.getHCALparameterSet().get(parameterName).getValue()).getString(); + if (oldString.equals("not set")) { + oldString = ""; + } + String newString = oldString + parameterValue; + logger.info("[HCAL " + functionManager.FMname + "]: Old = " + oldString); + logger.info("[HCAL " + functionManager.FMname + "]: New = " + newString); + + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(newString))); + } else { + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(parameterValue))); + } break; } case "UnsignedIntegerT": From 7da0ebbe635468800d9afd7f1cc66840e93e6fbd Mon Sep 17 00:00:00 2001 From: DryRun Date: Thu, 26 Jan 2017 18:24:35 +0100 Subject: [PATCH 17/27] Remove conflict flag, add special behavior for HCAL_CFGSCRIPT --- src/rcms/fm/app/level1/HCALxmlHandler.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index 6414f6c..bc7242a 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -501,17 +501,6 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); - // Overwrite/concatenate flag - Boolean concatenate = false; - if (parameterElement.hasAttribute("conflict")) { - if (!parameterType.equals("StringT")) { - logger.warn("[HCAL " + functionManager.FMname + "]: attribute 'conflict' (=overwrite or concatenate) is only implemented for StringT parameters. This parameter will be overwritten."); - concatenate = false; - } else { - concatenate = (parameterElement.getAttributes().getNamedItem("conflict").getNodeValue().equals("concatenate")); - } - } - switch (parameterType) { case "BooleanT": { @@ -555,21 +544,16 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } case "StringT": { - if (concatenate) { - logger.info("[HCAL " + functionManager.FMname + "]: Hold on to your butts, I am about to CONCATENATE a PARAMETER!"); + if (parameterName.equals("HCAL_CFGSCRIPT")) { String oldString = ((StringT)functionManager.getHCALparameterSet().get(parameterName).getValue()).getString(); if (oldString.equals("not set")) { oldString = ""; } String newString = oldString + parameterValue; - logger.info("[HCAL " + functionManager.FMname + "]: Old = " + oldString); - logger.info("[HCAL " + functionManager.FMname + "]: New = " + newString); - functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(newString))); } else { functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(parameterValue))); } - break; } case "UnsignedIntegerT": { From edef659ce3a9ebef1c9b1a952601ceb7ca49e750 Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 27 Jan 2017 12:07:51 +0100 Subject: [PATCH 18/27] goToError when mastersnippet is a malformed XML --- src/rcms/fm/app/level1/HCALxmlHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index bc7242a..8c4c442 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -554,6 +554,7 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea } else { functionManager.getHCALparameterSet().put(new FunctionManagerParameter(parameterName, new StringT(parameterValue))); } + break; } case "UnsignedIntegerT": { @@ -633,7 +634,8 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea //} } catch ( DOMException | ParserConfigurationException | SAXException | IOException e) { - logger.error("[HCAL " + functionManager.FMname + "]: Got an error when parsing masterSnippet: " + e.getMessage()); + String errMessage="[HCAL " + functionManager.FMname + "]: Got an error when parsing masterSnippet" ; + functionManager.goToError(errMessage,e); } } From 5c48b1489b42bd5fe857d091c83a5d4d8a7b692e Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 15:45:45 +0200 Subject: [PATCH 19/27] Add new MS entries, support python 2.6 format usage --- PortSnippet.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/PortSnippet.py b/PortSnippet.py index f90a1e3..8b05ea4 100644 --- a/PortSnippet.py +++ b/PortSnippet.py @@ -16,8 +16,12 @@ def PortSnippet(input_path, output_path): # Define a simple map for string.replaces tag_mapping = { "CfgScript":"HCAL_CFGSCRIPT", - "PIControl":"HCAL_PICONTROL", - "TCDSControl":"HCAL_TCDSCONTROL", + "PIControl":"HCAL_PICONTROL_MULTI", + "PIControlSingle":"HCAL_PICONTROL_SINGLE", + "PIControlMulti":"HCAL_PICONTROL_MULTI", + "ICIControlMulti":"HCAL_ICICONTROL_MULTI", + "ICIControlSignle":"HCAL_ICICONTROL_Single", + "TCDSControl":"HCAL_ICICONTROL_MULTI", "LPMControl":"HCAL_LPMCONTROL", "FedEnableMask":"FED_ENABLE_MASK", "AlarmerURL":"HCAL_ALARMER_URL", @@ -30,27 +34,27 @@ def PortSnippet(input_path, output_path): if re_FMSettings.search(line): match_RunInfoPublish = re_RunInfoPublish.search(line) if match_RunInfoPublish: - output_snippet_text += "{}\n".format(match_RunInfoPublish.group("RunInfoPublish")) + output_snippet_text += "{0}\n".format(match_RunInfoPublish.group("RunInfoPublish")) match_OfficialRunNumbers = re_OfficialRunNumbers.search(line) if match_OfficialRunNumbers: - output_snippet_text += "{}\n".format(match_OfficialRunNumbers.group("OfficialRunNumbers")) + output_snippet_text += "{0}\n".format(match_OfficialRunNumbers.group("OfficialRunNumbers")) match_NumberOfEvents = re_NumberOfEvents.search(line) if match_NumberOfEvents: - output_snippet_text += "{}\n".format(match_NumberOfEvents.group("OfficialRunNumbers")) + output_snippet_text += "{0}\n".format(match_NumberOfEvents.group("NumberOfEvents")) # xi:includes elif re_include.search(line): match_include_file = re_include_file.search(line) if not match_include_file: - raise ParsingError("Didn't find file in include line {}".format(line)) + raise ParsingError("Didn't find file in include line {0}".format(line)) include_file = match_include_file.group("file").replace("^/", "") match_include_version = re_include_version.search(line) if not match_include_version: - raise ParsingError("Didn't find version in include line {}".format(line)) + raise ParsingError("Didn't find version in include line {0}".format(line)) include_version = match_include_version.group("version") - output_snippet_text += "\n".format(include_file, include_version) + output_snippet_text += "\n".format(include_file, include_version) # Tag replacements/nothing to change else: @@ -84,4 +88,4 @@ def __init__(self, arg): sys.exit(1) #os.system("diff {} {}".format(args.input_path, args.output_path)) - os.system("cat {}".format(args.output_path)) \ No newline at end of file + os.system("cat {0}".format(args.output_path)) From eed08a5d4244b97f91d08c7f8dfb4d0a8688cf3d Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 16:02:25 +0200 Subject: [PATCH 20/27] Clean up alarmerURL --- src/rcms/fm/app/level1/HCALEventHandler.java | 3 ++- src/rcms/fm/app/level1/HCALFunctionManager.java | 1 - src/rcms/fm/app/level1/HCALlevelOneEventHandler.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALEventHandler.java b/src/rcms/fm/app/level1/HCALEventHandler.java index 457df7c..61ca3e1 100755 --- a/src/rcms/fm/app/level1/HCALEventHandler.java +++ b/src/rcms/fm/app/level1/HCALEventHandler.java @@ -2379,7 +2379,8 @@ public void run() { List watchedPartitions = new ArrayList(); //All watchedPartitions (LV2 names) List AlarmerPamNames = new ArrayList(); //All alarmer pam Names String FMstate = functionManager.getState().getStateString(); - XDAQParameter NameQuery = new XDAQParameter(functionManager.alarmerURL,"hcalAlarmer",0); + String alarmerURL_str = ((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue()).getString(); + XDAQParameter NameQuery = new XDAQParameter(alarmerURL_str,"hcalAlarmer",0); HashMap partitionStatusMap = new HashMap(); // e.g. , HashMap partitionMessageMap = new HashMap(); // e.g. , try{ diff --git a/src/rcms/fm/app/level1/HCALFunctionManager.java b/src/rcms/fm/app/level1/HCALFunctionManager.java index c373478..eaab1a4 100755 --- a/src/rcms/fm/app/level1/HCALFunctionManager.java +++ b/src/rcms/fm/app/level1/HCALFunctionManager.java @@ -220,7 +220,6 @@ public class HCALFunctionManager extends UserFunctionManager { public String rcmsStateListenerURL = ""; - public String alarmerPartition = ""; public HCALFunctionManager() { // any State Machine Implementation must provide the framework with some information about itself. diff --git a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java index 1fb71c2..48a0cf5 100755 --- a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java +++ b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java @@ -803,6 +803,7 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { String LTCControlSequence = ((StringT)functionManager.getHCALparameterSet().get("HCAL_LTCCONTROL" ).getValue()).getString(); FedEnableMask = ((StringT)functionManager.getHCALparameterSet().get("FED_ENABLE_MASK" ).getValue()).getString(); String DQMtask = ((StringT)functionManager.getHCALparameterSet().get("DQM_TASK").getValue()).getString(); + String alarmerURL = ((StringT)functionManager.getHCALparameterSet().get("HCAL_ALARMER_URL").getValue()).getString(); // Get the value of runinfopublish from the results of parseMasterSnippet RunInfoPublish = ((BooleanT)functionManager.getHCALparameterSet().get("HCAL_RUNINFOPUBLISH").getValue()).getBoolean(); OfficialRunNumbers = ((BooleanT)functionManager.getHCALparameterSet().get("OFFICIAL_RUN_NUMBERS").getValue()).getBoolean(); @@ -828,8 +829,7 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { logger.debug("[HCAL LVL1 " + functionManager.FMname + "] The final PIControlSequence is like this: \n" +PIControlSequence ); logger.debug("[HCAL LVL1 " + functionManager.FMname + "] The final TTCciControlSequence is like this: \n" +TTCciControlSequence ); logger.debug("[HCAL LVL1 " + functionManager.FMname + "] The final LTCControlSequence is like this: \n" +LTCControlSequence ); - logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerURL is " +functionManager.alarmerURL ); - logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerPartition is " +functionManager.alarmerPartition ); + logger.info("[HCAL LVL1 " + functionManager.FMname + "] The final AlarmerURL is " +alarmerURL ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The FED_ENABLE_MASK used by the level-1 is: " +FedEnableMask ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The RunInfoPublish value is : " +RunInfoPublish ); logger.info("[HCAL LVL1 " + functionManager.FMname + "] The OfficialRunNumbers value is : " +OfficialRunNumbers ); From 897b54f65d5ac7e43200d054f2c3647b37d2e689 Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 18:08:37 +0200 Subject: [PATCH 21/27] Fix typo --- PortSnippet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PortSnippet.py b/PortSnippet.py index 8b05ea4..ef4ddfc 100644 --- a/PortSnippet.py +++ b/PortSnippet.py @@ -20,7 +20,7 @@ def PortSnippet(input_path, output_path): "PIControlSingle":"HCAL_PICONTROL_SINGLE", "PIControlMulti":"HCAL_PICONTROL_MULTI", "ICIControlMulti":"HCAL_ICICONTROL_MULTI", - "ICIControlSignle":"HCAL_ICICONTROL_Single", + "ICIControlSingle":"HCAL_ICICONTROL_Single", "TCDSControl":"HCAL_ICICONTROL_MULTI", "LPMControl":"HCAL_LPMCONTROL", "FedEnableMask":"FED_ENABLE_MASK", From be93b6304351ba6637d4e3007473b9aa6d259f2e Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 18:25:57 +0200 Subject: [PATCH 22/27] Do not support old Tags --- PortSnippet.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PortSnippet.py b/PortSnippet.py index ef4ddfc..0a7a13b 100644 --- a/PortSnippet.py +++ b/PortSnippet.py @@ -16,7 +16,6 @@ def PortSnippet(input_path, output_path): # Define a simple map for string.replaces tag_mapping = { "CfgScript":"HCAL_CFGSCRIPT", - "PIControl":"HCAL_PICONTROL_MULTI", "PIControlSingle":"HCAL_PICONTROL_SINGLE", "PIControlMulti":"HCAL_PICONTROL_MULTI", "ICIControlMulti":"HCAL_ICICONTROL_MULTI", From 79e0ca80a9126d8d9a4f4777eff6f192e6b011b9 Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 18:52:18 +0200 Subject: [PATCH 23/27] Add schema attribute --- PortSnippet.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PortSnippet.py b/PortSnippet.py index 0a7a13b..596ff87 100644 --- a/PortSnippet.py +++ b/PortSnippet.py @@ -9,6 +9,7 @@ def PortSnippet(input_path, output_path): re_OfficialRunNumbers = re.compile("OfficialRunNumbers=\"(?Ptrue|false)\"") re_NumberOfEvents = re.compile("NumberOfEvents=\"(?P\d+)\"") + re_mastersnippet = re.compile(".+?)\"") re_include_version = re.compile("version=\"(?P.+?)\"") @@ -19,7 +20,7 @@ def PortSnippet(input_path, output_path): "PIControlSingle":"HCAL_PICONTROL_SINGLE", "PIControlMulti":"HCAL_PICONTROL_MULTI", "ICIControlMulti":"HCAL_ICICONTROL_MULTI", - "ICIControlSingle":"HCAL_ICICONTROL_Single", + "ICIControlSingle":"HCAL_ICICONTROL_SINGLE", "TCDSControl":"HCAL_ICICONTROL_MULTI", "LPMControl":"HCAL_LPMCONTROL", "FedEnableMask":"FED_ENABLE_MASK", @@ -54,6 +55,8 @@ def PortSnippet(input_path, output_path): raise ParsingError("Didn't find version in include line {0}".format(line)) include_version = match_include_version.group("version") output_snippet_text += "\n".format(include_file, include_version) + elif re_mastersnippet.search(line): + output_snippet_text += "\n" # Tag replacements/nothing to change else: From f694125651afd4ef53687bdf94ab209d224633e9 Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 18:57:44 +0200 Subject: [PATCH 24/27] escape mastersnippet tag, uncomment SetHCALParameterFromTagName for now --- src/rcms/fm/app/level1/HCALxmlHandler.java | 122 ++++++++++----------- 1 file changed, 58 insertions(+), 64 deletions(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index 43cde57..c1e527b 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -533,7 +533,7 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath, boolea Element parameterElement = (Element)elements.item(iNode); String parameterName = parameterElement.getNodeName(); - if (parameterName == "CommonMasterSnippet") { + if (parameterName == "CommonMasterSnippet" || parameterName == "mastersnippet" ) { continue; } logger.info("HCAL " + functionManager.FMname + "]: Found parameter " + parameterName); @@ -837,69 +837,63 @@ public void SetHCALFMParameter(Element fmParameterElement) { } - //public void SetHCALParameterFromTagName(String TagName, NodeList NodeListOfTagName ,String CfgCVSBasePath, boolean NeventIsSetFromGUI){ - // try{ - // if(TagName.equals("ICIControlSingle")|| TagName.equals("ICIControlMulti") || TagName.equals("LPMControl")|| TagName.equals("PIControlSingle")||TagName.equals("PIControlMulti") || TagName.equals("TTCciControl") || TagName.equals("LTCControl") ){ - // String HCALParameter = getHCALParameterFromTagName(TagName); - // String ControlSequence = getIncludeFiles( NodeListOfTagName, CfgCVSBasePath ,TagName ); - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter(HCALParameter ,new StringT(ControlSequence))); - // } - // if(TagName.equals("AlarmerURL")){ - // functionManager.alarmerURL = getTagTextContent(NodeListOfTagName, TagName ); - // } - // if(TagName.equals("AlarmerStatus")) { - // functionManager.alarmerPartition = getTagAttribute(NodeListOfTagName,TagName,"partition" ); - // } - // if(TagName.equals("FMSettings")){ - // //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - // String StringNumberOfEvents = getTagAttribute(NodeListOfTagName, TagName,"NumberOfEvents"); - // if(NeventIsSetFromGUI){ - // logger.info("[HCAL LVL1 "+functionManager.FMname+" Number of Events already set to "+ functionManager.getHCALparameterSet().get("NUMBER_OF_EVENTS").getValue()+" from GUI. Not over-writting"); - // } - // else{ - // if( !StringNumberOfEvents.equals("")){ - // Integer NumberOfEvents = Integer.valueOf(StringNumberOfEvents); - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter("NUMBER_OF_EVENTS",new IntegerT(NumberOfEvents))); - // } - // } - // //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - // String StringRunInfoPublish = getTagAttribute(NodeListOfTagName, TagName,"RunInfoPublish"); - // if( !StringRunInfoPublish.equals("")){ - // Boolean RunInfoPublish = Boolean.valueOf(StringRunInfoPublish); - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_RUNINFOPUBLISH",new BooleanT(RunInfoPublish))); - // } - - // //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter - // String StringOfficialRunNumbers = getTagAttribute(NodeListOfTagName, TagName,"OfficialRunNumbers"); - // if( !StringOfficialRunNumbers.equals("")){ - // Boolean OfficialRunNumbers = Boolean.valueOf(StringOfficialRunNumbers); - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter("OFFICIAL_RUN_NUMBERS",new BooleanT(OfficialRunNumbers))); - // } - // } - // if(TagName.equals("CfgScript")){ - // String tmpCfgScript =""; - // if( !hasDefaultValue("HCAL_CFGSCRIPT","not set") ){ - // //If the parameter is filled (by CommonMasterSnippet), add that first instead of overwriting - // tmpCfgScript = ((StringT)functionManager.getHCALparameterSet().get("HCAL_CFGSCRIPT").getValue()).getString(); - // tmpCfgScript += getTagTextContent( NodeListOfTagName, TagName); - // } - // else{ - // //If the parameter has defaultValue, put what is in the current mastersnippet in the parameter - // tmpCfgScript = getTagTextContent( NodeListOfTagName, TagName); - // } - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_CFGSCRIPT",new StringT(tmpCfgScript))); - // } - // if(TagName.equals("FedEnableMask")){ - // if (functionManager.RunType.equals("local")){ - // String tmpFedEnableMask = getTagTextContent( NodeListOfTagName, TagName); - // functionManager.getHCALparameterSet().put(new FunctionManagerParameter("FED_ENABLE_MASK",new StringT(tmpFedEnableMask))); - // } - // } - // } catch (UserActionException e) { - // // Warn when found more than one tag name in mastersnippet - // functionManager.goToError(e.getMessage()); - // } - //} + public void SetHCALParameterFromTagName(String TagName, NodeList NodeListOfTagName ,String CfgCVSBasePath, boolean NeventIsSetFromGUI){ + try{ + if(TagName.equals("ICIControlSingle")|| TagName.equals("ICIControlMulti") || TagName.equals("LPMControl")|| TagName.equals("PIControlSingle")||TagName.equals("PIControlMulti") || TagName.equals("TTCciControl") || TagName.equals("LTCControl") ){ + String HCALParameter = getHCALParameterFromTagName(TagName); + String ControlSequence = getIncludeFiles( NodeListOfTagName, CfgCVSBasePath ,TagName ); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter(HCALParameter ,new StringT(ControlSequence))); + } + if(TagName.equals("FMSettings")){ + //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter + String StringNumberOfEvents = getTagAttribute(NodeListOfTagName, TagName,"NumberOfEvents"); + if(NeventIsSetFromGUI){ + logger.info("[HCAL LVL1 "+functionManager.FMname+" Number of Events already set to "+ functionManager.getHCALparameterSet().get("NUMBER_OF_EVENTS").getValue()+" from GUI. Not over-writting"); + } + else{ + if( !StringNumberOfEvents.equals("")){ + Integer NumberOfEvents = Integer.valueOf(StringNumberOfEvents); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter("NUMBER_OF_EVENTS",new IntegerT(NumberOfEvents))); + } + } + //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter + String StringRunInfoPublish = getTagAttribute(NodeListOfTagName, TagName,"RunInfoPublish"); + if( !StringRunInfoPublish.equals("")){ + Boolean RunInfoPublish = Boolean.valueOf(StringRunInfoPublish); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_RUNINFOPUBLISH",new BooleanT(RunInfoPublish))); + } + + //Set the parameters if the attribute exists in the element, otherwise will use default in HCALParameter + String StringOfficialRunNumbers = getTagAttribute(NodeListOfTagName, TagName,"OfficialRunNumbers"); + if( !StringOfficialRunNumbers.equals("")){ + Boolean OfficialRunNumbers = Boolean.valueOf(StringOfficialRunNumbers); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter("OFFICIAL_RUN_NUMBERS",new BooleanT(OfficialRunNumbers))); + } + } + if(TagName.equals("CfgScript")){ + String tmpCfgScript =""; + if( !hasDefaultValue("HCAL_CFGSCRIPT","not set") ){ + //If the parameter is filled (by CommonMasterSnippet), add that first instead of overwriting + tmpCfgScript = ((StringT)functionManager.getHCALparameterSet().get("HCAL_CFGSCRIPT").getValue()).getString(); + tmpCfgScript += getTagTextContent( NodeListOfTagName, TagName); + } + else{ + //If the parameter has defaultValue, put what is in the current mastersnippet in the parameter + tmpCfgScript = getTagTextContent( NodeListOfTagName, TagName); + } + functionManager.getHCALparameterSet().put(new FunctionManagerParameter("HCAL_CFGSCRIPT",new StringT(tmpCfgScript))); + } + if(TagName.equals("FedEnableMask")){ + if (functionManager.RunType.equals("local")){ + String tmpFedEnableMask = getTagTextContent( NodeListOfTagName, TagName); + functionManager.getHCALparameterSet().put(new FunctionManagerParameter("FED_ENABLE_MASK",new StringT(tmpFedEnableMask))); + } + } + } catch (UserActionException e) { + // Warn when found more than one tag name in mastersnippet + functionManager.goToError(e.getMessage()); + } + } public boolean hasDefaultValue(String pam, String def_value){ String present_value = ((StringT)functionManager.getHCALparameterSet().get(pam).getValue()).getString(); //logger.info("[Martin log HCAL "+functionManager.FMname+"] the present value of "+pam+" is "+present_value); From 9da0c6b9bbebcc6ebfca1ac1b73af1b4d2e02ae3 Mon Sep 17 00:00:00 2001 From: kakwok Date: Fri, 8 Sep 2017 19:29:35 +0200 Subject: [PATCH 25/27] Fail gracefully if we fails to parse mastersnippet --- src/rcms/fm/app/level1/HCALlevelOneEventHandler.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java index 48a0cf5..85ca79a 100755 --- a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java +++ b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java @@ -773,7 +773,14 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { //Parse and set HCAL parameters from MasterSnippet logger.info("[HCAL LVL1 "+ functionManager.FMname +"] Going to parse MasterSnippet : "+ selectedRun); - xmlHandler.parseMasterSnippet(selectedRun,CfgCVSBasePath,NeventIsSetFromGUI); + try{ + xmlHandler.parseMasterSnippet(selectedRun,CfgCVSBasePath,NeventIsSetFromGUI); + } + catch(UserActionException e){ + String errMessage ="[HCAL LV1 "+functionManager.FMname+"] Failed to configure LV1 FM"; + functionManager.goToError(errMessage,e); + return; + } //Pring results from mastersnippet: logger.info("[HCAL LVL1 " + functionManager.FMname + "] Printing results from parsing Mastersnippet(s): "); From 93d15e00889a17a0beb3b3b3797431c71df45999 Mon Sep 17 00:00:00 2001 From: kakwok Date: Mon, 26 Mar 2018 12:21:08 +0200 Subject: [PATCH 26/27] Truncate long parameters --- src/rcms/fm/app/level1/HCALxmlHandler.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/rcms/fm/app/level1/HCALxmlHandler.java b/src/rcms/fm/app/level1/HCALxmlHandler.java index 9c465cf..062b2bf 100644 --- a/src/rcms/fm/app/level1/HCALxmlHandler.java +++ b/src/rcms/fm/app/level1/HCALxmlHandler.java @@ -510,6 +510,8 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath,String Element masterSnippetElement = masterSnippet.getDocumentElement(); NodeList elements = masterSnippetElement.getChildNodes(); + NodeList listOfTags = masterSnippetElement.getChildNodes(); + // Look for common master snippet and, if present, parse first String commonMasterSnippetFile = ""; @@ -618,7 +620,13 @@ public void parseMasterSnippet(String selectedRun, String CfgCVSBasePath,String String parameterType = parameterTypeLong[parameterTypeLong.length - 1]; String parameterValue = parameterElement.getTextContent(); - logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); + // Truncate parameter value + if (parameterValue.length()>=1000){ + parameterValue = parameterValue.substring(0, Math.min(parameterValue.length(), 1000)); + logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value(truncated)=" + parameterValue); + }else{ + logger.info("[HCAL " + functionManager.FMname + "]: Parsing parameter " + parameterName + ", type=" + parameterType + ", value=" + parameterValue); + } switch (parameterType) { case "BooleanT": From 46660d2011e66e1439904bfc393f276b71c75e1a Mon Sep 17 00:00:00 2001 From: kakwok Date: Mon, 26 Mar 2018 12:32:34 +0200 Subject: [PATCH 27/27] remove number of events --- PortSnippet.py | 140 ++++++++++++++++++++++++------------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/PortSnippet.py b/PortSnippet.py index 596ff87..bb62f06 100644 --- a/PortSnippet.py +++ b/PortSnippet.py @@ -3,71 +3,71 @@ import re def PortSnippet(input_path, output_path): - # Define regexes for more complicated remappings - re_FMSettings = re.compile("true|false)\"") - re_OfficialRunNumbers = re.compile("OfficialRunNumbers=\"(?Ptrue|false)\"") - re_NumberOfEvents = re.compile("NumberOfEvents=\"(?P\d+)\"") + # Define regexes for more complicated remappings + re_FMSettings = re.compile("true|false)\"") + re_OfficialRunNumbers = re.compile("OfficialRunNumbers=\"(?Ptrue|false)\"") + re_NumberOfEvents = re.compile("NumberOfEvents=\"(?P\d+)\"") - re_mastersnippet = re.compile(".+?)\"") - re_include_version = re.compile("version=\"(?P.+?)\"") + re_mastersnippet = re.compile(".+?)\"") + re_include_version = re.compile("version=\"(?P.+?)\"") - # Define a simple map for string.replaces - tag_mapping = { - "CfgScript":"HCAL_CFGSCRIPT", - "PIControlSingle":"HCAL_PICONTROL_SINGLE", - "PIControlMulti":"HCAL_PICONTROL_MULTI", - "ICIControlMulti":"HCAL_ICICONTROL_MULTI", - "ICIControlSingle":"HCAL_ICICONTROL_SINGLE", - "TCDSControl":"HCAL_ICICONTROL_MULTI", - "LPMControl":"HCAL_LPMCONTROL", - "FedEnableMask":"FED_ENABLE_MASK", - "AlarmerURL":"HCAL_ALARMER_URL", - } + # Define a simple map for string.replaces + tag_mapping = { + "CfgScript":"HCAL_CFGSCRIPT", + "PIControlSingle":"HCAL_PICONTROL_SINGLE", + "PIControlMulti":"HCAL_PICONTROL_MULTI", + "ICIControlMulti":"HCAL_ICICONTROL_MULTI", + "ICIControlSingle":"HCAL_ICICONTROL_SINGLE", + "TCDSControl":"HCAL_ICICONTROL_MULTI", + "LPMControl":"HCAL_LPMCONTROL", + "FedEnableMask":"FED_ENABLE_MASK", + "AlarmerURL":"HCAL_ALARMER_URL", + } - input_snippet = open(input_path, 'r') - output_snippet_text = "" - for line in input_snippet: - # FMSettings - if re_FMSettings.search(line): - match_RunInfoPublish = re_RunInfoPublish.search(line) - if match_RunInfoPublish: - output_snippet_text += "{0}\n".format(match_RunInfoPublish.group("RunInfoPublish")) + input_snippet = open(input_path, 'r') + output_snippet_text = "" + for line in input_snippet: + # FMSettings + if re_FMSettings.search(line): + match_RunInfoPublish = re_RunInfoPublish.search(line) + if match_RunInfoPublish: + output_snippet_text += "{0}\n".format(match_RunInfoPublish.group("RunInfoPublish")) - match_OfficialRunNumbers = re_OfficialRunNumbers.search(line) - if match_OfficialRunNumbers: - output_snippet_text += "{0}\n".format(match_OfficialRunNumbers.group("OfficialRunNumbers")) + match_OfficialRunNumbers = re_OfficialRunNumbers.search(line) + if match_OfficialRunNumbers: + output_snippet_text += "{0}\n".format(match_OfficialRunNumbers.group("OfficialRunNumbers")) - match_NumberOfEvents = re_NumberOfEvents.search(line) - if match_NumberOfEvents: - output_snippet_text += "{0}\n".format(match_NumberOfEvents.group("NumberOfEvents")) + match_NumberOfEvents = re_NumberOfEvents.search(line) + #if match_NumberOfEvents: + # output_snippet_text += "{0}\n".format(match_NumberOfEvents.group("NumberOfEvents")) - # xi:includes - elif re_include.search(line): - match_include_file = re_include_file.search(line) - if not match_include_file: - raise ParsingError("Didn't find file in include line {0}".format(line)) - include_file = match_include_file.group("file").replace("^/", "") - match_include_version = re_include_version.search(line) - if not match_include_version: - raise ParsingError("Didn't find version in include line {0}".format(line)) - include_version = match_include_version.group("version") - output_snippet_text += "\n".format(include_file, include_version) + # xi:includes + elif re_include.search(line): + match_include_file = re_include_file.search(line) + if not match_include_file: + raise ParsingError("Didn't find file in include line {0}".format(line)) + include_file = match_include_file.group("file").replace("^/", "") + match_include_version = re_include_version.search(line) + if not match_include_version: + raise ParsingError("Didn't find version in include line {0}".format(line)) + include_version = match_include_version.group("version") + output_snippet_text += "\n".format(include_file, include_version) elif re_mastersnippet.search(line): - output_snippet_text += "\n" + output_snippet_text += "\n" - # Tag replacements/nothing to change - else: - for input_tag, output_tag in tag_mapping.iteritems(): - line = line.replace(input_tag, output_tag) - output_snippet_text += line - input_snippet.close() + # Tag replacements/nothing to change + else: + for input_tag, output_tag in tag_mapping.iteritems(): + line = line.replace(input_tag, output_tag) + output_snippet_text += line + input_snippet.close() - output_snippet = open(output_path, 'w') - output_snippet.write(output_snippet_text) - output_snippet.close() + output_snippet = open(output_path, 'w') + output_snippet.write(output_snippet_text) + output_snippet.close() class ParsingError(Exception): def __init__(self, arg): @@ -75,19 +75,19 @@ def __init__(self, arg): if __name__ == "__main__": - import argparse - parser = argparse.ArgumentParser(description="Convert snippets to FM parameter-centric format") - parser.add_argument("input_path", type=str, help="Input snippet path") - parser.add_argument("output_path", type=str, help="Output snippet path") - args = parser.parse_args() + import argparse + parser = argparse.ArgumentParser(description="Convert snippets to FM parameter-centric format") + parser.add_argument("input_path", type=str, help="Input snippet path") + parser.add_argument("output_path", type=str, help="Output snippet path") + args = parser.parse_args() - try: - PortSnippet(args.input_path, args.output_path) - except ParsingError,e: - import time - print "Failed to parse snippet:" - print "".join(e.args) - sys.exit(1) + try: + PortSnippet(args.input_path, args.output_path) + except ParsingError,e: + import time + print "Failed to parse snippet:" + print "".join(e.args) + sys.exit(1) - #os.system("diff {} {}".format(args.input_path, args.output_path)) - os.system("cat {0}".format(args.output_path)) + #os.system("diff {} {}".format(args.input_path, args.output_path)) + os.system("cat {0}".format(args.output_path))