diff options
Diffstat (limited to 'libjava/classpath/javax/print/PrintServiceLookup.java')
-rw-r--r-- | libjava/classpath/javax/print/PrintServiceLookup.java | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/libjava/classpath/javax/print/PrintServiceLookup.java b/libjava/classpath/javax/print/PrintServiceLookup.java new file mode 100644 index 000000000..1ea1f9547 --- /dev/null +++ b/libjava/classpath/javax/print/PrintServiceLookup.java @@ -0,0 +1,303 @@ +/* PrintServiceLookup.java -- + Copyright (C) 2004, 2006 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package javax.print; + +import gnu.classpath.ServiceFactory; +import gnu.javax.print.CupsPrintServiceLookup; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; + +import javax.print.attribute.AttributeSet; + + +/** + * <code>PrintServiceLookup</code> implementations provide a way to lookup + * print services based on different constraints. + * <p> + * Implementations are located and loaded automatically through the SPI JAR + * file specification. Therefore implementation classes must provide a default + * constructor for instantiation. Furthermore, applications are able to + * register further instances directly at runtime. + * </p><p> + * If an SecurityManager is installed implementors should call + * <code>checkPrintJobAccess()</code> to disable access for untrusted code. + * This check is to be made in every lookup service implementation for + * flexibility. Print services registered by applications through + * <code>registerService(PrintService)</code> are suppressed in the + * lookup results if a security manager is installed and disallows access. + * </p> + * + * @author Michael Koch (konqueror@gmx.de) + * @author Wolfgang Baer (WBaer@gmx.de) + */ +public abstract class PrintServiceLookup +{ + + private static final CupsPrintServiceLookup systemProvider; + private static final HashSet printServices; + private static final HashSet printServiceLookups; + + static + { + systemProvider = new CupsPrintServiceLookup(); + + printServices = new HashSet(); + printServiceLookups = new HashSet(); + + // check for service providers + Iterator it = ServiceFactory.lookupProviders(PrintServiceLookup.class); + + while (it.hasNext()) + printServiceLookups.add(it.next()); + } + + /** + * Constructs a <code>PrintServiceLookup</code> object. + */ + public PrintServiceLookup() + { + // nothing to do here + } + + /** + * Explicitly registers the provided print service lookup implementation. + * <p> + * The registration will silently fail (returning <code>false</code>) if + * the lookup service is already registered or the registration somehow + * else fails. + * </p> + * + * @param sp the print service lookup implementation to register. + * @return <code>true</code> if registered, <code>false</code> otherwise. + */ + public static boolean registerServiceProvider(PrintServiceLookup sp) + { + return printServiceLookups.add(sp); + } + + /** + * Explicitly registers the provided print service instance. + * <p> + * The registration will silently fail (returning <code>false</code>) if + * the print service instance is already registered or the registration + * somehow else fails. + * </p> + * @param service the single print service to register. + * @return <code>true</code> if registered, <code>false</code> otherwise. + */ + public static boolean registerService(PrintService service) + { + if (service instanceof StreamPrintService) + return false; + + // security + try + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPrintJobAccess(); + + return printServices.add(service); + } + catch (SecurityException se) + { + return false; + } + } + + /** + * Searches print services capable of printing in the given document flavor + * which supports the specified printing attributes. + * + * @param flavor the document flavor to support. If <code>null</code> this + * constraint is ignored during lookup. + * @param attributes the printing attributes to support. If + * <code>null</code> this constraint is ignored during lookup. + * @return The resulting available print services, or an array of length 0 + * if none is found. + */ + public static final PrintService[] lookupPrintServices(DocFlavor flavor, + AttributeSet attributes) + { + ArrayList result = new ArrayList(); + + PrintService[] services = + systemProvider.getPrintServices(flavor, attributes); + result.addAll(Arrays.asList(services)); + + for (Iterator it = printServiceLookups.iterator(); it.hasNext(); ) + { + PrintServiceLookup lookup = (PrintServiceLookup) it.next(); + services = lookup.getPrintServices(flavor, attributes); + result.addAll(Arrays.asList(services)); + } + + for (Iterator it = printServices.iterator(); it.hasNext(); ) + { + PrintService service = (PrintService) it.next(); + if (systemProvider.checkPrintService(flavor, attributes, service)) + result.add(service); + } + + return (PrintService[]) result.toArray(new PrintService[result.size()]); + } + + /** + * Searches print services capable of multi document printing in all of the + * given document flavors and supporting the specified printing attributes. + * + * @param flavors the document flavors to support. If <code>null</code> this + * constraint is ignored during lookup. + * @param attributes the printing attributes to support. If + * <code>null</code> this constraint is ignored during lookup. + * @return The resulting available multi document print services, or an + * array of length 0 if none is found. + */ + public static final MultiDocPrintService[] lookupMultiDocPrintServices( + DocFlavor[] flavors, AttributeSet attributes) + { + ArrayList result = new ArrayList(); + + MultiDocPrintService[] services = + systemProvider.getMultiDocPrintServices(flavors, attributes); + result.addAll(Arrays.asList(services)); + + for (Iterator it = printServiceLookups.iterator(); it.hasNext(); ) + { + PrintServiceLookup lookup = (PrintServiceLookup) it.next(); + services = lookup.getMultiDocPrintServices(flavors, attributes); + result.addAll(Arrays.asList(services)); + } + + for (Iterator it = printServices.iterator(); it.hasNext(); ) + { + PrintService service = (PrintService) it.next(); + if (systemProvider.checkMultiDocPrintService(flavors, attributes, service)) + result.add(service); + } + + return (MultiDocPrintService[]) result.toArray( + new MultiDocPrintService[result.size()]); + } + + + /** + * Searches the default print service in the current environment. + * <p> + * If multiple lookup services are registered and each has a default + * print service the result is not specified. Usually the default + * print service of the native platform lookup service is returned. + * </p><p> + * The GNU classpath implementation will return the CUPS default + * printing service as the default print service, if available. + * </p><p> + * The default print service may be overriden by users through + * the property <code>javax.print.defaultPrinter</code>. A service + * specified must be found to be returned as the default. + * </p> + * + * @return The default print service, or <code>null</code> if none found. + */ + public static final PrintService lookupDefaultPrintService() + { + // TODO Find out what the property controls and use it + // String defaultPrinter = System.getProperty("javax.print.defaultPrinter"); + + // first test for platform specified default services + PrintService service = systemProvider.getDefaultPrintService(); + + if (service != null) + return service; + + // none available by systemDefaultProvider + // search in other registered ones and take first + for (Iterator it = printServiceLookups.iterator(); it.hasNext(); ) + { + service = ((PrintServiceLookup) it.next()).getDefaultPrintService(); + if (service != null) + return service; + } + + return null; + } + + /** + * Not to be called directly by applications. + * + * @return The default lookup service of the implementing lookup service or + * <code>null</code> if there is no default one. + */ + public abstract PrintService getDefaultPrintService(); + + /** + * Not to be called directly by applications. + * + * @param flavors the document flavors which have to be supported. + * @param attributes the attributes which have to be supported. + * + * @return The multidoc print services of the implementing lookup service + * for the given parameters, or an array of length 0 if none is available. + */ + public abstract MultiDocPrintService[] + getMultiDocPrintServices(DocFlavor[] flavors, AttributeSet attributes); + + /** + * Not to be called directly by applications. + * + * @return All known print services of the implementing lookup service + * regardless of supported features, or an array of length 0 if none is + * available. + */ + public abstract PrintService[] getPrintServices(); + + /** + * Not to be called directly by applications. + * + * @param flavor the document flavor which has to be supported. + * @param attributes the attributes which have to be supported. + * + * @return The print services of the implementing lookup service + * for the given parameters, or an array of length 0 if none is available. + */ + public abstract PrintService[] + getPrintServices(DocFlavor flavor, AttributeSet attributes); +} |