package org.jacorb.ir;
/*
* 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.
*/
import java.lang.reflect.Field;
import org.slf4j.Logger;
import org.omg.CORBA.INTF_REPOS;
import org.omg.PortableServer.POA;
/**
*/
public abstract class Contained
extends IRObject
implements org.omg.CORBA.ContainedOperations
{
protected String id;
/* IDL name from the root of the class path to the leaf */
protected String absolute_name;
/* from the root of the class path to the leaf */
String full_name;
protected String version = "1.0";
protected org.omg.CORBA.Container defined_in;
protected org.omg.CORBA.Repository containing_repository;
private static Class intfClass;
private static Class idlClass;
private static Class stubClass;
private static Class exceptClass;
private static boolean class_init;
public Contained()
{
}
public Contained( String _id,
String _name,
String _version,
org.omg.CORBA.Container _defined_in,
String _absolute_name,
org.omg.CORBA.Repository _containing_repository )
{
id = _id;
name = _name;
version = _version;
defined_in = _defined_in;
absolute_name = _absolute_name;
containing_repository = _containing_repository;
}
public static Contained createContained( Class c,
String path,
org.omg.CORBA.Container _defined_in,
org.omg.CORBA.Repository ir,
Logger logger,
ClassLoader loader,
POA poa )
{
if( !class_init )
{
try
{
intfClass =
loader.loadClass("org.omg.CORBA.Object");
idlClass =
loader.loadClass("org.omg.CORBA.portable.IDLEntity");
stubClass =
loader.loadClass("org.omg.CORBA.portable.ObjectImpl");
exceptClass =
loader.loadClass("org.omg.CORBA.UserException");
class_init = true;
}
catch ( ClassNotFoundException cnf )
{
// cnf.printStackTrace();
}
}
if( stubClass.isAssignableFrom( c ) )
{
return null; // don't care for stubs
}
else if( c.isInterface())
{
if( intfClass.isAssignableFrom( c ) )
{
try
{
Class helperClass =
loader.loadClass(c.getName() + "Helper");
if( helperClass == null )
{
return null;
}
InterfaceDef idef = new InterfaceDef( c,
helperClass,
path,
_defined_in,
ir,
loader,
poa,
logger);
return idef;
}
catch ( ClassNotFoundException e )
{
return null;
}
}
else
{
try
{
Field f = c.getDeclaredField("value");
return new ConstantDef( c,
_defined_in,
ir,
logger,
poa);
}
catch( NoSuchFieldException nsfe )
{
return null;
}
}
}
else if( exceptClass.isAssignableFrom( c ))
{
return new ExceptionDef(c,
_defined_in,
ir,
loader,
poa,
logger);
}
else if( idlClass.isAssignableFrom( c ) )
{
try
{
Class helperClass =
loader.loadClass( c.getName()+"Helper");
org.omg.CORBA.TypeCode tc =
(org.omg.CORBA.TypeCode)helperClass.getDeclaredMethod("type", (Class[]) null).invoke(null, (java.lang.Object[]) null);
switch( tc.kind().value())
{
case org.omg.CORBA.TCKind._tk_struct:
return new StructDef( c,
path,
_defined_in,
ir,
logger,
loader,
poa );
case org.omg.CORBA.TCKind._tk_enum:
return new EnumDef(
c,
_defined_in,
ir,
loader );
case org.omg.CORBA.TCKind._tk_union:
return new UnionDef( c,
path,
_defined_in,
ir,
loader,
logger,
poa);
default:
return null;
}
}
catch( ClassNotFoundException e )
{
// may happen for pseudo IDL
logger.warn("Caught Exception", e);
}
catch( Exception e )
{
logger.error("Caught Exception", e);
}
return null;
}
else if( c.getName().endsWith("Helper"))
{
try
{
org.omg.CORBA.TypeCode tc =
(org.omg.CORBA.TypeCode)c.getDeclaredMethod("type", (Class[]) null).invoke(null, (java.lang.Object[]) null);
if( tc.kind() == org.omg.CORBA.TCKind.tk_alias )
{
return new AliasDef(tc,
_defined_in,
ir,
logger,
poa);
}
}
catch( Exception e )
{
}
return null;
}
else
{
return null;
}
}
public static org.omg.CORBA.Contained createContainedReference(
Contained containedObject,
Logger logger,
POA poa )
{
if ( containedObject == null)
{
throw new INTF_REPOS ("Precondition violated in Contained createContainedReference");
}
org.omg.PortableServer.Servant servant = null;
switch ( containedObject.def_kind().value() )
{
case org.omg.CORBA.DefinitionKind._dk_Interface:
servant =
new org.omg.CORBA.InterfaceDefPOATie( (org.omg.CORBA.InterfaceDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Exception:
servant =
new org.omg.CORBA.ExceptionDefPOATie( (org.omg.CORBA.ExceptionDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Struct:
servant =
new org.omg.CORBA.StructDefPOATie( (org.omg.CORBA.StructDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Enum:
servant =
new org.omg.CORBA.EnumDefPOATie( (org.omg.CORBA.EnumDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Union:
servant =
new org.omg.CORBA.UnionDefPOATie( (org.omg.CORBA.UnionDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Module:
servant =
new org.omg.CORBA.ModuleDefPOATie( (org.omg.CORBA.ModuleDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Alias:
servant =
new org.omg.CORBA.AliasDefPOATie( (org.omg.CORBA.AliasDefOperations)containedObject );
break;
case org.omg.CORBA.DefinitionKind._dk_Constant:
servant =
new org.omg.CORBA.ConstantDefPOATie( (org.omg.CORBA.ConstantDefOperations)containedObject );
break;
default:
logger.warn("WARNING, createContainedReference returns null for dk " +
containedObject.def_kind().value() );
return null;
}
try
{
org.omg.CORBA.Contained containedRef =
org.omg.CORBA.ContainedHelper.narrow(poa.servant_to_reference( servant ));
containedObject.setReference( containedRef );
return containedRef;
}
catch( Exception e )
{
logger.error("unexpected exception", e);
return null;
}
}
public java.lang.String id()
{
return id;
}
public void id(java.lang.String a)
{
id = a;
}
public java.lang.String name()
{
return name;
}
public void name(java.lang.String a)
{
name = a;
}
public java.lang.String version()
{
return version;
}
public void version(java.lang.String a)
{
version = a;
}
public org.omg.CORBA.Container defined_in()
{
return defined_in;
}
public java.lang.String absolute_name()
{
return absolute_name;
}
public org.omg.CORBA.Repository containing_repository()
{
return containing_repository;
}
public abstract org.omg.CORBA.ContainedPackage.Description describe();
public void move(org.omg.CORBA.Container new_container,
java.lang.String new_name,
java.lang.String new_version)
{
if( defined_in != null )
; // remove this object
defined_in = new_container;
version = new_version;
name = new_name;
}
}