/*
* Copyright 2003 Federal Chancellery Austria
* MOA-ID 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.id.auth.validator.parep.config;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import at.gv.egovernment.moa.id.auth.validator.parep.ParepUtils;
import at.gv.egovernment.moa.id.auth.validator.parep.ParepValidator;
import at.gv.egovernment.moa.id.auth.validator.parep.PartyRepresentative;
import at.gv.egovernment.moa.id.config.ConfigurationException;
import at.gv.egovernment.moa.id.config.ConfigurationProvider;
import at.gv.egovernment.moa.id.config.ConnectionParameter;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.Constants;
/**
* This class implements the Configuration.
*
* @author Peter Danner
*/
public class ParepConfiguration {
//TODO: check correctness!!!!
/**
// * System property for config file.
// */
// public final static String PAREP_VALIDATOR_CONFIG = "parep.validator.config";
//
// /**
// * SZR-GW connection parameters.
// */
// private ConnectionParameter standardConnectionParameters;
//
// /**
// * Input field processor.
// */
// private String standardInputProcessorClass;
//
// /**
// * Input field processor template.
// */
// private String standardInputProcessorTemplate;
//
// /**
// * Configured party representatives.
// */
// private HashMap partyRepresentatives;
//
// /**
// * The configuration element.
// */
// private Element configElement = null;
//
// /**
// * Defines whether the user input form must be shown on each
// * request or not (also predefined mandates)
// */
// private boolean alwaysShowForm = false;
//
// /**
// * The configuration base directory.
// */
// private String baseDir_;
//
// /**
// * Gets the SZR-GW connection parameters.
// *
// * @return the connection parameters.
// */
// public ConnectionParameter getConnectionParameters(String representationID) {
// if (partyRepresentatives == null || "*".equals(representationID))
// return standardConnectionParameters;
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// ConnectionParameter connectionParameters = pr.getConnectionParameters();
// if (connectionParameters==null) connectionParameters = standardConnectionParameters;
// return connectionParameters;
// }
//
// /**
// * Sets the SZR-GW connection parameters for standard connection.
// *
// * @param connectionParameters
// * the connection parameters.
// */
// public void setStandardConnectionParameters(ConnectionParameter connectionParameters) {
// this.standardConnectionParameters = connectionParameters;
// }
//
// /*
// *
// */
// public String getFullDirectoryName(String fileString) {
// return makeAbsoluteURL(fileString, baseDir_);
// }
//
// /*
// *
// */
// private static String makeAbsoluteURL(String url, String root) {
// // if url is relative to rootConfigFileDirName make it absolute
//
// File keyFile;
// String newURL = url;
//
// if (null == url)
// return null;
//
// if (url.startsWith("http:/") || url.startsWith("https:/") || url.startsWith("ftp:/") || url.startsWith("file:/") || url.startsWith("file:\\")) {
// return url;
// } else {
// // check if absolute - if not make it absolute
// keyFile = new File(url);
// if (!keyFile.isAbsolute()) {
// keyFile = new File(root, url);
// newURL = keyFile.getPath();
// }
// return newURL;
// }
// }
//
// /**
// * Initializes the configuration with a given XML configuration element found
// * in the MOA-ID configuration.
// *
// * @param configElem
// * the configuration element.
// * @throws ConfigurationException
// * if an error occurs initializing the configuration.
// */
// public ParepConfiguration(Element configElem) throws ConfigurationException {
//
// partyRepresentatives = new HashMap();
// partyRepresentatives.put("*", new PartyRepresentative(true, true));
//
// String fileName = System.getProperty(ConfigurationProvider.CONFIG_PROPERTY_NAME);
//
// try {
//
// baseDir_ = (new File(fileName)).getParentFile().toURL().toString();
// Logger.trace("Config base directory: " + baseDir_);
// // check for configuration in system properties
// if (System.getProperty(PAREP_VALIDATOR_CONFIG) != null) {
// Document doc = ParepUtils.readDocFromIs(new FileInputStream(System.getProperty(PAREP_VALIDATOR_CONFIG)));
// this.configElement = doc.getDocumentElement();
// } else {
// this.configElement = configElem;
// }
// } catch (Exception e) {
// throw new ConfigurationException("Allgemeiner Fehler beim Einlesen der ParepValidatorConfiguration", null, e);
// }
// load();
// }
//
// /*
// *
// */
// private void load() throws ConfigurationException {
// Logger.debug("Parse ParepValidator Konfiguration");
// try {
// Element nameSpaceNode = configElement.getOwnerDocument().createElement("NameSpaceNode");
// nameSpaceNode.setAttribute("xmlns:" + Constants.MOA_ID_CONFIG_PREFIX, Constants.MOA_ID_CONFIG_NS_URI);
// // nameSpaceNode.setAttribute("xmlns:sgw",
// // SZRGWConstants.SZRGW_PROFILE_NS);
//
// Node inputProcessorNode = XPathAPI.selectSingleNode(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentation/"
// + Constants.MOA_ID_CONFIG_PREFIX + ":InputProcessor", nameSpaceNode);
// if (inputProcessorNode != null) {
// this.standardInputProcessorTemplate = ((Element) inputProcessorNode).getAttribute("template");
// Node inputProcessorClassNode = XPathAPI.selectSingleNode(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentation/"
// + Constants.MOA_ID_CONFIG_PREFIX + ":InputProcessor/text()", nameSpaceNode);
// if (inputProcessorClassNode != null) {
// this.standardInputProcessorClass = inputProcessorClassNode.getNodeValue();
// }
// }
// Node alwaysShowFormNode = XPathAPI.selectSingleNode(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentation/"
// + Constants.MOA_ID_CONFIG_PREFIX + ":AlwaysShowForm/text()", nameSpaceNode);
// if (alwaysShowFormNode != null) {
// this.setAlwaysShowForm(alwaysShowFormNode.getNodeValue());
// }
//
// // load connection parameters
// Logger.debug("Lade SZR-Gateway Standard Verbindungsparameter");
// Element connectionParamElement = (Element) XPathAPI.selectSingleNode(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentation/"
// + Constants.MOA_ID_CONFIG_PREFIX + ":ConnectionParameter", nameSpaceNode);
// if (connectionParamElement != null) {
// // parse connection parameters
// // ParepUtils.serializeElement(connectionParamElement, System.out);
// this.standardConnectionParameters = buildConnectionParameter(connectionParamElement, nameSpaceNode);
// }
//
// Logger.trace("Lade Konfiguration der Parteienvertreter");
// NodeList partyRepresentativeNodeList = XPathAPI.selectNodeList(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentation/"
// + Constants.MOA_ID_CONFIG_PREFIX + ":PartyRepresentative", nameSpaceNode);
// for (int i = 0; i < partyRepresentativeNodeList.getLength(); i++) {
//
// PartyRepresentative partyRepresentative = new PartyRepresentative();
//
// Element partyRepresentativeElement = (Element) partyRepresentativeNodeList.item(i);
// boolean representPhysicalParty = partyRepresentativeElement.getAttribute("representPhysicalParty").equalsIgnoreCase("true") ? true : false;
// boolean representCorporateParty = partyRepresentativeElement.getAttribute("representCorporateParty").equalsIgnoreCase("true") ? true : false;
// partyRepresentative.setOid(partyRepresentativeElement.getAttribute("oid"));
// partyRepresentative.setRepresentingPhysicalParty(representPhysicalParty);
// partyRepresentative.setRepresentingCorporateParty(representCorporateParty);
// partyRepresentative.setRepresentationText(partyRepresentativeElement.getAttribute("representationText"));
//
// Node inputProcessorSubNode = XPathAPI.selectSingleNode(partyRepresentativeElement, Constants.MOA_ID_CONFIG_PREFIX + ":InputProcessor", nameSpaceNode);
// if (inputProcessorSubNode != null) {
// partyRepresentative.setInputProcessorTemplate(((Element) inputProcessorSubNode).getAttribute("template"));
// Node inputProcessorClassSubNode = XPathAPI.selectSingleNode(partyRepresentativeElement, Constants.MOA_ID_CONFIG_PREFIX
// + ":InputProcessor/text()", nameSpaceNode);
// if (inputProcessorClassSubNode != null) {
// partyRepresentative.setInputProcessorClass(inputProcessorClassSubNode.getNodeValue());
// }
// }
//
// Element connectionParamSubElement = (Element) XPathAPI.selectSingleNode(partyRepresentativeElement, Constants.MOA_ID_CONFIG_PREFIX
// + ":ConnectionParameter", nameSpaceNode);
// if (connectionParamSubElement == null) {
// if (this.standardConnectionParameters == null) {
// throw new ConfigurationException("Fehler beim Parsen der ParepValidatorConfiguration: SZR-GW Verbindungsparameter zu Parteienvetreter "
// + partyRepresentative.getOid() + " fehlen.", null, null);
// }
// } else {
// // parse connection parameters
// // ParepUtils.serializeElement(connectionParamSubElement, System.out);
// partyRepresentative.setConnectionParameters(buildConnectionParameter(connectionParamSubElement, nameSpaceNode));
// }
// partyRepresentatives.put(partyRepresentative.getOid(), partyRepresentative);
// Logger.debug("Parteienvertreter: " + partyRepresentative.getOid() + " erfolgreich konfiguriert (representPhysicalParty="
// + partyRepresentative.isRepresentingPhysicalParty() + ", representCorporateParty=" + partyRepresentative.isRepresentingCorporateParty()
// + ", representationText=" + partyRepresentative.getRepresentationText()
// + ")");
// }
//
// Logger.debug("ParepValidator Konfiguration erfolgreich geparst.");
// } catch (Exception e) {
// throw new ConfigurationException("Allgemeiner Fehler beim Parsen der MandateValidatorConfiguration", null, e);
// }
// }
//
// /*
// *
// */
// private ConnectionParameter buildConnectionParameter(Element connParamElement, Element nameSpaceNode) throws ConfigurationException {
// try {
// ConnectionParameter connectionParameter = new ConnectionParameter();
//
// // parse connection url
// String URL = connParamElement.getAttribute("URL");
// connectionParameter.setUrl(URL);
//
// // accepted server certificates
// Node accServerCertsNode = XPathAPI.selectSingleNode(connParamElement, Constants.MOA_ID_CONFIG_PREFIX + ":AcceptedServerCertificates/text()",
// nameSpaceNode);
// if (accServerCertsNode != null) {
//
// String serverCertsDir = getFullDirectoryName(accServerCertsNode.getNodeValue());
// Logger.debug("Full directory name of accepted server certificates: " + serverCertsDir);
// connectionParameter.setAcceptedServerCertificates(serverCertsDir);
// }
//
// // client key store
// Node clientKeyStoreNode = XPathAPI.selectSingleNode(connParamElement, Constants.MOA_ID_CONFIG_PREFIX + ":ClientKeyStore/text()", nameSpaceNode);
// if (clientKeyStoreNode != null) {
// String clientKeystore = getFullDirectoryName(clientKeyStoreNode.getNodeValue());
// connectionParameter.setClientKeyStore(clientKeystore);
// }
//
// // client key store password
// Node clientKeyStorePasswordNode = XPathAPI.selectSingleNode(connParamElement, Constants.MOA_ID_CONFIG_PREFIX + ":ClientKeyStore/@password",
// nameSpaceNode);
// if (clientKeyStorePasswordNode != null) {
// connectionParameter.setClientKeyStorePassword(clientKeyStorePasswordNode.getNodeValue());
// }
//
// return connectionParameter;
// } catch (Exception e) {
// throw new ConfigurationException("Allgemeiner Fehler beim Parsen der ParepValidator ConnectionParameter.", null, e);
// }
// }
//
// public boolean isPartyRepresentative(String representationID) {
// if (partyRepresentatives == null)
// return false;
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// return pr != null;
// }
//
// public boolean isRepresentingCorporateParty(String representationID) {
// if (partyRepresentatives == null) return false;
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// if (pr == null) return false;
// return pr.isRepresentingCorporateParty();
// }
//
// public boolean isRepresentingPhysicalParty(String representationID) {
// if (partyRepresentatives == null) return false;
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// if (pr == null) return false;
// return pr.isRepresentingPhysicalParty();
// }
//
// public String getRepresentationText(String representationID) {
// String result = ParepValidator.STANDARD_REPRESENTATION_TEXT;
// if (partyRepresentatives != null) {
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// if (pr != null) {
// if (!ParepUtils.isEmpty(pr.getRepresentationText())) result = pr.getRepresentationText();
// }
// }
// return result;
// }
//
// /**
// * @return the input processor classname corresponding to representationID
// * @param representationID
// * the representation ID.
// */
// public String getInputProcessorClass(String representationID) {
// String inputProcessorClass = standardInputProcessorClass;
// if (ParepUtils.isEmpty(inputProcessorClass)) inputProcessorClass = ParepValidator.PAREP_INPUT_PROCESSOR;
// if (!(partyRepresentatives == null || "*".equals(representationID))) {
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// if (pr!=null) {
// String prInputProcessorClass = pr.getInputProcessorClass();
// if (!ParepUtils.isEmpty(prInputProcessorClass)) inputProcessorClass = prInputProcessorClass;
// }
// }
// return inputProcessorClass;
// }
//
// /**
// * @param standardInputProcessorClass the standardInputProcessorClass to set
// */
// public void setStandardInputProcessorClass(String standardInputProcessorClass) {
// this.standardInputProcessorClass = standardInputProcessorClass;
// }
//
// /**
// * @return the InputProcessorTemplate
// */
// public String getInputProcessorTemplate(String representationID) {
// String inputProcessorTemplate = standardInputProcessorTemplate;
// if (ParepUtils.isEmpty(inputProcessorTemplate)) inputProcessorTemplate = ParepValidator.PAREP_INPUT_TEMPLATE;
// if (!(partyRepresentatives == null || "*".equals(representationID))) {
// PartyRepresentative pr = (PartyRepresentative) partyRepresentatives.get(representationID);
// if (pr!=null) {
// String prInputProcessorTemplate = pr.getInputProcessorTemplate();
// if (!ParepUtils.isEmpty(prInputProcessorTemplate)) inputProcessorTemplate = prInputProcessorTemplate;
// }
// }
// return inputProcessorTemplate;
// }
//
// /**
// * @param standardInputProcessorTemplate the standardInputProcessorTemplate to set
// */
// public void setStandardInputProcessorTemplate(String standardInputProcessorTemplate) {
// this.standardInputProcessorTemplate = standardInputProcessorTemplate;
// }
//
// /**
// * @return the alwaysShowForm
// */
// public boolean isAlwaysShowForm() {
// return alwaysShowForm;
// }
//
// /**
// * @param alwaysShowForm the alwaysShowForm to set
// */
// public void setAlwaysShowForm(String alwaysShowForm) {
// if (ParepUtils.isEmpty(alwaysShowForm)) {
// this.alwaysShowForm = false;
// } else {
// this.alwaysShowForm = alwaysShowForm.equalsIgnoreCase("true");
// }
// }
//
// public static boolean isMandateCompatibilityMode(Element configElement) throws ConfigurationException {
// try {
// if (configElement==null) return false;
// Element nameSpaceNode = configElement.getOwnerDocument().createElement("NameSpaceNode");
// nameSpaceNode.setAttribute("xmlns:" + Constants.MOA_ID_CONFIG_PREFIX, Constants.MOA_ID_CONFIG_NS_URI);
// Node mandateCompatibilityNode = XPathAPI.selectSingleNode(configElement, Constants.MOA_ID_CONFIG_PREFIX + ":CompatibilityMode/text()", nameSpaceNode);
// if (mandateCompatibilityNode != null && !ParepUtils.isEmpty(mandateCompatibilityNode.getNodeValue())) {
// return mandateCompatibilityNode.getNodeValue().equalsIgnoreCase("true");
// }
// return false;
// } catch (Exception e) {
// throw new ConfigurationException("Allgemeiner Fehler beim Parsen des CompatibilityMode Parameters.", null, e);
// }
//
// }
//
//
//// public static void main(String[] args) throws Exception {
//// System.setProperty(PAREP_VALIDATOR_CONFIG, "c:/Doku/work/Organwalter/ConfigurationSnippetAppSpecific.xml");
//// System.setProperty("moa.id.configuration", "c:/workspace33moa/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/moa-id/SampleMOAWIDConfiguration_withTestBKsProxy.xml");
//// System.setProperty("log4j.configuration", "file:c:/workspace33moa/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/moa-id/log4j.properties");
//// Configuration cfg = new Configuration(null);
//// System.out.println(cfg.getInputProcessorClass("1.2.40.0.10.3.110"));
////}
}