8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: SMSJAXRPCObjectImpl.java,v 1.22 2009/10/28 04:24:27 hengming Exp $
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts * Portions Copyrighted 2010-2016 ForgeRock AS.
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpottsimport static org.forgerock.openam.utils.Time.*;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.server.PLLServer;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.server.SendNotificationException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.share.Notification;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.share.NotificationSet;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport com.iplanet.services.naming.ServerEntryNotFoundException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.common.CaseInsensitiveHashMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSNotificationManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceAttributeValidator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class SMSJAXRPCObjectImpl implements SMSObjectIF, SMSObjectListener {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static Debug debug = Debug.getInstance("amSMSServerImpl");
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper static Map<String, URL> notificationURLs = new HashMap<String, URL>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Cache of modified DNs for the last 30 minutes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static LinkedList cacheIndices = new LinkedList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Default constructor
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Empty constructor to avoid bootstraping when JAX-RPC
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // initialized this object on the Serve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Initialization to register the callback handler
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Unable to get SSO Token Manager");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Register for notifications & polling cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Registered for notifications");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Obtain the cache size, if configured
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Constants.EVENT_LISTENER_REMOTE_CLIENT_BACKLOG_CACHE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "EventNotification cache size is set to " + cacheSize);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct server URL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String namingURL = SystemProperties.get(Constants.AM_NAMING_URL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int index = namingURL.toLowerCase().indexOf("/namingservice");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL = SystemProperties.getServerInstanceName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((serverURL == null) || (serverURL.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("SMSJAXRPCObjectImpl.init Server URL IS NULL");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl.init ServerURL: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Method to check if service is local and also to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // test if the server is down
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the attribute names and values of the provided object using the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * identity of the provided SSO Token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Map read(String tokenID, String objName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::read dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (objName.equals("o=" + SMSJAXRPCObject.AMJAXRPCVERSIONSTR)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes.put(SMSJAXRPCObject.AMJAXRPCVERSIONSTR,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry ce = CachedSMSEntry.getInstance(getToken(tokenID),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((attrs != null) && (attrs instanceof CaseInsensitiveHashMap)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator items = attrs.keySet().iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else { // could be null or instance of HashMap - return as it is.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Creates an entry in the persistent store. Throws an exception if the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * entry already exists
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void create(String tokenID, String objName, Map attributes)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::create dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Modifies the attributes to the object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void modify(String tokenID, String objName, String mods)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::modify dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Delete the entry in the datastore. This should delete sub-entries also
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void delete(String tokenID, String objName) throws SMSException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::delete dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the suborganization names. Returns a set of SMSEntry objects that
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * are suborganization names. The paramter <code>numOfEntries</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * identifies the number of entries to return, if code>0</code> returns
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * all the entries.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set searchSubOrgNames(String tokenID, String dn, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, boolean sortResults, boolean ascendingOrder,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean recursive) throws SMSException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::searchSubOrgNames dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.searchSubOrgNames(getToken(tokenID), filter, recursive));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the organization names. Returns a set of SMSEntry objects that
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * are organization names. The paramter <code>numOfEntries</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * identifies the number of entries to return, if <code>0</code> returns
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * all the entries.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set searchOrganizationNames(String tokenID, String dn,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, boolean sortResults, boolean ascendingOrder,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String attrName, Set values)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::searchOrganizationNames dn: "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.searchOrgNames(getToken(tokenID), serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the sub-entries. Returns a set of SMSEntry objects that are
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * sub-entries. The paramter <code>numOfEntries</code> identifies the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * number of entries to return, if <code>0</code> returns all the entries.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set subEntries(String tokenID, String dn, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, boolean sortResults, boolean ascendingOrder)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::subentries dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.getSubEntries(getToken(tokenID), filter));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the sub-entries matching the schema id. Returns a set of SMSEntry
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * objects that are sub-entries for the provided schema id. The paramter
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>numOfEntries</code> identifies the number of entries to return,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if <code>0</code> returns all the entries.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set schemaSubEntries(String tokenID, String dn, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String sidFilter, int numOfEntries, boolean sortResults, boolean ao)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::subentries dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.getSchemaSubEntries(getToken(tokenID), filter, sidFilter));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searchs the data store for objects that match the filter
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search(String tokenID, String startDN, String filter)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (SMSEntry.search(getToken(tokenID), startDN, filter, 0, 0,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster false, false));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searchs the data store for objects that match the filter
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search2(String tokenID, String startDN, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, int timeLimit, boolean sortResults,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (SMSEntry.search(getToken(tokenID), startDN, filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster numOfEntries, timeLimit, sortResults, ascendingOrder));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searches the data store for objects that match the filter with an exclude set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search3(String tokenID, String startDN, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, int timeLimit, boolean sortResults,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter + " excludes: " + excludes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator i = SMSEntry.search(getToken(tokenID), startDN, filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster numOfEntries, timeLimit, sortResults, ascendingOrder, excludes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (i.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("SMSJAXRPCObjectImpl::problem performing search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter + " excludes: " + excludes, ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Checks if the provided DN exists. Used by PolicyManager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean entryExists(String tokenID, String objName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::exists dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean entryExists = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry ce = CachedSMSEntry.getInstance(getToken(tokenID),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entryExists = !(ce.getSMSEntry().isNewEntry());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Ignore the exception
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the root suffix (i.e., base DN) for the SMS objects. All
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * SMSEntries will end with this root suffix.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getRootSuffix() throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the root suffix (i.e., amsdkbase DN) for the UMS objects.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * All UMSEntries will end with this root suffix.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getAMSdkBaseDN() throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Validates service configuration attributes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token Single Sign On token.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param validatorClass validator class name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param values Values to be validated.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return <code>true</code> of values are valid.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SMSException if value is not valid.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if single sign on token is in valid.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws RemoteException if remote method cannot be invoked.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::validateServiceAttributes: " +
b13c7a4fcbf2a0eb86870a78014fc49ca5a88a65Neil Madden ServiceAttributeValidator v = (ServiceAttributeValidator) clazz.newInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Implementation to receive requests from clients
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Returns changes in the past <i>time</i> minutes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public synchronized Set objectsChanged(int time) throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::objectsChanged: " + time);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get the cache index for times upto time+2
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Add 1 minute to offset, the initial lookup
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheIndex = calendarToString(calendar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Implementation for SMSObjectListener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public synchronized void objectChanged(String name, int type) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheIndex = calendarToString(calendar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Maintain cacheIndex
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String index = (String) cacheIndices.removeLast();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // If notification URLs are present, send notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper for (Map.Entry<String, URL> entry : notificationURLs.entrySet()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct NotificationSet
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Notification notification = new Notification(modItem);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:objectChanged sent notification to " +
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.warning("SMSJAXRPCObjectImpl:objectChanged failed sending " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Remove the URL from Notification List
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing. Not sending to remote clients
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Methods to register notification URLs
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper public String registerNotificationURL(String url) throws RemoteException {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // Default value if there are any issues with the registration process.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check URL is not the local server
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!url.toLowerCase().startsWith(serverURL)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // Don't add the URL again if we already have it registered
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper boolean alreadyRegistered = false;
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper for (Map.Entry<String, URL> entry : notificationURLs.entrySet()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper if (notificationUrl.equals(entry.getValue())) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // This allows us to return the existing entry ID to support clients being able to
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // de-register the correct entry.
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL() - URL "
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper + url + " already registered, returning existing ID " + id);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // If we didn't find the url in our list, add it
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL - " +
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper "had a problem getting our serverID ", e);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // Generate a unique value that includes the serverID to have a better chance of being unique
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // in a cluster should a de-register request end up on the wrong server.
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper id = SMSUtils.getUniqueID() + "_" + serverID;
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL - " +
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper "registered notification URL: " + url + " with ID " + id);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Cannot add this server for notifications
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.warning("SMSJAXRPCObjectImpl:registerNotificationURL "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("SMSJAXRPCObjectImpl:registerNotificationURL "
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper public void deRegisterNotificationURL(String id) throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl.deRegisterNotificationURL() - URL "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Processes object changed events from other severs
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param name DN of the object changed
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param type change type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws java.rmi.RemoteException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void notifyObjectChanged(String name, int type)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSNotificationManager.getInstance().objectChanged(name, type);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static String calendarToString(Calendar calendar) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get year, month, date, hour and minute
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(":").append(year).append(month).append(date);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns SSOToken from token ID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static SSOToken getToken(String tokenID) throws SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an array of ModificationItems converted from string
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * representation of mods. The string representation is of the format:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <Modifications size="xx"> <AttributeValuePair event="ADD | REPLACE |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DELETE"> <Attribute name="attrName" /> <Value>...</Value>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </AttributeValuePair> </Modifications>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static ModificationItem[] getModItems(String mods) throws SMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObject::StringToMods: " + mods);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mods = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + mods;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Document doc = XMLUtils.toDOMDocument(mods, debug);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node root = XMLUtils.getRootNode(doc, "Modifications");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int modsSize = Integer.parseInt(XMLUtils.getNodeAttributeValue(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (node.getNodeName().equals("AttributeValuePair")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String eventS = XMLUtils.getNodeAttributeValue(node,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName = XMLUtils.getNodeAttributeValue(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set vals = XMLUtils.getAttributeValuePair(node, false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct ModificationItem
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BasicAttribute attr = new BasicAttribute(attrName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator it = vals.iterator(); it.hasNext();)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "sms-JAXRPC-cannot-copy-fromModStringToModItem"));