/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a full listing * of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ /** * @author Malik SAHEB (malik.saheb@arjuna.com) * @version $Id */ package com.arjuna.ats.internal.jts.orbspecific.jacorb.recoverycoordinators; import java.nio.charset.StandardCharsets; import java.util.List; import org.jacorb.orb.CDROutputStream; import org.jacorb.orb.ORB; import org.jacorb.orb.ParsedIOR; import org.jacorb.orb.iiop.IIOPProfile; import org.omg.IOP.IOR; import org.omg.IOP.TaggedProfile; import org.omg.IOP.TaggedProfileHolder; import com.arjuna.ats.internal.jts.ORBManager; import com.sun.corba.se.spi.ior.IORFactories; public class RecoverIOR { private static class RecoverableParsedIOR extends ParsedIOR { public RecoverableParsedIOR(String ior) { this((ORB)ORBManager.getORB().orb(), ior) ; } public RecoverableParsedIOR(final ORB orb, final String ior) { //super(ior, orb, orb.getConfiguration().getNamedLogger("arjuna.recovery.parsedior")); // old (JacORB 2.2) super(orb, ior); // new (JacORB 2.3) } public IOR newObjectKey(String objectId) { String the_object_key = new String(get_object_key()); int position = the_object_key.indexOf("RecoveryManager"); String new_object_key = the_object_key.substring(0, position).concat(objectId); IOR new_ior = new IOR(); List profiles = getProfiles(); new_ior.type_id = getTypeId(); new_ior.profiles = new TaggedProfile[profiles.size()]; for (int i = 0; i < profiles.size(); i++) { IIOPProfile pb = (IIOPProfile) profiles.get(i); IIOPProfile new_pb = (IIOPProfile) pb.copy(); new_pb.set_object_key(new_object_key.getBytes(StandardCharsets.UTF_8)); new_ior.profiles[i] = new TaggedProfile(); new_ior.profiles[i].tag = 0; // IIOP TaggedProfileHolder holder = new TaggedProfileHolder(new_ior.profiles[i]); new_pb.marshal(holder, null); new_ior.profiles[i].profile_data = holder.value.profile_data; } return new_ior; } // It appears that the following method do the same role as above public IOR newIOR(String objectId) { String the_object_key = new String(get_object_key(), StandardCharsets.UTF_8); int position = the_object_key.indexOf("RecoveryManager"); String new_object_key = the_object_key.substring(0, position).concat(objectId); IOR new_ior = ParsedIOR.createObjectIOR(getEffectiveProfile()); return new_ior; } // Sanity check. public void printInfo () { IIOPProfile profile = (IIOPProfile) getEffectiveProfile(); System.out.println("\n Print some Information -------------"); System.out.println("Object ID "+ getIDString()); System.out.println("Type Name "+ getTypeId()); System.out.println("Host Address "+ profile.getAddress()); System.out.println("Object Key "+ new String(get_object_key())); System.out.println("\n\n"); } } public static String newObjectKey (String ior, String Key) { RecoverableParsedIOR pior = new RecoverableParsedIOR(ior); IOR new_ior = pior.newObjectKey(Key); //IOR new_ior = pior.newIOR(Key); return iorToString(new_ior); } public static void printIORinfo(String ior) { RecoverableParsedIOR pior = new RecoverableParsedIOR(ior); pior.printInfo(); } private static String iorToString(IOR ior) { try { CDROutputStream out = new CDROutputStream(); // endianness = false, big-endian out.write_boolean(false); org.omg.IOP.IORHelper.write(out, ior); byte bytes[] = out.getBufferCopy(); StringBuffer sb = new StringBuffer("IOR:"); for (int j=0; j<bytes.length; j++) { int b = bytes[j]; if(b<0) b+= 256; int n1 = (0xff & b) / 16; int n2 = (0xff & b) % 16; int c1 = (n1 < 10) ? ('0' + n1) : ('a' + (n1 - 10)); int c2 = (n2 < 10) ? ('0' + n2) : ('a' + (n2 - 10)); sb.append((char)c1); sb.append((char)c2); } return sb.toString(); } catch (Exception e) { return null; } } }