/* Milenia Grafter Server Copyright (c) 2007-2008 by Milan Toth. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU 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 General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package application.modules; /* Tasks of Stress - accept conneciton of controller - open remote connections to given tested server - on successful connection, start playing a stream */ import java.util.ArrayList; import com.milgra.server.api.Client; import com.milgra.server.api.Stream; import com.milgra.server.api.Wrapper; import com.milgra.server.api.WrapperList; import com.milgra.server.api.InvokeEvent; import com.milgra.server.api.StatusEvent; import com.milgra.server.api.IApplication; import com.milgra.server.api.EventListener; public class Stress implements IModule { // counter - remote player counter // streamId - counterer for local stream creation public int counter; public int streamId; // client - controller client // testedUrl - url of tested server public Client client; public Client testedClient; public Stream testedStream; public String testedUrl; // application - mother application // players - remote clients public IApplication application; public ArrayList < Client > players; /** * Stress constructor * @param applicationX mother application */ public Stress ( IApplication applicationX ) { System.out.println( System.currentTimeMillis( ) + " SSLive.construct " ); // create players = new ArrayList < Client > ( ); // set counter = 0; streamId = 0; application = applicationX; } /** * Client entering point * @param clientX client * @param argumentsX arguments */ public void onEnter ( Client clientX , WrapperList argumentsX ) { System.out.println( System.currentTimeMillis( ) + " SSLive.onEnter " + clientX + " " + argumentsX ); // create EventListener invokeListener = new EventListener ( ) { public void onEvent ( InvokeEvent eventX ) { onInvoke( eventX ); } }; // set testedUrl = argumentsX.getString( 1 ); client = clientX; client.addInvokeEventListener( invokeListener ); client.accept( ); connectRemote( ); } public void connectRemote ( ) { System.out.println( System.currentTimeMillis( ) + " SSLive.connectRemote " ); client.call( "log" , new Wrapper( "Connecting to accepting application" ) ); EventListener statusListener = new EventListener ( ) { public void onEvent ( StatusEvent eventX ) { onAcceptedConnection( eventX ); } }; WrapperList arguments = new WrapperList( ); arguments.add( "StreamControl" ); testedClient = new Client( application ); testedClient.addStatusEventListener( statusListener ); testedClient.connect( "rtmp://" + testedUrl + "/milgraunit" , arguments ); } /** * Status for accepted connection * @param eventX event */ public void onAcceptedConnection ( StatusEvent eventX ) { System.out.println( System.currentTimeMillis( ) + " SSConnection.onAcceptedConnection " + eventX.code ); if ( eventX.code.equals( StatusEvent.SUCCESS ) ) { client.call( "log" , new Wrapper( "Status: " + eventX.code + " application: " + eventX.info.getString( "application" ) ) ); client.call( "log" , new Wrapper( "You can start stress testing." ) ); testedStream = new Stream( "livestream1" , testedClient ); testedStream.publish( "livestream" , "live" ); } else { client.call( "log" , new Wrapper( "Status: " + eventX.code ) ); client.call( "log" , new Wrapper( "FAILED" ) ); } testedClient.addStatusEventListener( null ); } /** * Closes module **/ public void onLeave ( Client clientX ) { System.out.println( System.currentTimeMillis( ) + " Stress.onClose " ); } /** * Invoke from controller * @param eventX event */ public void onInvoke ( InvokeEvent eventX ) { System.out.println( System.currentTimeMillis( ) + " SSLive.onInvoke " + eventX.id ); if ( eventX.id.equals( "setSubscribers" ) ) setSubscribers( ( int ) eventX.arguments.getDouble( 0 ) ); } /** * Status events from players * @param eventX event */ public void onStatus ( StatusEvent eventX ) { System.out.println( System.currentTimeMillis( ) + " Stress.onPlayerStatus " + eventX.code ); if ( eventX.code.equals( StatusEvent.SUCCESS ) ) { // play stream Stream stream = new Stream( "stream" + ++ streamId , eventX.client ); stream.play( "livestream1" ); } } /** * Sets remote subscribers * @param counterX counter */ public void setSubscribers ( int counterX ) { System.out.println( System.currentTimeMillis( ) + " Stress.setSubscribers " + counterX ); if ( counterX != counter ) { counter = counterX; // rearrange int difference = counter - players.size( ); if ( difference > 0 ) addPlayers( difference ); if ( difference < 0 ) removePlayers( - difference ); } } /** * Adds new remote players * @param counterX counter */ public void addPlayers ( int counterX ) { System.out.println( System.currentTimeMillis( ) + " Stress.addPlayers " + counterX ); EventListener statusListener = new EventListener ( ) { public void onEvent ( StatusEvent eventX ) { onStatus( eventX ); } }; for ( int index = 0 ; index < counterX ; index++ ) { // create client Client client = new Client( application ); client.addStatusEventListener( statusListener ); client.connect( "rtmp://" + testedUrl + "/milgraunit" , new Wrapper( "StreamControl" ) ); players.add( client ); } } /** * Removes players * @param counterX counter */ public void removePlayers ( int counterX ) { System.out.println( System.currentTimeMillis( ) + " Stress.removePlayers " + counterX ); for ( int index = 0 ; index < counterX ; index++ ) { Client client = players.remove( 0 ); client.detach( ); } } }