/***************************************************************************
* Copyright (C) 2011 by Balint Maschio <bmaschio@italianasoftware.com> *
* *
* 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.dummycreator.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map.Entry;
import jolie.lang.parse.ast.InputPortInfo;
import jolie.lang.parse.ast.InterfaceDefinition;
import jolie.lang.parse.ast.OperationDeclaration;
import jolie.lang.parse.ast.RequestResponseOperationDeclaration;
import jolie.lang.parse.ast.types.TypeDefinition;
import jolie.lang.parse.ast.types.TypeDefinitionLink;
import jolie.lang.parse.util.ProgramInspector;
/**
*
* @author Balint Maschio
*/
public class JolieDummyDocumentCreator
{
private ProgramInspector inspector;
private String directorySourceFile;
private StringBuilder stringBuilder;
private String nameSourceFile;
public JolieDummyDocumentCreator( ProgramInspector inspector, String directorySourceFile )
{
this.inspector = inspector;
this.directorySourceFile = directorySourceFile.substring( 0, directorySourceFile.lastIndexOf( "/" ) + 1 );
this.nameSourceFile = directorySourceFile.substring( directorySourceFile.lastIndexOf( "/" ) + 1 );
stringBuilder = new StringBuilder();
}
public void createDocument()
throws FileNotFoundException, IOException
{
String lineOriginalFile = "include \"string_utils.iol\"";
System.out.print( "The directory of the file ol is " + directorySourceFile + "\n" );
BufferedReader reader = new BufferedReader( new FileReader( directorySourceFile + nameSourceFile ) );
while( !(lineOriginalFile.contains( "nullProcess" )) ) {
stringBuilder.append( lineOriginalFile + "\n" );
lineOriginalFile = reader.readLine();
if ( (lineOriginalFile.contains( "include" )) && (lineOriginalFile.contains( "/" )) ) {
int indexSlash = lineOriginalFile.indexOf( "/" );
lineOriginalFile = lineOriginalFile.substring( 0, indexSlash ) + ".." + lineOriginalFile.substring( indexSlash );
}
}
for( InputPortInfo inputPortInfo : inspector.getInputPorts() ) {
if ( inputPortInfo.context().source().getSchemeSpecificPart().contains( directorySourceFile ) ) {
System.out.print( "The port is part of the soa " + inputPortInfo.context().source().getSchemeSpecificPart() + "\n" );
for( OperationDeclaration operationDeclaration : inputPortInfo.operations() ) {
convertOperation( operationDeclaration, stringBuilder );
//Input
}
} else {
System.out.print( "The port is not part of the soa " + inputPortInfo.context().source().getSchemeSpecificPart() + "\n" );
}
}
stringBuilder.append( "}" );
System.out.print( stringBuilder.toString() );
File pippo = new File( directorySourceFile + "test/" );
pippo.mkdir();
BufferedWriter writer = new BufferedWriter( new FileWriter( directorySourceFile + "test/" + nameSourceFile ) );
writer.append( stringBuilder.toString() );
writer.flush();
writer.close();
}
private void convertInterfaces( InterfaceDefinition insterfaceDefinition, StringBuilder stringBuilder )
{
}
private void convertOperation( OperationDeclaration operatationDeclaration, StringBuilder stringBuilder )
{
if ( operatationDeclaration instanceof RequestResponseOperationDeclaration ) {
//if (((RequestResponseOperationDeclaration)operatationDeclaration).requestType().id()
stringBuilder.append( "[" ).append( operatationDeclaration.id() ).append( "(request)(response){\n" );
stringBuilder.append( "\t" ).append( "valueToPrettyString@StringUtils( request )( s)" ).append( ";\n" );
stringBuilder.append( "\t" ).append( "println@Console(s)()" );
TypeDefinition typeDefinition = ((RequestResponseOperationDeclaration) operatationDeclaration).responseType();
if ( typeDefinition.hasSubTypes() ) {
stringBuilder.append( ";\n" );
for( Entry<String, TypeDefinition> entry : typeDefinition.subTypes() ) {
convertTypes( entry.getValue(), stringBuilder, "\tdummyResponse." + entry.getKey() );
}
stringBuilder.append( "response<<dummyResponse\n" );
} else {
if ( !(typeDefinition.nativeType().id().equals( "void" )) ) {
stringBuilder.append( ";\n" );
if ( typeDefinition.nativeType().id().equals( "int" ) ) {
stringBuilder.append( "\tdummyRespose" ).append( "=" ).append( "42;\n" );
//
} else if ( typeDefinition.nativeType().id().equals( "double" ) ) {
stringBuilder.append( "\tdummyRespose" ).append( "=" ).append( "1.54;\n" );
} else {
stringBuilder.append( "\tdummyRespose" ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
stringBuilder.append( "response<<dummyResponse\n" );
}
}
/// handeling of types here
stringBuilder.append( "\n}]{nullProcess}\n" );
}
}
private void convertTypes( TypeDefinition typeDefinition, StringBuilder stringBuilder, String nameVariable )
{
if ( typeDefinition instanceof TypeDefinitionLink ) {
TypeDefinitionLink typeDefinitionLink = (TypeDefinitionLink) typeDefinition;
if ( typeDefinitionLink.cardinality().max() > 1 ) {
if ( typeDefinitionLink.cardinality().max() == 2147483647 ) {
for( int cardinalityIndex = 0; cardinalityIndex < 4; cardinalityIndex++ ) {
{
if ( !(typeDefinitionLink.linkedType().nativeType().id().equals( "void" )) ) {
if ( typeDefinitionLink.nativeType().id().equals( "int" ) ) {
stringBuilder.append( "[" + (new Integer( cardinalityIndex )).toString() + "]" ).append( "=" ).append( "42;\n" );
//
} else if ( typeDefinitionLink.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "[" + (new Integer( cardinalityIndex )).toString() + "]" ).append( "=" ).append( "1.54;\n" );
} else {
stringBuilder.append( nameVariable ).append( "[" + (new Integer( cardinalityIndex )).toString() + "]" ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
}
if (typeDefinitionLink.linkedType().hasSubTypes()){
for( Entry<String, TypeDefinition> entry : typeDefinitionLink.linkedType().subTypes() ) {
convertTypes( entry.getValue(), stringBuilder, nameVariable + "[" + (new Integer( cardinalityIndex )).toString() + "]" + "." + entry.getKey() );
}
}
}
}
} else {
for( int cardinalityIndex = 0; cardinalityIndex < typeDefinitionLink.cardinality().max(); cardinalityIndex++ ) {
{
if ( !(typeDefinitionLink.linkedType().nativeType().id().equals( "void" )) ) {
if ( typeDefinitionLink.nativeType().id().equals( "int" ) ) {
stringBuilder.append( "[" ).append( (new Integer( cardinalityIndex )).toString() ).append( "]").append( "=" ).append( "42;\n" );
//
} else if ( typeDefinitionLink.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "[" ).append( (new Integer( cardinalityIndex )).toString()).append( "]").append( "=" ).append( "1.54;\n" );
} else {
stringBuilder.append( nameVariable ).append( "[" ).append( (new Integer( cardinalityIndex )).toString()).append( "]").append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
}
for( Entry<String, TypeDefinition> entry : typeDefinitionLink.linkedType().subTypes() ) {
convertTypes( entry.getValue(), stringBuilder, nameVariable + "[" + (new Integer( cardinalityIndex )).toString() + "]" + "." + entry.getKey() );
}
}
}
}
} else {
if ( !(typeDefinitionLink.linkedType().nativeType().id().equals( "void" )) ) {
if ( typeDefinitionLink.nativeType().id().equals( "int" ) ) {
stringBuilder.append( nameVariable ).append( "=" ).append( "42;\n" );
//
} else if ( typeDefinitionLink.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "=" ).append( "1.54;\n" );
} else {
stringBuilder.append( nameVariable ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
}
if (typeDefinitionLink.linkedType().hasSubTypes()){
for( Entry<String, TypeDefinition> entry : typeDefinitionLink.linkedType().subTypes() ) {
convertTypes( entry.getValue(), stringBuilder, nameVariable + "." + entry.getKey() );
}
}
}
} else if ( typeDefinition.untypedSubTypes() ) {
//
} else {
if ( typeDefinition.hasSubTypes() ) {
for( Entry<String, TypeDefinition> entry : typeDefinition.subTypes() ) {
convertTypes( entry.getValue(), stringBuilder, nameVariable + "." + entry.getKey() );
}
} else {
if ( typeDefinition.cardinality().max() > 1 ) {
if ( typeDefinition.cardinality().max() == 2147483647 ) {
for( int cardinalityIndex = 0; cardinalityIndex < 4; cardinalityIndex++ ) {
if ( typeDefinition.nativeType().id().equals( "int" ) ) {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( cardinalityIndex ).append( ";\n" );
//
} else if ( typeDefinition.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( 1.54 + cardinalityIndex ).append( ";\n" );
} else {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
//
}
} else {
for( int cardinalityIndex = 0; cardinalityIndex < typeDefinition.cardinality().max(); cardinalityIndex++ ) {
if ( typeDefinition.nativeType().id().equals( "int" ) ) {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( cardinalityIndex ).append( ";\n" );
//
} else if ( typeDefinition.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( 1.54 + cardinalityIndex ).append( ";\n" );
} else {
stringBuilder.append( nameVariable ).append( "[" ).append( cardinalityIndex ).append( "]" ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
}
}
} else {
if ( typeDefinition.nativeType().id().equals( "int" ) ) {
stringBuilder.append( nameVariable ).append( "=" ).append( "42;\n" );
//
} else if ( typeDefinition.nativeType().id().equals( "double" ) ) {
stringBuilder.append( nameVariable ).append( "=" ).append( "1.54;\n" );
} else {
stringBuilder.append( nameVariable ).append( "=" ).append( "\"dummy" ).append( typeDefinition.id() ).append( "\"" ).append( ";\n" );
}
}
}
}
}
//private void writeType( TypeDefinition type, boolean subType, Writer writer, int indetationLevel )
}