OpenEUICC/libs/lpad-sm-dp-plus-connector/src/main/java/com/truphone/lpad/worker/DeleteProfileWorker.java

163 lines
6.2 KiB
Java

package com.truphone.lpad.worker;
import com.truphone.lpa.ApduChannel;
import com.truphone.lpa.apdu.ApduUtils;
import com.truphone.lpad.LpadWorker;
import com.truphone.lpad.progress.Progress;
import com.truphone.lpad.progress.ProgressStep;
import com.truphone.rsp.dto.asn1.rspdefinitions.DeleteProfileResponse;
import com.truphone.util.LogStub;
import com.truphone.util.TextUtil;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DeleteProfileWorker implements LpadWorker<LpadWorkerExchange<DeleteProfileWorker.DeleteProfileInputParams>, String> {
private static final Logger LOG = Logger.getLogger(DeleteProfileWorker.class.getName());
private final Progress progress;
private final ApduChannel apduChannel;
static final String PROFILE_RESULT_SUCCESS = "0";
/**
* @param progress Progress Bar
* @param apduChannel aPDU Channel
*/
public DeleteProfileWorker(Progress progress, ApduChannel apduChannel) {
inputValidation(progress == null, "Progress must not be null");
inputValidation(apduChannel == null, "ApduChannel must not be null");
this.progress = progress;
this.apduChannel = apduChannel;
}
/**
* Deletes the Profile from the ICC and converts the response to be readable
*
* @param lpadWorkerExchange Exchange that must contain in its body the {@link DeleteProfileInputParams}
* @return Delete response Code
*/
public String run(final LpadWorkerExchange<DeleteProfileInputParams> lpadWorkerExchange) {
inputValidation(lpadWorkerExchange == null, "Input params to invoke Delete Profile must not be null");
inputValidation(lpadWorkerExchange.getBody() == null, "Input params must have body defined");
inputValidation(TextUtil.isBlank(lpadWorkerExchange.getBody().getIccid()), "ICCID must not be null/empty");
String iccid = lpadWorkerExchange.getBody().getIccid(); // Get ICCID From Body
String eResponse = transmitDeleteProfile(iccid, progress);
return convertDeleteProfile(iccid, progress, eResponse);
}
/**
* Converts the response from the transmission, checks if there are errors in the transmission
*
* @param iccid Integrated Circuit Card ID
* @param progress Progress Bar
* @param eResponse Response from transmitDeleteProfile
* @return Delete response Code
*/
private String convertDeleteProfile(String iccid, Progress progress, String eResponse) {
progress.stepExecuted(ProgressStep.DELETE_PROFILE_CONVERTING_RESPONSE, "Converting response");
DeleteProfileResponse deleteProfileResponse = new DeleteProfileResponse();
try {
InputStream is = new ByteArrayInputStream(Hex.decodeHex(eResponse.toCharArray()));
deleteProfileResponse.decode(is);
logDebug(" - Delete response: " + deleteProfileResponse);
if (PROFILE_RESULT_SUCCESS.equals(deleteProfileResponse.getDeleteResult().toString())) {
logDebug(" - iccid: " + iccid + " profile deleted");
logDebug(" - iccid: " + iccid + " Refreshing SIM card on Delete.");
apduChannel.sendStatus();
progress.stepExecuted(ProgressStep.DELETE_PROFILE_DELETED, iccid + " deleted successfully");
} else {
progress.stepExecuted(ProgressStep.DELETE_PROFILE_NOT_DELETED, iccid + " profile not deleted");
LOG.info(LogStub.getInstance().getTag() + " - iccid:" + iccid + " profile not deleted");
}
return deleteProfileResponse.getDeleteResult().toString();
} catch (IOException ioe) {
LOG.severe(LogStub.getInstance().getTag() + " - iccid:" + iccid + " profile failed to be deleted");
throw new RuntimeException("Unable to delete profile: " + iccid + ", response: " + eResponse);
} catch (DecoderException e) {
LOG.severe(LogStub.getInstance().getTag() + " - " + e.getMessage());
LOG.severe(LogStub.getInstance().getTag() + " - iccid: " + iccid + " profile failed to be deleted. Exception in Decoder:" + e.getMessage());
throw new RuntimeException("Unable to delete profile: " + iccid + ", response: " + eResponse);
}
}
/**
* Transmits the action to deletes the profile for the specific ICC
*
* @param iccid Integrated Circuit Card ID
* @param progress Progress Bar
* @return
*/
private String transmitDeleteProfile(String iccid, Progress progress) {
progress.setTotalSteps(3);
progress.stepExecuted(ProgressStep.DELETE_PROFILE_DELETING_PROFILE, iccid + " delete profile");
logDebug(" - Deleting profile: " + iccid);
String apdu = ApduUtils.deleteProfileApdu(iccid);
logDebug(" - Delete profile apdu: " + apdu);
String eResponse = apduChannel.transmitAPDU(apdu);
logDebug(" - Delete Response: " + eResponse);
return eResponse;
}
private void logDebug(final String errorMessage) {
if (LogStub.getInstance().isDebugEnabled()) {
LogStub.getInstance().logDebug(LOG, LogStub.getInstance().getTag() + errorMessage);
}
}
private void inputValidation(final boolean invalidCondition, final String errorMessage) {
if (invalidCondition) {
LOG.log(Level.SEVERE, LogStub.getInstance().getTag() + " - " + errorMessage);
throw new IllegalArgumentException(errorMessage);
}
}
/**
* This class is responsible to gather the mandatory params to delete a profile, which are:
* <ul>
* <li>iccid: Integrated Circuit Card ID</li>
* </ul>
*/
public class DeleteProfileInputParams {
private final String iccid;
/**
* Input params to allocate the Protected Profile Packages
*
* @param iccid Integrated Circuit Card ID
*/
public DeleteProfileInputParams(final String iccid) {
this.iccid = iccid;
}
String getIccid() {
return iccid;
}
}
}