package com.github.nmorel.gwtjackson.benchmark.client.mechanism; import java.util.ArrayList; import java.util.List; import com.github.nmorel.gwtjackson.benchmark.client.Criteria; import com.github.nmorel.gwtjackson.benchmark.client.Operation; import com.github.nmorel.gwtjackson.benchmark.client.data.DataContainer; import com.github.nmorel.gwtjackson.benchmark.client.ui.ResultWidget; import com.github.nmorel.gwtjackson.client.ObjectMapper; /** * @author Nicolas Morel */ public abstract class Mechanism { interface ObjectMapperProvider { ObjectMapper<DataContainer> getMapper(); } class ObjectMapperProviderSingleton implements ObjectMapperProvider { private ObjectMapper<DataContainer> singleton = newMapper(); @Override public ObjectMapper<DataContainer> getMapper() { return singleton; } } class ObjectMapperProviderPrototype implements ObjectMapperProvider { @Override public ObjectMapper<DataContainer> getMapper() { return newMapper(); } } private ResultWidget result; protected Mechanism( String title ) { this.result = new ResultWidget( title ); } public List<Operation> prepare( final DataContainer datas, Criteria criteria ) { final ObjectMapperProvider mapperProvider; if ( criteria.isSingletonMapper() ) { mapperProvider = new ObjectMapperProviderSingleton(); } else { mapperProvider = new ObjectMapperProviderPrototype(); } result.getResultSer().setVisible( criteria.isSerialization() ); result.getResultDeser().setVisible( criteria.isDeserialization() ); List<Operation> operations = new ArrayList<>(); if ( criteria.isSerialization() ) { if ( criteria.isSingletonMapper() ) { // warmup the mapper mapperProvider.getMapper().write( datas ); } operations.add( new Operation( criteria.getNbIterations(), result.getResultSer() ) { @Override protected void doExecute() { mapperProvider.getMapper().write( datas ); } } ); } if ( criteria.isDeserialization() ) { final String jsonInput = mapperProvider.getMapper().write( datas ); operations.add( new Operation( criteria.getNbIterations(), result.getResultDeser() ) { @Override protected void doExecute() { mapperProvider.getMapper().read( jsonInput ); } } ); } return operations; } public ResultWidget getResult() { return result; } public void clear() { result.getResultSer().setResult( null ); result.getResultDeser().setResult( null ); } protected abstract ObjectMapper<DataContainer> newMapper(); }