}
public static Response createErrorResponse(XACMLPolicyQueryType inResponseTo, Exception e) {
// get a builder factory
XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
/* prepare the response */
ResponseBuilder responseBuilder = (ResponseBuilder) builderFactory.getBuilder(Response.DEFAULT_ELEMENT_NAME);
Response response = responseBuilder.buildObject();
// set a few attributes for the response
response.setID("_" + UUID.randomUUID().toString());
response.setVersion(SAMLVersion.VERSION_20);
response.setIssueInstant(new DateTime());
response.setInResponseTo(inResponseTo.getID());
/* add the Status element */
// build a status object
StatusBuilder statusBuilder = (StatusBuilder) builderFactory.getBuilder(Status.DEFAULT_ELEMENT_NAME);
Status status = statusBuilder.buildObject();
// build a status code object
StatusCodeBuilder statusCodeBuilder = (StatusCodeBuilder) builderFactory.getBuilder(StatusCode.DEFAULT_ELEMENT_NAME);
StatusCode statusCode = statusCodeBuilder.buildObject();
// TODO now discriminates by exception but the code must be improved
if (e instanceof VersionMismatchException) {
statusCode.setValue(StatusCode.VERSION_MISMATCH_URI);
} else if (e instanceof MissingIssuerException || e instanceof WrongFormatIssuerException) {
// set the status code
statusCode.setValue(StatusCode.REQUESTER_URI);
// set status message with some details, when provided
if (e.getMessage() != null) {
StatusMessageBuilder statusMessageBuilder = (StatusMessageBuilder) builderFactory.getBuilder(StatusMessage.DEFAULT_ELEMENT_NAME);
StatusMessage statusMessage = statusMessageBuilder.buildObject();
statusMessage.setMessage(e.getMessage());