23 * questions. 24 */ 25 26 package jdk.internal.jshell.tool; 27 28 import java.io.BufferedReader; 29 import java.io.BufferedWriter; 30 import java.io.EOFException; 31 import java.io.File; 32 import java.io.FileNotFoundException; 33 import java.io.FileReader; 34 import java.io.IOException; 35 import java.io.InputStream; 36 import java.io.InputStreamReader; 37 import java.io.PrintStream; 38 import java.io.Reader; 39 import java.io.StringReader; 40 import java.lang.module.ModuleDescriptor; 41 import java.lang.module.ModuleFinder; 42 import java.lang.module.ModuleReference; 43 import java.nio.charset.Charset; 44 import java.nio.file.FileSystems; 45 import java.nio.file.Files; 46 import java.nio.file.InvalidPathException; 47 import java.nio.file.Path; 48 import java.nio.file.Paths; 49 import java.text.MessageFormat; 50 import java.util.ArrayList; 51 import java.util.Arrays; 52 import java.util.Collection; 53 import java.util.Collections; 54 import java.util.HashMap; 55 import java.util.HashSet; 56 import java.util.Iterator; 57 import java.util.LinkedHashMap; 58 import java.util.LinkedHashSet; 59 import java.util.List; 60 import java.util.Locale; 61 import java.util.Map; 62 import java.util.Map.Entry; 2951 } 2952 Stream<Snippet> stream = argsOptionsToSnippets(state::snippets, 2953 this::mainActive, arg, "/list"); 2954 if (stream == null) { 2955 return false; 2956 } 2957 2958 // prevent double newline on empty list 2959 boolean[] hasOutput = new boolean[1]; 2960 stream.forEachOrdered(sn -> { 2961 if (!hasOutput[0]) { 2962 cmdout.println(); 2963 hasOutput[0] = true; 2964 } 2965 cmdout.printf("%4s : %s\n", sn.id(), sn.source().replace("\n", "\n ")); 2966 }); 2967 return true; 2968 } 2969 2970 private boolean cmdOpen(String filename) { 2971 return runFile(filename, "/open"); 2972 } 2973 2974 private boolean runFile(String filename, String context) { 2975 if (!filename.isEmpty()) { 2976 try { 2977 Scanner scanner; 2978 if (!interactiveModeBegun && filename.equals("-")) { 2979 // - on command line: no interactive later, read from input 2980 regenerateOnDeath = false; 2981 scanner = new Scanner(cmdin); 2982 } else { 2983 Path path = toPathResolvingUserHome(filename); 2984 String resource; 2985 scanner = new Scanner( 2986 (!Files.exists(path) && (resource = getResource(filename)) != null) 2987 ? new StringReader(resource) // Not found as file, but found as resource 2988 : new FileReader(path.toString()) 2989 ); 2990 } 2991 run(new ScannerIOContext(scanner)); | 23 * questions. 24 */ 25 26 package jdk.internal.jshell.tool; 27 28 import java.io.BufferedReader; 29 import java.io.BufferedWriter; 30 import java.io.EOFException; 31 import java.io.File; 32 import java.io.FileNotFoundException; 33 import java.io.FileReader; 34 import java.io.IOException; 35 import java.io.InputStream; 36 import java.io.InputStreamReader; 37 import java.io.PrintStream; 38 import java.io.Reader; 39 import java.io.StringReader; 40 import java.lang.module.ModuleDescriptor; 41 import java.lang.module.ModuleFinder; 42 import java.lang.module.ModuleReference; 43 import java.net.URI; 44 import java.net.http.HttpClient; 45 import java.net.http.HttpRequest; 46 import java.net.http.HttpResponse; 47 import java.nio.channels.UnresolvedAddressException; 48 import java.nio.charset.Charset; 49 import java.nio.file.FileSystems; 50 import java.nio.file.Files; 51 import java.nio.file.InvalidPathException; 52 import java.nio.file.Path; 53 import java.nio.file.Paths; 54 import java.text.MessageFormat; 55 import java.util.ArrayList; 56 import java.util.Arrays; 57 import java.util.Collection; 58 import java.util.Collections; 59 import java.util.HashMap; 60 import java.util.HashSet; 61 import java.util.Iterator; 62 import java.util.LinkedHashMap; 63 import java.util.LinkedHashSet; 64 import java.util.List; 65 import java.util.Locale; 66 import java.util.Map; 67 import java.util.Map.Entry; 2956 } 2957 Stream<Snippet> stream = argsOptionsToSnippets(state::snippets, 2958 this::mainActive, arg, "/list"); 2959 if (stream == null) { 2960 return false; 2961 } 2962 2963 // prevent double newline on empty list 2964 boolean[] hasOutput = new boolean[1]; 2965 stream.forEachOrdered(sn -> { 2966 if (!hasOutput[0]) { 2967 cmdout.println(); 2968 hasOutput[0] = true; 2969 } 2970 cmdout.printf("%4s : %s\n", sn.id(), sn.source().replace("\n", "\n ")); 2971 }); 2972 return true; 2973 } 2974 2975 private boolean cmdOpen(String filename) { 2976 if (filename.startsWith("http://") || filename.startsWith("https://")) { 2977 return runUrl(filename, "/open"); 2978 } else { 2979 return runFile(filename, "/open"); 2980 } 2981 } 2982 2983 private boolean runUrl(String fileUrl, String context) { 2984 try { 2985 var httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build(); 2986 var request = HttpRequest.newBuilder(URI.create(fileUrl)).build(); 2987 var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); 2988 2989 if (response.statusCode() == 200) { 2990 var scanner = new Scanner(response.body()); 2991 run(new ScannerIOContext(scanner)); 2992 return true; 2993 } else { 2994 errormsg("jshell.err.url.not.accessible", context, fileUrl, response.statusCode()); 2995 return false; 2996 } 2997 } catch (UnresolvedAddressException | InterruptedException | IOException e) { 2998 errormsg("jshell.err.url.exception", context, fileUrl, e); 2999 } 3000 3001 return false; 3002 } 3003 3004 private boolean runFile(String filename, String context) { 3005 if (!filename.isEmpty()) { 3006 try { 3007 Scanner scanner; 3008 if (!interactiveModeBegun && filename.equals("-")) { 3009 // - on command line: no interactive later, read from input 3010 regenerateOnDeath = false; 3011 scanner = new Scanner(cmdin); 3012 } else { 3013 Path path = toPathResolvingUserHome(filename); 3014 String resource; 3015 scanner = new Scanner( 3016 (!Files.exists(path) && (resource = getResource(filename)) != null) 3017 ? new StringReader(resource) // Not found as file, but found as resource 3018 : new FileReader(path.toString()) 3019 ); 3020 } 3021 run(new ScannerIOContext(scanner)); |