⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 consoleservicerequest.java

📁 简单的会议议程系统,展示了Command 模式的应用
💻 JAVA
字号:
/*
 * @(#)ConsoleServiceRequest.java        2006/11/13
 *
 * Copyright (c) ZhiYang.
 * All rights reserved.
*/

package his;

import java.util.*;
import java.io.*;


/**
 * 命令行用户请求
 * @version 1.0 
 * @author 杨智 (MSE2006B-06250145)
 *
 */

public class ConsoleServiceRequest implements ServiceRequest 
{
	/*
	 * UIMessager: output message while doing a command
	*/
	private UIMessager msger;
	
	/*
	 * Command reators: user to create Command object
	*/
	private static Map reactors = new TreeMap();
	static {
		reactors.put( "register", new RegisterReactor() );
		reactors.put( "add", new AddReactor() );
		reactors.put( "query", new QueryReactor() );
		reactors.put( "delete", new DeleteReactor() );
		reactors.put( "clear", new ClearReactor() );
	}
	
	/*
	 * input wrapper
	*/
	private class InputWrapper {
		static final String prompt = "$";
		BufferedReader br;
		boolean isFile;
		InputWrapper ( BufferedReader br, boolean isFile ) {
			this.br = br;
			this.isFile = isFile;
		}
		String readLine() throws IOException {
			if( !isFile ) {
				msger.println( "" );
				msger.print( prompt );
			}
			String ret = br.readLine();
			if( isFile ) {
				if( ret != null && ret.length()>0 ) {
					msger.println( "" );
					msger.println( prompt + ret );
				}
			}
			return ret;
		}
	}
	
	/*
	 * ServiceRequest stack
	*/
	Stack srStack = new Stack();
	
	/*
	 * constructor
	*/
	public ConsoleServiceRequest ( UIMessager msger ) {
		this.msger = msger;
		srStack.push( new InputWrapper( new BufferedReader( new InputStreamReader(System.in)), false ) );
	}
	
	private Command constructCommand ( String strCommand, String strParams ) {
		//msger.println("command: " + strCommand );
		//msger.println("params : " + strParams );
		MeetingReactor reactor = (MeetingReactor) reactors.get( strCommand );
		if( reactor != null ) {
			/*
			if( 0 == strParams.compareTo("?") ){
				reactor.printUsage( msger );				
				return null;
			}*/
			Object[] params = reactor.parseParameters( strParams.split(" ") );
			if( params == null ) {
				msger.println("invalid parameters!");
				reactor.printUsage( msger );
				return null;
			}
			/*
			for(int i=0; i<params.length; ++i ) {
				msger.println("params[" + i + "]=" + params[i] );
			}*/
			return new MeetingCommand ( reactor, params, msger );
		}
		else {
			msger.println("invalid parameters!");
		}
		return null;
	}
	
	private void executeHelpCommand ( String destCmd ) {
		if( null == destCmd || destCmd.length()<1 ) {
			Iterator it = reactors.entrySet().iterator();
			while( it.hasNext() ) {
				Map.Entry entry = (Map.Entry) it.next();
				((MeetingReactor)entry.getValue()).printUsage(msger);
				msger.println("");
			}
		}
		else {
			if( destCmd.compareTo ( "quit" ) == 0 )  {
				msger.println("Usage: quit");
				return;
			}
			else if( destCmd.compareTo ( "batch" ) == 0 ) {
				msger.println("Usage: batch batch_file_path");
				return;
			}
			MeetingReactor reactor = (MeetingReactor) reactors.get( destCmd );
			if( null == reactor ) {
				msger.println("unknown command");
			}
			else {
				reactor.printUsage(msger);
			}
		}
	}
	
	private Command getNextCommand ( InputWrapper br ) {
		String strCmdLine = null;
		try {
			strCmdLine = br.readLine();
			if( null == strCmdLine ) {
				// end of current stream
				srStack.pop();
				return null;
			}
			else if( strCmdLine.length()<1 ){
				return null;
			}
		}
		catch ( IOException e ) {
			srStack.pop();
			return null;
		}
		int idx = strCmdLine.indexOf(' ');
		String strCommand = idx>0 ? strCmdLine.substring(0,idx) : strCmdLine ;
		String strParams = idx>0 ? strCmdLine.substring(idx+1) : "";
		strCommand = strCommand.toLowerCase();
		if( strCommand.compareTo("quit") == 0 ) {
			srStack.pop();
			return null;
		}
		else if( strCommand.compareTo("help") == 0 ) {
			executeHelpCommand( strParams );
			return null;
		}
		else if( strCommand.compareTo("batch") ==0 ) {
			// batch command file
			try {
				srStack.push( new InputWrapper( new BufferedReader( new FileReader( strParams ) ), true  ) ); 
			}
			catch ( FileNotFoundException e ) {
				msger.println("batch file \"" + strParams + "\" can not found!" );
			}
			return null;
		}
		return constructCommand ( strCommand, strParams );
	}
	
	/*
	 * get next command from request
	 * @return return null if requsts to quit
	*/
	public Command getNextCommand( ) throws HISE.TryNextCommand  {
		Command cmd = null;
		while( null == cmd ) {
			if( srStack.empty() )
				return null;
			InputWrapper br = (InputWrapper) srStack.peek();
			cmd = getNextCommand ( br );
			if( null == cmd ) {
				throw new HISE.TryNextCommand();
			}
		}
		return cmd;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -