org.gluu.authentication.remote.saml2.selector.ApplicationSelectorConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.gluu.authentication.remote.saml2.selector.ApplicationSelectorConfiguration.java

Source

/*
 * Asimba Server
 * 
 * Copyright (c) 2015, Gluu
 * Copyright (C) 2013 Asimba
 * Copyright (C) 2007-2008 Alfa & Ariss B.V.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see www.gnu.org/licenses
 * 
 * gluu-Asimba - Serious Open Source SSO - More information on www.gluu.org
 * 
 */
package org.gluu.authentication.remote.saml2.selector;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.gluu.asimba.util.ldap.LDAPUtility;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Configuration for application based selector
 * 
 * @author Yuriy Movchan Date: 16/05/2014
 */
public class ApplicationSelectorConfiguration {

    private static final Log log = LogFactory.getLog(ApplicationSelectorConfiguration.class);

    private final String CONFIGURATION_FILE_NAME = "asimba-selector.xml";

    private Map<String, String> applicationMapping;

    /**
     * Configuration file load mutex. 
     */
    private final ReentrantLock reloadLock = new ReentrantLock();
    private boolean isReload = false;

    private long lastModTime = -1;

    public ApplicationSelectorConfiguration() {
        this.applicationMapping = new HashMap<String, String>();
    }

    public void loadConfiguration() {
        this.applicationMapping = new HashMap<String, String>();

        String confFilePath = getConfigurationFilePath();
        if (confFilePath == null) {
            return;
        }

        File confFile = new File(confFilePath);
        if (this.lastModTime == confFile.lastModified()) {
            return;
        }

        loadFileSync(confFile);
    }

    public String getConfigurationFilePath() {
        final String homePath = LDAPUtility.getBaseDirectory();

        if (homePath == null) {
            log.error("Failed to load ApplicationSelector mapping from '" + CONFIGURATION_FILE_NAME
                    + "'. The environment variable gluu.home/catalina.home/jboss.home.dir isn't defined");
            return null;
        }

        String confPath = homePath + File.separator + "conf" + File.separator + "asimba" + File.separator
                + CONFIGURATION_FILE_NAME;
        log.info("Reading ApplicationSelector configuration from: " + confPath);

        return confPath;
    }

    private void loadFileSync(File confFile) {
        this.isReload = true;

        reloadLock.lock(); // block until condition holds
        try {
            if (!this.isReload) {
                return;
            }

            loadFile(confFile);
        } finally {
            reloadLock.unlock();
            this.isReload = false;
        }
    }

    private void loadFile(File confFile) {
        try {
            DocumentBuilderFactory fty = DocumentBuilderFactory.newInstance();
            fty.setNamespaceAware(true);
            DocumentBuilder builder = fty.newDocumentBuilder();
            Document xmlDoc = builder.parse(confFile);

            // Load mapping
            this.applicationMapping = loadIdpMapping(xmlDoc);
            this.lastModTime = confFile.lastModified();
        } catch (Exception ex) {
            log.error("Faield to load mapping configuration", ex);
        }
    }

    private Map<String, String> loadIdpMapping(Document xmlDoc) throws XPathExpressionException {
        Map<String, String> result = new HashMap<String, String>();
        XPath xPath = XPathFactory.newInstance().newXPath();

        XPathExpression query = xPath.compile("/asimba-selector/application");
        NodeList nodes = (NodeList) query.evaluate(xmlDoc, XPathConstants.NODESET);
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);

            Node entityIdNode = node.getAttributes().getNamedItem("entityId");
            if (entityIdNode == null) {
                continue;
            }

            Node organizationIdNode = node.getAttributes().getNamedItem("organizationId");
            if (organizationIdNode == null) {
                continue;
            }

            result.put(entityIdNode.getNodeValue(), organizationIdNode.getNodeValue());
        }

        return result;
    }

    public Map<String, String> getApplicationMapping() {
        return applicationMapping;
    }

}