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.io.File;
import java.util.Enumeration;
import java.util.Hashtable;
import org.omg.CORBA.AbstractInterfaceDef;
import org.omg.CORBA.ExtInitializer;
import org.omg.CORBA.ExtValueDef;
import org.omg.CORBA.INTF_REPOS;
import org.omg.CORBA.InterfaceDef;
import org.omg.CORBA.LocalInterfaceDef;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.ValueDef;
import org.omg.PortableServer.POA;
import org.slf4j.Logger;
public class Container
extends IRObject
implements org.omg.CORBA.ContainerOperations
{
protected IRObject delegator;
/** CORBA references to contained objects */
protected Hashtable contained = new Hashtable();
/** local references to contained objects */
protected Hashtable containedLocals = new Hashtable();
protected File my_dir = null;
protected String path = null;
protected String full_name = null;
/** CORBA reference to this container */
protected org.omg.CORBA.Container this_container;
/** outer container */
protected org.omg.CORBA.Container defined_in;
protected org.omg.CORBA.Repository containing_repository;
protected boolean defined = false;
private ClassLoader loader;
private POA poa;
private Logger logger;
/**
*/
public Container( IRObject delegator,
String path,
String full_name,
ClassLoader loader,
POA poa,
Logger logger )
{
this.loader = loader;
this.poa = poa;
this.logger = logger;
this.delegator = delegator;
this.path = path;
this.full_name = full_name;
my_dir = new File( path + fileSeparator +
( full_name != null ? full_name : "" ).replace('.', fileSeparator) );
if ( ! my_dir.isDirectory())
{
throw new INTF_REPOS ("no directory : " + path + fileSeparator + full_name);
}
this.name = delegator.getName();
if (this.logger.isDebugEnabled())
{
this.logger.debug("New Container full_name " +
full_name + " name : " + name +
" path: " + path);
}
// else: get reference from delegator, but must be postponed until later
}
/**
*/
void loadContents()
{
this_container =
org.omg.CORBA.ContainerHelper.narrow( delegator.getReference());
if (this_container == null)
{
throw new INTF_REPOS ("no container !");
}
if( delegator instanceof Contained )
{
containing_repository = ((Contained)delegator).containing_repository();
defined_in = ((Contained)delegator).defined_in();
}
else
{
containing_repository = org.omg.CORBA.
RepositoryHelper.narrow( delegator.getReference());
defined_in = containing_repository;
}
if (containing_repository == null)
{
throw new INTF_REPOS ("no containing repository");
}
String[] classes;
String[] dirs;
// get all files in this directory which either end in ".class" or
// do not contain a "." at all
classes = my_dir.list( new IRFilenameFilter(".class") );
dirs = my_dir.list( new IRFilenameFilter( null ) );
// load class files in this module/package
if( classes != null)
{
String prefix =
( full_name != null ? full_name + '.' : "");
for( int j = 0; j< classes.length; j++ )
{
try
{
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " +name+ " tries " +
prefix +
classes[j].substring( 0, classes[j].indexOf(".class")));
}
Class cl =
this.loader.loadClass(
( prefix +
classes[j].substring( 0, classes[j].indexOf(".class"))
));
Contained containedObject =
Contained.createContained( cl,
path,
this_container,
containing_repository,
this.logger,
this.loader,
this.poa );
if( containedObject == null )
{
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container: nothing created for "
+ cl.getClass().getName());
}
continue;
}
org.omg.CORBA.Contained containedRef =
Contained.createContainedReference(containedObject,
this.logger,
this.poa);
containedRef.move( this_container,
containedRef.name(),
containedRef.version() );
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " + prefix +
" loads "+ containedRef.name());
}
contained.put( containedRef.name() , containedRef );
containedLocals.put( containedRef.name(), containedObject );
if( containedObject instanceof ContainerType )
((ContainerType)containedObject).loadContents();
}
catch ( java.lang.Throwable e )
{
this.logger.error("Caught exception", e);
}
}
}
if( dirs != null)
{
for( int k = 0; k < dirs.length; k++ )
{
if( !dirs[k].endsWith("Package"))
{
File f = new File( my_dir.getAbsolutePath() +
fileSeparator +
dirs[k] );
try
{
String [] classList = f.list();
if( classList != null && classList.length > 0)
{
ModuleDef m =
new ModuleDef( path,
(( full_name != null ?
full_name + fileSeparator :
""
) + dirs[k]).replace(fileSeparator, '.'),
this_container,
containing_repository,
this.loader,
this.poa,
this.logger);
org.omg.CORBA.ModuleDef moduleRef =
org.omg.CORBA.ModuleDefHelper.narrow(
this.poa.servant_to_reference(
new org.omg.CORBA.ModuleDefPOATie( m ) ));
m.setReference( moduleRef );
m.loadContents();
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " +
full_name +
" puts module " + dirs[k]);
}
m.move( this_container, m.name(), m.version() );
contained.put( m.name() , moduleRef );
containedLocals.put( m.name(), m );
}
}
catch ( Exception e )
{
this.logger.error("Caught Exception", e);
}
}
}
}
}
void define()
{
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " + full_name + " defining...");
}
for( Enumeration e = containedLocals.elements();
e.hasMoreElements();
((IRObject)e.nextElement()).define())
;
defined = true;
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " + full_name + " defined");
}
}
public org.omg.CORBA.Contained[] contents(org.omg.CORBA.DefinitionKind limit_type,
boolean exclude_inherited)
{
if ( ! defined)
{
throw new INTF_REPOS ("contents undefined");
}
Hashtable filtered = new Hashtable();
if( limit_type.value() == org.omg.CORBA.DefinitionKind._dk_all )
{
filtered = contained;
}
else
{
Enumeration f = contained.keys();
while( f.hasMoreElements() )
{
Object k = f.nextElement();
org.omg.CORBA.Contained c =
(org.omg.CORBA.Contained)contained.get( k );
if( c.def_kind().value() == limit_type.value() )
filtered.put( k, c );
}
}
Enumeration e = filtered.elements();
org.omg.CORBA.Contained[] result =
new org.omg.CORBA.Contained[ filtered.size() ];
for( int i = 0; i < filtered.size(); i++ )
result[i] = (org.omg.CORBA.Contained)e.nextElement();
return result;
}
/**
* retrieves a contained object given a scoped name
*/
public org.omg.CORBA.Contained lookup( String scopedname )
{
String top_level_name;
String rest_of_name;
String name;
if( scopedname.startsWith("::") )
{
name = scopedname.substring(2);
}
else
name = scopedname;
if( name.indexOf("::") > 0 )
{
top_level_name = name.substring( 0, name.indexOf("::") );
rest_of_name = name.substring( name.indexOf("::") + 2);
}
else
{
top_level_name = name;
rest_of_name = null;
}
org.omg.CORBA.Contained top =
(org.omg.CORBA.Contained)contained.get( top_level_name );
if( top == null )
{
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " + this.name +
" top " + top_level_name + " not found ");
}
return null;
}
if( rest_of_name == null )
{
return top;
}
org.omg.CORBA.Container topContainer =
org.omg.CORBA.ContainerHelper.narrow( top );
if( topContainer != null )
{
return topContainer.lookup( rest_of_name );
}
if (this.logger.isDebugEnabled())
{
this.logger.debug("Container " + this.name +" " +
scopedname + " not found, top " +
top.getClass().getName());
}
return null;
}
public org.omg.CORBA.Contained[] lookup_name( String search_name,
int levels_to_search,
org.omg.CORBA.DefinitionKind limit_type,
boolean exclude_inherited)
{
if( levels_to_search == 0 )
return null;
org.omg.CORBA.Contained[] c =
contents( limit_type, exclude_inherited );
Hashtable found = new Hashtable();
for( int i = 0; i < c.length; i++)
if( c[i].name().equals( search_name ) )
found.put( c[i], "" );
if( levels_to_search > 1 || levels_to_search == -1 )
{
// search up to a specific depth or undefinitely
for( int i = 0; i < c.length; i++)
{
if( c[i] instanceof org.omg.CORBA.Container )
{
org.omg.CORBA.Contained[] tmp_seq =
((org.omg.CORBA.Container)c[i]).lookup_name( search_name,
levels_to_search-1,
limit_type,
exclude_inherited);
if( tmp_seq != null )
for( int j = 0; j < tmp_seq.length; j++)
found.put( tmp_seq[j], "" );
}
}
}
org.omg.CORBA.Contained[] result = new org.omg.CORBA.Contained[ found.size() ];
int idx = 0;
for( Enumeration e = found.keys(); e.hasMoreElements(); )
result[ idx++] = (org.omg.CORBA.Contained)e.nextElement();
return result;
}
public org.omg.CORBA.ContainerPackage.Description[] describe_contents(org.omg.CORBA.DefinitionKind limit_type, boolean exclude_inherited, int max_returned_objs)
{
return null;
}
public org.omg.CORBA.ModuleDef create_module(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version){
return null;
}
public org.omg.CORBA.ConstantDef create_constant(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, org.omg.CORBA.IDLType type, org.omg.CORBA.Any value){
return null;
}
public org.omg.CORBA.StructDef create_struct(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, /*StructMemberSeq*/ org.omg.CORBA.StructMember[] members){
return null;
}
public org.omg.CORBA.UnionDef create_union(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, org.omg.CORBA.IDLType discriminator_type, /*UnionMemberSeq*/ org.omg.CORBA.UnionMember[] members){
return null;
}
public org.omg.CORBA.EnumDef create_enum(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, /*EnumMemberSeq*/ /*Identifier*/ String[] members){
return null;
}
public org.omg.CORBA.AliasDef create_alias(/*RepositoryId*/ String id, /*Identifier*/ String name, /*VersionSpec*/ String version, org.omg.CORBA.IDLType original_type){
return null;
}
/**
* not supported
*/
public org.omg.CORBA.ExceptionDef create_exception(java.lang.String id, java.lang.String name , java.lang.String version, org.omg.CORBA.StructMember[] member )
{
return null;
}
/**
* not supported
*/
public org.omg.CORBA.InterfaceDef create_interface(
/*RepositoryId*/ String id,
/*Identifier*/ String name,
/*VersionSpec*/ String version,
/*InterfaceDefSeq*/ org.omg.CORBA.InterfaceDef[] base_interfaces)
{
return null;
}
/**
* not supported
*/
public org.omg.CORBA.ValueBoxDef create_value_box(java.lang.String id,
java.lang.String name,
java.lang.String version,
org.omg.CORBA.IDLType type)
{
return null;
}
/**
* not supported
*/
public org.omg.CORBA.ValueDef create_value(
java.lang.String id,
java.lang.String name,
java.lang.String version,
boolean is_custom,
boolean is_abstract,
org.omg.CORBA.ValueDef base_value,
boolean is_truncatable,
org.omg.CORBA.ValueDef[] abstract_base_values,
org.omg.CORBA.InterfaceDef[] supported_interfaces,
org.omg.CORBA.Initializer[] initializers)
{
return null;
}
/**
* not supported
*/
public org.omg.CORBA.NativeDef create_native(java.lang.String id,
java.lang.String name,
java.lang.String version)
{
return null;
}
public void destroy(){}
public AbstractInterfaceDef create_abstract_interface (String id, String name, String version,
AbstractInterfaceDef[] baseInterfaces)
{
throw new NO_IMPLEMENT ("NYI");
}
public ExtValueDef create_ext_value (String id, String name, String version, boolean isCustom,
boolean isAbstract, ValueDef baseValue, boolean isTruncatable,
ValueDef[] abstractBaseValues, InterfaceDef[] supportedInterfaces,
ExtInitializer[] initializers)
{
throw new NO_IMPLEMENT ("NYI");
}
public LocalInterfaceDef create_local_interface (String id, String name, String version,
InterfaceDef[] baseInterfaces)
{
throw new NO_IMPLEMENT ("NYI");
}
}