001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA 010 * is licensed to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.example.dna.sequencer; 025 026 import java.io.BufferedReader; 027 import java.io.File; 028 import java.io.IOException; 029 import java.io.InputStreamReader; 030 import java.net.URL; 031 import java.util.List; 032 import org.jboss.dna.repository.sequencer.SequencingService; 033 034 /** 035 * @author Randall Hauch 036 */ 037 public class ConsoleInput implements UserInterface { 038 039 protected static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 040 041 public ConsoleInput( final SequencingClient client ) { 042 try { 043 System.out.println(); 044 System.out.print("Starting repository and sequencing service ... "); 045 client.startRepository(); 046 System.out.print("done.\nStarting sequencing service ... "); 047 client.startDnaServices(); 048 System.out.println("done."); 049 System.out.println(); 050 051 System.out.println(getMenu()); 052 Thread eventThread = new Thread(new Runnable() { 053 054 private boolean quit = false; 055 056 public void run() { 057 try { 058 while (!quit) { 059 System.out.print(">"); 060 try { 061 String input = in.readLine(); 062 if (input.length() != 1) { 063 System.out.println("Please enter a valid option."); 064 continue; 065 } 066 067 char option = input.charAt(0); 068 switch (option) { 069 case 'u': 070 client.uploadFile(); 071 break; 072 case 's': 073 client.search(); 074 break; 075 case 'm': 076 case '?': 077 case 'h': 078 System.out.println(getMenu()); 079 break; 080 case 'd': 081 System.out.println(getStatistics(client.getStatistics())); 082 break; 083 case 'q': 084 quit = true; 085 break; 086 default: 087 System.out.println("Invalid option."); 088 break; 089 } 090 } catch (NumberFormatException e) { 091 System.out.println("Invalid integer " + e.getMessage()); 092 } catch (IllegalArgumentException e) { 093 System.out.println(e.getMessage()); 094 } catch (IOException e) { 095 e.printStackTrace(); 096 } catch (Throwable e) { 097 e.printStackTrace(); 098 } 099 } 100 } finally { 101 try { 102 // Terminate ... 103 System.out.println(); 104 System.out.print("Shutting down sequencing service ... "); 105 client.shutdownDnaServices(); 106 System.out.print("done.\nShutting down repository ... "); 107 client.shutdownRepository(); 108 System.out.print("done."); 109 System.out.println(); 110 System.out.println(); 111 } catch (Exception err) { 112 System.out.println("Error shutting down sequencing service and repository: " 113 + err.getLocalizedMessage()); 114 err.printStackTrace(System.err); 115 } 116 } 117 } 118 }); 119 120 eventThread.start(); 121 } catch (Exception err) { 122 System.out.println("Error: " + err.getLocalizedMessage()); 123 err.printStackTrace(System.err); 124 } 125 } 126 127 protected String getMenu() { 128 StringBuilder buffer = new StringBuilder(); 129 buffer.append("-----------------------------------\n"); 130 buffer.append("Menu:\n"); 131 buffer.append("\n"); 132 buffer.append("u) Upload a file to the repository\n"); 133 buffer.append("s) Search the repository using extracted metadata\n"); 134 buffer.append("\n"); 135 buffer.append("d) Display statistics\n"); 136 buffer.append("\n"); 137 buffer.append("?) Show this menu\n"); 138 buffer.append("q) Quit"); 139 return buffer.toString(); 140 } 141 142 /** 143 * {@inheritDoc} 144 */ 145 public URL getFileToUpload() throws IllegalArgumentException, IOException { 146 System.out.println("Please enter the file to upload:"); 147 String path = in.readLine(); 148 File file = new File(path); 149 if (!file.exists()) { 150 throw new IllegalArgumentException("The file \"" + file.getAbsolutePath() + "\" does not exist."); 151 } 152 if (!file.canRead()) { 153 throw new IllegalArgumentException("Unable to read \"" + file.getAbsolutePath() + "\"."); 154 } 155 if (!file.isFile()) { 156 throw new IllegalArgumentException("Please specify a file. The file \"" + file.getAbsolutePath() 157 + "\" is a directory."); 158 } 159 return file.toURI().toURL(); 160 } 161 162 public String getRepositoryPath( String defaultPath ) throws IllegalArgumentException, IOException { 163 if (defaultPath != null) defaultPath = defaultPath.trim(); 164 if (defaultPath.length() == 0) defaultPath = null; 165 String displayDefaultPath = defaultPath == null ? "" : " [" + defaultPath.trim() + "]"; 166 System.out.println("Please enter the repository path where the file should be placed" + displayDefaultPath + ":"); 167 String path = in.readLine().trim(); 168 if (path.length() == 0) { 169 if (defaultPath == null) { 170 throw new IllegalArgumentException("The path \"" + path + "\" is not valid."); 171 } 172 path = defaultPath; 173 } 174 return path; 175 } 176 177 public void displaySearchResults( List<ContentInfo> contentInfos ) { 178 System.out.println(); 179 if (contentInfos.isEmpty()) { 180 System.out.println("No results were found."); 181 System.out.println(); 182 return; 183 } 184 if (contentInfos.size() == 1) { 185 System.out.println("1 result was found:"); 186 } else { 187 System.out.println("" + contentInfos.size() + " results were found:"); 188 } 189 int counter = 1; 190 for (ContentInfo info : contentInfos) { 191 System.out.println(" " + info.getInfoType() + " " + counter++); 192 System.out.println(info.toString()); 193 } 194 System.out.println(); 195 } 196 197 public String getStatistics( SequencingService.Statistics stats ) { 198 StringBuilder sb = new StringBuilder(); 199 sb.append("\n"); 200 sb.append("# nodes sequenced: ").append(stats.getNumberOfNodesSequenced()).append("\n"); 201 sb.append("# nodes skipped: ").append(stats.getNumberOfNodesSkipped()).append("\n"); 202 sb.append("\n"); 203 return sb.toString(); 204 } 205 }