code: /***************************************************************************
   *   Copyright (C) 2009 by Fabrizio Montesi                                *
   *                                                                         *
   *   This program 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 program 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 for more details.                          *
   *                                                                         *
   *   You should have received a copy of the GNU Library General Public     *
   *   License along with this program; if not, write to the                 *
   *   Free Software Foundation, Inc.,                                       *
   *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
   *                                                                         *
   *   For details about the authors of this software, see the AUTHORS file. *
   ***************************************************************************/
  
  package joliex.java.impl;
  
  import java.io.IOException;
  import java.io.Writer;
  import java.util.Map.Entry;
  import java.util.logging.Logger;
  import jolie.lang.parse.ast.InterfaceDefinition;
  import jolie.lang.parse.ast.OneWayOperationDeclaration;
  import jolie.lang.parse.ast.OperationDeclaration;
  import jolie.lang.parse.ast.Program;
  import jolie.lang.parse.ast.RequestResponseOperationDeclaration;
  import joliex.java.impl.InterfaceVisitor;
  import joliex.java.impl.InterfaceVisitor.InterfaceNotFound;
  
  /**
   *
   * @author Fabrizio Montesi
   */
  public class InterfaceConverter
  {
  	private final Program program;
  	private final String[] interfaceNames;
  	private final Logger logger;
  	private Writer writer;
  	private int indentationLevel = 0;
  
  	public InterfaceConverter( Program program, String[] interfaceNames, Logger logger )
  	{
  		this.program = program;
  		this.interfaceNames = interfaceNames;
  		this.logger = logger;
  	}
  
  	private void indent()
  	{
  		indentationLevel++;
  	}
  
  	private void unindent()
  	{
  		indentationLevel--;
  	}
  
  	public void convert( Writer writer )
  		throws InterfaceNotFound, IOException
  	{
  		this.writer = writer;
  		InterfaceDefinition[] interfaceDefinitions =
  			new InterfaceVisitor( program, interfaceNames ).getInterfaceDefinitions();
  
  		writeHeader();
  		indent();
  		for( InterfaceDefinition i : interfaceDefinitions ) {
  			convertInterfaceDefinition( i );
  		}
  		unindent();
  		writeFooter();
  
  		writer.flush();
  	}
  
  	private void writeFooter()
  		throws IOException
  	{
  		writeLine( "}" );
  	}
  
  	private void writeHeader()
  		throws IOException
  	{
  		String className = "Tmp";
  		writeLine( "public class " + className );
  		writeLine( "{" );
  		indent();
  		writeLine( "private final JolieAdapter service;\n" );
  		writeLine( "public " + className + "( JavaService javaService )" );
  		writeLine( "{" );
  		indent();
  		writeLine( "this.service = new JolieAdapter( javaService, \"/\" );" );
  		unindent();
  		writeLine( "}" );
  		unindent();
  	}
  
  	private void writeLine( String s )
  		throws IOException
  	{
  		for( int i = 0; i < indentationLevel; i++ ) {
  			writer.write( "\t" );
  		}
  		writer.write( s );
  		writer.write( "\n" );
  	}
  
  	private void convertInterfaceDefinition( InterfaceDefinition iface )
  		throws IOException
  	{
  		for( Entry< String, OperationDeclaration > entry : iface.operationsMap().entrySet() ) {
  			writeLine( "" );
  			if ( entry.getValue() instanceof OneWayOperationDeclaration ) { // It's a One-Way
  				writeOperation( (OneWayOperationDeclaration)entry.getValue() );
  			} else { // It's a Request-Response
  				writeOperation( (RequestResponseOperationDeclaration)entry.getValue() );
  			}
  		}
  	}
  
  	private void writeOperation( OneWayOperationDeclaration op )
  		throws IOException
  	{
  		writeLine( "public void " + op.id() + "( Value request )" );
  		writeLine( "{" );
  		indent();
  		writeLine( "service.callOneWay( \"" + op.id() + "\", request );" );
  		unindent();
  		writeLine( "}" );
  	}
  
  	private void writeOperation( RequestResponseOperationDeclaration op )
  		throws IOException
  	{
  		writeLine( "public Value " + op.id() + "( Value request )" );
  		indent(); writeLine( "throws FaultException"); unindent();
  		writeLine( "{" );
  		indent();
  		writeLine( "return service.callRequestResponse( \"" + op.id() + "\", request );" );
  		unindent();
  		writeLine( "}" );
  	}
  }
  