/* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.jacorb.orb; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jacorb.config.Configuration; import org.jacorb.config.ConfigurationException; import org.omg.CORBA.BAD_PARAM; /** * @author Alphonse Bendt */ public class ObjectKeyMap { private final ORB orb; private final Map objectKeyMap = new HashMap(); public ObjectKeyMap(ORB orb) { this.orb = orb; } /** * Map an object key to another, as defined by the value * of a corresponding configuration property in the properties * file, e.g. map "NameService" to "StandardNS/NameServer-POA/_root" * * @param originalKey a <code>byte[]</code> value containing the original * key. * @return a <code>byte[]</code> value containing the mapped key, if a * mapping is defined, originalKey otherwise. */ public synchronized byte[] mapObjectKey(byte[] originalKey) { byte []result = originalKey; if (objectKeyMap.size () > 0) { String origKey = new String (originalKey); Object found = objectKeyMap.get (origKey); if( found != null ) { if (found instanceof String) { if ( ParsedIOR.isParsableProtocol ( (String)found ) ) { // We have found a file reference. Use ParsedIOR to get // the byte key. try { ParsedIOR ior = new ParsedIOR( orb, (String)found ); result = ior.get_object_key(); } catch ( IllegalArgumentException e ) { throw new BAD_PARAM("could not extract object_key from IOR: " + e); } } else { result = org.jacorb.orb.util.CorbaLoc.parseKey((String)found); } // This 'hack' does the following - we cannot parse the key in configuration // as the service may not have been started yet so the files may not exist. So we have // to do it on demand - as an optimisation we then overwrite the original value with the // parsed form to save speed on future lookups. objectKeyMap.put (origKey, result); } else { // Must be a byte - already parsed it result = (byte[])found; } } } return result; } /** * a helper method supplied to initialize the object key map. This * replaces functionality from the defunct Environment class to populate * a hash map based on the names starting with "jacorb.orb.ObjectKeyMap" */ public synchronized void configureObjectKeyMap(Configuration config) { final String prefix = "jacorb.orb.objectKeyMap."; final List<String> names = config.getAttributeNamesWithPrefix(prefix); try { for (Iterator<String> i = names.iterator(); i.hasNext(); ) { final String property = i.next(); final String key_name = property.substring(prefix.length()); final String full_path = config.getAttribute(property); addObjectKey(key_name, full_path); } } catch (ConfigurationException e) { throw new RuntimeException("should never happen", e); } } /** * <code>addObjectKey </code> is a proprietary method that allows the * internal objectKeyMap to be altered programmatically. The objectKeyMap * allows more readable corbaloc URLs by mapping the actual object key to * an arbitary string. See the jacorb.properties file for more information. * * @param key_name a <code>String</code> value e.g. NameService * @param full_path an <code>String</code> value e.g. file:/home/rnc/NameSingleton.ior */ public synchronized void addObjectKey(String key_name, String full_path) { objectKeyMap.put(key_name, full_path); } /** * @see #addObjectKey(String, String) * @param key_name a <code>String</code> value e.g. NameService * @param object an a reference to a object whose object key should be used. */ public void addObjectKey(String key_name, org.omg.CORBA.Object object) { addObjectKey(key_name, orb.object_to_string(object)); } }