org.openid4java.message.sreg.SRegRequest Maven / Gradle / Ivy
/*
* Copyright 2006-2008 Sxip Identity Corporation
*/
package org.openid4java.message.sreg;
import org.openid4java.message.MessageException;
import org.openid4java.message.Parameter;
import org.openid4java.message.ParameterList;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Implements the extension for Simple Registration fetch requests.
*
* @see SRegMessage Message
* @author Marius Scurtescu, Johnny Bufu
*/
public class SRegRequest extends SRegMessage
{
private static Log _log = LogFactory.getLog(SRegRequest.class);
private static final boolean DEBUG = _log.isDebugEnabled();
/**
* Constructs a SReg Request with an empty parameter list.
*/
protected SRegRequest()
{
if (DEBUG) _log.debug("Created empty SReg request.");
}
/**
* Constructs a SReg Request with an empty parameter list.
*/
public static SRegRequest createFetchRequest()
{
return new SRegRequest();
}
/**
* Constructs a SRegRequest from a parameter list.
*
* The parameter list can be extracted from a received message with the
* getExtensionParams method of the Message class, and MUST NOT contain
* the "openid.." prefix.
*/
protected SRegRequest(ParameterList params)
{
_parameters = params;
}
/**
* Constructs a SRegRequest from a parameter list.
*
* The parameter list can be extracted from a received message with the
* getExtensionParams method of the Message class, and MUST NOT contain
* the "openid.." prefix.
*/
public static SRegRequest createSRegRequest(ParameterList params)
throws MessageException
{
SRegRequest req = new SRegRequest(params);
if (! req.isValid())
throw new MessageException("Invalid parameters for a SReg request");
if (DEBUG)
_log.debug("Created SReg request from parameter list:\n" + params);
return req;
}
/**
* Adds an attribute to the SReg request.
*
* @param attr A requested attribute name.
* @param required If true, marks the attribute as 'required';
* 'if_available' otherwise.
*/
public void addAttribute(String attr, boolean required)
{
String level = required ? "required" : "optional";
Parameter levelParam = _parameters.getParameter(level);
Parameter newParam;
if (levelParam == null)
{
newParam = new Parameter(level, multivalEncode(attr));
}
else
{
newParam = new Parameter(level,
levelParam.getValue() + "," + multivalEncode(attr));
_parameters.removeParameters(level);
}
_parameters.set(newParam);
if (DEBUG) _log.debug("Added new attribute to SReg request: " + attr +
" required: " + required);
}
/**
* Returns a map with the requested attributes.
*
* @param required If set to true the list of 'required' attributes
* is returned, otherwise the list of 'optional'
* attributes.
* @return List of attribute names.
*/
public List getAttributes(boolean required)
{
List attributes = new ArrayList();
String level = required ? "required" : "optional";
Parameter param = _parameters.getParameter(level);
if (param != null)
{
String[] values = param.getValue().split(",");
for (int i = 0; i < values.length; i++)
{
String attr = multivalDecode(values[i]);
attributes.add(attr);
}
}
return attributes;
}
/**
* Gets all requested attributes (required and optional).
*
* @return List of attribute names.
*/
public List getAttributes()
{
List attributes = getAttributes(true);
attributes.addAll(getAttributes(false));
return attributes;
}
/**
* Sets the optional policy URL.
*
* @param policyUrl A URL which the Consumer provides to give the
* End User a place to read about the how the profile
* data will be used. The Identity Provider SHOULD
* display this URL to the End User if it is given.
*/
public void setPolicyUrl(String policyUrl) throws MessageException {
try
{
new URL(policyUrl);
} catch (MalformedURLException e)
{
throw new MessageException("Invalid policy_url: " + policyUrl);
}
if (DEBUG) _log.debug("Setting SReg request policy_url: " + policyUrl);
_parameters.set(new Parameter("policy_url", policyUrl));
}
/**
* Gets the optional policy URL parameter if available, or null otherwise.
*/
public String getUpdateUrl()
{
return _parameters.hasParameter("policy_url") ?
_parameters.getParameterValue("policy_url") : null;
}
/**
* Checks the validity of the extension.
*
* Used when constructing a extension from a parameter list.
*
* @return True if the extension is valid, false otherwise.
*/
public boolean isValid()
{
if ( ! _parameters.hasParameter("required") &&
! _parameters.hasParameter("optional") )
{
_log.warn("One of 'required' or 'optional' parameters must be present.");
return false;
}
Iterator it = _parameters.getParameters().iterator();
while (it.hasNext())
{
String paramName = ((Parameter) it.next()).getKey();
if (! paramName.equals("required") &&
! paramName.equals("optional") &&
! paramName.equals("policy_url"))
{
_log.warn("Invalid parameter name in SReg request: " + paramName);
// return false;
}
}
return true;
}
}