package org.korsakow.services.encoders.font; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Hashtable; public class FontEncoderFactory { private static FontEncoderFactory defaultFactory; public static FontEncoderFactory getDefaultFactory() { if (defaultFactory == null) defaultFactory = new FontEncoderFactory(); return defaultFactory; } private final Collection<FontEncoder.FontEncoderDescription> descriptions = new ArrayList<FontEncoder.FontEncoderDescription>(); private final Collection<FontFormat> requiredInputFormats = new HashSet<FontFormat>(); private final Collection<FontFormat> requiredOutputFormats = new HashSet<FontFormat>(); private final Hashtable<String, Object> requiredOptions = new Hashtable<String, Object>(); public void addEncoder(FontEncoder.FontEncoderDescription description) { descriptions.add(description); } public void addRequiredInputFormat(FontFormat format) { requiredInputFormats.add(format); } public void addRequiredOutputFormat(FontFormat format) { requiredOutputFormats.add(format); } public void setRequiredOption(String name, Object value) { requiredOptions.put(name, value); } public FontEncoder createFontEncoder() throws FontEncoderException { for (FontEncoder.FontEncoderDescription desc : descriptions) { if (!desc.getSupportedInputFormats().containsAll(requiredInputFormats)) continue; if (!desc.getSupportedOutputFormats().containsAll(requiredOutputFormats)) continue; FontEncoder fontEncoder; try { fontEncoder = desc.getEncoderClass().newInstance(); } catch (InstantiationException e) { throw new FontEncoderException(e); } catch (IllegalAccessException e) { throw new FontEncoderException(e); } return fontEncoder; } throw new FontEncoderException("No encoder matching the requirements was found"); } }