001 package com.hammurapi.render;
002
003 import java.net.URL;
004
005 import com.hammurapi.common.ClassResourceLoader;
006 import com.hammurapi.common.Context;
007 import com.hammurapi.convert.AtomicConverter;
008 import com.hammurapi.convert.Converter;
009 import com.hammurapi.convert.DuckConverterFactory;
010
011 /**
012 * Converts objects to ImageProvider by looking up images in classloader
013 * traversing object's class hierarchy.
014 * @author Pavel Vlasov
015 *
016 */
017 public class ImageProviderConverter implements AtomicConverter<Object, ImageProvider> {
018
019 @Override
020 public ImageProvider convert(final Object source, Converter master, Context context, ClassLoader classLoader) {
021 return new ImageProvider() {
022
023 private boolean resolved;
024
025 private URL result;
026
027 @Override
028 public Object getIcon() throws RenderingException {
029 if (!resolved) {
030 ClassResourceLoader crl = new ClassResourceLoader(source.getClass(), "META-INF/com.hammurapi.render/", DuckConverterFactory.getChildClassLoader(source.getClass().getClassLoader(), this.getClass().getClassLoader()));
031 result = crl.getResource(null, RenderingConstants.GIF);
032 resolved = true;
033 }
034 return result;
035 }
036
037 };
038 }
039
040 @Override
041 public Class<Object> getSourceType() {
042 return Object.class;
043 }
044
045 @Override
046 public Class<? extends ImageProvider> getTargetType() {
047 return ImageProvider.class;
048 }
049
050 }