/* * Copyright (c) 2012 Chris Ellison, Mike Deats, Liron Yahdav, Ryan Neal, * Brandon Sutherlin, Scott Griffin * * This software is released under the MIT license * (http://www.opensource.org/licenses/mit-license.php) * * Created on Feb 12, 2012 */ package edu.cmu.sv.arinc838.dao; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.arinc.arinc838.FileDefinition; import com.arinc.arinc838.SdfFile; import com.arinc.arinc838.ThwDefinition; import edu.cmu.sv.arinc838.binary.BdfFile; import edu.cmu.sv.arinc838.util.Converter; public class SoftwareDefinitionFileDao { /** * The default file format version as defined in the spec. Value is {@value} */ public static final byte[] DEFAULT_FILE_FORMAT_VERSION = Converter.hexToBytes("00008100"); private List<FileDefinitionDao> fileDefinitions = new ArrayList<FileDefinitionDao>(); private List<TargetHardwareDefinitionDao> thwDefinitions = new ArrayList<TargetHardwareDefinitionDao>(); private SoftwareDescriptionDao softwareDescription; private IntegrityDefinitionDao lspIntegrityDefinition; private IntegrityDefinitionDao sdfIntegrityDefinition; private byte[] fileFormatVersion = DEFAULT_FILE_FORMAT_VERSION; private String path; public SoftwareDefinitionFileDao() { ; } public SoftwareDefinitionFileDao(SdfFile swDefFile, String path) { this.initialize(swDefFile); this.path = path; } public SoftwareDefinitionFileDao(BdfFile bdfFile, String path) throws IOException { this.initialize(bdfFile); this.path = path; } public void initialize(SdfFile swDefFile) { fileDefinitions.clear(); for (FileDefinition fileDef : swDefFile.getFileDefinitions()) { fileDefinitions.add(new FileDefinitionDao(fileDef)); } thwDefinitions.clear(); for (ThwDefinition thwDef : swDefFile.getThwDefinitions()) { thwDefinitions.add(new TargetHardwareDefinitionDao(thwDef)); } softwareDescription = new SoftwareDescriptionDao(swDefFile.getSoftwareDescription()); lspIntegrityDefinition = new IntegrityDefinitionDao(swDefFile.getLspIntegrityDefinition()); sdfIntegrityDefinition = new IntegrityDefinitionDao(swDefFile.getSdfIntegrityDefinition()); fileFormatVersion = swDefFile.getFileFormatVersion(); } public void initialize(SoftwareDefinitionFileDao sdfFile) { this.setPath(sdfFile.getPath()); fileDefinitions.clear(); for (FileDefinitionDao fileDef : sdfFile.getFileDefinitions()) { fileDefinitions.add(fileDef); } thwDefinitions.clear(); for (TargetHardwareDefinitionDao thwDef : sdfFile.getTargetHardwareDefinitions()) { thwDefinitions.add(thwDef); } softwareDescription = sdfFile.getSoftwareDescription(); lspIntegrityDefinition = sdfFile.getLspIntegrityDefinition(); sdfIntegrityDefinition = sdfFile.getSdfIntegrityDefinition(); fileFormatVersion = sdfFile.getFileFormatVersion(); } public void initialize(BdfFile file) throws IOException { file.seek(BdfFile.FILE_FORMAT_VERSION_LOCATION); fileFormatVersion = file.readHexbin32(); file.seek(file.readSoftwareDescriptionPointer()); softwareDescription = new SoftwareDescriptionDao(file); this.getTargetHardwareDefinitions().clear(); file.seek(file.readTargetDefinitionsPointer()); long targetHardwareCount = file.readUint32(); for (int i = 0; i < targetHardwareCount; i++) { long nextHardware = file.readUint32(); TargetHardwareDefinitionDao hardware = new TargetHardwareDefinitionDao(file); this.getTargetHardwareDefinitions().add(hardware); file.seek(nextHardware); } this.getFileDefinitions().clear(); file.seek(file.readFileDefinitionsPointer()); long fileDefinitionCount = file.readUint32(); for (int i = 0; i < fileDefinitionCount; i++) { long nextFile = file.readUint32(); FileDefinitionDao fileDefinition = new FileDefinitionDao(file); this.getFileDefinitions().add(fileDefinition); file.seek(nextFile); } file.seek(file.readSdfIntegrityDefinitionPointer()); this.setSdfIntegrityDefinition(new IntegrityDefinitionDao(file)); file.seek(file.readLspIntegrityDefinitionPointer()); this.setLspIntegrityDefinition(new IntegrityDefinitionDao(file)); } public String getPath(){ return path; } public void setPath(String value){ path = value; } public byte[] getFileFormatVersion() { return fileFormatVersion; } public void setFileFormatVersion(byte[] fileFormatVersion) { this.fileFormatVersion = fileFormatVersion; } public SoftwareDescriptionDao getSoftwareDescription() { return softwareDescription; } public void setSoftwareDescription(SoftwareDescriptionDao sd) { softwareDescription = sd; } public List<TargetHardwareDefinitionDao> getTargetHardwareDefinitions() { return thwDefinitions; } public List<FileDefinitionDao> getFileDefinitions() { return fileDefinitions; } public IntegrityDefinitionDao getSdfIntegrityDefinition() { return this.sdfIntegrityDefinition; } public void setSdfIntegrityDefinition(IntegrityDefinitionDao value) { this.sdfIntegrityDefinition = value; } public IntegrityDefinitionDao getLspIntegrityDefinition() { return this.lspIntegrityDefinition; } public void setLspIntegrityDefinition(IntegrityDefinitionDao value) { this.lspIntegrityDefinition = value; } public String getBinaryFileName() { return getSoftwareDescription().getSoftwarePartnumber().replace("-", "") + ".BDF"; } public String getXmlFileName() { return getSoftwareDescription().getSoftwarePartnumber().replace("-", "") + ".XDF"; } @Override public boolean equals(Object obj) { return obj != null && this == obj || (obj instanceof SoftwareDefinitionFileDao && equals((SoftwareDefinitionFileDao) obj)); } public boolean equals(SoftwareDefinitionFileDao obj) { return obj != null && (this == obj || (this.getSoftwareDescription().equals(obj.getSoftwareDescription()) && Arrays.equals(this.getFileFormatVersion(), obj.getFileFormatVersion()) && this.getTargetHardwareDefinitions().equals(obj.getTargetHardwareDefinitions()) && this.getFileDefinitions().equals(obj.getFileDefinitions()) && this.getSdfIntegrityDefinition().equals(obj.getSdfIntegrityDefinition()) && this .getLspIntegrityDefinition().equals(obj.getLspIntegrityDefinition()))); } @Override public int hashCode() { if (this.getSoftwareDescription() != null && this.getSoftwareDescription().getSoftwarePartnumber() != null) { return this.getXmlFileName().hashCode(); } return 0; } }