/*
* @(#)IeeeCDFAdapter.java
*
* Copyright (C) 2006 www.interpss.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* @Author Mike Zhou
* @Version 1.0
* @Date 02/11/2008
*
* Revision History
* ================
*
*/
package org.ieee.odm.adapter.ieeecdf;
import org.ieee.odm.adapter.AbstractODMAdapter;
import org.ieee.odm.adapter.IODMAdapter;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFBranchDataMapper;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFBusDataMapper;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFInterchangeDataMapper;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFLossZoneDataMapper;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFNetDataMapper;
import org.ieee.odm.adapter.ieeecdf.mapper.IeeeCDFTielineDataMapper;
import org.ieee.odm.common.IFileReader;
import org.ieee.odm.common.ODMException;
import org.ieee.odm.common.ODMLogger;
import org.ieee.odm.model.IODMModelParser;
import org.ieee.odm.model.aclf.AclfModelParser;
import org.ieee.odm.schema.LoadflowNetXmlType;
import org.ieee.odm.schema.OriginalDataFormatEnumType;
/**
* IEEE Common Format ODM parser implementation
*
* @author mzhou
*
*/
public class IeeeCDFAdapter extends AbstractODMAdapter {
/** data section indicator for the beginning */
private static final int DataNotDefine = 0;
/** Bus data section indicator */
private static final int BusData = 1;
/** Branch data section indicator */
private static final int BranchData = 2;
/** Loss zone data section indicator */
private static final int LossZone = 3;
/** inter-change data section indicator */
private static final int InterchangeData = 4;
/** Tie line data section indicator */
private static final int TielineData = 5;
/** Bus data line parser */
private IeeeCDFBusDataMapper busDataMapper = new IeeeCDFBusDataMapper();
/** Branch data line parser */
private IeeeCDFBranchDataMapper branchDataMapper = new IeeeCDFBranchDataMapper();
/** Network data (head line) line parser */
private IeeeCDFNetDataMapper netDataMappe = new IeeeCDFNetDataMapper();
/** Loss zone data line parser */
private IeeeCDFLossZoneDataMapper zoneDataMapper = new IeeeCDFLossZoneDataMapper();
/** inter-exchange data line parser */
private IeeeCDFInterchangeDataMapper exchangeDataMapper = new IeeeCDFInterchangeDataMapper();
/** tie line data line parser */
private IeeeCDFTielineDataMapper tieLineDataMapper = new IeeeCDFTielineDataMapper();
/**
* constructor
*/
public IeeeCDFAdapter() {
super();
}
@Override protected AclfModelParser parseInputFile(final IFileReader din, String encoding) throws ODMException {
// IEEE CDF file stores Aclf Network info
AclfModelParser parser = new AclfModelParser(encoding);
parser.initCaseContentInfo(OriginalDataFormatEnumType.IEEE_CDF);
LoadflowNetXmlType baseCaseNet = parser.getNet();
baseCaseNet.setId("Base_Case_from_IEEECDF_format");
// read the first line - head line
// sample :
// 08/19/93 UW ARCHIVE 100.0 1962 W IEEE 14 Bus Test Case
String str = din.readLine();
netDataMappe.mapInputLine(str, parser);
int dataLineIndicator = DataNotDefine;
do {
str = din.readLine();
// NOTE: Some data file misses the "END OF DATA" string at the end of the file, which may cause a problem
if(str!=null){
if (str.trim().equals("END OF DATA"))
break;
try {
/*
* process section head record - for example
*
* BUS DATA FOLLOWS
*/
if ((str.length() > 3)
&& str.substring(0, 3).equals("BUS")) {
dataLineIndicator = BusData;
ODMLogger.getLogger().fine("load bus data");
}
else if ((str.length() > 6)
&& str.substring(0, 6).equals("BRANCH")) {
dataLineIndicator = BranchData;
ODMLogger.getLogger().fine("load branch data");
}
else if ((str.length() > 4)
&& str.substring(0, 4).equals("LOSS")) {
dataLineIndicator = LossZone;
ODMLogger.getLogger().fine("load loss zone data");
}
else if ((str.length() > 11)
&& str.substring(0, 11).equals("INTERCHANGE")) {
dataLineIndicator = InterchangeData;
ODMLogger.getLogger().fine("load interchange data");
}
else if ((str.length() > 3)
&& str.substring(0, 3).equals("TIE")) {
dataLineIndicator = TielineData;
ODMLogger.getLogger().fine("load tieline data");
}
/*
* data section end indicator line processing
*/
else if (str.startsWith("-999") || str.startsWith("-99") || str.startsWith("-9")) {
dataLineIndicator = DataNotDefine;
}
/*
* parse data line
*/
else if (dataLineIndicator == BusData) {
busDataMapper.mapInputLine(str, parser);
}
else if (dataLineIndicator == BranchData) {
branchDataMapper.mapInputLine(str, parser);
}
else if (dataLineIndicator == LossZone) {
zoneDataMapper.mapInputLine(str, parser);
}
else if (dataLineIndicator == InterchangeData) {
exchangeDataMapper.mapInputLine(str, parser);
}
else if (dataLineIndicator == TielineData) {
tieLineDataMapper.mapInputLine(str, parser);
}
} catch (final Exception e) {
ODMLogger.getLogger().severe(e.toString() + "\n" + str);
//e.printStackTrace();
}
}
} while (str!=null);
return parser;
}
/**
* IEEE CDF does not support multiple files
*/
protected IODMModelParser parseInputFile(IODMAdapter.NetType type, final IFileReader[] din, String encoding) throws ODMException {
throw new ODMException("not implemented yet");
}
}