9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper/**
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * Copyright (c) 2008 Sun Microsystems Inc. All Rights Reserved
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * The contents of this file are subject to the terms
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * of the Common Development and Distribution License
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * (the License). You may not use this file except in
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * compliance with the License.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * You can obtain a copy of the License at
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * https://opensso.dev.java.net/public/CDDLv1.0.html or
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * opensso/legal/CDDLv1.0.txt
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * See the License for the specific language governing
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * permission and limitations under the License.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * When distributing Covered Code, include this CDDL
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * Header Notice in each file and include the License file
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * at opensso/legal/CDDLv1.0.txt.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * If applicable, add the following below the CDDL Header,
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * with the fields enclosed by brackets [] replaced by
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * your own identifying information:
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * "Portions Copyrighted [year] [name of copyright owner]"
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * $Id: SharedState.java,v 1.1 2009/01/30 12:09:40 kalpanakm Exp $
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper */
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperpackage com.sun.opensso.agents.jsr115;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.HashMap;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.HashSet;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.Iterator;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.Collection;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.concurrent.locks.Lock;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.concurrent.locks.ReentrantReadWriteLock;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport java.util.logging.Logger;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport javax.security.jacc.PolicyContext;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport javax.security.jacc.PolicyContextException;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperimport com.sun.identity.agents.arch.AgentConfiguration;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper/**
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * SharedState maintains the state of the PolicyConfiguration for various
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * CONTEXT_IDs
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * @author kalpana
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper */
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeperpublic class SharedState {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper //lock on the shared configTable and linkTable
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static Lock rLock = rwLock.readLock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static Lock wLock = rwLock.writeLock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static HashMap<String, OpenSSOJACCPolicyConfiguration> configTable =
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper new HashMap<String, OpenSSOJACCPolicyConfiguration>();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static HashMap<String, HashSet<String>> linkTable =
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper new HashMap<String, HashSet<String>>();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static final Logger logger =
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper Logger.getLogger(SharedState.class.getPackage().getName());
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private static HashSet<String> adminAppList = null;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper /*
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * JACC configuration is for an entire domain. So all the admin apps also
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * pass through the custom JSR115 provider. Inorder to avoid this, a check
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * is made for the contextID. If its an adminapp, control is passed on to
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * default provider implementation
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper *
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper */
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList = new HashSet();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("adminapp/adminapp");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("admingui/admingui");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("__default-web-module/__default-web-module");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("__ejb_container_timer_app/ejb_jar");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("__JWSappclients/sys_war");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("WSTXServices/WSTXServices");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper adminAppList.add("MEjbApp/mejb_jar");
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper private SharedState() {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static Logger getLogger() {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return logger;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static OpenSSOJACCPolicyConfiguration lookupConfig(String pcid) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper OpenSSOJACCPolicyConfiguration pc = null;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.lock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper try {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key = AgentConfiguration.getApplicationUser()+ pcid ;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper pc = configTable.get(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } finally {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.unlock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return pc;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static OpenSSOJACCPolicyConfiguration getConfig(String pcid, boolean remove) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper OpenSSOJACCPolicyConfiguration pc = null;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key = null;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.lock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper try {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper key = AgentConfiguration.getApplicationUser()+ pcid ;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper pc = configTable.get(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper if (pc == null) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // TODO - Check whether the policyfiles are present in LDAP and decide
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // Whether you need read that and create a config object ...
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper boolean isPresent = OpenSSOJACCPolicyConfiguration.isPolicyPresent(pcid);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper if (isPresent){
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper pc = new OpenSSOJACCPolicyConfiguration(pcid,false);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } else {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper pc = new OpenSSOJACCPolicyConfiguration(pcid);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper SharedState.initLinks(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper configTable.put(key, pc);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } else if (remove) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper SharedState.removeLinks(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } finally {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.unlock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return pc;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static Collection getConfigCollection() {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return configTable.values();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper /**
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * Creates a relationship between this configuration and another
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * such that they share the same principal-to-role mappings.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * PolicyConfigurations are linked to apply a common principal-to-role
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * mapping to multiple seperately manageable PolicyConfigurations,
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * as is required when an application is composed of multiple
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * modules.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * <P>
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * Note that the policy statements which comprise a role, or comprise
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * the excluded or unchecked policy collections in a PolicyConfiguration
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * are unaffected by the configuration being linked to another.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * <P>
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * The relationship formed by this method is symetric, transitive
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * and idempotent.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * @param id
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * @param otherId
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * @throws javax.security.jacc.PolicyContextException If otherID
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper * equals receiverID. no relationship is formed.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper */
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static void link(String id, String otherId)
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper throws javax.security.jacc.PolicyContextException {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.lock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper try {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper if (otherId.equals(id)) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String msg = "Operation attempted to link PolicyConfiguration to itself.";
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper throw new IllegalArgumentException(msg);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // get the linkSet corresponding to this context
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key = AgentConfiguration.getApplicationUser()+ id;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key1 = AgentConfiguration.getApplicationUser() + otherId;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper HashSet<String> linkSet = linkTable.get(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // get the linkSet corresponding to the context being linked to this
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper HashSet otherLinkSet = linkTable.get(key1);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper if (otherLinkSet == null) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String msg = "Linked policy configuration (" + otherId + ") does not exist";
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper throw new RuntimeException(msg);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper Iterator it = otherLinkSet.iterator();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // for each context (id) linked to the context being linked to this
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper while (it.hasNext()) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String nextid = (String) it.next();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper //add the id to this linkSet
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkSet.add(nextid);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper //replace the linkset mapped to all the contexts being linked
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper //to this context, with this linkset.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkTable.put(nextid, linkSet);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } finally {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.unlock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static void initLinks(String id) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // create a new linkSet with only this context id, and put in the table.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper HashSet linkSet = new HashSet();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkSet.add(id);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkTable.put(id, linkSet);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper static void removeLinks(String id) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.lock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key = AgentConfiguration.getApplicationUser();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper try { // get the linkSet corresponding to this context.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper HashSet linkSet = linkTable.get(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // remove this context id from the linkSet (which may be shared
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper // with other contexts), and unmap the linkSet from this context.
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper if (linkSet != null) {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkSet.remove(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper linkTable.remove(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper initLinks(key);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper } finally {
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper wLock.unlock();
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper public static HashSet getLink(String contextID){
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper String key = AgentConfiguration.getApplicationUser() + contextID;
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return linkTable.get(contextID);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper public static boolean isAdminApp(String contextID){
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper return adminAppList.contains(contextID);
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper }
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper}
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper
9772159fcd47ec75c7451e49baf2165fecb1f271Mark de Reeper