Code for Example 6 InApp class

package tut;
import java.util.Locale;
import com.ibm.telephony.beans.directtalk.ApplicationProperties;
import com.ibm.telephony.beans.media.*;
import com.ibm.telephony.wvr.*;
/**
 *
 * A simple WVR application
 */
public class InApp extends WVRApplication {
	// Define the category for all the voice segments in this application.
	private static final String CATEGORY = "Tutorials";
	
	// Define the menu items
    	private static final String ITEM1_MSG	   = "Message";
	private static final String ITEM2_NUMBER   = "Number";
	private static final String ITEM3_ORDER	   = "Order";
	private static final String ITEM4_OPERATOR = "Operator";
	private static final String ITEM5_HANGUP   = "Hangup";
	
	// Create an array to store the menu items
	private static final String[] MENU_ITEMS = { ITEM1_MSG, ITEM2_NUMBER, ITEM3_ORDER,
                                                         ITEM4_OPERATOR, ITEM5_HANGUP };
	
	// Create an array to represent the keys that will be used to select the menu items
	private static final String[] MENU_KEYS = { "1", "2", "3", "4", "5" };
	
	// Create a number of Voice Segment objects that are shared amongst all instances of this
	// application within the JVM.
	
	// Create the Welcome and Difficulties segment objects
	private static final VoiceSegment VS_WELCOME      = new VoiceSegment(CATEGORY, "Welcome");
	private static final VoiceSegment VS_DIFFICULTIES = new VoiceSegment(CATEGORY, "Difficulties");
	
	// Create the segment objects for the menu items, and store them in an array
	private static final MediaType[]  MENU_PROMPTS = {
		new VoiceSegment(CATEGORY, "Message"),
		new VoiceSegment(CATEGORY, "Number"),
		new VoiceSegment(CATEGORY, "Order"),
		new VoiceSegment(CATEGORY, "Operator"),
		new VoiceSegment(CATEGORY, "Hangup")
	};
		
	// Create the segment objects required for the menu properties
	private static final VoiceSegment VS_MENU_INVALID = new VoiceSegment(CATEGORY, "InvalidKey");
	private static final VoiceSegment VS_MENU_ERROR   = new VoiceSegment(CATEGORY, "Error");
	private static final VoiceSegment VS_MENU_ONEMORE = new VoiceSegment(CATEGORY, "OneMore");
	private static final VoiceSegment VS_MENU_HEADER  = new VoiceSegment(CATEGORY, "MenuHeader");
	private static final VoiceSegment VS_MENU_FOOTER  = new VoiceSegment(CATEGORY, "MenuFooter");	
	// Create the segment objects for the hangup menu item
	private static final VoiceSegment VS_THANKCALLING = new VoiceSegment(CATEGORY, "ThankCalling");
	
	// Create the segment objects for the record a message menu item
	private static final VoiceSegment VS_RECORD     = new VoiceSegment(CATEGORY, "Record");
	private static final VoiceSegment VS_PRESS_KEY  = new VoiceSegment(CATEGORY, "PressKey");
	private static final VoiceSegment VS_CALLER_MSG = new VoiceSegment(CATEGORY, "CallerMsg");
	private static final VoiceSegment VS_RESPOND    = new VoiceSegment(CATEGORY, "Respond");
	// Create the segment objects for the key in a telephone number menu item
	private static final VoiceSegment VS_TEL_NO         = new VoiceSegment(CATEGORY, "TelNo");
	private static final VoiceSegment VS_THANK_YOU      = new VoiceSegment(CATEGORY, "ThankYou");
	private static final VoiceSegment VS_ONE_MORE_TIME  = new VoiceSegment(CATEGORY, "OneMoreTime");
	private static final VoiceSegment VS_NO_VALID_INPUT = new VoiceSegment(CATEGORY, "NoValidInput");
	private static final VoiceSegment VS_NUMBER_INVALID = new VoiceSegment(CATEGORY, "NumberInvalid");
	private static final VoiceSegment VS_NOT_ENOUGH     = new VoiceSegment(CATEGORY, "NotEnough");
	private static final VoiceSegment VS_CALL_BACK      = new VoiceSegment(CATEGORY, "CallBack");
	// Create an InputValidator to validate the caller's telephone number
	private static final InputValidator PHONE_NUM_CHECKER = new InputValidator() {
		public String validate(InputResult result) {
			String value = result.getValue();
			if (value.substring(0, 1).equals("2")) return value;
			return null;	
		}	
	};
	// Create some attribute objects for the menu
	private PlayAttributes menuPlayAtts = new PlayAttributes();
	private MenuAttributes menuAtts     = new MenuAttributes(MENU_PROMPTS, MENU_ITEMS, MENU_KEYS, null);
	private DTMFAttributes menuDTMFAtts = new DTMFAttributes();
	private RecoAttributes menuRecoAtts = null;
	
	// Create some attribute objects for getting the caller's telephone number
	private PlayAttributes telNoPlayAtts   = new PlayAttributes();
	private InputAttributes telNoInputAtts = new InputAttributes();
	private DTMFAttributes telNoDTMFAtts   = new DTMFAttributes();
	private RecoAttributes telNoRecoAtts   = null;
	
	// Create a flag to control whether we continue to loop around in the voiceMain() method taking calls
	private boolean keepTakingCalls = true;
	// Create an instance of the Catalog class
	private Catalog catalog = new Catalog();
	
	// Create a constructor method to set up the attributes
	public InApp() {
		// Set the input attributes of the menu
		menuAtts.setHeaderMessage(VS_MENU_HEADER);
		menuAtts.setFooterMessage(VS_MENU_FOOTER);		
		menuAtts.setInvalidInputMessage(VS_MENU_INVALID);
		menuAtts.setOneMoreRepeatMessage(VS_MENU_ONEMORE);
		menuAtts.setNoMoreRepeatsMessage(VS_MENU_ERROR);
		menuAtts.setTimeout(10);
		menuAtts.setNumberOfRepeats(2);	
		
		// Set the DTMF attributes of the menu
		menuDTMFAtts.setDelimiterKeys("");
		menuDTMFAtts.setMaximumKeys(1);
		
		// Set the input attributes for getting the telephone number
		telNoInputAtts.setMessage(VS_TEL_NO);
		telNoInputAtts.setTimeoutMessage(VS_NOT_ENOUGH);
		telNoInputAtts.setInvalidInputMessage(VS_NUMBER_INVALID);
		telNoInputAtts.setOneMoreRepeatMessage(VS_ONE_MORE_TIME);
		telNoInputAtts.setNoMoreRepeatsMessage(VS_NO_VALID_INPUT);		
		telNoInputAtts.setTimeout(10);
		telNoInputAtts.setNumberOfRepeats(2);
		telNoInputAtts.setValidator(PHONE_NUM_CHECKER);
		
		// Set the DTMF attributes for getting the telephone number
		telNoDTMFAtts.setDelimiterKeys("");
		telNoDTMFAtts.setMaximumKeys(6);
	}//InApp
  /**
	 * @see com.ibm.telephony.wvr.WVRApplication#voiceMain()
	 */
	public void voiceMain() throws WVRException {	
		
		// Define the Call object
		Call call = null; 			
		// Set the application properties
		ApplicationProperties applicationProperties = new ApplicationProperties();
		applicationProperties.setApplicationName("app1");
		applicationProperties.setLocale(Locale.US);
			
		// Create the WVR object and set the wait time
		WVR wvr = new WVR(this, applicationProperties);
		wvr.setWaitTime(-1);
			
		// Create a variable that will be used to give each call a unique number
		int callNumber = 0;
		try {
			while (keepTakingCalls) {
				// Increment callNumber
				callNumber++;
				
				// Wait for a call
				call = wvr.waitForCall("Call: " + callNumber);
				
				// Create a flag to indicate whether the call is in progress
				boolean callInProgress = true;
				try {			
					// Play welcome message
					call.play(VS_WELCOME);
					
					while (callInProgress) {						
						// Play the menu and get the caller's response.
						InputResult input = call.playAndGetInput(menuPlayAtts, menuAtts, menuDTMFAtts, menuRecoAtts);
						String choice = input.getValue();	
						
						// Check which menu option has been selected and take
						// the appropriate action. Each action returns a boolean
						// stating whether the call should continue or not
						if (choice.equals(ITEM1_MSG)) {
							// Menu item 1 - record a message
							callInProgress = recordMessage(call);
						}
						else if (choice.equals(ITEM2_NUMBER)) {
							// Menu item 2 - leave a telephone number
							callInProgress = leavePhoneNumber(call);
						}
						else if (choice.equals(ITEM3_ORDER)) {
							// Menu item 3 - place an order
							callInProgress = order(call);
						}
						else if (choice.equals(ITEM5_HANGUP)) {
							// Menu item 5 - hang up
							callInProgress = hangUp(call);
						}
						else {					
							// Print out the caller's choice.
							System.out.println("Caller chose option " + choice);
						}//if						
					}//while
				}				
				catch (WVRHungUpException e) {
					// Caller has hung up - ignore exception, program will go to finally block
				}
				catch (WVRInvalidInputException e) {
					// Caller has entered invalid input - ignore exception, application will go to finally block		
				}		
				catch (WVRException e) {
					// Check if Call object has been created. If yes, play the Difficulties message.
					if (call.isActive()) call.play(VS_DIFFICULTIES);
					// Print debugging information
					e.printStackTrace();
				}				
				finally {
					// Return the call
					call.returnCall();
				}//try
									
			}//while
		}
		
		catch (WVRException e) {
			// Print debugging information
			e.printStackTrace();
		}//try
		
	}//voiceMain
	/**
	 * Method recordMessage.
	 * @param call
	 * @return boolean
	 */
	private boolean recordMessage(Call call) throws WVRException {
		// Play segments to instruct the caller on how to record their message
		call.play(VS_RECORD);
		call.play(VS_PRESS_KEY);
		
		// Record the message
		call.record(VS_CALLER_MSG, 180);
		
		// Play a message to acknowledge the recording
		call.play(VS_RESPOND);
		call.play(VS_CALL_BACK);
		
		
		return true;		
	}
	/**
	 * Method leavePhoneNumber.
	 * @param call
	 * @return boolean
	 */
	private boolean leavePhoneNumber(Call call) throws WVRException {
		try {
			// Get the caller's input - the Input Validator class created earlier will check to make sure the
			// number begins with a 2
			InputResult result = call.playAndGetInput(telNoPlayAtts, telNoInputAtts, telNoDTMFAtts, telNoRecoAtts);
		}
		catch (WVRInvalidInputException e) {
			return true;
		}//try
		
		// Play the ThankYou message to acknowledge a valid number
		call.play(VS_THANK_YOU);
		return true;
	}
	/**
	 * Method order.
	 * @param call
	 * @return boolean
	 */
	private boolean order(Call call) throws WVRException {
		// Invoke the takeOrder method of the Catalog class to get the caller's order
		catalog.takeOrder(call);
		return true;		
	}//order
	/**
	 * Method hangUp.
	 * @param call
	 * @return boolean
	 */
	private boolean hangUp(Call call) throws WVRException {
		// Thank the user for calling
		call.play(VS_THANKCALLING);
		
		return false;
	}
	// Tell the application to stop taking calls when the node shuts down	
	public void voiceAppStop() { keepTakingCalls = false; }
	public static void main(String[] args) {
		// Create an instance of the class and invoke the run method
		InApp aInApp = new InApp();
		aInApp.run();
	}//main
}//InApp