/* * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.corba.se.impl.naming.pcosnaming; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Hashtable; import org.omg.CORBA.Policy; import org.omg.CORBA.LocalObject; import org.omg.PortableServer.POA; import org.omg.PortableServer.Servant; import org.omg.PortableServer.ForwardRequest; import org.omg.PortableServer.ServantLocator; import org.omg.PortableServer.LifespanPolicyValue; import org.omg.PortableServer.RequestProcessingPolicyValue; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.ServantRetentionPolicyValue; import org.omg.PortableServer.ServantLocatorPackage.CookieHolder; import com.sun.corba.se.spi.orb.ORB; /** * @author Rohit Garg * @since JDK1.2 */ public class ServantManagerImpl extends org.omg.CORBA.LocalObject implements ServantLocator { // computed using serialver tool private static final long serialVersionUID = 4028710359865748280L; private ORB orb; private NameService theNameService; private File logDir; private Hashtable contexts; private CounterDB counterDb; private int counter; private final static String objKeyPrefix = "NC"; ServantManagerImpl(ORB orb, File logDir, NameService aNameService) { this.logDir = logDir; this.orb = orb; // initialize the counter database counterDb = new CounterDB(logDir); contexts = new Hashtable(); theNameService = aNameService; } public Servant preinvoke(byte[] oid, POA adapter, String operation, CookieHolder cookie) throws ForwardRequest { String objKey = new String(oid); Servant servant = (Servant) contexts.get(objKey); if (servant == null) { servant = readInContext(objKey); } return servant; } public void postinvoke(byte[] oid, POA adapter, String operation, java.lang.Object cookie, Servant servant) { // nada } public NamingContextImpl readInContext(String objKey) { NamingContextImpl context = (NamingContextImpl) contexts.get(objKey); if( context != null ) { // Returning Context from Cache return context; } File contextFile = new File(logDir, objKey); if (contextFile.exists()) { try { FileInputStream fis = new FileInputStream(contextFile); ObjectInputStream ois = new ObjectInputStream(fis); context = (NamingContextImpl) ois.readObject(); context.setORB( orb ); context.setServantManagerImpl( this ); context.setRootNameService( theNameService ); ois.close(); } catch (Exception ex) { } } if (context != null) { contexts.put(objKey, context); } return context; } public NamingContextImpl addContext(String objKey, NamingContextImpl context) { File contextFile = new File(logDir, objKey); if (contextFile.exists()) { context = readInContext(objKey); } else { try { FileOutputStream fos = new FileOutputStream(contextFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(context); oos.close(); } catch (Exception ex) { } } try { contexts.remove( objKey ); } catch( Exception e) { } contexts.put(objKey, context); return context; } public void updateContext( String objKey, NamingContextImpl context ) { File contextFile = new File(logDir, objKey); if (contextFile.exists()) { contextFile.delete( ); contextFile = new File(logDir, objKey); } try { FileOutputStream fos = new FileOutputStream(contextFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(context); oos.close(); } catch (Exception ex) { ex.printStackTrace( ); } } public static String getRootObjectKey() { return objKeyPrefix + CounterDB.rootCounter; } public String getNewObjectKey() { return objKeyPrefix + counterDb.getNextCounter(); } } class CounterDB implements Serializable { CounterDB (File logDir) { counterFileName = "counter"; counterFile = new File(logDir, counterFileName); if (!counterFile.exists()) { counter = new Integer(rootCounter); writeCounter(); } else { readCounter(); } } private void readCounter() { try { FileInputStream fis = new FileInputStream(counterFile); ObjectInputStream ois = new ObjectInputStream(fis); counter = (Integer) ois.readObject(); ois.close(); } catch (Exception ex) { } } private void writeCounter() { try { counterFile.delete(); FileOutputStream fos = new FileOutputStream(counterFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(counter); oos.flush(); oos.close(); } catch (Exception ex) { } } public synchronized int getNextCounter() { int counterVal = counter.intValue(); counter = new Integer(++counterVal); writeCounter(); return counterVal; } private Integer counter; private static String counterFileName = "counter"; private transient File counterFile; public final static int rootCounter = 0; }