/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2015 RomRaider.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 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. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.logger.ecu.definition.xml; import com.romraider.logger.ecu.definition.EcuDefinition; import com.romraider.logger.ecu.definition.EcuDefinitionImpl; import static com.romraider.util.ParamChecker.isNullOrEmpty; import org.apache.log4j.Logger; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; import java.io.File; import java.util.HashMap; import java.util.Map; /* <rom base="16BITBASE"> <romid> <xmlid>CAL ID:A4TC300K</xmlid> <internalidaddress>200</internalidaddress> <internalidstring>A4TC300K</internalidstring> <year>03</year> <transmission>AT</transmission> <ecuid>3614446205</ecuid> </romid> </rom> */ public final class EcuDefinitionHandler extends DefaultHandler { private static final Logger LOGGER = Logger.getLogger(EcuDefinitionHandler.class); private static final String TAG_ROM = "rom"; private static final String TAG_ROMID = "romid"; private static final String TAG_CALID = "internalidstring"; private static final String TAG_ECUID = "ecuid"; private static final String TAG_CASEID = "caseid"; private static final String TAG_ADDRESS = "internalidaddress"; private static final String TAG_YEAR = "year"; private static final String TAG_MARKET = "market"; private static final String TAG_MAKE = "make"; private static final String TAG_MODEL = "model"; private static final String TAG_SUBMODEL = "submodel"; private static final String TAG_TRANS = "transmission"; private static final String TAG_MEMMODEL = "memmodel"; private static final String TAG_FLASH = "flashmethod"; private static final String TAG_SIZE = "filesize"; private static final String TAG_OBSOLETE = "obsolete"; private static final String ATTR_BASE = "base"; private Map<String, EcuDefinition> ecuDefinitionMap = new HashMap<String, EcuDefinition>(); private String calId; private String ecuId; private String caseId; private String address; private String year; private String market; private String make; private String model; private String submodel; private String transmission; private String memmodel; private String flashmethod; private String filesize; private String obsolete; private String inherit; private String carString; private StringBuilder charBuffer; private File ecuDefsFile; public EcuDefinitionHandler(File ecuDefsFile) { this.ecuDefsFile = ecuDefsFile; } public void startDocument() { ecuDefinitionMap = new HashMap<String, EcuDefinition>(); } public void startElement(String uri, String localName, String qName, Attributes attributes) { if (TAG_ROM.equals(qName)) { inherit = attributes.getValue(ATTR_BASE); } else if (TAG_ROMID.equals(qName)) { calId = ""; ecuId = ""; caseId = ""; address = ""; year = ""; market = ""; make = ""; model = ""; submodel = ""; transmission = ""; memmodel = ""; flashmethod = ""; filesize = ""; obsolete = "0"; carString = ""; } charBuffer = new StringBuilder(); } public void characters(char[] ch, int start, int length) { charBuffer.append(ch, start, length); } public void endElement(String uri, String localName, String qName) { if (TAG_ROM.equals(qName)) { inherit = null; } else if (TAG_ROMID.equals(qName)) { if (!isNullOrEmpty(ecuId) && !isNullOrEmpty(calId) && !isNullOrEmpty(year) && !isNullOrEmpty(market) && !isNullOrEmpty(make) && !isNullOrEmpty(model) && !isNullOrEmpty(submodel) && !isNullOrEmpty(transmission) ) { carString = String.format("%s %s %s %s %s %s", year, market, make, model, submodel, transmission); ecuDefinitionMap.put(ecuId, new EcuDefinitionImpl( ecuId, calId, carString, inherit, ecuDefsFile)); } if (!isNullOrEmpty(ecuId) && !isNullOrEmpty(calId) && !isNullOrEmpty(address) && !isNullOrEmpty(year) && !isNullOrEmpty(market) && !isNullOrEmpty(make) && !isNullOrEmpty(model) && !isNullOrEmpty(submodel) && !isNullOrEmpty(transmission) && !isNullOrEmpty(memmodel) && !isNullOrEmpty(flashmethod) && !isNullOrEmpty(obsolete) ) { LOGGER.debug(romDetail()); } } else if (TAG_CALID.equals(qName)) { calId = charBuffer.toString(); } else if (TAG_ECUID.equals(qName)) { ecuId = charBuffer.toString(); } else if (TAG_CASEID.equals(qName)) { caseId = charBuffer.toString(); } else if (TAG_ADDRESS.equals(qName)) { address = charBuffer.toString(); } else if (TAG_YEAR.equals(qName)) { year = charBuffer.toString(); if (!year.isEmpty()) { try { if (Integer.parseInt(year) < 90) { year = "20" + year; } } catch (NumberFormatException e) { if ((year.contains("/") || year.contains("-")) && year.length() < 6 ) year = "20" + year; } } else { year = "20xx"; } } else if (TAG_MARKET.equals(qName)) { market = charBuffer.toString(); } else if (TAG_MAKE.equals(qName)) { make = charBuffer.toString(); } else if (TAG_MODEL.equals(qName)) { model = charBuffer.toString(); } else if (TAG_SUBMODEL.equals(qName)) { submodel = charBuffer.toString(); } else if (TAG_TRANS.equals(qName)) { transmission = charBuffer.toString(); } else if (TAG_MEMMODEL.equals(qName)) { memmodel = charBuffer.toString(); } else if (TAG_FLASH.equals(qName)) { flashmethod = charBuffer.toString(); } else if (TAG_SIZE.equals(qName)) { filesize = charBuffer.toString(); } else if (TAG_OBSOLETE.equals(qName)) { obsolete = charBuffer.toString(); } } public Map<String, EcuDefinition> getEcuDefinitionMap() { return ecuDefinitionMap; } public String romDetail() { return String.format( "calid='%s'," + "address='%s'," + "string='%s'," + "caseid='%s'," + "year='%s'," + "market='%s'," + "make='%s'," + "model='%s'," + "submodel='%s'," + "transmission='%s'," + "memmodel='%s'," + "flash='%s'," + "filesize='%s'," + "obsolete='%s'," + "inherit='%s'" + "file='%s'", calId, address, calId, caseId, year, market, make, model, submodel, transmission, memmodel, flashmethod, filesize , obsolete, inherit, ecuDefsFile.getName() ); } }