8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
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: EntityManager.java,v 1.3 2008/06/25 05:41:44 qcheng Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.iplanet.ums;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Stack;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.debug.Debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.ldap.Attr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.ldap.AttrSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.util.I18n;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This class has the responsibility of creating structural entities. A
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * structural entity is an entry which contains other entries (example: people
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * container). The information in the DIT (under "StructureTemplates") defines
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the structure . For example, when an Organization is created, it will contain
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * a "Groups" container. This class creates the structure of entities as defined
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * in the DIT.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class EntityManager implements IUMSConstants {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Get the instance of Entity Manager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return Instance of Entity manager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws UMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If an exception occurs.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static synchronized EntityManager getEntityManager()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws UMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (_instance == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _instance = new EntityManager();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return _instance;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method will use methods provided by ConfigManager to get "Structure
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Template" information from the DIT. It will use this information to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * create the "Structural Entity".
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param principal
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The Principal.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pObject
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The persistent object for which the entities apply.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pGUID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The guid of the parent object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws UMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if an exception occurs.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void execute(java.security.Principal principal,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PersistentObject pObject, Guid pGUID) throws UMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String className;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HashMap hm = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set set = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator iter = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Attr attr = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttrSet attrSet = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] attrValues;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pObject == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .getString(IUMSConstants.PERSISTENT_OBJECT_PARAM_NULL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _principal = principal;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _pObject = pObject;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _stack = new Stack();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster className = _pObject.getClass().getName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _parentObject = _pObject;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("GETTING ENTITY FOR:CLASS:" + className + ",PARENT:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + pGUID.getDn());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set = _configManager.getEntity(pGUID, className);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!set.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (set.size() > 1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet = findEntity(_pObject, set);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator it = set.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (it.hasNext())
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet = (AttrSet) it.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (attrSet == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String args[] = new String[1];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[0] = className;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster IUMSConstants.STRUCTURE_TEMPLATE_ATTRSET_NULL, args);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (ConfigManagerException cme) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String args[] = new String[1];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[0] = cme.getMessage();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(IUMSConstants.CONFIG_MGR_ERROR, args);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ENTITY ATTRSET:" + attrSet);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attr = attrSet.getAttribute(ENTITY_CHILDNODE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (attr == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrValues = attr.getStringValues();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < attrValues.length; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hm = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hm.put(attrValues[i], _parentObject.getGuid());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _stack.push(hm);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (!_stack.empty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hm = (HashMap) _stack.pop();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set = hm.keySet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter = set.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String childNodeName = (String) iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Guid parentGuid = (Guid) hm.get(childNodeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set childSet = _configManager.getEntity(pGUID, childNodeName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!childSet.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter = childSet.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (iter.hasNext())
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet = (AttrSet) iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (childSet.isEmpty() | attrSet == null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (ConfigManagerException cme) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String args[] = new String[1];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[0] = cme.getMessage();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(IUMSConstants.CONFIG_MGR_ERROR,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Create Object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PersistentObject pObj = createObject(attrSet, parentGuid, pGUID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attr = attrSet.getAttribute(ENTITY_CHILDNODE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (attr != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrValues = attr.getStringValues();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int j = 0; j < attrValues.length; j++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hm = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hm.put(attrValues[j], pObj.getGuid());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _stack.push(hm);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method will determine which Structure Template entry to use if there
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is more than one returned from ConfigManagerUMS. It will make the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * determination based on the "filter" and "priority" attributes in each
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Structure Template atrribute set.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pObject
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The persistentObject for which the Structure Template applies.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param set
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The Set containing multiple Structure Template attribute sets.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws UMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if an error occurs.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private AttrSet findEntity(PersistentObject pObject, Set set)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws UMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Loop through all attrSets in Set, and for each one:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // o use the filter to find the entry for which the Structure
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Template applies. If each of the attrSet filters finds
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // an entry, select the one with the highest priority (0 being
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // the highest).
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttrSet foundAttrSet = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttrSet attrSet = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator it = set.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (it.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet = (AttrSet) it.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String filter = attrSet.getAttribute(ENTITY_FILTER).getValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SearchControl sc = new SearchControl();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sc.setSearchScope(SearchControl.SCOPE_BASE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SearchResults sr = pObject.search(filter, sc);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sr.hasMoreElements()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sr.abandon();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((foundAttrSet == null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster || (Integer.parseInt(attrSet.getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ENTITY_PRIORITY).getValue()) < Integer
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .parseInt(foundAttrSet.getAttribute(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ENTITY_PRIORITY).getValue()))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster foundAttrSet = attrSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NumberFormatException nfe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String args[] = new String[3];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[0] = "" + attrSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[1] = "" + foundAttrSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args[2] = nfe.getMessage();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster IUMSConstants.BAD_STRUCTURE_TEMPLATE_PRIORITY, args);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return foundAttrSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method creates a Persistent Object and adds it to a "parent"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Persistent Object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param attrSet
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The attribute set used to create the child object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param parentGUID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The identifier for the "parent" Persistent object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param searchGuid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Where to get the CreationTemplate.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The child Persistent Object which was added to the parent.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws UMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if an exception occurs.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PersistentObject createObject(AttrSet attrSet, Guid parentGuid,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Guid searchGuid) throws UMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] attrValues;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster DataLayer dataLayer = DataLayer.getInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Extract attributes from attribute sets.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Build an attribute set of name/value pairs which will
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // be used with the CreationTemplate to create the child
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Persistent Object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Attr tempAttr = attrSet.getAttribute(ENTITY_TEMPLATE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Attr attrAttr = attrSet.getAttribute(ENTITY_NAME);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (attrAttr == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(IUMSConstants.BAD_NAMING_ATTR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrValues = attrAttr.getStringValues();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet = new AttrSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int k = 0; k < attrValues.length; k++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrValue = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int index = attrValues[k].indexOf(NAME_TOKEN_DELIM);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (index < 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String msg = i18n.getString(IUMSConstants.BAD_NAMING_ATTR);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrName = attrValues[k].substring(0, index);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrValue = attrValues[k].substring(index + 1, attrValues[k]
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .length());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster attrSet.add(new Attr(attrName, attrValue));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Use the TemplateManager to get an instance of a CreationTemplate.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get the class name from the CreationTemplate.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Instantiate the constructor which accepts the attribute set -
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this creates the child object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Add the child object to the parent.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String templateName = tempAttr.getValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CreationTemplate ct = _templateMgr.getCreationTemplate(templateName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster searchGuid);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PersistentObject pObj = new PersistentObject(ct, attrSet);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String idAttr = pObj.getNamingAttribute();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String idValue = pObj.getAttribute(idAttr).getValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Guid childGuid = new Guid(idAttr + "=" + idValue + ","
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + parentGuid.getDn());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] attrNames = pObj.getAttributeNames();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttrSet atts = pObj.getAttributes(attrNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dataLayer.addEntry(_principal, childGuid, atts);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UMSException umse) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(umse.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster UMSObject.getObject(_principal, childGuid);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pObj;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructor
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws UMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if an exception occurs.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private EntityManager() throws UMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _configManager = ConfigManagerUMS.getConfigManager();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster _templateMgr = TemplateManager.getTemplateManager();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (ConfigManagerException cme) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new UMSException(cme.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String ENTITY_CHILDNODE = "childNode";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String ENTITY_FILTER = "filter";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String ENTITY_PRIORITY = "priority";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String ENTITY_TEMPLATE = "template";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String ENTITY_NAME = "name";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String NAME_TOKEN_DELIM = "=";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PersistentObject _pObject;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PersistentObject _parentObject;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Stack _stack;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private TemplateManager _templateMgr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private java.security.Principal _principal;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ConfigManagerUMS _configManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static EntityManager _instance = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static I18n i18n = I18n.getInstance(IUMSConstants.UMS_PKG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Debug debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug = Debug.getInstance(IUMSConstants.UMS_DEBUG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}