/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id: ImageWriterRegistry.java 1804124 2017-08-04 14:13:54Z ssteiner $ */
package org.apache.xmlgraphics.image.writer;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Properties;
import org.apache.xmlgraphics.util.Service;
Registry for ImageWriter
implementations. /**
* Registry for {@link ImageWriter} implementations.
*/
public final class ImageWriterRegistry {
private static volatile ImageWriterRegistry instance;
private Map<String, List<ImageWriter>> imageWriterMap
= new java.util.HashMap<String, List<ImageWriter>>();
private Map<String, Integer> preferredOrder;
Default constructor. The default preferred order for the image writers is loaded from the
resources.
/**
* Default constructor. The default preferred order for the image writers is loaded from the
* resources.
*/
public ImageWriterRegistry() {
Properties props = new Properties();
InputStream in = getClass().getResourceAsStream("default-preferred-order.properties");
if (in != null) {
try {
try {
props.load(in);
} finally {
in.close();
}
} catch (IOException ioe) {
throw new RuntimeException(
"Could not load default preferred order due to I/O error: "
+ ioe.getMessage());
}
}
setPreferredOrder(props);
setup();
}
Special constructor. The preferred order for the image writers can be specified as a
Map (for example a Properties file). The entries of the Map consists of fully qualified
class or package names as keys and integer numbers as values. Zero (0) is the default
priority.
Params: - preferredOrder – the map of order properties used to order the plug-ins
/**
* Special constructor. The preferred order for the image writers can be specified as a
* Map (for example a Properties file). The entries of the Map consists of fully qualified
* class or package names as keys and integer numbers as values. Zero (0) is the default
* priority.
* @param preferredOrder the map of order properties used to order the plug-ins
*/
public ImageWriterRegistry(Properties preferredOrder) {
setPreferredOrder(preferredOrder);
setup();
}
private void setPreferredOrder(Properties preferredOrder) {
Map<String, Integer> order = new java.util.HashMap<String, Integer>();
for (Map.Entry<Object, Object> entry : preferredOrder.entrySet()) {
order.put(entry.getKey().toString(),
Integer.parseInt(entry.getValue().toString()));
}
this.preferredOrder = order;
}
Returns: a singleton instance of the ImageWriterRegistry.
/** @return a singleton instance of the ImageWriterRegistry. */
public static ImageWriterRegistry getInstance() {
if (instance == null) {
instance = new ImageWriterRegistry();
}
return instance;
}
private void setup() {
Iterator iter = Service.providers(ImageWriter.class);
while (iter.hasNext()) {
ImageWriter writer = (ImageWriter)iter.next();
register(writer);
}
}
private int getPriority(ImageWriter writer) {
String key = writer.getClass().getName();
Integer value = preferredOrder.get(key);
while (value == null) {
int pos = key.lastIndexOf(".");
if (pos < 0) {
break;
}
key = key.substring(0, pos);
value = preferredOrder.get(key);
}
return (value != null) ? value : 0;
}
Registers a new ImageWriter implementation with the associated priority in the registry.
Higher priorities get preference over lower priorities.
Params: - writer – the ImageWriter instance to register.
- priority – the priority of the writer in the registry.
See Also:
/**
* Registers a new ImageWriter implementation with the associated priority in the registry.
* Higher priorities get preference over lower priorities.
* @param writer the ImageWriter instance to register.
* @param priority the priority of the writer in the registry.
* @see #register(ImageWriter)
*/
public void register(ImageWriter writer, int priority) {
String key = writer.getClass().getName();
// Register the priority to preferredOrder; overwrite original priority if exists
preferredOrder.put(key, priority);
register(writer);
}
Registers a new ImageWriter implementation in the registry. If an ImageWriter for the same
target MIME type has already been registered, it is placed in an array based on priority.
Params: - writer – the ImageWriter instance to register.
/**
* Registers a new ImageWriter implementation in the registry. If an ImageWriter for the same
* target MIME type has already been registered, it is placed in an array based on priority.
* @param writer the ImageWriter instance to register.
*/
public synchronized void register(ImageWriter writer) {
List<ImageWriter> entries = imageWriterMap.get(writer.getMIMEType());
if (entries == null) {
entries = new java.util.ArrayList<ImageWriter>();
imageWriterMap.put(writer.getMIMEType(), entries);
}
int priority = getPriority(writer);
ListIterator<ImageWriter> li = entries.listIterator();
while (li.hasNext()) {
ImageWriter w = li.next();
if (getPriority(w) < priority) {
li.previous();
break;
}
}
li.add(writer);
}
Returns an ImageWriter that can be used to encode an image to the requested MIME type.
Params: - mime – the MIME type of the desired output format
Returns: a functional ImageWriter instance handling the desired output format or
null if none can be found.
/**
* Returns an ImageWriter that can be used to encode an image to the requested MIME type.
* @param mime the MIME type of the desired output format
* @return a functional ImageWriter instance handling the desired output format or
* null if none can be found.
*/
public synchronized ImageWriter getWriterFor(String mime) {
List<ImageWriter> entries = imageWriterMap.get(mime);
if (entries == null) {
return null;
}
for (ImageWriter writer : entries) {
if (writer.isFunctional()) {
return writer;
}
}
return null;
}
}