/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.job;
import java.util.function.Supplier;
import org.eclipse.packagedrone.job.JobInstance.Context;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public abstract class AbstractJsonJobFactory<T, R> implements JobFactory
{
private static GsonBuilder DEFAULT = new GsonBuilder ();
private Supplier<GsonBuilder> gsonBuilder;
private Class<T> dataClazz;
private GsonBuilder builder;
public AbstractJsonJobFactory ( final Class<T> dataClazz, final Supplier<GsonBuilder> gsonBuilder )
{
this.dataClazz = dataClazz;
this.gsonBuilder = gsonBuilder == null ? ( ) -> DEFAULT : gsonBuilder;
}
public AbstractJsonJobFactory ( final Class<T> dataClazz, final GsonBuilder gsonBuilder )
{
this.dataClazz = dataClazz;
this.gsonBuilder = null;
this.builder = gsonBuilder;
}
public AbstractJsonJobFactory ( final Class<T> dataClazz )
{
this ( dataClazz, new GsonBuilder () );
}
protected Gson createGson ()
{
if ( this.builder == null )
{
this.builder = this.gsonBuilder.get ();
}
return this.builder.create ();
}
protected abstract R process ( Context context, T data ) throws Exception;
@Override
public JobInstance createInstance ( final String data )
{
final Gson gson = createGson ();
final T cfg = gson.fromJson ( data, this.dataClazz );
return new JobInstance () {
@Override
public void run ( final Context context ) throws Exception
{
final R result = process ( context, cfg );
context.setResult ( gson.toJson ( result ) );
}
};
}
@Override
public String encodeConfiguration ( final Object data )
{
if ( data == null )
{
return null;
}
if ( !this.dataClazz.isAssignableFrom ( data.getClass () ) )
{
throw new IllegalArgumentException ( String.format ( "Job data must be of type: %s (is %s)", this.dataClazz, data.getClass () ) );
}
return createGson ().toJson ( data );
}
@Override
public String makeLabel ( final String data )
{
final T cfg = createGson ().fromJson ( data, this.dataClazz );
return makeLabelFromData ( cfg );
}
protected abstract String makeLabelFromData ( T data );
}