package org.nightlabs.jfire.auth.ui;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.nightlabs.base.ui.entity.editor.EntityEditor;
import org.nightlabs.base.ui.wizard.DynamicPathWizard;
import org.nightlabs.base.ui.wizard.IWizardHop;
import org.nightlabs.eclipse.extension.AbstractEPProcessor;
import org.nightlabs.jfire.auth.ui.editor.IUserSecurityGroupSyncConfigDelegate;
import org.nightlabs.jfire.auth.ui.editor.UserManagementSystemEditor;
import org.nightlabs.jfire.auth.ui.editor.UserSecurityGroupEditorSyncConfigPage;
import org.nightlabs.jfire.security.integration.UserManagementSystemType;
/**
* Registry for org.nightlabs.jfire.auth.ui.userManagementSystemUIMapping extension point.
*
* @author Denis Dudnik <deniska.dudnik[at]gmail{dot}com>
*
*/
public class UserManagementSystemUIMappingRegistry extends AbstractEPProcessor{
public static final String EXTENSION_POINT_ID = "org.nightlabs.jfire.auth.ui.userManagementSystemUIMapping"; //$NON-NLS-1$
/**
* Lazily instantiated shared instance.
*/
private static UserManagementSystemUIMappingRegistry sharedInstance = null;
/**
* Get the lazily created shared instance.
* @return The shared instance
*/
public static UserManagementSystemUIMappingRegistry sharedInstance(){
if (sharedInstance == null){
sharedInstance = new UserManagementSystemUIMappingRegistry();
}
return sharedInstance;
}
private UserManagementSystemUIMappingRegistry() { }
/**
* {@link Map} for holding class names of {@link EntityEditor} page factories for every {@link UserManagementSystemType} specific class.
*/
private Map<Class<? extends UserManagementSystemType<?>>, Set<String>> pageFactoriesByClass = new HashMap<Class<? extends UserManagementSystemType<?>>, Set<String>>();
/**
* {@link Map} for holding a {@link IWizardHop}s for every {@link UserManagementSystemType} specific class.
*/
private Map<Class<? extends UserManagementSystemType<?>>, Map<Class<? extends DynamicPathWizard>, Class<? extends IWizardHop>>> wizardHopsByClass = new HashMap<Class<? extends UserManagementSystemType<?>>, Map<Class<? extends DynamicPathWizard>,Class<? extends IWizardHop>>>();
/**
* {@link Map} for holding class implementing {@link IUserSecurityGroupSyncConfigDelegate}s for every {@link UserManagementSystemType} specific class.
*/
private Map<Class<? extends UserManagementSystemType<?>>, Class<? extends IUserSecurityGroupSyncConfigDelegate>> userGroupSyncConfigDelgatesByClass = new HashMap<Class<? extends UserManagementSystemType<?>>, Class<? extends IUserSecurityGroupSyncConfigDelegate>>();
/**
* Get class names of {@link EntityEditor} page factories by specific {@link UserManagementSystemType} class.
* These class names are then used for filtering {@link UserManagementSystemEditor} pages.
*
* @param userManagementSystemTypeClass Class of specific {@link UserManagementSystemType}
* @return {@link Set} of class names for page factories
*/
public Set<String> getPageFactoryClassNames(Class<? extends UserManagementSystemType<?>> userManagementSystemTypeClass){
checkProcessing();
return pageFactoriesByClass==null ? null : pageFactoriesByClass.get(userManagementSystemTypeClass);
}
/**
* Get {@link IWizardHop} for specified {@link DynamicPathWizard} by specific {@link UserManagementSystemType} class.
*
* @param userManagementSystemTypeClass Class of specific {@link UserManagementSystemType}
* @param wizardClass Class of specific {@link DynamicPathWizard}
* @return instance of {@link IWizardHop}
*/
public IWizardHop getWizardHop(Class<? extends UserManagementSystemType<?>> userManagementSystemTypeClass,
Class<? extends DynamicPathWizard> wizardClass){
checkProcessing();
try{
if (wizardHopsByClass.get(userManagementSystemTypeClass) instanceof Map){
Class<? extends IWizardHop> hopClass = wizardHopsByClass.get(userManagementSystemTypeClass).get(wizardClass);
return hopClass != null ? hopClass.newInstance() : null;
}
return null;
}catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* Get {@link IUserSecurityGroupSyncConfigDelegate} by specific {@link UserManagementSystemType} class.
* These delegate is then used for creating UI in {@link UserSecurityGroupEditorSyncConfigPage}.
*
* @param userManagementSystemTypeClass Class of specific {@link UserManagementSystemType}
* @return new {@link IUserSecurityGroupSyncConfigDelegate} instance
*/
public IUserSecurityGroupSyncConfigDelegate getUserGroupSyncConfigDelegate(Class<? extends UserManagementSystemType<?>> userManagementSystemTypeClass){
checkProcessing();
Class<? extends IUserSecurityGroupSyncConfigDelegate> delegateClass = userGroupSyncConfigDelgatesByClass==null ? null : userGroupSyncConfigDelgatesByClass.get(userManagementSystemTypeClass);
try{
return delegateClass != null ? delegateClass.newInstance() : null;
}catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public String getExtensionPointID(){
return EXTENSION_POINT_ID;
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
@Override
public void processElement(IExtension extension, IConfigurationElement element) throws Exception{
if ("userManagementSystemType".equalsIgnoreCase(element.getName())) { //$NON-NLS-1$
Class<? extends UserManagementSystemType<?>> userManagementSystemTypeClass = (Class<? extends UserManagementSystemType<?>>) Class.forName(element.getAttribute("class")); //$NON-NLS-2$
if (pageFactoriesByClass.get(userManagementSystemTypeClass) == null){
pageFactoriesByClass.put(userManagementSystemTypeClass, new HashSet<String>());
}
IConfigurationElement[] children = element.getChildren();
for (IConfigurationElement child : children) {
if ("pageFactoryMapping".equalsIgnoreCase(child.getName())){ //$NON-NLS-3$
pageFactoriesByClass.get(userManagementSystemTypeClass).add(child.getAttribute("class")); //$NON-NLS-4$
}else if ("wizardHopMapping".equalsIgnoreCase(child.getName())){ //$NON-NLS-5$
Class<? extends IWizardHop> hopClass = (Class<? extends IWizardHop>) Class.forName(child.getAttribute("class"));
Class<? extends DynamicPathWizard> wizardClass = (Class<? extends DynamicPathWizard>) Class.forName(child.getAttribute("wizardClass"));
if (wizardHopsByClass.get(userManagementSystemTypeClass) instanceof Map){
wizardHopsByClass.get(userManagementSystemTypeClass).put(wizardClass, hopClass);
}else{
HashMap<Class<? extends DynamicPathWizard>, Class<? extends IWizardHop>> wizardHops = new HashMap<Class<? extends DynamicPathWizard>, Class<? extends IWizardHop>>();
wizardHops.put(wizardClass, hopClass);
wizardHopsByClass.put(userManagementSystemTypeClass, wizardHops);
}
}else if ("userSecurityGroupSyncConfigMapping".equalsIgnoreCase(child.getName())){ //$NON-NLS-3$
userGroupSyncConfigDelgatesByClass.put(
userManagementSystemTypeClass,
(Class<? extends IUserSecurityGroupSyncConfigDelegate>) Class.forName(child.getAttribute("class"))); //$NON-NLS-4$
}
}
}
}
}