References: https://docs.oracle.com/cd/E19225-01/820-5597/ahvap/index.html
https://docs.oracle.com/cd/E19225-01/820-5597/ahvch/index.html
1. The necessary JAR files can be found in "$WSHOME//WEB-INF/lib" directory. The following JAR files are needed to built SIM SPML applications:
- openspml.jar
- mail.jar
- soap.jar
2. Given below is sample JAVA code to demonstrate the use of SPML client:
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openspml.client.LighthouseClient;
import org.openspml.message.ExtendedRequest;
import org.openspml.message.FilterTerm;
import org.openspml.message.ModifyRequest;
import org.openspml.message.SearchRequest;
import org.openspml.message.SearchResponse;
import org.openspml.message.SearchResult;
import org.openspml.message.SpmlResponse;
import org.openspml.util.SpmlException;
/**
* Sun Identity Manager: SPML Client
* Test class for demonstration purposes
* @author oracle
*/
public class SIMSPMLClient
{
// SIM environment information
private static final String simServiceAccountUser = "configurator";
private static final String simServiceAccountPassword = "configurator";
private static final String simPort = "8080";
private static final String simHostname = "localhost";
private static final String simWebServiceURL = "http://" + simHostname + ":" + simPort +"/idm/servlet/rpcrouter2";
// Class logger
private static final Logger logger = Logger.getLogger(SIMSPMLClient.class.getName());
/**
* Test Driver
* @param args
*/
public static void main(String[] args)
{
LighthouseClient client = null;
String accountId = null;
String resourceAccountName = "Database Table";
try
{
// Setup SIM SMPL client
client = new LighthouseClient();
client.setUrl(simWebServiceURL);
client.setUser(simServiceAccountUser);
client.setPassword(simServiceAccountPassword);
// Call method to modify user attributes
accountId = "jdoe";
HashMap<String, Object> modAttrs = new HashMap<String, Object>();
modAttrs.put("email", "jdoe@gmail.com");
modAttrs.put("status", "Active");
modifyUserAttributes(client, accountId, modAttrs);
// Provision target resource
accountId = "gbass";
HashMap<String, Object> resAttrs = new HashMap<String, Object>();
resAttrs.put("resources", "Database Table"); //delimited by comma
resAttrs.put("status", "Created");
//modifyUserAttributes(client, accountId, resAttrs);
// Deprovision target resource, but does not remove assignment in SIM
ExtendedRequest dreq = new ExtendedRequest();
dreq.setOperationIdentifier("deleteUser");
dreq.setAttribute("accountId","gbass");
dreq.setAttribute("accounts","Database Table");
//SpmlResponse res = client.request(dreq);
//System.out.println(res.getResult());
// Deprovision target resources and removes assignment
HashMap<String, Object> resRmAttrs = new HashMap<String, Object>();
resAttrs.put("resources", "");
//modifyUserAttributes(client, accountId, resRmAttrs);
// Call custom workflow
String simWorkFlowName = "Custom-Workflow";
String username = "jmann";
HashMap<String, Object> wfAttrs = new HashMap<String, Object>();
wfAttrs.put("ACTION", "MODIFY");
wfAttrs.put("__UID__", username);
wfAttrs.put("__NAME__", username);
wfAttrs.put("__PASSWORD__", "jmann");
wfAttrs.put("EMAIL", "jmann8@gmail.com");
wfAttrs.put("LASTNAME", "");
wfAttrs.put("USERNAME", username);
//callSimWorkFlow(client, simWorkFlowName, wfAttrs);
// Disable resource account
accountId = "gbass";
//disableResourceAccount(client, accountId, resourceAccountName);
// Enable resource account
//enableResourceAccount(client, accountId, resourceAccountName);
// Create SIM account
HashMap<String, String> attrs = new HashMap<String,String>();
attrs.put("lastname", "Parker");
attrs.put("firstname", "Peter");
attrs.put("email", "pparker@gmail.com");
attrs.put("password","Password1");
//client.createUser("pparker", attrs);
// Delete SIM account
List<String> accounts = new ArrayList<String>();
//client.deleteUser("pparker", accounts);
// Search SIM User based on accountId
SearchRequest req = new SearchRequest();
req.addAttribute("lastname");
req.addAttribute("email");
FilterTerm ft = new FilterTerm();
ft.setOperation(FilterTerm.OP_EQUAL);
ft.setName("accountId");
ft.setValue("jdoe");
req.addFilterTerm(ft);
SearchResponse res = (SearchResponse)client.request(req);
System.out.println(res.getResults());
List results = res.getResults();
if (results != null)
{
for (int i = 0 ; i < results.size() ; i++)
{
SearchResult sr = (SearchResult) results.get(i);
System.out.println("Identifier=" + sr.getIdentifierString() + " sn=" + sr.getAttribute("lastname").getValue() + " email=" + sr.getAttribute("email").getValue());
}
}
}
catch (SpmlException ex)
{
logger.log(Level.SEVERE, null, ex);
}
catch (MalformedURLException ex)
{
logger.log(Level.SEVERE, null, ex);
}
finally
{
if (client != null)
{
try
{
client.logout();
}
catch (SpmlException ex)
{
logger.log(Level.SEVERE, null, ex);
}
}
}
}
/**
* Modification request to modify attributes on a user.
* SIM user attributes and resource attributes can be modified by this method.
* Also provisioning of resource account can be made.
* @param client SPML client with service account logged in
* @param accountId Identifier to match against SIM account and make modifications
* @param attributes Attributes to modify on user
* @return SIM SPML response
* @throws SpmlException
*/
public static SpmlResponse modifyUserAttributes(LighthouseClient client, String accountId, Map<String, Object> attributes) throws SpmlException
{
// Create a request to send to SIM
ModifyRequest req = new ModifyRequest();
req.setIdentifier(accountId);
// SIM attributes to modify
for (Map.Entry<String, Object> entry : attributes.entrySet())
{
req.addModification(entry.getKey(), entry.getValue());
}
// Send request to SIM and SIM sends a response back
SpmlResponse response = client.request(req);
logger.log(Level.INFO, "Response Code: {0}", new Object[] {response.getResult()});
return response;
}
/**
* Call a SIM work flow to be executed.
* @param client SPML client with service account logged in
* @param workflow Name of SIM work flow
* @param attributes Attributes includes accountId to be processed by work flow
* @return SIM SPML response
* @throws SpmlException
*/
public static SpmlResponse callSimWorkFlow(LighthouseClient client, String workFlowName, Map<String, Object> attributes) throws SpmlException
{
// Create a request to send to SIM
ExtendedRequest req = new ExtendedRequest();
req.setOperationIdentifier("launchProcess");
req.setAttribute("process", workFlowName);
// SIM attributes to sent to work flow
for (Map.Entry<String, Object> entry : attributes.entrySet())
{
req.setAttribute(entry.getKey(), entry.getValue());
}
// Send request to SIM and SIM sends a response back
SpmlResponse response = client.request(req);
logger.log(Level.INFO, "Response Code: {0}", new Object[] {response.getResult()});
return response;
}
/**
* Disables a resource account in SIM
* @param client SPML client with service account logged in
* @param accountId SIM user whose resource account is going to be disabled
* @param accountName Resource account to disable
* @return
* @throws SpmlException
*/
public static SpmlResponse disableResourceAccount(LighthouseClient client, String accountId, String accountName) throws SpmlException
{
ExtendedRequest req = new ExtendedRequest();
req.setOperationIdentifier("disableUser");
req.setAttribute("accountId", accountId);
req.setAttribute("accounts", accountName);
SpmlResponse response = client.request(req);
logger.log(Level.INFO, "Response Code: {0}", new Object[] {response.getResult()});
return response;
}
/**
* Enable a resource account in SIM
* @param client SPML client with service account logged in
* @param accountId SIM user whose resource account is going to be disabled
* @param accountName Resource account to disable
* @return
* @throws SpmlException
*/
public static SpmlResponse enableResourceAccount(LighthouseClient client, String accountId, String accountName) throws SpmlException
{
ExtendedRequest req = new ExtendedRequest();
req.setOperationIdentifier("enableUser");
req.setAttribute("accountId", accountId);
req.setAttribute("accounts", accountName);
SpmlResponse response = client.request(req);
logger.log(Level.INFO, "Response Code: {0}", new Object[] {response.getResult()});
return response;
}
}






























