package edu.cmu.sv.arinc838.builder; import java.io.IOException; import com.arinc.arinc838.ThwDefinition; import edu.cmu.sv.arinc838.binary.BdfFile; import edu.cmu.sv.arinc838.dao.TargetHardwareDefinitionDao; public class TargetHardwareDefinitionBuilder implements Builder<TargetHardwareDefinitionDao, ThwDefinition> { @Override public ThwDefinition buildXml(TargetHardwareDefinitionDao targetHardwareDefinition) { ThwDefinition def = new ThwDefinition(); def.setThwId(targetHardwareDefinition.getThwId()); for (String position : targetHardwareDefinition.getPositions()) { def.getThwPosition().add(position); } return def; } @Override public int buildBinary(TargetHardwareDefinitionDao targetHardwareDefinition, BdfFile bdfFile) throws IOException { int initialPosition = (int) bdfFile.getFilePointer(); bdfFile.writePlaceholder(); bdfFile.writeStr64k(targetHardwareDefinition.getThwId()); bdfFile.writeUint32(targetHardwareDefinition.getPositions().size()); for (int i = 0; i < targetHardwareDefinition.getPositions().size(); i++) { String position = targetHardwareDefinition.getPositions().get(i); // next pointer is current position + 4 pointer to next thw-position // + 2 position string length + position length long nextThwPositionPointer = bdfFile.getFilePointer() + 4 + 2 + position.length(); if (i == targetHardwareDefinition.getPositions().size() - 1) { bdfFile.writeUint32(0); } else { bdfFile.writeUint32(nextThwPositionPointer); } bdfFile.writeStr64k(position); } int finalPosition = (int) bdfFile.getFilePointer(); if (!targetHardwareDefinition.isLast()) { bdfFile.seek(initialPosition); bdfFile.writeUint32(finalPosition); bdfFile.seek(finalPosition); } return (int) (finalPosition - initialPosition); } }