/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.iiop.rmi.ir;
import org.omg.CORBA.ContainerOperations;
import org.omg.CORBA.Contained;
import org.omg.CORBA.ContainedHelper;
import org.omg.CORBA.Container;
import org.omg.CORBA.ContainerPackage.Description;
import org.omg.CORBA.IDLType;
import org.omg.CORBA.DefinitionKind;
import org.omg.CORBA.StructMember;
import org.omg.CORBA.UnionMember;
import org.omg.CORBA.InterfaceDef;
import org.omg.CORBA.EnumDef;
import org.omg.CORBA.ValueDef;
import org.omg.CORBA.StructDef;
import org.omg.CORBA.UnionDef;
import org.omg.CORBA.ConstantDef;
import org.omg.CORBA.ModuleDef;
import org.omg.CORBA.ValueBoxDef;
import org.omg.CORBA.Initializer;
import org.omg.CORBA.AliasDef;
import org.omg.CORBA.NativeDef;
import org.omg.CORBA.ExceptionDef;
import org.omg.CORBA.BAD_INV_ORDER;
import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
import java.util.ArrayList;
/**
* Delegate for Container functionality.
*
* @author <a href="mailto:osh@sparre.dk">Ole Husgaard</a>
* @version $Revision: 81018 $
*/
class ContainerImplDelegate
implements ContainerOperations
{
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
// Static --------------------------------------------------------
private static final org.jboss.logging.Logger logger =
org.jboss.logging.Logger.getLogger(ContainerImplDelegate.class);
// Constructors --------------------------------------------------
/**
* Create a new delegate.
*/
ContainerImplDelegate(LocalContainer delegateFor)
{
this.delegateFor = delegateFor;
}
// Public --------------------------------------------------------
// LocalContainer delegation implementation ----------------------
public LocalContained _lookup(String search_name)
{
logger.debug("ContainerImplDelegate._lookup(\"" + search_name +
"\") entered.");
if (search_name.startsWith("::"))
return delegateFor.getRepository()._lookup(search_name.substring(2));
int idx = search_name.indexOf("::");
if (idx > 0) {
String first = search_name.substring(0, idx);
logger.debug("ContainerImplDelegate._lookup(\"" + search_name +
"\") looking for \"" + first + "\".");
Object o = contMap.get(first);
if (o == null || !(o instanceof LocalContainer))
return null;
else {
LocalContainer next = (LocalContainer)o;
String rest = search_name.substring(idx + 2);
return next._lookup(rest);
}
} else
return (LocalContained)contMap.get(search_name);
}
public LocalContained[] _contents(DefinitionKind limit_type,
boolean exclude_inherited)
{
int target = limit_type.value();
Collection found;
if (target == DefinitionKind._dk_all)
found = cont;
else {
found = new ArrayList();
for (int i = 0; i < cont.size(); ++i) {
LocalContained val = (LocalContained)cont.get(i);
if (target == val.def_kind().value()) {
if (!exclude_inherited || val.defined_in() == delegateFor)
found.add(val);
}
}
}
LocalContained[] res = new LocalContained[found.size()];
res = (LocalContained[])found.toArray(res);
return res;
}
public LocalContained[] _lookup_name(String search_name,
int levels_to_search,
DefinitionKind limit_type,
boolean exclude_inherited)
{
if (levels_to_search == 0)
return null;
if (levels_to_search == -1)
++levels_to_search; // One more level (recursively) == all levels
Collection found = new ArrayList();
LocalContained[] here = _contents(limit_type, exclude_inherited);
for (int i = 0; i < here.length; ++i)
if (here[i].name().equals(search_name))
found.add(here[i]);
if (levels_to_search >= 0) {
// More levels to search, or unlimited depth search
for (int i = 0; i < here.length; ++i) {
if (here[i] instanceof Container) { // search here
LocalContainer container = (LocalContainer)here[i];
LocalContained[] c;
c = container._lookup_name(search_name, levels_to_search - 1,
limit_type, exclude_inherited);
if (c != null)
for (int j = 0; j < c.length; ++j)
found.add(c[j]);
}
}
}
LocalContained[] res = new LocalContained[found.size()];
res = (LocalContained[])found.toArray(res);
return res;
}
public void shutdown()
{
for (int i = 0; i < cont.size(); ++i)
((LocalContained)cont.get(i)).shutdown();
}
// ContainerOperations implementation ----------------------------
public Contained lookup(String search_name)
{
LocalContained c = _lookup(search_name);
if (c == null)
return null;
else
return ContainedHelper.narrow(c.getReference());
}
public Contained[] contents(DefinitionKind limit_type,
boolean exclude_inherited)
{
LocalContained[] c = _contents(limit_type, exclude_inherited);
Contained[] res = new Contained[c.length];
for (int i = 0; i < c.length; ++i)
res[i] = ContainedHelper.narrow(c[i].getReference());
return res;
}
public Contained[] lookup_name(String search_name, int levels_to_search,
DefinitionKind limit_type,
boolean exclude_inherited)
{
LocalContained[] c = _lookup_name(search_name, levels_to_search,
limit_type, exclude_inherited);
Contained[] res = new Contained[c.length];
for (int i = 0; i < c.length; ++i)
res[i] = ContainedHelper.narrow(c[i].getReference());
return res;
}
public Description[] describe_contents(DefinitionKind limit_type,
boolean exclude_inherited,
int max_returned_objs)
{
Contained[] c = contents(limit_type, exclude_inherited);
int returnSize;
if (max_returned_objs != -1 && c.length > max_returned_objs)
returnSize = max_returned_objs;
else
returnSize = c.length;
Description[] ret = new Description[returnSize];
for (int i = 0; i < returnSize; ++i) {
org.omg.CORBA.ContainedPackage.Description d = c[i].describe();
ret[i] = new Description(c[i], d.kind, d.value);
}
return ret;
}
public ModuleDef create_module(String id, String name, String version)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public ConstantDef create_constant(String id, String name, String version,
IDLType type, org.omg.CORBA.Any value)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public StructDef create_struct(String id, String name, String version,
StructMember[] members)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public UnionDef create_union(String id, String name, String version,
IDLType discriminator_type,
UnionMember[] members)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public EnumDef create_enum(String id, String name, String version,
String[] members)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public AliasDef create_alias(String id, String name, String version,
IDLType original_type)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public InterfaceDef create_interface(String id, String name, String version,
InterfaceDef[] base_interfaces,
boolean is_abstract)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public ValueDef create_value(String id, String name, String version,
boolean is_custom, boolean is_abstract,
ValueDef base_value, boolean is_truncatable,
ValueDef[] abstract_base_values,
InterfaceDef[] supported_interfaces,
Initializer[] initializers)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public ValueBoxDef create_value_box(String id, String name, String version,
IDLType original_type_def)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public ExceptionDef create_exception(String id, String name, String version,
StructMember[] members)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
public NativeDef create_native(String id, String name, String version)
{
throw new BAD_INV_ORDER("Cannot change RMI/IIOP mapping.");
}
// Dummy IRObjectOperations implementation -----------------------
public DefinitionKind def_kind()
{
throw new RuntimeException("Should not be called.");
}
public void destroy()
{
throw new RuntimeException("Should not be called.");
}
// Package protected ---------------------------------------------
void add(String name, LocalContained contained)
throws IRConstructionException
{
if (contained.getRepository() != delegateFor.getRepository())
throw new IRConstructionException("Wrong repository");
if (contMap.get(name) != null)
throw new IRConstructionException("Duplicate name: " + name);
cont.add(contained);
contMap.put(name, contained);
logger.debug("ContainerDelegateImpl.add() added \"" + name + "\".");
}
/**
* Finalize build process, and export.
*/
void allDone()
throws IRConstructionException
{
logger.debug("ContainerDelegateImpl.allDone() entered ");
for (int i = 0; i < cont.size(); ++i) {
LocalContained item = (LocalContained)cont.get(i);
logger.debug("Container[" + item.id() + "].allDone() calling [" +
item.id() + "].allDone()");
item.allDone();
}
logger.debug("ContainerDelegateImpl.allDone() done ");
}
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
/**
* The contents of the Container.
*/
private ArrayList cont = new ArrayList();
/**
* Maps names to the contents of the Container.
*/
private Map contMap = new HashMap();
/**
* The Container I am a delegate for.
*/
private LocalContainer delegateFor;
// Inner classes -------------------------------------------------
}