package org.jacorb.idl;
/*
* 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.PrintWriter;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
/**
* @author Gerald Brose
*/
public class RaisesExpr
extends IdlSymbol
{
public Vector nameList;
public RaisesExpr( int num )
{
super( num );
nameList = new Vector();
}
/**
* Constructs an empty RaisesExpr
*/
public RaisesExpr()
{
this(new_num());
}
/**
* Constructs a
* @param nameList
*/
public RaisesExpr (Vector nameList)
{
super (new_num());
this.nameList = (Vector)nameList.clone();
}
public void setPackage( String s )
{
s = parser.pack_replace( s );
for( Enumeration e = nameList.elements();
e.hasMoreElements();
( (ScopedName)e.nextElement() ).setPackage( s ) )
;
}
public boolean empty()
{
return ( nameList.size() == 0 );
}
public String[] getExceptionNames()
{
String[] result = new String[ nameList.size() ];
Enumeration e = nameList.elements();
for( int i = 0; i < result.length; i++ )
{
result[ i ] = ( (ScopedName)e.nextElement() ).toString();
}
return result;
}
public String[] getExceptionIds()
{
String[] result = new String[ nameList.size() ];
Enumeration e = nameList.elements();
for( int i = 0; i < result.length; i++ )
{
result[ i ] = ( (ScopedName)e.nextElement() ).id();
}
return result;
}
public String[] getExceptionClassNames()
{
String[] result = new String[ nameList.size() ];
Enumeration e = nameList.elements();
for( int i = 0; i < result.length; i++ )
{
result[ i ] = ( (ScopedName)e.nextElement() ).toString();
}
return result;
}
public void parse()
{
Hashtable h = new Hashtable(); // for removing duplicate exception names
for( Enumeration e = nameList.elements(); e.hasMoreElements(); )
{
ScopedName name = null;
try
{
name = (ScopedName)e.nextElement();
TypeSpec ts = name.resolvedTypeSpec();
if( ( (StructType)( (ConstrTypeSpec)ts ).declaration() ).isException() )
{
h.put( name.resolvedName(), name );
continue; // ok
}
// else: go to the exception
}
catch( Exception ex )
{
// any type cast errors
}
parser.fatal_error( "Illegal type in raises clause: " +
name.toString(), token );
}
// remove duplicate exceptions, i.e. ScopedNames that, when
// fully qualified, point to the same exception declaration
nameList = new Vector();
for( Enumeration e = h.keys(); e.hasMoreElements(); )
{
nameList.addElement( h.get( e.nextElement() ) );
}
h.clear();
String[] classes = getExceptionClassNames();
IdlSymbol myInterface = enclosing_symbol;
for( int i = 0; i < classes.length; i++ )
{
myInterface.addImportedName( classes[ i ] );
}
}
public void print( PrintWriter ps )
{
Enumeration e = nameList.elements();
if( e.hasMoreElements() )
{
ps.print( " throws " + e.nextElement() );
}
for( ; e.hasMoreElements(); )
{
ps.print( "," + e.nextElement() );
}
}
}