/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2006 The JacORB project.
*
* 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.
*/
package org.jacorb.orb.typecode;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.jacorb.orb.CDRInputStream;
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.TypeCode;
import org.slf4j.Logger;
/**
* this class is the entry point into the TypeCode reading logic.
*
* @author Alphonse Bendt
*/
public class DelegatingTypeCodeReader
{
private final Map readerMap = new HashMap();
public DelegatingTypeCodeReader()
{
readerMap.put(Integer.valueOf(-1), new IndirectionTypeCodeReader());
final TypeCodeReader primitiveReader = new PrimitiveTypeCodeReader();
for (int x=0; x<14; ++x)
{
readerMap.put(Integer.valueOf(x), primitiveReader);
}
readerMap.put(Integer.valueOf(23), primitiveReader);
readerMap.put(Integer.valueOf(24), primitiveReader);
readerMap.put(Integer.valueOf(26), primitiveReader);
readerMap.put(Integer.valueOf(14), new ObjectReferenceTypeCodeReader());
readerMap.put(Integer.valueOf(15), new StructTypeCodeReader());
readerMap.put(Integer.valueOf(16), new UnionTypeCodeReader());
readerMap.put(Integer.valueOf(17), new EnumTypeCodeReader());
readerMap.put(Integer.valueOf(21), new AliasTypeCodeReader());
readerMap.put(Integer.valueOf(22), new ExceptTypeCodeReader());
readerMap.put(Integer.valueOf(29), new ValueTypeCodeReader());
readerMap.put(Integer.valueOf(30), new ValueBoxTypeCodeReader());
readerMap.put(Integer.valueOf(32), new AbstractInterfaceTypeCodeReader());
final TypeCodeReader simpleReader = new SimpleTypeCodeReader();
readerMap.put(Integer.valueOf(18), simpleReader);
readerMap.put(Integer.valueOf(27), simpleReader);
readerMap.put(Integer.valueOf(28), simpleReader);
final TypeCodeReader sequenceReader = new SequenceTypeCodeReader();
readerMap.put(Integer.valueOf(19), sequenceReader);
readerMap.put(Integer.valueOf(20), sequenceReader);
}
/**
* entry method to the TypeCode reader logic
* @param logger used to log informational/debug information
* @param in the InputStream from which should be read from
* @param recursiveTCMap Map that should be used to store the buffer positions of not completely read in TypeCodes
* @param repeatedTCMap Map that should be used to store the buffer positions of completely read in TypeCodes
*/
public TypeCode readTypeCode(Logger logger, CDRInputStream in, Map recursiveTCMap, Map repeatedTCMap)
{
in.mark(0);
final int kind = in.read_long();
final int start_pos = in.get_pos() - 4;
try
{
in.reset();
}
catch(IOException e)
{
assert false;
throw new RuntimeException("should not happen");
}
if (logger.isDebugEnabled())
{
logger.debug(in.getIndentString() + "read TypeCode kind " + kind + " at startposition " + start_pos);
}
final TypeCode result = doReadTypeCode(in, recursiveTCMap, repeatedTCMap, kind);
if (logger.isDebugEnabled())
{
logger.debug(in.getIndentString() + "return " + result + " (" + result.getClass().getName() + "@" + System.identityHashCode(result) + ")");
}
return result;
}
private TypeCode doReadTypeCode(CDRInputStream in, Map recursiveTCMap, Map repeatedTCMap, int kind)
{
final TypeCodeReader delegate = (TypeCodeReader) readerMap.get(Integer.valueOf(kind));
if (delegate == null)
{
throw new MARSHAL("cannot handle TypeCode with kind=" + kind);
}
else
{
return delegate.readTypeCode(in, recursiveTCMap, repeatedTCMap);
}
}
}