/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved * * The contents of this file are subject to the terms * of the Common Development and Distribution License * (the License). You may not use this file except in * compliance with the License. * * You can obtain a copy of the License at * https://opensso.dev.java.net/public/CDDLv1.0.html or * opensso/legal/CDDLv1.0.txt * See the License for the specific language governing * permission and limitations under the License. * * When distributing Covered Code, include this CDDL * Header Notice in each file and include the License file * at opensso/legal/CDDLv1.0.txt. * If applicable, add the following below the CDDL Header, * with the fields enclosed by brackets [] replaced by * your own identifying information: * "Portions Copyrighted [year] [name of copyright owner]" * * $Id: EntityObjectImpl.java,v 1.3 2008/06/25 05:43:26 qcheng Exp $ * */ package com.sun.identity.entity; import java.rmi.RemoteException; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import com.iplanet.am.sdk.AMConstants; import com.iplanet.am.sdk.AMEntity; import com.iplanet.am.sdk.AMEntityType; import com.iplanet.am.sdk.AMException; import com.iplanet.am.sdk.AMOrganization; import com.iplanet.am.sdk.AMStoreConnection; import com.iplanet.am.util.Cache; import com.iplanet.sso.SSOException; import com.iplanet.sso.SSOToken; import com.iplanet.sso.SSOTokenManager; /** * Implementation class for the interface EntityObjectIF */ public class EntityObjectImpl implements EntityObjectIF { protected static Cache oCache; protected static Object lock = new Object(); protected SSOToken token; protected AMStoreConnection amsc; protected AMOrganization entity = null; private static SSOTokenManager tokenManager; /** * Creates entities. * * @param ssotoken * String representing user's SSO Token. * @param entityName * Name of this entity.eg.cn=websphereAgent * @param entityType * Type of entity being created. eg. Agent The types supported by * SDK are configured in the list of Managed Objects in the * DAI service. * @param entityLocation * Location of the entity creation.eg.www.abc.com * @param attributes * Map to represent Attribute-Value Pairs * @return Returns a set of Entity DNs created. * @throws EntityException * if there is an internal error in the AM Store * @throws SSOException * if the sign on is no longer valid */ public Set createEntity(String ssotoken, String entityName, String entityType, String entityLocation, Map attributes) throws EntityException, SSOException { Set entitySet = new HashSet(); initializeObject(ssotoken, entityLocation); try { int type = 0; type = getIntTypeFromStr(entityType); Map input = new HashMap(2); input.put(entityName, attributes); if (entity != null) { Set entityObjs = entity.createEntities(type, input); Iterator it = entityObjs.iterator(); while (it.hasNext()) { entitySet.add(((AMEntity) it.next()).getDN()); } } } catch (AMException amex) { EntityUtils.debug.error("EntityObjectImpl.createEntity() : " + "Create Entity Failed. " + amex); throw EntityUtils.convertException(amex); } return entitySet; } /** * Deletes entities. * * @param ssoToken User's Single Sign On Token. * @param entityName Name of this entity. example * cn=websphereAgent. * @param entityType Type of entity being created. eg. Agent The types * supported by SDK are configured in the list of Managed Objects * in the DAI service. * @param entityLocation Location of the entity creation. example * www.abc.com. * @throws EntityException if there is an internal error in the AM Store. * @throws SSOException if the sign on is no longer valid. */ public void deleteEntity( String ssoToken, String entityName, String entityType, String entityLocation ) throws EntityException, SSOException { initializeObject(ssoToken, entityLocation); Set entityNameSet = new HashSet(); try { int type = 0; type = getIntTypeFromStr(entityType); String entDN = getEntityDN(entityName, type, entityLocation); entityNameSet.add(entDN); if (entity != null) { entity.deleteEntities(type, entityNameSet); if (EntityUtils.debug.messageEnabled()) { EntityUtils.debug .message("EntityObjectImpl.deleteEntity():" + " Deleted " + entityNameSet.toString()); } } } catch (AMException amex) { EntityUtils.debug.error("EntityObjectImpl.deleteEntity() : " + "Delete Entity Failed. " + amex); throw EntityUtils.convertException(amex); } } /** * Returns the entity object for each entity given the entityType and * entityName(s) in that particular organization. * * @param ssoToken User's Single Sign On Token. * @param entityName Name of this entity. example * cn=websphereAgent. * @param entityType Type of entity being created. eg. Agent The types * supported by SDK are configured in the list of Managed Objects * in the DAI service. * @param entityLocation Location of the entity creation. example * www.abc.com. * @return Set of Entity objects. * @throws EntityException if there is an internal error in the AM Store. * @throws SSOException if the sign on is no longer valid. * @throws RemoteException */ public Map getEntity( String ssoToken, String entityName, String entityType, String entityLocation ) throws EntityException, SSOException, RemoteException { initializeObject(ssoToken, entityLocation); Map entityMap = new HashMap(); return entityMap; } /** * Returns a set of Entity Names given the Entity Type for that particular * organization. * * @param ssoToken User's Single Sign On Token. * @param entityType Type of entity being created. eg. Agent The types * supported by SDK are configured in the list of Managed Objects * in the DAI service. * @param entityLocation Location of the entity creation. example * www.abc.com. * @param entityFilter * @return Set of Entity Names. * @throws EntityException if there is an internal error in the AM Store. * @throws SSOException if the sign on is no longer valid. * @throws RemoteException */ public Set getEntityNames( String ssoToken, String entityType, String entityLocation, String entityFilter ) throws EntityException, SSOException, RemoteException { initializeObject(ssoToken, entityLocation); Set entitySet = new HashSet(); return entitySet; } /** * Sets or replaces attribute values with the new values supplied and Stores * the changes to directory server. * * @param ssoToken User's Single Sign Token. * @param entityName Name of this entity. example * cn=websphereAgent * @param entityType Type of entity being created. eg. Agent The types * supported by SDK are configured in the list of Managed Objects * in the DAI service. * @param entityLocation Location of the entity creation. example * www.abc.com. * @throws EntityException if there is an internal error in the AM Store. * @throws SSOException if the sign on is no longer valid. * @throws RemoteException */ public void modifyEntity( String ssoToken, String entityName, String entityType, String entityLocation, Map attributes ) throws EntityException, SSOException, RemoteException { initializeObject(ssoToken, entityLocation); AMEntity amEntity = getAMEntity(ssoToken, entityName, entityType, entityLocation); try { if (amEntity != null) { amEntity.setAttributes(attributes); amEntity.store(); } } catch (AMException amex) { EntityUtils.debug.error("EntityObjectImpl.modifyEntity() : " + "Modify Entity Failed. " + amex); throw EntityUtils.convertException(amex); } } /** * Method to get the token manager handle. */ protected static void checkInitialization() throws SSOException { if (tokenManager == null) { synchronized (lock) { if (tokenManager == null) { try { tokenManager = SSOTokenManager.getInstance(); oCache = new Cache(1000); } catch (SSOException ssoe) { EntityUtils.debug.error( "EntityObjectImpl:checkInitialization() " + ": Unable to get SSOTokenManager", ssoe); throw (ssoe); } } } } } /** * Method to get the AMEntity object from the storeconnection. */ protected AMEntity getAMEntity(String ssoToken, String entityName, String entityType, String entityLocation) throws EntityException, SSOException { checkInitialization(); AMEntity amEntity; try { int type = 0; type = getIntTypeFromStr(entityType); String entDN = getEntityDN(entityName, type, entityLocation); String key = ssoToken + "/" + entDN; amEntity = (AMEntity) oCache.get(key); if (amEntity == null) { amEntity = amsc.getEntity(entDN); oCache.put(key, amEntity); } } catch (SSOException ssoe) { EntityUtils.debug.error("EntityObjectImpl.getAMEntity(): " + "Unable to convert SSOToken: " + ssoToken, ssoe); throw ssoe; } return amEntity; } /** * Method to initialize the object. The AMStoreConnection handle is obtained * by creating a valid SSOToken. */ protected void initializeObject(String ssoToken, String entityLocation) throws EntityException, SSOException { checkInitialization(); try { token = tokenManager.createSSOToken(ssoToken); amsc = new AMStoreConnection(token); String orgDN = amsc.getOrganizationDN(entityLocation, null); entity = amsc.getOrganization(orgDN); } catch (AMException amex) { EntityUtils.debug.error("EntityObjectImpl.initializeObject() : " + "Unable to get Organization DN " + amex); throw EntityUtils.convertException(amex); } catch (SSOException ssoe) { EntityUtils.debug.error("EntityObjectImpl.initializeObject() : " + "Unable to convert SSOToken: " + ssoToken, ssoe); throw ssoe; } if (EntityUtils.debug.messageEnabled()) { EntityUtils.debug.message("EntityObjectImpl.getAMEntity(): " + "Obtained ssotoken: " + ssoToken); EntityUtils.debug.message("EntityObjectImpl.getAMEntity(): " + "Obtained AMSToreConnection object for SSOToken: " + ssoToken); } } /** * Method to convert the entity type from string to integer recognizable by * SDK. */ private int getIntTypeFromStr(String entityType) { int type = 0; Set supportedTypes = amsc.getEntityTypes(); Iterator iter = supportedTypes.iterator(); while (iter.hasNext()) { AMEntityType amEntityType = (AMEntityType) iter.next(); if (amEntityType.getName().equalsIgnoreCase(entityType)) { type = amEntityType.getType(); break; } } return type; } /** * Method to get the DN of the entity based on the search results for the * entityName from the entityLocation. */ private String getEntityDN(String entityName, int entityType, String entityLocation) throws EntityException, SSOException { String entDN = null; try { Set entityResults = entity.searchEntities(entityType, "*", AMConstants.SCOPE_SUB, new HashMap()); Iterator iter = entityResults.iterator(); while (iter.hasNext()) { entDN = (String) iter.next(); if (entDN.indexOf(entityName) >= 0) { break; } } } catch (AMException amex) { EntityUtils.debug.error("EntityObjectImpl.getEntityDN() : " + "Unable to get DN for the Entity " + amex); throw EntityUtils.convertException(amex); } return entDN; } }