Implements the Referral interface. SampleReferral.java gets the referral policy decision from a text file SampleReferral.properties located in the /samples directory.
package com.sun.identity.samples.policy; import java.io.*; import java.util.*; import com.sun.identity.policy.*; import com.sun.identity.policy.interfaces.Referral; import com.iplanet.sso.SSOToken; import com.iplanet.sso.SSOException; import com.iplanet.am.util.SystemProperties; public class SampleReferral implements Referral { static final String SEPARATOR = ":"; static String PROPERTIES = "samples/policy/SampleReferral.properties"; static String INSTALL_DIR = SystemProperties.get("com.iplanet.am.installdir"); static Properties properties = new Properties(); private String _name; private Set _values; /** No argument constructor */ public SampleReferral() { } /**Initializes the referral with a map of Configuration parameters * @param configurationMap a map containing configuration * information. Each key of the map is a configuration * parameter. Each value of the key would be a set of values * for the parameter. The map is cloned and a reference to the * clone is stored in the referral */ public void initialize(Map configurationMap) { } /**Sets the name of this referral * @param name name of this referral */ private void setName(String name) { _name = name; } /**Gets the name of this referral * @return the name of this referral */ private String getName() { return _name; } /**Sets the values of this referral. * @param values a set of values for this referral * Each element of the set has to be a String * @throws InvalidNameException if any value passed in the * values is invalid */ public void setValues(Set values) throws InvalidNameException { _values = values; } /**Gets the values of this referral * @return the values of this referral * Each element of the set would be a String */ public Set getValues() { return _values; } /** * Returns the display name for the value for the given locale. * For all the valid values obtained through the methods * <code>getValidValues</code> this method must be called * by GUI and CLI to get the corresponding display name. * The <code>locale</code> variable could be used by the * plugin to customize * the display name for the given locale. * The <code>locale</code> variable * could be <code>null</code>, in which case the plugin must * use the default locale (most probabily en_US). * This method returns only the display name and should not * be used for the method <code>setValues</code>. * Alternatively, if the plugin does not have to localize * the value, it can just return the <code>value</code> as is. * * @param value one of the valid value for the plugin * @param locale locale for which the display name must be customized * * @exception NameNotFoundException if the given <code>value</code> * is not one of the valid values for the plugin */ public String getDisplayNameForValue(String value, Locale locale) throws NameNotFoundException { return value; } /**Gets the valid values for this referral * @param token SSOToken * @return <code>ValidValues</code> object * @throws SSOException, PolicyException */ public ValidValues getValidValues(SSOToken token) throws SSOException, PolicyException { return getValidValues(token, "*"); } /**Gets the valid values for this referral * matching a pattern * @param token SSOToken * @param pattern a pattern to match against the value * @return </code>ValidValues</code> object * @throws SSOException, PolicyException */ public ValidValues getValidValues(SSOToken token, String pattern) throws SSOException, PolicyException { Set values = new HashSet(); values.add(PROPERTIES); return (new ValidValues(ValidValues.SUCCESS, values)); } /**Gets the syntax for the value * @param token SSOToken * @see com.sun.identity.policy.Syntax */ public Syntax getValueSyntax(SSOToken token) throws SSOException, PolicyException { return (Syntax.SINGLE_CHOICE); } /**Gets the name of the ReferralType * @return name of the ReferralType representing this referral */ public String getReferralTypeName() { return "SampleReferral"; } /**Gets policy results * @param token SSOToken * @param resourceType resource type * @param resourceName name of the resource * @param actionNames a set of action names * @param envParameters a map of enivronment parameters. * Each key is an environment parameter name. * Each value is a set of values for the parameter. * @return policy decision * @throws SSOException * @throws PolicyException */ public PolicyDecision getPolicyDecision(SSOToken token, String resourceType, String resourceName, Set actionNames, Map envParameters) throws SSOException, PolicyException { PolicyDecision pd = new PolicyDecision(); Iterator elements = _values.iterator(); if (!elements.hasNext()) { return pd; } String fileName = (String)elements.next(); fileName = INSTALL_DIR + "/" + fileName; try { InputStream is = new FileInputStream(fileName); if (is == null) { return pd; } properties.load(is); } catch (Exception e) { return pd; } String serviceName = getProperty("servicename"); if (!serviceName.equals(resourceType)) { return pd; } String resName = getProperty("resourcename"); if (!resName.equals(resourceName)) { return pd; } List actionNameList = getPropertyValues("actionnames"); List actionValueList = getPropertyValues("actionvalues"); int numOfActions = actionNameList.size(); int numOfValues = actionValueList.size(); if ((numOfActions == 0 || (numOfValues == 0) || numOfActions != numOfValues)) { return pd; } Iterator namesIter = actionNameList.iterator(); Iterator valuesIter = actionValueList.iterator(); for (int i = 0; i < numOfActions; i++) { String actionName = (String)namesIter.next(); String actionValue = (String)valuesIter.next(); if (actionNames.contains(actionName)) { Set values = new HashSet(); values.add(actionValue); ActionDecision ad = new ActionDecision( actionName, values, null, Long.MAX_VALUE); pd.addActionDecision(ad); } } return pd; } private String getProperty(String key) { return properties.getProperty(key); } private List getPropertyValues(String name) { List values = new ArrayList(); String value = getProperty(name); if ( value != null ) { StringTokenizer st = new StringTokenizer(value, SEPARATOR); while ( st.hasMoreTokens() ) { values.add(st.nextToken()); } } return values; } /** Gets resource names rooted at the given resource name for the given * serviceType that could be governed by this referral * @param token ssoToken sso token * @param serviceTypeName service type name * @param rsourceName resource name * @return names of sub resources for the given resourceName. * The return value also includes the resourceName. * * @throws PolicyException * @throws SSOException */ public Set getResourceNames(SSOToken token, String serviceTypeName, String resourceName) throws PolicyException, SSOException { return null; } }