/* * Copyright 2011 the original author or authors. * * 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. */ package org.rioproject.tools.cli; import net.jini.core.lookup.ServiceItem; import org.rioproject.cybernode.Cybernode; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; /** * Handles enlistment and release of Cybernodes */ public class EnlistmentHandler { static final String ENLIST = "enlist"; static final String RELEASE = "release"; public static class EnlistHandler implements OptionHandler { @Override public String process(final String input, final BufferedReader br, final PrintStream out) { return handleRequest(input, br, out); } @Override public String getUsage() { return ("usage: enlist "); } } public static class ReleaseHandler implements OptionHandler { @Override public String process(final String input, final BufferedReader br, final PrintStream out) { return handleRequest(input, br, out); } @Override public String getUsage() { return ("usage: release"); } } private static ServiceItem[] getCybernodes(final String action) throws RemoteException { List<ServiceItem> list = new ArrayList<ServiceItem>(); ServiceItem[] items = CLI.getInstance().getServiceFinder().findCybernodes(null, null); for(ServiceItem item : items) { Cybernode c = (Cybernode)item.service; if(action.equals(RELEASE)) { if(c.isEnlisted()) { list.add(item); } } else { if(!c.isEnlisted()) { list.add(item); } } } return list.toArray(new ServiceItem[list.size()]); } private static void printRequest(final PrintStream out, final String action) { out.print("Enter cybernode to " + action + " or \"c\" to cancel : "); } private static String handleRequest(final String input, final BufferedReader br, final PrintStream out) { if (out == null) throw new IllegalArgumentException("Must have an output PrintStream"); BufferedReader reader = br; if (reader == null) reader = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tok = new StringTokenizer(input); /* first token is "enlist" or "release" */ String action = tok.nextToken(); ServiceItem[] items; try { items = getCybernodes(action); } catch (RemoteException e) { e.printStackTrace(); return ("Problem checking cybernode enlistment status , " + "Exception : " + e.getLocalizedMessage() + "\n"); } if(items.length==0) { StringBuilder sb = new StringBuilder(); String word = action.equals(ENLIST)?"enlisted":"released"; sb.append("All cybernodes are ").append(word); return sb.toString(); } out.println(Formatter.asChoices(items) + "\n"); printRequest(out, action); while (true) { try { String response = reader.readLine(); if (response != null) { if (response.equals("c")) break; try { int num = Integer.parseInt(response); if (num < 1 || num > (items.length + 1)) { printRequest(out, action); } else { if (num == (items.length + 1)) { for(ServiceItem item : items) { Cybernode cybernode = (Cybernode)item.service; handleAction(cybernode, action); } } else { Cybernode cybernode = (Cybernode)items[num-1].service; handleAction(cybernode, action); } break; } } catch (NumberFormatException e) { out.println("Invalid choice [" + response + "]"); printRequest(out, action); } } } catch (IOException e) { e.printStackTrace(); } } return (""); } private static void handleAction(final Cybernode cybernode, final String action) throws RemoteException { if(action.equals(ENLIST)) cybernode.enlist(); else cybernode.release(true); } }