package de.persosim.simulator.processing; import java.util.HashMap; import de.persosim.simulator.apdu.CommandApdu; import de.persosim.simulator.apdu.ResponseApdu; public class ProcessingStateDelta extends ProcessingState { private CommandApdu commandApdu; private ResponseApdu responseApdu; private HashMap<Class<? extends UpdatePropagation>, UpdatePropagation> updatePropagations = new HashMap<>(); /** * Create a new ProcessingStateDelta which only updates the command APDU * @param respApdu */ public ProcessingStateDelta(CommandApdu cmdApdu) { commandApdu = cmdApdu; } /** * Create a new ProcessingStateDelta which only updates the response APDU * @param respApdu */ public ProcessingStateDelta(ResponseApdu respApdu) { responseApdu = respApdu; } /** * Create a new ProcessingStateDelta which only contains one * updatePropagation. * * The provided UpatePropagation is added under the key returned by its * getKey()-method. If adding under a different key is desired you need to * provide it through the {@link #putUpdatePropagation(Class<? extends * UpdatePropagation>, UpdatePropagation) putUpdatePropagation} method * instead. * * @param respApdu */ public ProcessingStateDelta(UpdatePropagation updatePropagation) { if (updatePropagation != null) { updatePropagations.put(updatePropagation.getKey(), updatePropagation); } } public CommandApdu getCommandApdu() { return commandApdu; } public ResponseApdu getResponseApdu() { return responseApdu; } public HashMap<Class<? extends UpdatePropagation>, UpdatePropagation> getUpdatePropagations() { return updatePropagations; } public void putUpdatePropagation(Class<? extends UpdatePropagation> key, UpdatePropagation newPropagation) { if (!key.isInstance(newPropagation)) { throw new IllegalArgumentException("UpdatePropagation must be instance of the class used as key"); } this.updatePropagations.put(key, newPropagation); } /** * Returns the number of parts modified by this ProcessingStateDelta * * @return number of parts modified by this ProcessingStateDelta */ public int getNrOfModifications() { int nrOfModifications = 0; if (commandApdu != null) { nrOfModifications++; } if (responseApdu != null) { nrOfModifications++; } if (updatePropagations != null) { nrOfModifications += updatePropagations.size(); } return nrOfModifications; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("processing state delta containing the following changes: "); if(commandApdu != null) { sb.append("command APDU"); } if(responseApdu != null) { if(commandApdu != null) { sb.append(", "); } sb.append("response APDU"); } int noOfUpdatePropagations = updatePropagations.size(); if(noOfUpdatePropagations > 0) { if((commandApdu != null) || (responseApdu != null)) { sb.append(", "); } sb.append(noOfUpdatePropagations + " update propagation"); if(noOfUpdatePropagations > 1) { sb.append("s"); } } return sb.toString(); } }