blob: b6a380834152d7f61669d94b2a13faadd1cc72ad [file] [log] [blame]
/*
* Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* COMPONENT_NAME: idl.toJava
*
* ORIGINS: 27
*
* Licensed Materials - Property of IBM
* 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
* RMI-IIOP v1.0
*
*/
package com.sun.tools.corba.se.idl.toJavaPortable;
// NOTES:
import java.io.File;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Vector;
import com.sun.tools.corba.se.idl.GenFileStream;
import com.sun.tools.corba.se.idl.ConstEntry;
import com.sun.tools.corba.se.idl.ModuleEntry;
import com.sun.tools.corba.se.idl.PrimitiveEntry;
import com.sun.tools.corba.se.idl.StringEntry;
import com.sun.tools.corba.se.idl.SymtabEntry;
import com.sun.tools.corba.se.idl.TypedefEntry;
/**
*
**/
public class ConstGen implements com.sun.tools.corba.se.idl.ConstGen
{
/**
* Public zero-argument constructor.
**/
public ConstGen ()
{
} // ctor
/**
* Generate Java code for an IDL constant. A constant is written to
* a new class only when it is not a member of an interface; otherwise
* it written to the interface class in which it resides.
**/
public void generate (Hashtable symbolTable, ConstEntry c, PrintWriter s)
{
this.symbolTable = symbolTable;
this.c = c;
this.stream = s;
init ();
if (c.container () instanceof ModuleEntry)
generateConst ();
else if (stream != null)
writeConstExpr ();
} // generate
/**
* Initialize members unique to this generator.
**/
protected void init ()
{
} // init
/**
* Generate the class defining the constant.
**/
protected void generateConst ()
{
openStream ();
if (stream == null)
return;
writeHeading ();
writeBody ();
writeClosing ();
closeStream ();
} // generateConst
/**
* Open a new print stream only if the constant is not a member
* of an interface.
**/
protected void openStream ()
{
stream = Util.stream (c, ".java");
} // openStream
/**
* Write the heading for the class defining the constant.
**/
protected void writeHeading ()
{
Util.writePackage (stream, c);
Util.writeProlog (stream, ((GenFileStream)stream).name ());
stream.println ("public interface " + c.name ());
// should not be done according to the mapping
// + " extends org.omg.CORBA.portable.IDLEntity");
stream.println ("{");
} // writeHeading
/**
* Write the constant expression and any comment, if present.
**/
protected void writeBody ()
{
writeConstExpr ();
} // writeBody
/**
* Write the entire constant expression and any comment, if present.
**/
protected void writeConstExpr ()
{
if (c.comment () != null)
c.comment ().generate (" ", stream);
if (c.container () instanceof ModuleEntry) {
stream.print (" public static final " + Util.javaName (c.type ()) + " value = ");
} else {
stream.print (" public static final " + Util.javaName (c.type ()) + ' ' + c.name () + " = ");
}
writeConstValue (c.type ());
} // writeConstExpr
/**
* Write the constant's value according to its type.
**/
private void writeConstValue (SymtabEntry type)
{
if (type instanceof PrimitiveEntry)
stream.println ('(' + Util.javaName (type) + ")(" + Util.parseExpression (c.value ()) + ");");
else if (type instanceof StringEntry)
stream.println (Util.parseExpression (c.value ()) + ';');
else if (type instanceof TypedefEntry)
{
while (type instanceof TypedefEntry)
type = type.type ();
writeConstValue (type);
}
else
stream.println (Util.parseExpression (c.value ()) + ';');
} // writeValue
/**
* Generate any last words and close the class.
**/
protected void writeClosing ()
{
stream.println ("}");
} // writeClosing
/**
* Close the print stream, causing the file to be written.
**/
protected void closeStream ()
{
stream.close ();
} // closeStream
protected java.util.Hashtable symbolTable = null;
protected ConstEntry c = null;
protected PrintWriter stream = null;
} // class ConstGen
/*=======================================================================================
DATE-AUTHOR ACTION
---------------------------------------------------------------------------------------
11sep1997daz Return when print stream is null and container is NOT a module. Fixes
-keep option, which causes null print stream to be sent to ConstGen.
31jul1997daz Write source comment immediately preceding constant declaration.
=======================================================================================*/