1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.oracle.tools.packager; 27 28 import java.util.Collection; 29 import java.util.Iterator; 30 import java.util.ServiceLoader; 31 32 33 public interface Bundlers { 34 35 /** 36 * This convenience method will call {@link #createBundlersInstance(ClassLoader)} 37 * with the classloader that this Bundlers is loaded from. 38 * 39 * @return an instance of Bundlers loaded and configured from the current ClassLoader. 40 */ 41 public static Bundlers createBundlersInstance() { 42 return createBundlersInstance(Bundlers.class.getClassLoader()); 43 } 44 45 /** 46 * This convenience method will automatically load a Bundlers instance 47 * from either META-INF/services or the default 48 * {@link BasicBundlers} if none are found in 49 * the services meta-inf. 50 * 51 * After instantiating the bundlers instance it will load the default 52 * bundlers via {@link #loadDefaultBundlers()} as well as requesting 53 * the services loader to load any other bundelrs via 54 * {@link #loadBundlersFromServices(ClassLoader)}. 55 56 * 57 * @param servicesClassLoader the classloader to search for 58 * META-INF/service registered bundlers 59 * @return an instance of Bundlers loaded and configured from the specified ClassLoader 60 */ 61 public static Bundlers createBundlersInstance(ClassLoader servicesClassLoader) { 62 ServiceLoader<Bundlers> bundlersLoader = ServiceLoader.load(Bundlers.class, servicesClassLoader); 63 Bundlers bundlers = null; 64 Iterator<Bundlers> iter = bundlersLoader.iterator(); 65 if (iter.hasNext()) { 66 bundlers = iter.next(); 67 } 68 if (bundlers == null) { 69 bundlers = new BasicBundlers(); 70 } 71 72 bundlers.loadDefaultBundlers(); 73 bundlers.loadBundlersFromServices(servicesClassLoader); 74 return bundlers; 75 } 76 77 /** 78 * Returns all of the preconfigured, requested, and manually 79 * configured bundlers loaded with this instance. 80 * 81 * @return a read-only collection of the requested bundlers 82 */ 83 Collection<Bundler> getBundlers(); 84 85 /** 86 * Returns all of the preconfigured, requested, and manually 87 * configured bundlers loaded with this instance that are of 88 * a specific BundleType, such as disk images, installers, or 89 * remote installers. 90 * 91 * @return a read-only collection of the requested bundlers 92 */ 93 Collection<Bundler> getBundlers(String type); 94 95 /** 96 * A list of the "standard" parameters that bundlers should support 97 * or fall back to when their specific parameters are not used. 98 * 99 * @return an unmodifiable collection of the standard parameters. 100 */ 101 Collection<BundlerParamInfo> getStandardParameters(); 102 103 /** 104 * Loads the bundlers common to the JDK. A typical implementation 105 * would load: 106 * <UL> 107 * <LI>Windows file image</LI> 108 * <LI>Mac .app</LI> 109 * <LI>Linux file image</LI> 110 111 * <LI>Windows MSI</LI> 112 * <LI>Windows EXE</LI> 113 * <LI>Mac DMG</LI> 114 * <LI>Linux DEB</LI> 115 * <LI>Linux RPM</LI> 116 * 117 * </UL> 118 * 119 * This method is called from the {@link #createBundlersInstance(ClassLoader)} 120 * and {@link #createBundlersInstance()} methods. 121 */ 122 void loadDefaultBundlers(); 123 124 /** 125 * Loads bundlers from the META-INF/services directly. 126 * 127 * This method is called from the {@link #createBundlersInstance(ClassLoader)} 128 * and {@link #createBundlersInstance()} methods. 129 */ 130 void loadBundlersFromServices(ClassLoader cl); 131 132 /** 133 * Loads a specific bundler into the set of bundlers. 134 * Useful for a manually configured bundler. 135 * 136 * @param bundler the specific bundler to add 137 */ 138 void loadBundler(Bundler bundler); 139 }