/* * 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.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.traversal.NodeIterator; import at.gv.egovernment.moa.spss.MOAApplicationException; import at.gv.egovernment.moa.spss.api.SPSSFactory; import at.gv.egovernment.moa.spss.api.common.Content; import at.gv.egovernment.moa.spss.api.xmlsign.CreateSignatureEnvironmentProfile; import at.gv.egovernment.moa.spss.api.xmlsign.CreateSignatureInfo; import at.gv.egovernment.moa.spss.api.xmlsign.CreateTransformsInfoProfile; import at.gv.egovernment.moa.spss.api.xmlsign.CreateXMLSignatureRequest; import at.gv.egovernment.moa.spss.api.xmlsign.DataObjectInfo; import at.gv.egovernment.moa.spss.api.xmlsign.SingleSignatureInfo; import at.gv.egovernment.moaspss.util.BoolUtils; 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 CreateXMLSignatureRequest DOM trees into * CreateXMLSignatureRequest API objects. * * @author Patrick Peck * @version $Id$ */ public class CreateXMLSignatureRequestParser { // // XPath expresssions to select elements in the CreateXMLSignatureRequest // private static final String MOA = Constants.MOA_PREFIX + ":"; private static final String KEY_IDENTIFIER_XPATH = "/" + MOA + "CreateXMLSignatureRequest/" + MOA + "KeyIdentifier"; private static final String SINGLE_SIGNATURE_INFO_XPATH = "/" + MOA + "CreateXMLSignatureRequest/" + MOA + "SingleSignatureInfo"; private static final String DATA_OBJECT_INFO_XPATH = MOA + "DataObjectInfo"; private static final String DATA_OBJECT_XPATH = MOA + "DataObject"; private static final String CREATE_SIGNATURE_INFO_XPATH = MOA + "CreateSignatureInfo"; private static final String CREATE_TRANSFORMS_INFO_PROFILE_XPATH = MOA + "CreateTransformsInfoProfile | " + MOA + "CreateTransformsInfoProfileID"; private static final String CREATE_SIGNATURE_ENVIRONMENT_XPATH = MOA + "CreateSignatureEnvironment"; private static final String CREATE_SIGNATURE_ENVIRONMENT_PROFILE_XPATH = MOA + "CreateSignatureEnvironmentProfile | " + MOA + "CreateSignatureEnvironmentProfileID"; private static final String SL_CONFORM_ATTR_NAME = "SecurityLayerConformity"; /** The factory to create API objects. */ private final SPSSFactory factory; /** * Create a new CreateXMLSignatureRequestParser. */ public CreateXMLSignatureRequestParser() { this.factory = SPSSFactory.getInstance(); } /** * Parse a CreateXMLSignatureRequest DOM element, as defined by the * MOA schema. * * @param requestElem The CreateXMLSignatureRequest to parse. The * request must have been successfully parsed against the * schema for this method to succeed. * @return A CreateXMLSignatureRequest API object containing the * data from the DOM element. * @throws MOAApplicationException An error occurred parsing the request. */ public CreateXMLSignatureRequest parse(Element requestElem) throws MOAApplicationException { final List singleSignatureInfos = parseSingleSignatureInfos(requestElem); final String keyIdentifier = XPathUtils.getElementValue(requestElem, KEY_IDENTIFIER_XPATH, null); return factory.createCreateXMLSignatureRequest( keyIdentifier, singleSignatureInfos); } /** * Parse all SingleSignatureInfo elements of the * CreateXMLSignatureRequest. * * @param requestElem The CreateXMLSignatureRequest to parse. * @return A List of SingleSignatureInfo API objects. * @throws MOAApplicationException An error occurred parsing on of the * SingleSignatureInfo elements. */ private List parseSingleSignatureInfos(Element requestElem) throws MOAApplicationException { final List singleSignatureInfos = new ArrayList(); final NodeIterator sigInfoElems = XPathUtils.selectNodeIterator(requestElem, SINGLE_SIGNATURE_INFO_XPATH); Element sigInfoElem; while ((sigInfoElem = (Element) sigInfoElems.nextNode()) != null) { singleSignatureInfos.add(parseSingleSignatureInfo(sigInfoElem)); } return singleSignatureInfos; } /** * Parse a SingleSignatureInfo DOM element. * * @param sigInfoElem The SingleSignatureInfo DOM element to parse. * @return A SingleSignatureInfo API object containing the * information of sigInfoElem. * @throws MOAApplicationException An error occurred parsing the * SingleSignatureInfo. */ private SingleSignatureInfo parseSingleSignatureInfo(Element sigInfoElem) throws MOAApplicationException { final List dataObjectInfos = parseDataObjectInfos(sigInfoElem); final CreateSignatureInfo createSignatureInfo = parseCreateSignatureInfo(sigInfoElem); boolean securityLayerConform; if (sigInfoElem.hasAttribute(SL_CONFORM_ATTR_NAME)) { securityLayerConform = BoolUtils.valueOf(sigInfoElem.getAttribute(SL_CONFORM_ATTR_NAME)); } else { securityLayerConform = true; } return factory.createSingleSignatureInfo( dataObjectInfos, createSignatureInfo, securityLayerConform); } /** * Parse the DataObjectInfo DOM elements contained in the given * SingleSignatureInfo DOM element. * * @param sigInfoElem The SingleSignatureInfo DOM element whose * DataObjectInfos to parse. * @return A List of DataObjectInfo API objects * containing the data from the DataObjectInfo DOM * elements. * @throws MOAApplicationException An error occurred parsing one of the * DataObjectInfos. */ private List parseDataObjectInfos(Element sigInfoElem) throws MOAApplicationException { final List dataObjectInfos = new ArrayList(); final NodeIterator dataObjInfoElems = XPathUtils.selectNodeIterator(sigInfoElem, DATA_OBJECT_INFO_XPATH); Element dataObjInfoElem; while ((dataObjInfoElem = (Element) dataObjInfoElems.nextNode()) != null) { dataObjectInfos.add(parseDataObjectInfo(dataObjInfoElem)); } return dataObjectInfos; } /** * Parse a DataObjectInfo DOM element. * * @param dataObjInfoElem The DataObjectInfo DOM element to parse. * @return A DataObjectInfo API element containing the data from * dataObjInfoElem. * @throws MOAApplicationException An error occurred parsing the * DataObjectInfo. */ private DataObjectInfo parseDataObjectInfo(Element dataObjInfoElem) throws MOAApplicationException { final String structure = dataObjInfoElem.getAttribute("Structure"); final Element dataObjectElem = (Element) XPathUtils.selectSingleNode(dataObjInfoElem, DATA_OBJECT_XPATH); final Content dataObject = RequestParserUtils.parseContent(dataObjectElem); final CreateTransformsInfoProfile createTransformsInfoProfile = parseCreateTransformsInfoProfile(dataObjInfoElem); boolean childOfManifest; if (dataObjInfoElem.hasAttribute("ChildOfManifest")) { childOfManifest = BoolUtils.valueOf(dataObjInfoElem.getAttribute("ChildOfManifest")); } else { childOfManifest = false; } return factory.createDataObjectInfo( structure, childOfManifest, dataObject, createTransformsInfoProfile); } /** * Parse a CreateTransformsInfoProfile DOM element. * * @param dataObjInfoElem The DataObjectInfo DOM element containing * the CreateTransformsInfoProfile. * @return The CreateTransformsInfoProfile API object containing * the profile found in dataObjInfoElem. * @throws MOAApplicationException An error occurred parsing the * CreateTransformsInfoProfile. */ private CreateTransformsInfoProfile parseCreateTransformsInfoProfile(Element dataObjInfoElem) throws MOAApplicationException { final Element profileElem = (Element) XPathUtils.selectSingleNode( dataObjInfoElem, CREATE_TRANSFORMS_INFO_PROFILE_XPATH); if ("CreateTransformsInfoProfile".equals(profileElem.getLocalName())) { final ProfileParser profileParser = new ProfileParser(); return profileParser.parseCreateTransformsInfoProfile(profileElem); } else { final String profileID = DOMUtils.getText(profileElem); return factory.createCreateTransformsInfoProfile(profileID); } } /** * Parse the CreateSignatureInfo DOM element contained in a * SingleSignatureInfo. * * @param sigInfoElem The SingleSignatureInfo DOM element * containing the CreateSignatureInfo to be * parsed. * @return A CreateSignatureInfo API object containing the data * from the CreateSignatureInfo DOM element, or * null, if none was found. */ private CreateSignatureInfo parseCreateSignatureInfo(Element sigInfoElem) { final Element createInfoElem = (Element) XPathUtils.selectSingleNode( sigInfoElem, CREATE_SIGNATURE_INFO_XPATH); if (createInfoElem != null) { final Element environmentElem = (Element) XPathUtils.selectSingleNode( createInfoElem, CREATE_SIGNATURE_ENVIRONMENT_XPATH); final Content environment = RequestParserUtils.parseContent(environmentElem); final CreateSignatureEnvironmentProfile environmentProfile = parseCreateSignatureEnvironmentProfile(createInfoElem); return factory.createCreateSignatureInfo(environment, environmentProfile); } else { return null; } } /** * Parse the CreateSignatureEnvironmentProfile contained in the * given CreateSignatureInfo DOM element. * * @param createInfoElem CreateSignatureInfo DOM element to parse. * @return The CreateSignatureEnvironmentProfile contained in the * given CreateSignatureInfo DOM element.. */ private CreateSignatureEnvironmentProfile parseCreateSignatureEnvironmentProfile(Element createInfoElem) { final Element profileElem = (Element) XPathUtils.selectSingleNode( createInfoElem, CREATE_SIGNATURE_ENVIRONMENT_PROFILE_XPATH); if ("CreateSignatureEnvironmentProfile" .equals(profileElem.getLocalName())) { final ProfileParser profileParser = new ProfileParser(); return profileParser.parseCreateSignatureEnvironmentProfile(profileElem); } else { final String profileID = DOMUtils.getText(profileElem); return factory.createCreateSignatureEnvironmentProfile(profileID); } } }