package org.korsakow.services.encoders.image; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; public class ImageEncoderFactory { public static ImageEncoderFactory getNewFactory() { return new ImageEncoderFactory(); } private static Collection<ImageEncoder.ImageEncoderDescription> descriptions = new ArrayList<ImageEncoder.ImageEncoderDescription>(); public static void addEncoder(ImageEncoder.ImageEncoderDescription description) { synchronized (descriptions) { descriptions.add(description); } } private final Collection<ImageFormat> requiredInputFormats = new HashSet<ImageFormat>(); private final Collection<ImageFormat> requiredOutputFormats = new HashSet<ImageFormat>(); private ImageEncoderFactory() { } public void addRequiredInputFormat(ImageFormat format) { requiredInputFormats.add(format); } public void addRequiredOutputFormat(ImageFormat format) { requiredOutputFormats.add(format); } public void clear() { requiredInputFormats.clear(); requiredOutputFormats.clear(); } public ImageEncoder createImageEncoder() throws ImageEncoderException { List<ImageEncoder.ImageEncoderDescription> descs; synchronized (descriptions) { descs = new ArrayList<ImageEncoder.ImageEncoderDescription>(descriptions); } for (ImageEncoder.ImageEncoderDescription desc : descs) { if (!desc.getSupportedInputFormats().containsAll(requiredInputFormats)) continue; if (!desc.getSupportedOutputFormats().containsAll(requiredOutputFormats)) continue; ImageEncoder videoEncoder; try { videoEncoder = desc.getEncoderClass().newInstance(); } catch (InstantiationException e) { throw new ImageEncoderException(e); } catch (IllegalAccessException e) { throw new ImageEncoderException(e); } return videoEncoder; } throw new ImageEncoderException("No encoder matching the requirements was found"); } }