package org.ieee.odm.adapter.pwd; import org.ieee.odm.adapter.AbstractODMAdapter; import org.ieee.odm.adapter.pwd.impl.ContingencyDataProcessor; import org.ieee.odm.adapter.pwd.impl.PWDHelper; import org.ieee.odm.common.IFileReader; import org.ieee.odm.common.ODMLogger; import org.ieee.odm.model.IODMModelParser; import org.ieee.odm.model.aclf.AclfModelParser; import org.ieee.odm.schema.OriginalDataFormatEnumType; /** * PWD contingency data adapter * * @version 0.2 01/08/2012 * @author * */ public class PWDAdapterForContingency extends AbstractODMAdapter{ //Define the contingency types public enum ContingencyType{BRANCH,SERIES_CAPACITOR,DC_LINE_CHANGE,DC_LINE_SETPOINT,PHSXFR_SETPOINT,THREEW_XFR}; //Define the data record types private enum RecType{CONTINGENCY,CTG_OPTIONS,GLOBALCONTINGENCYACTIONS,UNSUPPORTED}; public PWDAdapterForContingency(){ super(); } /** * Entry point of the PWD contingency data processor. It reads in the contingency definition data * and parses it into ODM, saved in ODMModelParser object. */ @Override protected IODMModelParser parseInputFile(IFileReader din, String encoding) { String str=""; final String CONTINGENCY_Token="CONTINGENCY"; final String CTG_OPTIONS_Token="CTG_OPTIONS"; final String GLOBAL_CTG_ACTION_Token="GLOBALCONTINGENCYACTIONS"; RecType recType=null; AclfModelParser parser=new AclfModelParser(encoding); parser.initCaseContentInfo(OriginalDataFormatEnumType.POWER_WORLD); //create contingency data processor //In fact you don't know what kind of contingency the data defined until you get the CTGElement Part /*Now we know the contingency data we got is branch status change(most changed to OPEN, some CLOSE) * so we can defined the exact type contingency processor before the processing; */ ContingencyDataProcessor ctgProc=new ContingencyDataProcessor(parser); try { do{ str=din.readLine(); if (str != null) { if (str.startsWith("DATA")) { if (getDataType(str).equals(CONTINGENCY_Token)) { recType = RecType.CONTINGENCY; } else if (getDataType(str).equals(CTG_OPTIONS_Token)) recType = RecType.CTG_OPTIONS; else if (getDataType(str).equals(GLOBAL_CTG_ACTION_Token)) recType = RecType.GLOBALCONTINGENCYACTIONS; else recType = RecType.UNSUPPORTED; // parse Field Names while (!PWDHelper.isArgumentFieldsCompleted(str)) { str += din.readLine(); } ctgProc.parseMetadata(str); } else if (str.trim().startsWith("//")) ODMLogger.getLogger().fine("comments:" + str); else if (str.trim().startsWith("{")) ODMLogger.getLogger().info( recType.toString() + " type data begins"); else if (str.trim().startsWith("}")) ODMLogger.getLogger().info( recType.toString() + " type data ends"); // start processing record data else if (!str.trim().isEmpty() && recType == RecType.CONTINGENCY) { ctgProc.processContingencyData(str); } }// end of if str!=null } while(str!=null); } catch (Exception e) { ODMLogger.getLogger().severe("Contingency file processing error: " + e.toString()); //e.printStackTrace(); } return parser; } @Override protected IODMModelParser parseInputFile(NetType type, IFileReader[] din, String encoding) { ODMLogger.getLogger().severe("Method not implemented"); return null; } /** * Get the contingency definition data type * @param str * @return record data type string */ private String getDataType(String str){ int indexOfLeftParenthesis=str.indexOf("("); int indexOfFirstComma=str.indexOf(","); String dataType=str.substring(indexOfLeftParenthesis+1, indexOfFirstComma).trim(); return dataType; } }