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    }