/* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://www.sun.com/cddl/cddl.html or
* install_dir/legal/LICENSE
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at install_dir/legal/LICENSE.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id$
*
* Copyright 2005-2009 Sun Microsystems Inc. All Rights Reserved
*/
package com.sun.faban.harness.engine;
import com.sun.faban.harness.common.Config;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* The Faban harness login configuration object.
*/
public class LoginConfiguration extends Configuration {
Logger logger = Logger.getLogger(getClass().getName());
AppConfigurationEntry[] entries = new AppConfigurationEntry[1];
/**
* Reads the login configuration from a DOM tree.
* @param root The root node
* @param xPath An xpath instance
* @throws XPathExpressionException If there is an error in the xpath
*/
public void readConfig(Node root, XPath xPath)
throws XPathExpressionException {
Node loginModule = (Node) xPath.evaluate("security/loginModule", root,
XPathConstants.NODE);
String moduleName = xPath.evaluate("class", loginModule);
logger.fine("Login module: " + moduleName);
Map<String, String> options = new HashMap<String, String>();
NodeList propNodes = (NodeList) xPath.evaluate("property", loginModule,
XPathConstants.NODESET);
for (int i = 0; i < propNodes.getLength(); i++) {
Node propNode = propNodes.item(i);
String name = xPath.evaluate("name", propNode);
String value = xPath.evaluate("value", propNode);
logger.fine("Property: " + name + '=' + value);
options.put(name, value);
}
entries[0] = new AppConfigurationEntry(moduleName,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
}
/**
* Retrieve the AppConfigurationEntries for the specified <i>name</i>
* from this Configuration.
* <p/>
* <p/>
*
* @param name the name used to index the Configuration.
* @return an array of AppConfigurationEntries for the specified <i>name</i>
* from this Configuration, or null if there are no entries
* for the specified <i>name</i>
*/
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
return entries;
}
/**
* Refresh and reload the Configuration.
* <p/>
* <p> This method causes this Configuration object to refresh/reload its
* contents in an implementation-dependent manner.
* For example, if this Configuration object stores its entries in a file,
* calling <code>refresh</code> may cause the file to be re-read.
* <p/>
* <p/>
*
* @throws SecurityException if the caller does not have permission
* to refresh its Configuration.
*/
public void refresh() {
try {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().
newDocumentBuilder();
XPath xPath = XPathFactory.newInstance().newXPath();
Node root = parser.parse(new File(Config.CONFIG_DIR +
"harness.xml")).getDocumentElement();
readConfig(root, xPath);
} catch (Exception e) {
Logger logger = Logger.getLogger(getClass().getName());
logger.log(Level.SEVERE, "Error refreshing login configuration.",
e);
}
}
}