a4544a5a0e622ef69e38641f87ab1b5685e05911Phill Cunnington/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
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 *
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 * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
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 *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: SMSJAXRPCObjectImpl.java,v 1.22 2009/10/28 04:24:27 hengming Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts * Portions Copyrighted 2010-2016 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.sm.jaxrpc;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpottsimport static org.forgerock.openam.utils.Time.*;
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.am.util.SystemProperties;
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;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport com.iplanet.services.naming.WebtopNaming;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOToken;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOTokenManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.common.CaseInsensitiveHashMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.jaxrpc.JAXRPCUtil;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.Constants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.debug.Debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.xml.XMLUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.CachedSMSEntry;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.CachedSubEntries;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSDataEntry;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSEntry;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSNotificationManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSObjectListener;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SMSUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceAttributeValidator;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport org.json.JSONException;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport org.w3c.dom.Document;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport org.w3c.dom.Node;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport org.w3c.dom.NodeList;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Jooste
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport javax.naming.directory.BasicAttribute;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport javax.naming.directory.DirContext;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport javax.naming.directory.ModificationItem;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.net.MalformedURLException;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.net.URL;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.rmi.RemoteException;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.Calendar;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.Date;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.HashMap;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.HashSet;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.Iterator;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.LinkedList;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.Map;
48a3f9d4300dcee393075c632655deb42f43bce6Jaco Joosteimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class SMSJAXRPCObjectImpl implements SMSObjectIF, SMSObjectListener {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static Debug debug = Debug.getInstance("amSMSServerImpl");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper static Map<String, URL> notificationURLs = new HashMap<String, URL>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static SSOTokenManager tokenMgr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static SSOException initializationError;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String baseDN;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String amsdkbaseDN;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static boolean initialized;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String serverURL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Cache of modified DNs for the last 30 minutes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static int cacheSize = 30;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static LinkedList cacheIndices = new LinkedList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static HashMap cache = new HashMap(cacheSize);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Default constructor
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public SMSJAXRPCObjectImpl() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Empty constructor to avoid bootstraping when JAX-RPC
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // initialized this object on the Serve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Initialization to register the callback handler
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void initialize() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!initialized) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenMgr = SSOTokenManager.getInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ssoe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("SMSJAXRPCObject: "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Unable to get SSO Token Manager");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initializationError = ssoe;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Register for notifications & polling cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSNotificationManager.isCacheEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSNotificationManager.getInstance()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .registerCallbackHandler(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl.init " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Registered for notifications");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Obtain the cache size, if configured
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheSizeStr = SystemProperties.get(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Constants.EVENT_LISTENER_REMOTE_CLIENT_BACKLOG_CACHE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cacheSize = Integer.parseInt(cacheSizeStr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (cacheSize < 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cacheSize = 30;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NumberFormatException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl.init " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "EventNotification cache size is set to " + cacheSize);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct server URL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String namingURL = SystemProperties.get(Constants.AM_NAMING_URL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (namingURL != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int index = namingURL.toLowerCase().indexOf("/namingservice");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (index != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL = namingURL.substring(0, index);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL = SystemProperties.getServerInstanceName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (serverURL == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((serverURL == null) || (serverURL.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("SMSJAXRPCObjectImpl.init Server URL IS NULL");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl.init ServerURL: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serverURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialized = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Method to check if service is local and also to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // test if the server is down
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void checkForLocal() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSJAXRPCObject.isLocal = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the attribute names and values of the provided object using the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * identity of the provided SSO Token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Map read(String tokenID, String objName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::read dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map returnAttributes = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (objName.equals("o=" + SMSJAXRPCObject.AMJAXRPCVERSIONSTR)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes.put(SMSJAXRPCObject.AMJAXRPCVERSIONSTR,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSJAXRPCObject.AMJAXRPCVERSION);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry ce = CachedSMSEntry.getInstance(getToken(tokenID),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ce.isDirty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ce.refresh();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map attrs = ce.getSMSEntry().getAttributes();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((attrs != null) && (attrs instanceof CaseInsensitiveHashMap)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator items = attrs.keySet().iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster items.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName = items.next().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object o = attrs.get(attrName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes.put(attrName, o);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else { // could be null or instance of HashMap - return as it is.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster returnAttributes = attrs;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return returnAttributes;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Creates an entry in the persistent store. Throws an exception if the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * entry already exists
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void create(String tokenID, String objName, Map attributes)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::create dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.setAttributes(attributes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.save();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Modifies the attributes to the object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void modify(String tokenID, String objName, String mods)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::modify dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.modifyAttributes(getModItems(mods));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.save();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Delete the entry in the datastore. This should delete sub-entries also
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void delete(String tokenID, String objName) throws SMSException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::delete dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry entry = new SMSEntry(getToken(tokenID), objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.delete();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
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 initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::searchSubOrgNames dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getToken(tokenID), dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.searchSubOrgNames(getToken(tokenID), filter, recursive));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
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 throws SMSException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::searchOrganizationNames dn: "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getToken(tokenID), dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.searchOrgNames(getToken(tokenID), serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrName, values));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set subEntries(String tokenID, String dn, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, boolean sortResults, boolean ascendingOrder)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::subentries dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getToken(tokenID), dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.getSubEntries(getToken(tokenID), filter));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set schemaSubEntries(String tokenID, String dn, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String sidFilter, int numOfEntries, boolean sortResults, boolean ao)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::subentries dn: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSubEntries ce = CachedSubEntries.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getToken(tokenID), dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (ce.getSchemaSubEntries(getToken(tokenID), filter, sidFilter));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searchs the data store for objects that match the filter
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search(String tokenID, String startDN, String filter)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (SMSEntry.search(getToken(tokenID), startDN, filter, 0, 0,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster false, false));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searchs the data store for objects that match the filter
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search2(String tokenID, String startDN, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, int timeLimit, boolean sortResults,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean ascendingOrder)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (SMSEntry.search(getToken(tokenID), startDN, filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster numOfEntries, timeLimit, sortResults, ascendingOrder));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Searches the data store for objects that match the filter with an exclude set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set search3(String tokenID, String startDN, String filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int numOfEntries, int timeLimit, boolean sortResults,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean ascendingOrder, Set excludes)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter + " excludes: " + excludes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator i = SMSEntry.search(getToken(tokenID), startDN, filter,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster numOfEntries, timeLimit, sortResults, ascendingOrder, excludes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> result = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (i.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSDataEntry e = (SMSDataEntry)i.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster result.add(e.toJSONString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (JSONException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("SMSJAXRPCObjectImpl::problem performing search dn: " + startDN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " filter: " + filter + " excludes: " + excludes, ex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return result;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Checks if the provided DN exists. Used by PolicyManager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean entryExists(String tokenID, String objName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::exists dn: " + objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean entryExists = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry ce = CachedSMSEntry.getInstance(getToken(tokenID),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster objName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ce.isDirty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ce.refresh();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entryExists = !(ce.getSMSEntry().isNewEntry());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SMSException smse) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Ignore the exception
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (entryExists);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getRootSuffix() throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (baseDN == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster baseDN = SMSEntry.getRootSuffix();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (baseDN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getAMSdkBaseDN() throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (amsdkbaseDN == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster amsdkbaseDN = SMSEntry.getAMSdkBaseDN();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (amsdkbaseDN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Validates service configuration attributes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
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 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean validateServiceAttributes(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String token,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String validatorClass,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set values
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) throws SMSException, SSOException, RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::validateServiceAttributes: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster validatorClass + " Values: " + values);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Class clazz = Class.forName(validatorClass);
b13c7a4fcbf2a0eb86870a78014fc49ca5a88a65Neil Madden ServiceAttributeValidator v = (ServiceAttributeValidator) clazz.newInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return v.validate(values);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (InstantiationException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IllegalAccessException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (ClassNotFoundException ex) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SMSException("sms-validator_cannot_instantiate_class");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
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 if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObjectImpl::objectsChanged: " + time);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set answer = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get the cache index for times upto time+2
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts Calendar calendar = getCalendarInstance();
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts calendar.setTime(newDate());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Add 1 minute to offset, the initial lookup
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster calendar.add(Calendar.MINUTE, 1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < time + 3; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster calendar.add(Calendar.MINUTE, -1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheIndex = calendarToString(calendar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set modDNs = (Set) cache.get(cacheIndex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (modDNs != null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.addAll(modDNs);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Implementation for SMSObjectListener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public synchronized void objectChanged(String name, int type) {
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts Calendar calendar = getCalendarInstance();
ccf9d4a5c6453fa9f8b839baeee25147865fbb7dJames Phillpotts calendar.setTime(newDate());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheIndex = calendarToString(calendar);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set modDNs = (Set) cache.get(cacheIndex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (modDNs == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster modDNs = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cache.put(cacheIndex, modDNs);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Maintain cacheIndex
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cacheIndices.addFirst(cacheIndex);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (cacheIndices.size() > cacheSize) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String index = (String) cacheIndices.removeLast();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cache.remove(index);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String modItem = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (type) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case ADD:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster modItem = "ADD:" + name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case DELETE:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster modItem = "DEL:" + name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster modItem = "MOD:" + name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster modDNs.add(modItem);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // If notification URLs are present, send notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper for (Map.Entry<String, URL> entry : notificationURLs.entrySet()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper String id = entry.getKey();
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper URL url = entry.getValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct NotificationSet
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Notification notification = new Notification(modItem);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NotificationSet ns =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new NotificationSet(JAXRPCUtil.SMS_SERVICE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ns.addNotification(notification);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PLLServer.send(url, ns);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:objectChanged sent notification to " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "URL: " + url + " Data: " + ns);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SendNotificationException ne) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.warning("SMSJAXRPCObjectImpl:objectChanged failed sending " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "notification to: " + url + "\nRemoving " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "URL from notification list.", ne);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Remove the URL from Notification List
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper notificationURLs.remove(id);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void allObjectsChanged() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing. Not sending to remote clients
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Methods to register notification URLs
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper public String registerNotificationURL(String url) throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initialize();
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // Default value if there are any issues with the registration process.
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper String id = "0";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check URL is not the local server
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!url.toLowerCase().startsWith(serverURL)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper URL notificationUrl = new URL(url);
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 id = entry.getKey();
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper alreadyRegistered = true;
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper if (debug.messageEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL() - URL "
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper + url + " already registered, returning existing ID " + id);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper }
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper break;
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper }
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper }
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper // If we didn't find the url in our list, add it
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper if (!alreadyRegistered) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper String serverID = "";
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper try {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper serverID = WebtopNaming.getAMServerID();
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper } catch (ServerEntryNotFoundException e) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper if (debug.messageEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL - " +
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper "had a problem getting our serverID ", e);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
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 notificationURLs.put(id, notificationUrl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl:registerNotificationURL - " +
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper "registered notification URL: " + url + " with ID " + id);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Cannot add this server for notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.warning("SMSJAXRPCObjectImpl:registerNotificationURL "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "cannot add local server: " + url);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MalformedURLException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("SMSJAXRPCObjectImpl:registerNotificationURL "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " invalid URL: " + url, e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper return id;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper public void deRegisterNotificationURL(String id) throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (notificationURLs) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper URL url = notificationURLs.remove(id);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper if (url != null && debug.messageEnabled()) {
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper debug.message("SMSJAXRPCObjectImpl.deRegisterNotificationURL() - URL "
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper + url + " de-registered for ID " + id);
6a490d4b01fde313651d02ca8d6ac8db32266d03Mark de Reeper }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Processes object changed events from other severs
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param name DN of the object changed
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param type change type
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws java.rmi.RemoteException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void notifyObjectChanged(String name, int type)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws RemoteException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSNotificationManager.getInstance().objectChanged(name, type);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static String calendarToString(Calendar calendar) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get year, month, date, hour and minute
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int year = calendar.get(Calendar.YEAR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int month = calendar.get(Calendar.MONTH);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int date = calendar.get(Calendar.DATE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int hour = calendar.get(Calendar.HOUR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int minute = calendar.get(Calendar.MINUTE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder(200);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(serverURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(":").append(year).append(month).append(date);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(hour).append(minute);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (sb.toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns SSOToken from token ID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static SSOToken getToken(String tokenID) throws SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (initializationError != null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (initializationError);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (tokenMgr.createSSOToken(tokenID));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an array of ModificationItems converted from string
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * representation of mods. The string representation is of the format:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <pre>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <Modifications size="xx"> <AttributeValuePair event="ADD | REPLACE |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DELETE"> <Attribute name="attrName" /> <Value>...</Value>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </AttributeValuePair> </Modifications>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * </pre>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static ModificationItem[] getModItems(String mods) throws SMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("SMSJAXRPCObject::StringToMods: " + mods);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ModificationItem[] answer = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (mods != null) {
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 root, "size"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer = new ModificationItem[modsSize];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster NodeList nl = root.getChildNodes();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < modsSize; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node node = nl.item(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (node.getNodeName().equals("AttributeValuePair")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String eventS = XMLUtils.getNodeAttributeValue(node,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "event");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int event = DirContext.ADD_ATTRIBUTE;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (eventS.equals("REPLACE"))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster event = DirContext.REPLACE_ATTRIBUTE;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster else if (eventS.equals("DELETE"))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster event = DirContext.REMOVE_ATTRIBUTE;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Node attrNode = XMLUtils
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .getChildNode(node, "Attribute");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName = XMLUtils.getNodeAttributeValue(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrNode, "name");
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 attr.add(it.next());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer[i] = new ModificationItem(event, attr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw (new SMSException(e,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "sms-JAXRPC-cannot-copy-fromModStringToModItem"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}