/***************************************************************************
 *   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.runtime.embedding;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptException;
import jolie.Interpreter;
import jolie.net.AbstractCommChannel;
import jolie.net.CommChannel;
import jolie.net.CommMessage;
import jolie.net.PollableCommChannel;
import jolie.runtime.Value;

/**
 * @author Fabrizio Montesi
 * 
 * TODO: this shouldn't be polled
 */
public class JavaScriptCommChannel extends AbstractCommChannel implements PollableCommChannel
{
	private final Invocable invocable;
	private final List< CommMessage > messages = new LinkedList< CommMessage >();

	public JavaScriptCommChannel( Invocable invocable )
	{
		this.invocable = invocable;
	}

	@Override
	public CommChannel createDuplicate()
	{
		return new JavaScriptCommChannel( invocable );
	}

	protected void sendImpl( CommMessage message )
		throws IOException
	{
		Object returnValue = null;
		try {
			returnValue = invocable.invokeFunction( message.operationName(), message.value() );
		} catch( ScriptException e ) {
			throw new IOException( e );
		} catch( NoSuchMethodException e ) {
			throw new IOException( e );
		}
		CommMessage response;
		if ( returnValue != null ) {
			Value value = Value.create();
			value.setValue( returnValue );
			response = new CommMessage(
						message.id(),
						message.operationName(),
						message.resourcePath(),
						value,
						null
					);
		} else {
			response = CommMessage.createEmptyResponse( message );
		}
		synchronized( messages ) {
			messages.add( response );
			messages.notifyAll();
		}
	}

	protected CommMessage recvImpl()
		throws IOException
	{
		CommMessage ret = null;
		synchronized( messages ) {
			while( messages.isEmpty() ) {
				try {
					messages.wait();
				} catch( InterruptedException e ) {}
			}
			ret = messages.remove( 0 );
		}
		if ( ret == null ) {
			throw new IOException( "Unknown exception occurred during communications with a Java Service" );
		}
		return ret;
	}

	@Override
	protected void disposeForInputImpl()
		throws IOException
	{
		Interpreter.getInstance().commCore().registerForPolling( this );
	}

	protected void closeImpl()
	{}

	public boolean isReady()
	{
		return( !messages.isEmpty() );
	}
}

@@ -88,16 +88,26 @@
 ight (C)
+ 2008-2015
  by Fabr
@@ -123,39 +123,29 @@
 esi 
-                               
+%3Cfamontesi@gmail.com%3E
     
@@ -1614,26 +1614,19 @@
 va.util.
-LinkedList
+Map
 ;%0Aimport
@@ -1636,20 +1636,44 @@
 va.util.
-List
+concurrent.ConcurrentHashMap
 ;%0Aimport
@@ -1764,46 +1764,8 @@
 er;%0A
-import jolie.net.AbstractCommChannel;%0A
 impo
@@ -2008,16 +2008,8 @@
 nds 
-Abstract
 Comm
@@ -2100,21 +2100,26 @@
 e final 
-List%3C
+Map%3C Long,
  CommMes
@@ -2144,19 +2144,32 @@
 new 
-LinkedList%3C
+ConcurrentHashMap%3C Long,
  Com
@@ -3057,51 +3057,38 @@
 %7D%0A%09%09
-synchronized( messages ) %7B%0A%09%09%09
+%0A%09%09messages.put( 
 message
-s.add(
+.id(),
  res
@@ -3101,41 +3101,130 @@
 );%0A%09
-%09%09messages.notifyAll();%0A%09%09%7D
+%7D%0A%09%0A%09protected CommMessage recvImpl()%0A%09%09throws IOException%0A%09%7B%0A%09%09throw new IOException( %22Unsupported operation%22 );
 %0A%09%7D%0A%0A%09
+/* 
 prot
@@ -3616,24 +3616,169 @@
 turn ret;%0A%09%7D
+%0A%09*/%0A%09%0A%09@Override%0A%09public CommMessage recvResponseFor( CommMessage request )%0A%09%09throws IOException%0A%09%7B%0A%09%09return messages.remove( request.id() );%0A%09%7D
 %0A%0A%09@Override

Improve efficiency of javascript channels.