/***************************************************************************
 *   Copyright (C) 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 jolie.process;

import jolie.ExecutionThread;
import jolie.runtime.Condition;
import jolie.runtime.FaultException;


public class IfProcess implements Process
{
	public static class CPPair
	{
		final private Condition condition;
		final private Process process;
		
		public CPPair( Condition condition, Process process )
		{
			this.condition = condition;
			this.process = process;
		}
		
		public Condition condition()
		{
			return condition;
		}
		
		public Process process()
		{
			return process;
		}
	}
	
	final private CPPair[] pairs;
	final private Process elseProcess;
	
	public IfProcess( CPPair[] pairs, Process elseProcess )
	{
		this.pairs = pairs;
		this.elseProcess = elseProcess;
	}
	
	public Process clone( TransformationReason reason )
	{
		CPPair[] pairsCopy = new CPPair[ pairs.length ];
		for( int i = 0; i < pairs.length; i++ ) {
			pairsCopy[ i ] = new CPPair(
					pairs[ i ].condition.cloneCondition( reason ),
					pairs[ i ].process.clone( reason )
				);
		}
		return new IfProcess(
			pairsCopy,
			( elseProcess == null ) ? null : elseProcess.clone( reason )
		);
	}
	
	public void run()
		throws FaultException
	{
		if ( ExecutionThread.currentThread().isKilled() ) {
			return;
		}

		boolean stop = false;
		int i = 0;
		CPPair pair;
		
		while( !stop && i < pairs.length ) {
			pair = pairs[ i ];
			if ( pair.condition().evaluate() ) {
				stop = true;
				pair.process().run();
			}
			i++;
		}

		// No valid condition found, run the else process
		if ( !stop && elseProcess != null )
			elseProcess.run();
	}
	
	public boolean isKillable()
	{
		return true;
	}
}
@@ -2773,19 +2773,21 @@
 ean 
-stop = fals
+keepRun = tru
 e;%0A%09
@@ -2825,21 +2825,23 @@
 %09while( 
-!stop
+keepRun
  && i %3C 
@@ -2927,18 +2927,22 @@
 %09%09%09%09
-stop = tru
+keepRun = fals
 e;%0A%09
@@ -3047,13 +3047,15 @@
 f ( 
-!stop
+keepRun
  && 
@@ -3075,16 +3075,18 @@
 = null )
+ %7B
 %0A%09%09%09else
@@ -3100,16 +3100,20 @@
 .run();%0A
+%09%09%7D%0A
 %09%7D%0A%09%0A%09pu

Adhere to the code style.