}
private XmlObject actionGeneratePlan(PortletRequest request, RealmData data) {
normalize(data);
ConfigurationDocument doc = ConfigurationDocument.Factory.newInstance();
ConfigurationType root = doc.addNewConfiguration();
root.setConfigId("SecurityRealm-"+data.getName());
// Use a parentId of null to pick up the default
// Dependencies
if(data.getJar() != null) {
DependencyType jar = root.addNewDependency();
jar.setUri(data.getJar());
}
// Build the realm GBean
GbeanType realm = root.addNewGbean();
realm.setName(data.getName());
realm.setClass1("org.apache.geronimo.security.realm.GenericSecurityRealm");
AttributeType realmName = realm.addNewAttribute();
realmName.setName("realmName");
realmName.setStringValue(data.getName());
ReferenceType serverInfo = realm.addNewReference();
serverInfo.setName2("ServerInfo");
serverInfo.setGbeanName(PortletManager.getCurrentServer(request).getServerInfo());
ReferenceType loginService = realm.addNewReference();
loginService.setName2("LoginService");
loginService.setGbeanName(PortletManager.getCurrentServer(request).getLoginService());
XmlAttributeType config = realm.addNewXmlReference();
// Construct the content to put in the XmlAttributeType
GerLoginConfigDocument lcDoc = GerLoginConfigDocument.Factory.newInstance();
GerLoginConfigType login = lcDoc.addNewLoginConfig();
for (int i = 0; i < data.getModules().length; i++) {
LoginModuleDetails details = data.getModules()[i];
if(details.getLoginDomainName() == null || details.getLoginDomainName().equals("")) {
continue;
}
GerLoginModuleType module = login.addNewLoginModule();
module.setControlFlag(details.getControlFlag().equals("OPTIONAL") ? GerControlFlagType.OPTIONAL :
details.getControlFlag().equals("REQUIRED") ? GerControlFlagType.REQUIRED :
details.getControlFlag().equals("REQUISITE") ? GerControlFlagType.REQUISITE :
details.getControlFlag().equals("SUFFICIENT") ? GerControlFlagType.SUFFICIENT :
GerControlFlagType.OPTIONAL);
module.setServerSide(details.isServerSide());
module.setLoginDomainName(details.getLoginDomainName());
module.setLoginModuleClass(details.getClassName());
module.setWrapPrincipals(details.isWrapPrincipals());
for (Iterator it = details.getOptions().entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
GerOptionType option = module.addNewOption();
option.setName((String) entry.getKey());
option.setStringValue((String) entry.getValue());
}
// bit of a hack -- to put the DataSource module in as a parent for SQL modules
if(details.getClassName().indexOf("SQL") > -1) {
String poolName = (String) details.getOptions().get("dataSourceName");
String appName = (String) details.getOptions().get("dataSourceApplication");
if(poolName != null) {
if(appName == null) appName = "null";
JCAManagedConnectionFactory[] factories = PortletManager.getOutboundFactoriesOfType(request, "javax.sql.DataSource");
for (int j = 0; j < factories.length; j++) {
JCAManagedConnectionFactory factory = factories[j];
try {
ObjectName objectName = ObjectName.getInstance(factory.getObjectName());
final String testName = objectName.getKeyProperty(NameFactory.J2EE_NAME);
final String testApp = objectName.getKeyProperty(NameFactory.J2EE_APPLICATION);
if(testName.equals(poolName) && testApp.equals(appName)) {
String moduleName = objectName.getKeyProperty(NameFactory.JCA_RESOURCE);
DependencyType imp = root.addNewImport();
imp.setUri(moduleName);
break;
}
} catch (MalformedObjectNameException e) {
log.error("Unable to parse ObjectName", e);