/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2007 Sun Microsystems Inc. All Rights Reserved * * 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 * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * 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 opensso/legal/CDDLv1.0.txt. * 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: FSAuthDomainsEditViewBean.java,v 1.3 2008/06/25 05:49:34 qcheng Exp $ * */ package com.sun.identity.console.federation; import com.iplanet.jato.RequestContext; import com.iplanet.jato.NavigationException; import com.iplanet.jato.model.ModelControlException; import com.iplanet.jato.view.View; import com.iplanet.jato.view.event.DisplayEvent; import com.iplanet.jato.view.event.RequestInvocationEvent; import com.sun.identity.console.base.AMPropertySheet; import com.sun.identity.console.base.model.AMAdminConstants; import com.sun.identity.console.base.model.AMConsoleException; import com.sun.identity.console.base.model.AMModelBase; import com.sun.identity.console.base.model.AMAdminUtils; import com.sun.identity.console.base.model.AMPropertySheetModel; import com.sun.identity.console.components.view.html.SerializedField; import com.sun.identity.console.delegation.model.DelegationConfig; import com.sun.identity.console.federation.model.FSAuthDomainsModel; import com.sun.identity.federation.common.IFSConstants; import com.sun.web.ui.view.addremove.CCAddRemove; import com.sun.web.ui.model.CCAddRemoveModel; import com.sun.web.ui.model.CCPageTitleModel; import com.sun.web.ui.view.alert.CCAlert; import com.sun.web.ui.view.html.CCTextField; import com.sun.web.ui.view.pagetitle.CCPageTitle; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; public class FSAuthDomainsEditViewBean extends FSAuthDomainsOpViewBeanBase { public static final String DEFAULT_DISPLAY_URL = "/console/federation/FSAuthDomainsEditViewBean.jsp"; private static final String PGTITLE_THREE_BTNS = "pgtitleThreeBtns"; private static final String PROPERTY_ATTRIBUTE = "propertyAttributes"; private AMPropertySheetModel propertySheetModel; private static final String ADD_REMOVE_PROVIDERS = "addRemoveProviders"; CCAddRemoveModel addRemoveModel; /** * Creates a authentication domains creation view bean. */ public FSAuthDomainsEditViewBean() { super("FSAuthDomainsEdit"); setDefaultDisplayURL(DEFAULT_DISPLAY_URL); } protected void initialize() { if (!initialized) { super.initialize(); initialized = true; createPageTitleModel(); createPropertyModel(); registerChildren(); } } public void forwardTo(RequestContext reqContext) throws NavigationException { String name = (String)getPageSessionAttribute( FSAuthDomainsModel.TF_NAME); if (name != null) { setDisplayFieldValue(FSAuthDomainsModel.TF_NAME, name); } super.forwardTo(reqContext); } protected void registerChildren() { super.registerChildren(); registerChild(FSAuthDomainsModel.TF_NAME, CCTextField.class); registerChild(PGTITLE_THREE_BTNS, CCPageTitle.class); registerChild(PROPERTY_ATTRIBUTE, AMPropertySheet.class); propertySheetModel.registerChildren(this); } protected View createChild(String name) { View view = null; if (name.equals(PGTITLE_THREE_BTNS)) { view = new CCPageTitle(this, ptModel, name); } else if (name.equals(PROPERTY_ATTRIBUTE)) { view = new AMPropertySheet(this, propertySheetModel, name); } else if (propertySheetModel.isChildSupported(name)) { view = propertySheetModel.createChild(this, name, getModel()); } else { view = super.createChild(name); } return view; } public void beginDisplay(DisplayEvent event) throws ModelControlException { super.beginDisplay(event); String name = (String)getDisplayFieldValue(FSAuthDomainsModel.TF_NAME); setPageSessionAttribute(FSAuthDomainsModel.TF_NAME, name); FSAuthDomainsModel model = (FSAuthDomainsModel)getModel(); try { String realm = model.getRealm(name); Map values = model.getAttributeValues(realm, name); AMPropertySheet ps = (AMPropertySheet)getChild(PROPERTY_ATTRIBUTE); ps.setAttributeValues(values, model); if(addRemoveModel==null){ addRemoveModel = new CCAddRemoveModel(); } Set providers = model.getAllProviderNames(realm); List selectedProviders = new ArrayList(model.getTrustedProviderNames(realm,name)); if ((selectedProviders != null) || (!selectedProviders.isEmpty())) { providers.removeAll(selectedProviders); Map displayNames = FSAuthDomainsOpViewBeanBase.getProviderDisplayNames( model, selectedProviders); addRemoveModel.setSelectedOptionList( createOptionList(replacePipeWithComma(displayNames))); } Map displayNames = FSAuthDomainsOpViewBeanBase.getProviderDisplayNames( model, providers); addRemoveModel.setAvailableOptionList( createOptionList(replacePipeWithComma(displayNames))); propertySheetModel.setModel(ADD_REMOVE_PROVIDERS, addRemoveModel); } catch (AMConsoleException e) { setInlineAlertMessage(CCAlert.TYPE_ERROR, "message.error", e.getMessage()); } } private void createPageTitleModel() { ptModel = new CCPageTitleModel( getClass().getClassLoader().getResourceAsStream( "com/sun/identity/console/threeBtnsPageTitle.xml")); ptModel.setValue("button1", "button.save"); ptModel.setValue("button2", "button.reset"); ptModel.setValue("button3", "button.back"); } private void createPropertyModel() { DelegationConfig dConfig = DelegationConfig.getInstance(); String startDN = AMModelBase.getStartDN( getRequestContext().getRequest()); boolean canModify = dConfig.hasPermission(startDN, null, AMAdminConstants.PERMISSION_MODIFY, getRequestContext().getRequest(), getClass().getName()); // TBD: need to have one propertysheet which is read_only String xmlFile = (canModify) ? "com/sun/identity/console/propertyCOTEdit.xml" : "com/sun/identity/console/propertyCOTEdit.xml"; propertySheetModel = new AMPropertySheetModel( getClass().getClassLoader().getResourceAsStream(xmlFile)); if(addRemoveModel==null) addRemoveModel = new CCAddRemoveModel(); propertySheetModel.setModel(ADD_REMOVE_PROVIDERS, addRemoveModel); propertySheetModel.clear(); } /** * Handles reset request. * * @param event Request invocation event */ public void handleButton2Request(RequestInvocationEvent event) { forwardTo(); } /** * Handles create authentication domains view bean. * * @param event Request invocation event */ public void handleButton1Request(RequestInvocationEvent event) throws ModelControlException { FSAuthDomainsModel model = (FSAuthDomainsModel)getModel(); String name = (String)getDisplayFieldValue(model.TF_NAME); AMPropertySheet ps = (AMPropertySheet)getChild(PROPERTY_ATTRIBUTE); try { String realm = model.getRealm(name); Map values = ps.getAttributeValues(model.getDataMap(), false,model); model.setAttributeValues(realm, name, values); SerializedField szCache = (SerializedField)getChild(SZ_CACHE); FederationViewBean vb = (FederationViewBean) getViewBean(FederationViewBean.class); CCAddRemove addRemoveList = (CCAddRemove)getChild(ADD_REMOVE_PROVIDERS); addRemoveList.restoreStateData(); CCAddRemoveModel addRemoveModel = (CCAddRemoveModel)addRemoveList.getModel(); List list = new ArrayList(getSelectedValues(addRemoveModel)); model.addProviders(realm,name,list); setInlineAlertMessage( CCAlert.TYPE_INFO, "message.information", "authentication.domain.updated"); forwardTo(); } catch (AMConsoleException e) { setInlineAlertMessage(CCAlert.TYPE_ERROR, "message.error", e.getMessage()); forwardTo(); } } protected String getBreadCrumbDisplayName() { String name = (String)getPageSessionAttribute( FSAuthDomainsModel.TF_NAME); String[] arg = {name}; FSAuthDomainsModel model = (FSAuthDomainsModel)getModel(); return MessageFormat.format(model.getLocalizedString( "breadcrumbs.federation.authdomains.edit"), arg); } /** * Handles cancel request. * * @param event Request invocation event */ public void handleButton3Request(RequestInvocationEvent event) { forwardToAuthDomainView(event); } protected boolean startPageTrail() { return false; } private Set getSelectedValues(CCAddRemoveModel addRemoveModel) { Set results = null; Set selected = getValues(addRemoveModel.getSelectedOptionList()); if ((selected != null) && !selected.isEmpty()) { results = new HashSet(selected.size() *2); for (Iterator iter = selected.iterator(); iter.hasNext(); ) { String n = (String)iter.next(); results.add(n.replace(',', '|')); } } return (results == null) ? Collections.EMPTY_SET : results; } /* TBD: need to move this function to a common location. * HACK. Introduce this hack because Lockhart use | as delimiter for * selected value in a add remove list. http://xxx.com|IDP liked entry * will be broken down into two entries insteads on one. * This hack here is to replace | with comma. */ private Map replacePipeWithComma(Map map) { if ((map != null) && !map.isEmpty()) { Map altered = new HashMap(map.size() *2); for (Iterator i = map.keySet().iterator(); i.hasNext(); ) { String key = (String)i.next(); altered.put(key.replace('|', ','), map.get(key)); } return altered; } else { return map; } } }