# HG changeset patch # User sundar # Date 1485524265 -19800 # Node ID 91f9c9170d9764224fc9fea58e272e19686cd18b # Parent 889efa08776829323ea0b436293b6da2ca694b1a 8172864: Remove custom plugin module path Reviewed-by: alanb, jlaskey diff -r 889efa087768 -r 91f9c9170d97 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Thu Jan 26 23:11:37 2017 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java Fri Jan 27 19:07:45 2017 +0530 @@ -194,8 +194,6 @@ private final class PluginsHelper { - private static final String PLUGINS_PATH = "--plugin-module-path"; - private Layer pluginsLayer = Layer.boot(); private final List plugins; private String lastSorter; @@ -503,22 +501,7 @@ } private String getPluginsPath(String[] args) throws BadArgs { - String pp = null; - for (int i = 0; i < args.length; i++) { - if (args[i].equals(PluginsHelper.PLUGINS_PATH)) { - if (i == args.length - 1) { - throw new BadArgs("err.no.plugins.path").showUsage(true); - } else { - i += 1; - pp = args[i]; - if (!pp.isEmpty() && pp.charAt(0) == '-') { - throw new BadArgs("err.no.plugins.path").showUsage(true); - } - break; - } - } - } - return pp; + return null; } // used by jimage. Return unhandled arguments like "create", "describe". @@ -542,31 +525,7 @@ // Must extract it prior to do any option analysis. // Required to interpret custom plugin options. // Unit tests can call Task multiple time in same JVM. - pluginOptions = new PluginsHelper(getPluginsPath(args)); - - // First extract plugins path if any - String pp = null; - List filteredArgs = new ArrayList<>(); - for (int i = 0; i < args.length; i++) { - if (args[i].equals(PluginsHelper.PLUGINS_PATH)) { - if (i == args.length - 1) { - throw new BadArgs("err.no.plugins.path").showUsage(true); - } else { - warning("warn.thirdparty.plugins.enabled"); - log.println(bundleHelper.getMessage("warn.thirdparty.plugins")); - i += 1; - String arg = args[i]; - if (!arg.isEmpty() && arg.charAt(0) == '-') { - throw new BadArgs("err.no.plugins.path").showUsage(true); - } - pp = args[i]; - } - } else { - filteredArgs.add(args[i]); - } - } - String[] arr = new String[filteredArgs.size()]; - args = filteredArgs.toArray(arr); + pluginOptions = new PluginsHelper(null); List rest = collectUnhandled? new ArrayList<>() : null; // process options diff -r 889efa087768 -r 91f9c9170d97 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Thu Jan 26 23:11:37 2017 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties Fri Jan 27 19:07:45 2017 +0530 @@ -142,9 +142,6 @@ \ --resources-last-sorter The last plugin allowed to sort\n\ \ resources -plugin.opt.plugin-module-path=\ -\ --plugin-module-path Custom plugin module path - plugin.opt.disable-plugin=\ \ --disable-plugin Disable the plugin mentioned diff -r 889efa087768 -r 91f9c9170d97 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Thu Jan 26 23:11:37 2017 +0000 +++ b/jdk/test/ProblemList.txt Fri Jan 27 19:07:45 2017 +0530 @@ -262,8 +262,6 @@ tools/jlink/multireleasejar/JLinkMultiReleaseJarTest.java 8169971 windows-x64 -tools/jlink/CustomPluginTest.java 8172864 generic-all - tools/jar/multiRelease/ApiValidatorTest.java 8173396 generic-all ############################################################################ diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/CustomPluginTest.java --- a/jdk/test/tools/jlink/CustomPluginTest.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import tests.Helper; -import tests.JImageGenerator; -import tests.Result; - -/* - * @test - * @summary Test custom plugin - * @author Jean-Francois Denise - * @library ../lib - * @modules java.base/jdk.internal.jimage - * jdk.jdeps/com.sun.tools.classfile - * jdk.jlink/jdk.tools.jlink.internal - * jdk.jlink/jdk.tools.jmod - * jdk.jlink/jdk.tools.jimage - * jdk.compiler - * @build tests.* - * @run main/othervm CustomPluginTest - */ - -public class CustomPluginTest { - - public static void main(String[] args) throws Exception { - new CustomPluginTest().test(); - } - - private void test() throws Exception { - Helper helper = Helper.newHelper(); - if (helper == null) { - System.err.println("Test not run"); - return; - } - helper.generateDefaultModules(); - Path jmod = registerServices(helper); - Path pluginModulePath = jmod.getParent(); - - testHelloProvider(helper, pluginModulePath); - testCustomPlugins(helper, pluginModulePath); - testModuleVerification(helper, pluginModulePath); - } - - private void testCustomPlugins(Helper helper, Path pluginModulePath) { - Result result = JImageGenerator.getJLinkTask() - .option("--list-plugins") - .pluginModulePath(pluginModulePath) - .output(helper.createNewImageDir("customplugin")) - .call(); - if (result.getExitCode() != 0) { - System.err.println(result.getMessage()); - throw new AssertionError("jlink crashed: " + result.getExitCode()); - } - List customPlugins = Stream.of(result.getMessage().split("\n")) - .filter(s -> s.startsWith("Plugin Name:")) - .filter(s -> s.contains("custom")) - .collect(Collectors.toList()); - if (customPlugins.size() != 1) { - System.err.println(result.getMessage()); - throw new AssertionError("Found plugins: " + customPlugins); - } - } - - private Path registerServices(Helper helper) throws IOException { - String name = "customplugin"; - Path src = Paths.get(System.getProperty("test.src")).resolve(name); - Path classes = helper.getJmodClassesDir().resolve(name); - JImageGenerator.compile(src, classes); - return JImageGenerator.getJModTask() - .addClassPath(classes) - .jmod(helper.getJmodDir().resolve(name + ".jmod")) - .create().assertSuccess(); - } - - private void testHelloProvider(Helper helper, Path pluginModulePath) throws IOException { - Path pluginFile = Paths.get("customplugin.txt"); - if (Files.exists(pluginFile)) { - throw new AssertionError("Custom plugin output file already exists"); - } - String customplugin = "customplugin"; - { - // Add the path but not the option, plugin musn't be called - JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .pluginModulePath(pluginModulePath) - .output(helper.createNewImageDir(customplugin)) - .addMods(customplugin) - .call().assertSuccess(); - } - - if (Files.exists(pluginFile)) { - throw new AssertionError("Custom plugin output file exists, plugin " - + " called although shouldn't have been"); - } - - { // Add the path and the option, plugin should be called. - JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .addMods(customplugin) - .pluginModulePath(pluginModulePath) - .output(helper.createNewImageDir(customplugin)) - .option("--hello") - .call().assertSuccess(); - } - - if (!Files.exists(pluginFile)) { - throw new AssertionError("Custom plugin not called"); - } - } - - private void testModuleVerification(Helper helper, Path pluginModulePath) throws IOException { - { - // dependent module missing check - String moduleName = "bar"; // 8147491 - Path jmodFoo = helper.generateDefaultJModule("foo").assertSuccess(); - Path jmodBar = helper.generateDefaultJModule(moduleName, "foo").assertSuccess(); - // rogue filter removes "foo" module resources which are - // required by "bar" module. Module checks after plugin - // application should detect and report error. - JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .pluginModulePath(pluginModulePath) - .output(helper.createNewImageDir(moduleName)) - .addMods(moduleName) - .option("--disable-plugin") - .option("release-info") - .option("--rogue-filter") - .option("/foo/") - .call() - .assertFailure("foo not found"); - } - - { - // package exported by one module used as concealed package - // in another module. But, module-info.class is not updated! - String moduleName = "jdk.scripting.nashorn"; - JImageGenerator.getJLinkTask() - .modulePath(helper.defaultModulePath()) - .pluginModulePath(pluginModulePath) - .output(helper.createNewImageDir(moduleName)) - .addMods(moduleName) - // "java.logging" includes a package 'javax.script' - // which is an exported package from "java.scripting" module! - // module-info.class of java.logging left "as is". - .option("--rogue-adder") - .option("/java.logging/javax/script/Foo.class") - .call() - .assertFailure( - "Module java.logging's descriptor returns inconsistent package set"); - } - } -} diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/JLink2Test.java --- a/jdk/test/tools/jlink/JLink2Test.java Thu Jan 26 23:11:37 2017 +0000 +++ b/jdk/test/tools/jlink/JLink2Test.java Fri Jan 27 19:07:45 2017 +0530 @@ -68,58 +68,9 @@ // This test case must be first one, the JlinkTask is clean // and reveals possible bug related to plugin options in defaults testSameNames(helper); - testModulePath(helper); testOptions(); } - private static void testModulePath(Helper helper) throws IOException { - Path doesNotExist = helper.createNewImageDir("doesnotexist"); - Path jar = helper.getJarDir().resolve("bad.jar"); - JImageGenerator.getJLinkTask() - .pluginModulePath(doesNotExist) - .option("--help") - .call().assertSuccess(); - Files.createFile(jar); - JImageGenerator.getJLinkTask() - .pluginModulePath(jar) - .option("--help") - .call().assertFailure("(\n|\r|.)*Error: Invalid modules in the plugins path: (\n|\r|.)*"); - JImageGenerator.getJLinkTask() - .pluginModulePath(jar.getParent()) - .option("--help") - .call().assertFailure("Error: Invalid modules in the plugins path: .*zip file is empty(\n|\r|.)*"); - try (JarOutputStream out = new JarOutputStream(new FileOutputStream(jar.toFile()))) { - JarEntry entry = new JarEntry("class"); - out.putNextEntry(entry); - out.write("AAAA".getBytes()); - out.closeEntry(); - } - JImageGenerator.getJLinkTask() - .pluginModulePath(jar.getParent()) - .output(helper.createNewImageDir("crash")) - .addJmods(helper.getStdJmodsDir()) - .addJmods(jar.getParent()) - .addMods("bad") - .call().assertFailure("(\n|\r|.)*Error: module-info.class not found for bad module(\n|\r|.)*"); - try (JarOutputStream out = new JarOutputStream(new FileOutputStream(jar.toFile()))) { - JarEntry entry = new JarEntry("classes"); - out.putNextEntry(entry); - out.closeEntry(); - - entry = new JarEntry("classes/class"); - out.putNextEntry(entry); - out.write("AAAA".getBytes()); - out.closeEntry(); - } - JImageGenerator.getJLinkTask() - .pluginModulePath(jar.getParent()) - .output(helper.createNewImageDir("bad")) - .addJmods(jar.getParent()) - .addJars(helper.getStdJmodsDir()) - .addMods("bad") - .call().assertFailure("(\n|\r|.)*Error: module-info.class not found for bad module(\n|\r|.)*"); - } - private static void testSameNames(Helper helper) throws Exception { // Multiple modules with the same name in modulepath, take the first one in the path. // First jmods then jars. So jmods are found, jars are hidden. diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/customplugin/module-info.java --- a/jdk/test/tools/jlink/customplugin/module-info.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -module customplugin { - requires jdk.jlink; - provides jdk.tools.jlink.plugin.Plugin with plugin.HelloPlugin; - provides jdk.tools.jlink.plugin.Plugin with plugin.CustomPlugin; - provides jdk.tools.jlink.plugin.Plugin with plugin.RogueAdderPlugin; - provides jdk.tools.jlink.plugin.Plugin with plugin.RogueFilterPlugin; -} diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java --- a/jdk/test/tools/jlink/customplugin/plugin/CustomPlugin.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package plugin; - -import java.util.Collections; -import java.util.Map; -import java.util.function.Function; -import jdk.tools.jlink.plugin.ResourcePoolEntry; -import jdk.tools.jlink.plugin.ResourcePool; -import jdk.tools.jlink.plugin.ResourcePoolBuilder; -import jdk.tools.jlink.plugin.Plugin; - -public class CustomPlugin implements Plugin { - - private final static String NAME = "custom-plugin"; - - public CustomPlugin() { - } - - @Override - public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { - in.transformAndCopy(Function.identity(), out); - return out.build(); - } - - @Override - public String getName() { - return NAME; - } - - @Override - public String getDescription() { - return NAME + "-description"; - } - - @Override - public void configure(Map config) { - } - - @Override - public Category getType() { - return Category.PROCESSOR; - } -} diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java --- a/jdk/test/tools/jlink/customplugin/plugin/HelloPlugin.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package plugin; - -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.Collections; -import java.util.Map; -import jdk.tools.jlink.plugin.ResourcePoolEntry; -import jdk.tools.jlink.plugin.ResourcePool; -import jdk.tools.jlink.plugin.ResourcePoolBuilder; -import jdk.tools.jlink.plugin.Plugin; - -/** - * Custom plugin - */ -public final class HelloPlugin implements Plugin { - - private static final String OUTPUT_FILE = "customplugin.txt"; - public static final String NAME = "hello"; - - public static boolean called; - - @Override - public String getName() { - return NAME; - } - - @Override - public ResourcePool transform(ResourcePool inResources, ResourcePoolBuilder outResources) { - try { - System.out.println("Hello!!!!!!!!!!"); - File f = new File(OUTPUT_FILE); - f.createNewFile(); - inResources.entries().forEach(res -> { - outResources.add(res); - }); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - return outResources.build(); - } - - @Override - public String getDescription() { - return NAME + "-description"; - } -} diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/customplugin/plugin/RogueAdderPlugin.java --- a/jdk/test/tools/jlink/customplugin/plugin/RogueAdderPlugin.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package plugin; - -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.lang.module.ModuleDescriptor; -import java.util.Collections; -import java.util.Map; -import java.util.function.Function; -import jdk.tools.jlink.plugin.ResourcePool; -import jdk.tools.jlink.plugin.ResourcePoolBuilder; -import jdk.tools.jlink.plugin.ResourcePoolEntry; -import jdk.tools.jlink.plugin.ResourcePoolModule; -import jdk.tools.jlink.plugin.Plugin; - -/** - * Rogue adder plugin - */ -public final class RogueAdderPlugin implements Plugin { - public static final String NAME = "rogue-adder"; - private String resName; - - @Override - public String getName() { - return NAME; - } - - @Override - public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { - in.transformAndCopy(Function.identity(), out); - out.add(ResourcePoolEntry.create(resName, new byte[1])); - return out.build(); - } - - @Override - public String getDescription() { - return NAME + "-description"; - } - - @Override - public Category getType() { - return Category.FILTER; - } - - @Override - public boolean hasArguments() { - return true; - } - - @Override - public void configure(Map config) { - resName = config.get(NAME); - } -} diff -r 889efa087768 -r 91f9c9170d97 jdk/test/tools/jlink/customplugin/plugin/RogueFilterPlugin.java --- a/jdk/test/tools/jlink/customplugin/plugin/RogueFilterPlugin.java Thu Jan 26 23:11:37 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package plugin; - -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.Collections; -import java.util.Map; -import jdk.tools.jlink.plugin.ResourcePoolEntry; -import jdk.tools.jlink.plugin.ResourcePool; -import jdk.tools.jlink.plugin.ResourcePoolBuilder; -import jdk.tools.jlink.plugin.Plugin; - -/** - * Rogue filter plugin - */ -public final class RogueFilterPlugin implements Plugin { - public static final String NAME = "rogue-filter"; - private String prefix; - - @Override - public String getName() { - return NAME; - } - - @Override - public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) { - in.transformAndCopy((file) -> { - return file.path().startsWith(prefix)? null : file; - }, out); - return out.build(); - } - - @Override - public String getDescription() { - return NAME + "-description"; - } - - @Override - public Category getType() { - return Category.FILTER; - } - - @Override - public boolean hasArguments() { - return true; - } - - @Override - public void configure(Map config) { - prefix = config.get(NAME); - } -}