/*
 * $Id: services.java,v 1.2 2005/08/18 00:02:44 rampil Exp $
 * Copyright (c) 2004 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.gdrn.shell.command;

import java.io.OutputStream;
import java.io.PrintWriter;
import java.rmi.RemoteException;
import java.util.Iterator;

import org.logical_paradox.rss.lookup.LookupFactory;
import org.logical_paradox.shell.Argument;
import org.logical_paradox.shell.Command;
import org.logical_paradox.shell.ResultCode;
import org.logical_paradox.shell.ShellEnv;
import org.logical_paradox.shell.exception.CommandExecutionException;
import org.logical_paradox.shell.exception.TerminationException;

/**
 * <pre>
 * ■services
 * 
 * 【動作仕様】
 * サービス一覧を出力します。
 * DSRが省略された場合、カレント選択されているDSRが対象となります。
 * DSRを指定してタイプを省略した場合、指定されたDSRの全てのサービスを表示します。
 * 
 * 【書式】
 * services [<DSR uri> [<タイプ>]]
 * </pre>
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class services implements Command {
	// 使用方法
	public static final String USAGE = "services [<DSR-uri> [<service-type>]]";

	public String usage() {
		return USAGE;
	}
	public ResultCode execute(OutputStream arg0, ShellEnv arg1, Argument arg2) throws CommandExecutionException, TerminationException {
		String[] arguments = arg2 != null ? arg2.getArguments() : new String[0];
		String dsruri = arg1.getProperty("DEFAULT_DSR_URI");
		String serviceType = null;

		if(arguments != null && arguments.length > 1) {
			// 対象DSR
			dsruri = arguments[0];
		}
		if(arguments != null && arguments.length > 2) {
			// サービスタイプ
			serviceType = arguments[1].toUpperCase();
		}

		// 各サービスのスタブを取得する
		PrintWriter pw = new PrintWriter(arg0);
		try {
			if(serviceType != null && serviceType.trim().length() > 0) {
				Integer serviceCode = (Integer)GdrnCommandConstant.services.get(serviceType);
				getService(pw, dsruri, serviceCode.intValue());
			} else {
				// 登録されている全てのサービスに関して、問い合わせを実行する
				for(Iterator it = GdrnCommandConstant.services.keySet().iterator(); it.hasNext();) {
					serviceType = (String)it.next();
					Integer serviceCode = (Integer)GdrnCommandConstant.services.get(serviceType);
					getService(pw, dsruri, serviceCode.intValue());
				}
			}
			pw.flush();
			pw.close();
		} catch(RemoteException re) {
			re.printStackTrace();
			throw new CommandExecutionException("RemoteException has been caused in communicating to remote server [serviceType:" + serviceType + "]");
		}
		// OK
		return new ResultCode(ResultCode.STATUS_OK);
	}
	/**
	 * ノードを表示する
	 * @param pw 出力先
	 * @param dsruri DSRのURI
	 * @param serviceCode サービスコード
	 * @throws RemoteException
	 */
	protected void getService(PrintWriter pw, String dsruri, int serviceCode) throws RemoteException {
		try {
			String[] services = LookupFactory.getLookup(dsruri).services(serviceCode);
			for(int i = 0; i < services.length; i++) {
				pw.println("[" + serviceCode + "]" + services[i]);
			}
		} catch(RemoteException re) {
			throw re;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RemoteException(e.getMessage());
		}
	}
}
