/*************************************************************************** * Copyright (C) 2008 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.metaservice; import java.io.IOException; import jolie.net.CommChannel; import jolie.runtime.FaultException; import jolie.runtime.Value; /** * The MetaService class is a bridge to a MetaService JOLIE service. * @TODO: support nested paths * @author Fabrizio Montesi */ abstract public class MetaService { private final static String SHUTDOWN = "shutdown"; private final static String ADD_REDIRECTION = "addRedirection"; private final static String REMOVE_REDIRECTION = "removeRedirection"; private final static String LOAD_EMBEDDED_JOLIE_SERVICE = "loadEmbeddedJolieService"; private final static String UNLOAD_EMBEDDED_JOLIE_SERVICE = "unloadEmbeddedService"; abstract public MetaServiceChannel getChannel() throws IOException; abstract protected CommChannel createCommChannel() throws IOException; /** * Shuts down this MetaService instance. * @throws java.io.IOException */ public void shutdown() throws IOException { getChannel().send( SHUTDOWN, Value.create() ); } /** * Adds a redirection. * @param resourcePrefix the first part of the resource name * the redirection will be published under, * e.g. if resourceName="MediaPlayer" then the redirection * will be published in /MediaPlayer or in /MediaPlayer-s, where s is a string. * @param location the location (in JOLIE format) the redirection has to point to. * @param protocol the protocol (in JOLIE format) the redirection has to use. * @param metadata additional descriptive metadata to be added to the redirection. * @return a MetaServiceChannel pointing to the added redirection. * @throws java.io.IOException in case of communication error. * @throws jolie.runtime.FaultException in case of a fault sent by the MetaService service. */ public MetaServiceChannel addRedirection( String resourcePrefix, String location, Value protocol, Value metadata ) throws IOException, FaultException { final MetaServiceChannel channel = getChannel(); Value request = Value.create(); request.getFirstChild( "resourcePrefix" ).setValue( resourcePrefix ); request.getFirstChild( "location" ).setValue( location ); request.getFirstChild( "protocol" ).deepCopy( protocol ); request.getFirstChild( "metadata" ).deepCopy( metadata ); channel.send( ADD_REDIRECTION, request ); Value ret = channel.recv(); return new MetaServiceChannel( this, '/' + ret.strValue() ); } /** * Removes a redirection. * @param resourceName the resource name identifying the redirection to remove. */ public void removeRedirection( String resourceName ) throws IOException { final MetaServiceChannel channel = getChannel(); channel.send( REMOVE_REDIRECTION, Value.create( resourceName ) ); try { channel.recv(); // This is a synchronous request. } catch( FaultException f ) { // This should never happen. throw new IOException( f ); } } /** * Starts an embedded jolie service reading its source code file, * publishes it and returns the created resource name. * @param resourcePrefix the first part of the resource name * the redirection will be published under, * e.g. if resourceName="MediaPlayer" then the redirection * will be published in /MediaPlayer or in /MediaPlayer-s, where s is a string. * @param filepath the source file path of the jolie service to embed. * @param metadata additional descriptive metadata to be added to the embedded service. * @return a MetaServiceChannel pointing to the embedded service * @throws java.io.IOException in case of communication error. * @throws jolie.runtime.FaultException in case of a fault sent by the MetaService service. */ public MetaServiceChannel loadEmbeddedJolieService( String resourcePrefix, String filepath, Value metadata ) throws IOException, FaultException { final MetaServiceChannel channel = getChannel(); Value request = Value.create(); request.getFirstChild( "resourcePrefix" ).setValue( resourcePrefix ); request.getFirstChild( "filepath" ).setValue( filepath ); request.getFirstChild( "metadata" ).deepCopy( metadata ); channel.send( LOAD_EMBEDDED_JOLIE_SERVICE, request ); Value ret = channel.recv(); return new MetaServiceChannel( this, '/' + ret.strValue() ); } /** * Unloads an embedded JOLIE service. * @param resourceName the resource name identifying the embedded service to remove. */ public void unloadEmbeddedJolieService( String resourceName ) throws IOException { final MetaServiceChannel channel = getChannel(); channel.send( UNLOAD_EMBEDDED_JOLIE_SERVICE, Value.create( resourceName ) ); try { channel.recv(); // This is a synchronous request. } catch( FaultException f ) { // This should never happen. throw new IOException( f ); } } }