content: /*
   *                         Vortex OpenSplice
   *
   *   This software and documentation are Copyright 2006 to TO_YEAR ADLINK
   *   Technology Limited, its affiliated companies and licensors. All rights
   *   reserved.
   *
   *   Licensed under the Apache License, Version 2.0 (the "License");
   *   you may not use this file except in compliance with the License.
   *   You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
   *   Unless required by applicable law or agreed to in writing, software
   *   distributed under the License is distributed on an "AS IS" BASIS,
   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *   See the License for the specific language governing permissions and
   *   limitations under the License.
   *
   */
  
  import java.util.ArrayList;
  import java.util.List;
  import org.omg.dds.core.Duration;
  import org.omg.dds.sub.InstanceState;
  import org.omg.dds.sub.Sample;
  
  /**
   * The RoundTrip example consists of a Ping and a Pong application. Ping sends
   * sample to Pong by writing to the Ping partition which Pong subscribes to.
   * Pong them sends them back to Ping by writing on the Pong partition which Ping
   * subscribes to. Ping measure the amount of time taken to write and read each
   * sample as well as the total round trip time to send a sample to Pong and
   * receive it back.
   * 
   * This class performs the Pong role in this example.
   */
  class Pong_impl {
  
  	/**
  	 * Performs the Pong role in this example.
  	 */
  	public void run(String args[]) {
  		try {
  
  			/*
  			 * Initialize entities
  			 */
  			final Entities e = new Entities("pong", "ping");
  
  			Runtime.getRuntime().addShutdownHook(new Thread() {
  				public void run() {
  					e.terminated.setTriggerValue(true);
  				}
  			});
  
  			System.out.println("Waiting for samples from ping to send back...");
  
  			Duration waitTimeout = e.env.getSPI().infiniteDuration();
  
  			List<Sample<RoundTripModule.DataType>> samples = new ArrayList<Sample<RoundTripModule.DataType>>(
  					10);
  
  			while (!e.terminated.getTriggerValue()) {
  				/*
  				 * Wait for a sample from ping
  				 */
  				e.waitSet.waitForConditions(waitTimeout);
  				/*
  				 * Take sample
  				 */
  				e.reader.take(samples);
  
  				for (int i = 0; !e.terminated.getTriggerValue()
  						&& i < samples.size(); i++) {
  					/*
  					 * If writer has been disposed terminate pong
  					 */
  					Sample<RoundTripModule.DataType> sample = samples.get(i);
  					if (sample.getInstanceState() == InstanceState.NOT_ALIVE_DISPOSED) {
  						System.out
  								.println("Received termination request. Terminating.");
  						e.terminated.setTriggerValue(true);
  						break;
  					}
  					/*
  					 * If sample is valid, send it back to ping
  					 */
  					else if (sample.getData() != null) {
  						e.writer.write(sample.getData());
  					}
  
  				}
  			}
  			e.participant.close();
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  	}
  }
  