001: /*
002: * Copyright (c) 2005 Your Corporation. All Rights Reserved.
003: */
004: package com.technoetic.xplanner.security.module;
005:
006: import java.text.MessageFormat;
007: import java.util.ArrayList;
008: import java.util.HashMap;
009: import java.util.Iterator;
010: import java.util.List;
011:
012: import org.springframework.beans.BeansException;
013:
014: import com.technoetic.xplanner.XPlannerProperties;
015: import com.technoetic.xplanner.security.LoginModule;
016: import com.technoetic.xplanner.util.MainBeanFactory;
017:
018: public class LoginModuleLoader {
019: public static final String LOGIN_MODULE_PROPERTY_PREFIX = "xplanner.security.login";
020: public static final String LOGIN_MODULE_CLASS_KEY = LOGIN_MODULE_PROPERTY_PREFIX
021: + "[{0}].module";
022: public static final String LOGIN_MODULE_NAME_KEY = LOGIN_MODULE_PROPERTY_PREFIX
023: + "[{0}].name";
024: static final String LOGIN_OPTION_PREFIX = LOGIN_MODULE_PROPERTY_PREFIX
025: + "[{0}].option.";
026:
027: public LoginModule[] loadLoginModules()
028: throws ConfigurationException {
029: XPlannerProperties properties = new XPlannerProperties();
030: int idx = 0;
031: String loginModuleClassName;
032: List loginModuleList = new ArrayList();
033: while (true) {
034: loginModuleClassName = properties.getProperty(getKey(
035: LOGIN_MODULE_CLASS_KEY, idx));
036: if (loginModuleClassName == null)
037: break;
038:
039: String loginModuleName = properties.getProperty(getKey(
040: LOGIN_MODULE_NAME_KEY, idx));
041: if (loginModuleName == null) {
042: throw new ConfigurationException(
043: LoginModule.MESSAGE_NO_MODULE_NAME_SPECIFIED_ERROR_KEY);
044: }
045: HashMap options = getOptions(properties, idx);
046: loginModuleList.add(createModule(loginModuleClassName,
047: loginModuleName, options));
048: idx++;
049: }
050: return (LoginModule[]) loginModuleList
051: .toArray(new LoginModule[] {});
052: }
053:
054: private LoginModule createModule(String loginModuleClassName,
055: String loginModuleName, HashMap options) {
056: LoginModule loginModule;
057: try {
058: Object bean = MainBeanFactory.getBean(loginModuleClassName);
059: if (bean instanceof LoginModuleFactory) {
060: LoginModuleFactory factory = (LoginModuleFactory) bean;
061: loginModule = factory.newInstance(options);
062: } else {
063: loginModule = (LoginModule) bean;
064: }
065: loginModule.setName(loginModuleName);
066: loginModule.setOptions(options);
067: } catch (BeansException e) {
068: throw new ConfigurationException(e);
069: }
070: return loginModule;
071: }
072:
073: private HashMap getOptions(XPlannerProperties properties, int idx) {
074: HashMap options = new HashMap();
075: Iterator propertyNames = properties.getPropertyNames();
076: while (propertyNames.hasNext()) {
077: String name = (String) propertyNames.next();
078: String optionName = MessageFormat.format(
079: LOGIN_OPTION_PREFIX, new Integer[] { new Integer(
080: idx) });
081: if (name.startsWith(optionName)) {
082: options.put(name.substring(optionName.length()),
083: properties.getProperty(name));
084: }
085: }
086: return options;
087: }
088:
089: public static String[] getLoginModuleNames() {
090: XPlannerProperties properties = new XPlannerProperties();
091: List loginModuleNameList = new ArrayList();
092: for (int i = 0; properties.getProperty(getKey(
093: LOGIN_MODULE_NAME_KEY, i)) != null; i++) {
094: loginModuleNameList.add(properties.getProperty(getKey(
095: LOGIN_MODULE_NAME_KEY, i)));
096: }
097: return (String[]) loginModuleNameList.toArray(new String[] {});
098: }
099:
100: private static String getKey(String propertyKey, int i) {
101: return MessageFormat.format(propertyKey,
102: new Integer[] { new Integer(i) });
103: }
104:
105: }
|