package eu.doppel_helix.netbeans.mantisintegration.util;
import biz.futureware.mantisconnect.CustomFieldDefinitionData;
import eu.doppel_helix.netbeans.mantisintegration.repository.MantisRepository;
import java.math.BigInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.namespace.QName;
import org.apache.axis.AxisFault;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
public class ExceptionHandler {
private static final QName clientFault = new QName("http://schemas.xmlsoap.org/soap/envelope/", "Client");
private static final Pattern customFieldMsgPattern = Pattern.compile("(Invalid custom field value for field )id \\s*(\\d+)\\s*\\.");
private final MantisRepository repository;
public ExceptionHandler(MantisRepository repository) {
this.repository = repository;
}
public void handleException(Logger logger, String message, Exception ex) {
if (ex instanceof AxisFault) {
AxisFault af = (AxisFault) ex;
if (clientFault.equals(af.getFaultCode())) {
NotifyDescriptor nd = new NotifyDescriptor.Message(
formatUserMessage(message, af.getFaultString()),
NotifyDescriptor.WARNING_MESSAGE);
DialogDisplayer.getDefault().notifyLater(nd);
logger.log(Level.INFO, message, ex);
}
} else {
logger.log(Level.WARNING, message, ex);
}
}
private String formatUserMessage(String message, String fault) {
if(fault == null) {
fault = "";
}
Matcher customFieldMatcher = customFieldMsgPattern.matcher(fault);
if(customFieldMatcher.matches()) {
String intro = customFieldMatcher.group(1);
String id = customFieldMatcher.group(2);
CustomFieldDefinitionData cfd = repository.getMasterData().getCustomFieldDefinition(
new BigInteger(id));
if(cfd != null) {
fault = String.format("%s '%s (ID: %s)'",
intro, cfd.getField().getName(), id);
} else {
fault = String.format("%s (ID: %s)", intro, id);
}
}
return message + "\n\n" + fault;
}
}