/*
* Copyright 2003 Federal Chancellery Austria
* MOA-SPSS has been developed in a cooperation between BRZ, the Federal
* Chancellery Austria - ICT staff unit, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package at.gv.egovernment.moa.spss.api.xmlbind;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.spss.MOAApplicationException;
import at.gv.egovernment.moa.spss.api.SPSSFactory;
import at.gv.egovernment.moa.spss.api.cmsverify.CMSContent;
import at.gv.egovernment.moa.spss.api.cmsverify.CMSDataObject;
import at.gv.egovernment.moa.spss.api.cmsverify.VerifyCMSSignatureRequest;
import at.gv.egovernment.moa.spss.api.common.MetaInfo;
import at.gv.egovernment.moaspss.util.Base64Utils;
import at.gv.egovernment.moaspss.util.CollectionUtils;
import at.gv.egovernment.moaspss.util.Constants;
import at.gv.egovernment.moaspss.util.DOMUtils;
import at.gv.egovernment.moaspss.util.XPathUtils;
/**
* A parser to parse VerifyCMSSignatureRequest
DOM trees into
* VerifyCMSSignatureRequest
API objects.
*
* @author Patrick Peck
* @version $Id$
*/
public class VerifyCMSSignatureRequestParser {
//
// XPath expressions for selecting parts of the DOM message
//
private static final String MOA = Constants.MOA_PREFIX + ":";
private static final String DATE_TIME_XPATH = MOA + "DateTime";
private static final String EXTENDED_VALIDATION_XPATH = MOA + "ExtendedValidation";
private static final String CMS_SIGNATURE_XPATH = MOA + "CMSSignature";
private static final String PDF_SIGNATURE_XPATH = MOA + "PDFSignature";
private static final String TRUST_PROFILE_ID_XPATH = MOA + "TrustProfileID";
private static final String DATA_OBJECT_XPATH = MOA + "DataObject";
private static final String META_INFO_XPATH = MOA + "MetaInfo";
private static final String CONTENT_XPATH = MOA + "Content";
private static final String BASE64_CONTENT_XPATH = MOA + "Base64Content";
private static final String EXCLUDEBYTERANGE_FROM_XPATH = MOA + "ExcludedByteRange/" + MOA + "From";
private static final String EXCLUDEBYTERANGE_TO_XPATH = MOA + "ExcludedByteRange/" + MOA + "To";
/** The SPSSFactory
for creating new API objects. */
private final SPSSFactory factory = SPSSFactory.getInstance();
/**
* Parse a VerifyCMSSignatureRequest
DOM element, as defined by the
* MOA schema.
*
* @param requestElem The VerifyCMSSignatureRequest
to parse. The
* request must have been successfully parsed against the
* schema for this method to succeed.
* @return A VerifyCMSSignatureRequest
API objects containing the
* data from the DOM element.
* @throws MOAApplicationException An error occurred parsing the request.
*/
public VerifyCMSSignatureRequest parsePDF(Element requestElem)
throws MOAApplicationException {
final int[] signatories = parseSignatories(requestElem);
final Date dateTime =
RequestParserUtils.parseDateTime(requestElem, DATE_TIME_XPATH);
final boolean extendedValidation =
RequestParserUtils.parseExtendedValidation(requestElem, EXTENDED_VALIDATION_XPATH, false);
final String cmsSignatureStr =
XPathUtils.getElementValue(requestElem, PDF_SIGNATURE_XPATH, "");
final CMSDataObject dataObject = parseDataObject(requestElem);
final String trustProfileID =
XPathUtils.getElementValue(requestElem, TRUST_PROFILE_ID_XPATH, null);
// Logger.info("CMSSignature: " + cmsSignatureStr);
final InputStream cmsSignature =
Base64Utils.decodeToStream(cmsSignatureStr, true);
return factory.createVerifyCMSSignatureRequest(
signatories,
dateTime,
cmsSignature,
dataObject,
trustProfileID,
true,
extendedValidation);
}
/**
* Parse a VerifyCMSSignatureRequest
DOM element, as defined by the
* MOA schema.
*
* @param requestElem The VerifyCMSSignatureRequest
to parse. The
* request must have been successfully parsed against the
* schema for this method to succeed.
* @return A VerifyCMSSignatureRequest
API objects containing the
* data from the DOM element.
* @throws MOAApplicationException An error occurred parsing the request.
*/
public VerifyCMSSignatureRequest parse(Element requestElem)
throws MOAApplicationException {
final int[] signatories = parseSignatories(requestElem);
final Date dateTime =
RequestParserUtils.parseDateTime(requestElem, DATE_TIME_XPATH);
final boolean extendedValidation =
RequestParserUtils.parseExtendedValidation(requestElem, EXTENDED_VALIDATION_XPATH, false);
final String cmsSignatureStr =
XPathUtils.getElementValue(requestElem, CMS_SIGNATURE_XPATH, "");
final CMSDataObject dataObject = parseDataObject(requestElem);
final String trustProfileID =
XPathUtils.getElementValue(requestElem, TRUST_PROFILE_ID_XPATH, null);
final InputStream cmsSignature =
Base64Utils.decodeToStream(cmsSignatureStr, true);
return factory.createVerifyCMSSignatureRequest(
signatories,
dateTime,
cmsSignature,
dataObject,
trustProfileID,
false,
extendedValidation);
}
/**
* Parse the Signatories
attribute contained in the
* VerifyCMSSignatureRequest
DOM element.
*
* @param requestElem The VerifyCMSSignatureRequest
DOM element.
* @return The signatories contained in the given
* VerifyCMSSignatureRequest
DOM element.
*/
private int[] parseSignatories(Element requestElem) {
final String signatoriesStr = requestElem.getAttribute("Signatories");
if ("all".equals(signatoriesStr)) {
return VerifyCMSSignatureRequest.ALL_SIGNATORIES;
} else {
final StringTokenizer tokenizer = new StringTokenizer(signatoriesStr);
final List signatoriesList = new ArrayList();
int[] signatories;
// put the signatories into a List
while (tokenizer.hasMoreTokens()) {
try {
signatoriesList.add(new Integer(tokenizer.nextToken()));
} catch (final NumberFormatException e) {
// this cannot occur if the request has been validated
}
}
// convert the List into an int array
signatories = CollectionUtils.toIntArray(signatoriesList);
return signatories;
}
}
/**
* Parse a the DataObject
DOM element contained in a given
* VerifyCMSSignatureRequest
DOM element.
*
* @param requestElem The VerifyCMSSignatureRequest
DOM element to
* parse.
* @return The CMSDataObject
API object containing the data from
* the DataObject
DOM element.
*/
private CMSDataObject parseDataObject(Element requestElem) {
final Element dataObjectElem =
(Element) XPathUtils.selectSingleNode(requestElem, DATA_OBJECT_XPATH);
if (dataObjectElem != null) {
final Element metaInfoElem =
(Element) XPathUtils.selectSingleNode(dataObjectElem, META_INFO_XPATH);
MetaInfo metaInfo = null;
final Element contentElem =
(Element) XPathUtils.selectSingleNode(dataObjectElem, CONTENT_XPATH);
final CMSContent content = parseContent(contentElem);
if (metaInfoElem != null) {
metaInfo = RequestParserUtils.parseMetaInfo(metaInfoElem);
}
final String excludeByteRangeFromStr = XPathUtils.getElementValue(dataObjectElem,
EXCLUDEBYTERANGE_FROM_XPATH, null);
final String excludeByteRangeToStr = XPathUtils.getElementValue(dataObjectElem,
EXCLUDEBYTERANGE_TO_XPATH, null);
BigDecimal excludeByteRangeFrom = null;
BigDecimal excludeByteRangeTo = null;
if (excludeByteRangeFromStr != null) {
excludeByteRangeFrom = new BigDecimal(excludeByteRangeFromStr);
}
if (excludeByteRangeToStr != null) {
excludeByteRangeTo = new BigDecimal(excludeByteRangeToStr);
}
return factory.createCMSDataObject(metaInfo, content, excludeByteRangeFrom, excludeByteRangeTo);
} else {
return null;
}
}
/**
* Parse the content contained in a CMSContentBaseType
kind of DOM
* element.
*
* @param contentElem The CMSContentBaseType
kind of element to
* parse.
* @return A CMSDataObject
API object containing the data from the
* given DOM element.
*/
private CMSContent parseContent(Element contentElem) {
final Element base64ContentElem =
(Element) XPathUtils.selectSingleNode(contentElem, BASE64_CONTENT_XPATH);
if (base64ContentElem != null) {
final String base64Str = DOMUtils.getText(base64ContentElem);
final InputStream binaryContent = Base64Utils.decodeToStream(base64Str, true);
return factory.createCMSContent(binaryContent);
} else {
return factory.createCMSContent(
contentElem.getAttribute("Reference"));
}
}
}