Set<String> loginModuleNames = new HashSet<String>();
boolean atStart = true;
while ((atStart && xmlCursor.toFirstChild()) || (!atStart && xmlCursor.toNextSibling())) {
atStart = false;
XmlObject child = xmlCursor.getObject();
GerAbstractLoginModuleType abstractLoginModule = (GerAbstractLoginModuleType) child;
String controlFlag = abstractLoginModule.getControlFlag().toString();
boolean wrapPrincipals = (abstractLoginModule.isSetWrapPrincipals() && abstractLoginModule.getWrapPrincipals());
ReferencePatterns loginModuleReferencePatterns;
String name;
if (abstractLoginModule instanceof GerLoginModuleRefType) {
GerLoginModuleRefType loginModuleRef = (GerLoginModuleRefType) abstractLoginModule;
PatternType patternType = loginModuleRef.getPattern();
AbstractNameQuery loginModuleNameQuery = SingleGBeanBuilder.buildAbstractNameQuery(patternType, USE_REFERENCE_INFO);
loginModuleReferencePatterns = new ReferencePatterns(loginModuleNameQuery);
name = (String) loginModuleNameQuery.getName().get("name");
if (name == null) {
throw new DeploymentException("You must specify the name of the login module in the login module ref " + patternType);
}
//TODO configid reinstate this check for duplicate domain names
// try
// {
// String loginDomain = (String) context.getAttribute(loginModuleName, "loginDomainName");
// if (!loginModuleNames.add(loginDomain))
// {
// throw new DeploymentException("Security realm contains two login domains called '" + loginDomain + "'");
// }
// }
// catch (DeploymentException e)
// {
// throw e;
// }
// catch (Exception e)
// {
// throw new DeploymentException("Unable to create reference to login module " + name, e);
// }
} else if (abstractLoginModule instanceof GerLoginModuleType) {
//create the LoginModuleGBean also
AbstractName loginModuleName;
GerLoginModuleType loginModule = (GerLoginModuleType) abstractLoginModule;
name = trim(loginModule.getLoginDomainName());
if (!loginModuleNames.add(name)) {
throw new DeploymentException("Security realm contains two login domains called '" + name + "'");
}
String className = trim(loginModule.getLoginModuleClass());
Map<String, Object> options = new HashMap<String, Object>();
GerOptionType[] optionArray = loginModule.getOptionArray();
for (GerOptionType gerOptionType : optionArray) {
String key = gerOptionType.getName();
String value = trim(gerOptionType.getStringValue());
options.put(key, value);
}
XmlAttributeType[] xmlOptionArray = loginModule.getXmlOptionArray();
if (xmlOptionArray != null) {
for (XmlAttributeType xmlOptionType : xmlOptionArray) {
String key = xmlOptionType.getName().trim();
XmlObject[] anys = xmlOptionType.selectChildren(XmlAttributeType.type.qnameSetForWildcardElements());
if (anys.length != 1) {
throw new DeploymentException("Unexpected count of xs:any elements in xml-attribute " + anys.length + " qnameset: " + XmlAttributeType.type.qnameSetForWildcardElements());
}
String namespace = xmlObject.getDomNode().getNamespaceURI();
XmlAttributeBuilder builder = (XmlAttributeBuilder) xmlAttributeBuilderMap.get(namespace);
if (builder == null) {
throw new DeploymentException("No attribute builder deployed for namespace: " + namespace);
}
Object value = builder.getValue(anys[0], xmlOptionType, null, bundle);
options.put(key, value);
}
}
loginModuleName = naming.createChildName(parentName, name, SecurityNames.LOGIN_MODULE);
loginModuleReferencePatterns = new ReferencePatterns(loginModuleName);
GBeanData loginModuleGBeanData = new GBeanData(loginModuleName, LoginModuleGBean.GBEAN_INFO);
loginModuleGBeanData.setAttribute("loginDomainName", name);
loginModuleGBeanData.setAttribute("loginModuleClass", className);
loginModuleGBeanData.setAttribute("options", options);
loginModuleGBeanData.setAttribute("wrapPrincipals", wrapPrincipals);
context.addGBean(loginModuleGBeanData);
} else {
throw new DeploymentException("Unknown abstract login module type: " + abstractLoginModule.getClass());
}
AbstractName thisName;
thisName = naming.createChildName(parentName, name, "LoginModuleUse");
GBeanData loginModuleUseGBeanData = new GBeanData(thisName, JaasLoginModuleUse.GBEAN_INFO);
loginModuleUseGBeanData.setAttribute("controlFlag", getControlFlag(controlFlag));