package fr.lteconsulting.hexa.client.comm; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; public class DataProxyFastFactories { HashMap<Class<?>, IDataProxyFastFactory> factories = null; HashMap<Class<?>, IterableFactory> iterableFactories = new HashMap<Class<?>, IterableFactory>(); public void init( HashMap<Class<?>, IDataProxyFastFactory> factories ) { this.factories = factories; for( Entry<Class<?>, IDataProxyFastFactory> e : factories.entrySet() ) iterableFactories.put( e.getKey(), new IterableFactory( e.getValue() ) ); } public <T> T getData( Class<T> clazz, JavaScriptObject obj ) { IDataProxyFastFactory factory = factories.get( clazz ); assert (factory != null) : "Factory not null"; if( factory == null ) return null; return factory.getData( obj ); } public <T> Iterable<T> getList( Class<T> clazz, JsArray<JavaScriptObject> obj ) { IterableFactory factoryIterable = iterableFactories.get( clazz ); if( factoryIterable == null ) { IDataProxyFastFactory factory = factories.get( clazz ); assert (factory != null) : "Factory is null for class " + clazz.toString(); if( factory == null ) return null; factoryIterable = new IterableFactory( factory ); iterableFactories.put( clazz, factoryIterable ); } return factoryIterable.getIterable( obj ); } class IterableFactory { IDataProxyFastFactory factory; public IterableFactory( IDataProxyFastFactory factory ) { this.factory = factory; } public <T> Iterable<T> getIterable( JsArray<JavaScriptObject> obj ) { return new It<T>( obj ); } class It<T> implements Iterable<T> { JsArray<JavaScriptObject> obj; public It( JsArray<JavaScriptObject> obj ) { this.obj = obj; } public Iterator<T> iterator() { return new Iterator<T>() { int idx = 0; public boolean hasNext() { return idx < obj.length(); } public T next() { return factory.getData( obj.get( idx++ ) ); } public void remove() { assert false : "remove forbidden"; } }; } } } }