package org.jboss.iiop.rmi.ir;
import org.omg.CORBA.Repository;
import org.omg.CORBA.RepositoryPOATie;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Any;
import org.omg.CORBA.IRObject;
import org.omg.CORBA.Container;
import org.omg.CORBA.DefinitionKind;
import org.omg.CORBA.RepositoryOperations;
import org.omg.CORBA.Contained;
import org.omg.CORBA.ContainedHelper;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.TCKind;
import org.omg.CORBA.PrimitiveDef;
import org.omg.CORBA.StringDef;
import org.omg.CORBA.WstringDef;
import org.omg.CORBA.SequenceDef;
import org.omg.CORBA.InterfaceDef;
import org.omg.CORBA.ArrayDef;
import org.omg.CORBA.FixedDef;
import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.io.UnsupportedEncodingException;
class RepositoryImpl
extends ContainerImpl
implements RepositoryOperations, LocalContainer
{
private static final org.jboss.logging.Logger logger =
org.jboss.logging.Logger.getLogger(RepositoryImpl.class);
public RepositoryImpl(ORB orb, POA poa, String name)
{
super(DefinitionKind.dk_Repository, null);
this.orb = orb;
this.poa = poa;
try {
oid = (name).getBytes("UTF-8");
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException("UTF-8 encoding not supported.");
}
oidPrefix = name + ":";
anonOidPrefix = oidPrefix + "anon";
repository = this;
}
public IRObject getReference()
{
if (ref == null) {
ref = org.omg.CORBA.RepositoryHelper.narrow(
servantToReference(new RepositoryPOATie(this)) );
}
return ref;
}
public void allDone()
throws IRConstructionException
{
super.allDone();
Iterator iter = sequenceMap.values().iterator();
while (iter.hasNext())
((SequenceDefImpl)iter.next()).allDone();
}
public void shutdown()
{
for (long i = 1; i < nextPOAId; i++) {
try {
getPOA().deactivate_object(getAnonymousObjectId(i));
} catch (org.omg.CORBA.UserException ex) {
logger.warn("Could not deactivate anonymous IR object", ex);
}
}
super.shutdown();
}
public Contained lookup_id(java.lang.String search_id)
{
logger.debug("RepositoryImpl.lookup_id(\"" + search_id + "\") entered.");
LocalContained c = _lookup_id(search_id);
if (c == null)
return null;
return ContainedHelper.narrow(c.getReference());
}
public TypeCode get_canonical_typecode(org.omg.CORBA.TypeCode tc)
{
logger.debug("RepositoryImpl.get_canonical_typecode() entered.");
return null;
}
public PrimitiveDef get_primitive(org.omg.CORBA.PrimitiveKind kind)
{
logger.debug("RepositoryImpl.get_primitive() entered.");
return null;
}
public StringDef create_string(int bound)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public WstringDef create_wstring(int bound)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public SequenceDef create_sequence(int bound, org.omg.CORBA.IDLType element_type)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public ArrayDef create_array(int length, org.omg.CORBA.IDLType element_type)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public FixedDef create_fixed(short digits, short scale)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
ORB orb = null;
POA poa = null;
private byte[] oid = null;
private String oidPrefix = null;
private String anonOidPrefix = null;
Map sequenceMap = new HashMap();
Map sequenceIdMap = new HashMap();
LocalContained _lookup_id(java.lang.String search_id)
{
logger.debug("RepositoryImpl._lookup_id(\"" + search_id +
"\") entered.");
if (search_id.startsWith("RMI:["))
return (ValueBoxDefImpl)sequenceIdMap.get(search_id);
String name = scopedName(search_id);
logger.debug("RepositoryImpl._lookup_id(): scopedName=\"" +
scopedName(search_id) + "\"");
LocalContained ret = (name == null) ? null : _lookup(name);
logger.debug("RepositoryImpl._lookup_id(): returning " +
((ret == null) ? "null" : "NOT null") );
return ret;
}
SequenceDefImpl getSequenceImpl(TypeCode typeCode)
{
return (SequenceDefImpl)sequenceMap.get(typeCode);
}
void putSequenceImpl(String id, TypeCode typeCode, SequenceDefImpl sequence,
ValueBoxDefImpl valueBox)
{
sequenceIdMap.put(id, valueBox);
sequenceMap.put(typeCode, sequence);
}
String getObjectIdPrefix()
{
return oidPrefix;
}
protected byte[] getObjectId()
{
return (byte[])oid.clone();
}
protected byte[] getAnonymousObjectId(long n)
{
String s = anonOidPrefix + Long.toString(n);
try {
return s.getBytes("UTF-8");
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException("UTF-8 encoding not supported.");
}
}
protected byte[] getNextObjectId()
{
return getAnonymousObjectId(nextPOAId++);
}
private Repository ref = null;
private long nextPOAId = 1;
private String scopedName(String id)
{
if (id == null)
return null;
if (id.startsWith("IDL:")) {
if ("IDL:omg.org/CORBA/Object:1.0".equals(id) ||
"IDL:omg.org/CORBA/ValueBase:1.0".equals(id))
return null;
int idx2 = id.indexOf(':', 4); if (idx2 == -1)
return null; String base = id.substring(4, id.indexOf(':', 4));
if (base.startsWith("omg.org"))
base = "org/omg" + base.substring(7);
if (base.startsWith("w3c.org"))
base = "org/w3c" + base.substring(7);
StringBuffer b = new StringBuffer();
for (int i = 0; i < base.length(); ++i) {
char c = base.charAt(i);
if (c != '/')
b.append(c);
else
b.append("::");
}
return b.toString();
} else if (id.startsWith("RMI:")) {
int idx2 = id.indexOf(':', 4); if (idx2 == -1)
return null; String base = id.substring(4, id.indexOf(':', 4));
StringBuffer b = new StringBuffer();
for (int i = 0; i < base.length(); ++i) {
char c = base.charAt(i);
if (c != '.')
b.append(c);
else
b.append("::");
}
return b.toString();
} else
return null;
}
}