Path: blob/master/test/jdk/java/lang/Class/getResource/Main.java
41153 views
/*1* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import java.lang.module.Configuration;24import java.lang.module.ResolvedModule;25import java.io.IOException;26import java.io.InputStream;27import java.net.URL;28import java.nio.file.Files;29import java.nio.file.Path;30import java.nio.file.Paths;3132/**33* Basic test of Class getResource and getResourceAsStream to locate/read34* resources in named modules.35*/3637public class Main {3839static final String NAME = "myresource";4041public static void main(String[] args) throws IOException {4243// create resources in m144createResource("m1", Paths.get("."), "m1");45createResource("m1", Paths.get("p1"), "m1/p1");46createResource("m1", Paths.get("p1", "impl"), "m1/p1.impl");47createResource("m1", Paths.get("p1", "resources"), "m1/p1.resources");4849// create resources in m250createResource("m2", Paths.get("."), "m2");51createResource("m2", Paths.get("p2"), "m2/p2");52createResource("m2", Paths.get("p2", "impl"), "m2/p2.impl");53createResource("m2", Paths.get("p2", "resources"), "m2/p2.resources");545556// invoke Class getResource from an unnamed module.57URL url = Main.class.getResource("/" + NAME);58assertNotNull(url);5960url = Main.class.getResource("/p1/" + NAME);61assertNull(url);6263url = Main.class.getResource("/p1/impl/" + NAME);64assertNull(url);6566url = Main.class.getResource("/p1/resources/" + NAME);67assertEquals(readAllAsString(url), "m1/p1.resources");6869url = Main.class.getResource("/p2/" + NAME);70assertNull(url);7172url = Main.class.getResource("/p2/impl/" + NAME);73assertNull(url);7475// m1: exports private p1.resources76url = Main.class.getResource("/p2/resources/" + NAME);77assertNull(url);787980// invoke Class getResource from module m181url = p1.Main.getResource("/" + NAME);82assertEquals(readAllAsString(url), "m1");8384url = p1.Main.getResource("/p1/" + NAME);85assertEquals(readAllAsString(url), "m1/p1");8687url = p1.Main.getResource("/p1/impl/" + NAME);88assertEquals(readAllAsString(url), "m1/p1.impl");8990url = p1.Main.getResource("/p1/resources/" + NAME);91assertEquals(readAllAsString(url), "m1/p1.resources");9293// m2: not a named package94url = p1.Main.getResource(p2.Main.class, "/" + NAME);95assertEquals(readAllAsString(url), "m2");9697url = p1.Main.getResource(p2.Main.class, "/p2/" + NAME);98assertNull(url);99100// m2: exports p2.impl to m1101url = p1.Main.getResource(p2.Main.class, "/p2/impl/" + NAME);102assertNull(url);103104// m2: exports private p2.resources to m1;105url = p1.Main.getResource(p2.Main.class, "/p2/resources/" + NAME);106assertEquals(readAllAsString(url), "m2/p2.resources");107108109// invoke Class getResource from module m2110url = p2.Main.getResource("/" + NAME);111assertEquals(readAllAsString(url), "m2");112113url = p2.Main.getResource("/p2/" + NAME);114assertEquals(readAllAsString(url), "m2/p2");115116url = p2.Main.getResource("/p2/impl/" + NAME);117assertEquals(readAllAsString(url), "m2/p2.impl");118119url = p2.Main.getResource("/p2/resources/" + NAME);120assertEquals(readAllAsString(url), "m2/p2.resources");121122// m1: not a named package123url = p2.Main.getResource(p1.Main.class, "/" + NAME);124assertEquals(readAllAsString(url), "m1");125126url = p2.Main.getResource(p1.Main.class, "/p1/" + NAME);127assertNull(url);128129url = p2.Main.getResource(p1.Main.class, "/p1/impl/" + NAME);130assertNull(url);131132// m1: exports private p1.resources;133url = p2.Main.getResource(p1.Main.class, "/p1/resources/" + NAME);134assertEquals(readAllAsString(url), "m1/p1.resources");135136137// invoke Class getResourceAsStream from an unnamed module.138InputStream in = Main.class.getResourceAsStream("/" + NAME);139assertNotNull(in);140141in = Main.class.getResourceAsStream("/p1/" + NAME);142assertNull(in);143144in = Main.class.getResourceAsStream("/p1/impl/" + NAME);145assertNull(in);146147in = Main.class.getResourceAsStream("/p1/resources/" + NAME);148assertEquals(readAllAsString(in), "m1/p1.resources");149150in = Main.class.getResourceAsStream("/p2/" + NAME);151assertNull(in);152153in = Main.class.getResourceAsStream("/p2/impl/" + NAME);154assertNull(in);155156in = Main.class.getResourceAsStream("/p2/resources/" + NAME);157assertNull(in);158159160// invoke Class getResourceAsStream from module m1161in = p1.Main.getResourceAsStream("/" + NAME);162assertEquals(readAllAsString(in), "m1");163164in = p1.Main.getResourceAsStream("/p1/" + NAME);165assertEquals(readAllAsString(in), "m1/p1");166167in = p1.Main.getResourceAsStream("/p1/impl/" + NAME);168assertEquals(readAllAsString(in), "m1/p1.impl");169170in = p1.Main.getResourceAsStream("/p1/resources/" + NAME);171assertEquals(readAllAsString(in), "m1/p1.resources");172173in = p1.Main.getResourceAsStream(p2.Main.class, "/" + NAME);174assertEquals(readAllAsString(in), "m2");175176in = p1.Main.getResourceAsStream(p2.Main.class, "/p2/" + NAME);177assertNull(in);178179in = p1.Main.getResourceAsStream(p2.Main.class, "/p2/impl/" + NAME);180assertNull(in);181182in = p1.Main.getResourceAsStream(p2.Main.class, "/p2/resources/" + NAME);183assertEquals(readAllAsString(in), "m2/p2.resources");184185186// invoke Class getResourceAsStream from module m2187in = p2.Main.getResourceAsStream("/" + NAME);188assertEquals(readAllAsString(in), "m2");189190in = p2.Main.getResourceAsStream("/p2/" + NAME);191assertEquals(readAllAsString(in), "m2/p2");192193in = p2.Main.getResourceAsStream("/p2/impl/" + NAME);194assertEquals(readAllAsString(in), "m2/p2.impl");195196in = p2.Main.getResourceAsStream("/p2/resources/" + NAME);197assertEquals(readAllAsString(in), "m2/p2.resources");198199in = p2.Main.getResourceAsStream(p1.Main.class, "/" + NAME);200assertEquals(readAllAsString(in), "m1");201202in = p2.Main.getResourceAsStream(p1.Main.class, "/p1/" + NAME);203assertNull(in);204205in = p2.Main.getResourceAsStream(p1.Main.class, "/p1/impl/" + NAME);206assertNull(in);207208in = p2.Main.getResourceAsStream(p1.Main.class, "/p1/resources/" + NAME);209assertEquals(readAllAsString(in), "m1/p1.resources");210211212// Nulls213try {214Main.class.getResource(null);215assertTrue(false);216} catch (NullPointerException expected) { }217try {218Main.class.getResourceAsStream(null);219assertTrue(false);220} catch (NullPointerException expected) { }221try {222p1.Main.class.getResource(null);223assertTrue(false);224} catch (NullPointerException expected) { }225try {226p1.Main.class.getResourceAsStream(null);227assertTrue(false);228} catch (NullPointerException expected) { }229230// SecurityManager case231System.setSecurityManager(new SecurityManager());232233assertNull(Main.class.getResource("/" + NAME));234assertNull(p1.Main.getResource("/" + NAME));235assertNull(p2.Main.getResource("/" + NAME));236237assertNull(Main.class.getResourceAsStream("/" + NAME));238assertNull(p1.Main.getResourceAsStream("/" + NAME));239assertNull(p2.Main.getResourceAsStream("/" + NAME));240241System.out.println("Success!");242}243244/**245* Create a resource in the sub-directory of the given exploded module246*/247static void createResource(String mn, Path subdir, String msg) throws IOException {248Path dir = directoryFor(mn).resolve(subdir);249Path file = dir.resolve(NAME);250Files.write(file, msg.getBytes("UTF-8"));251}252253/**254* Returns the directory for the given module (by name).255*/256static Path directoryFor(String name) {257Configuration cf = ModuleLayer.boot().configuration();258ResolvedModule resolvedModule = cf.findModule(name).orElse(null);259if (resolvedModule == null)260throw new RuntimeException("not found: " + name);261Path dir = Paths.get(resolvedModule.reference().location().get());262if (!Files.isDirectory(dir))263throw new RuntimeException("not a directory: " + dir);264return dir;265}266267static String readAllAsString(InputStream in) throws IOException {268if (in == null)269return null;270try (in) {271return new String(in.readAllBytes(), "UTF-8");272}273}274275static String readAllAsString(URL url) throws IOException {276if (url == null)277return null;278InputStream in = url.openStream();279return readAllAsString(url.openStream());280}281282static void assertTrue(boolean condition) {283if (!condition) throw new RuntimeException();284}285286static void assertNull(Object o) {287assertTrue(o == null);288}289290static void assertNotNull(Object o) {291assertTrue(o != null);292}293294static void assertEquals(Object actual, Object expected) {295if (expected == null) {296assertNull(actual);297} else {298assertTrue(expected.equals(actual));299}300}301302static void assertNotEquals(Object actual, Object expected) {303if (expected == null) {304assertNotNull(actual);305} else {306assertTrue(!expected.equals(actual));307}308}309}310311312313