
li.rudin.mavenjs.charting.api.ApplicationApi Maven / Gradle / Ivy
The newest version!
package li.rudin.mavenjs.charting.api;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import li.rudin.mavenjs.charting.ChartingDataSource;
import li.rudin.mavenjs.charting.calculations.SeriesIntegratorTask;
import li.rudin.mavenjs.charting.metadata.ChartMetadata;
import li.rudin.mavenjs.charting.metadata.SourceMetadata;
import li.rudin.mavenjs.charting.result.ChartResult;
@Path("/charting")
@ApplicationScoped
public class ApplicationApi implements Serializable
{
/**
* All available sources
*/
@Inject Instance sources;
/**
* Data source map for query lookup
*/
private final Map sourceMap = new HashMap<>();
private final ChartMetadata metadata = new ChartMetadata();
@PostConstruct
public void init()
{
//Map sources
for (ChartingDataSource source: sources)
{
SourceMetadata sourceMetadata = source.getMetadata();
metadata.addSource(sourceMetadata);
sourceMap.put(sourceMetadata.getName(), source);
}
}
/**
* Thread pool
*/
private final ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@PreDestroy
public void destroy()
{
pool.shutdown();
}
@GET
@Produces("application/json")
@Path("/")
public ChartMetadata getMetadata()
{
return metadata;
}
@GET
@Produces("application/json")
@Path("/{source}/{from}/{to}")
public List query(
@PathParam("source") String source,
@PathParam("from") long from,
@PathParam("to") long to,
@QueryParam("maxItems") @DefaultValue("1000") int maxItems
) throws InterruptedException, ExecutionException
{
ChartingDataSource dataSource = sourceMap.get(source);
if (dataSource == null)
throw new IllegalArgumentException("no such source: " + source);
List data = new ArrayList<>();
List> futures = new ArrayList<>();
//Submit tasks
for (ChartResult result: dataSource.getData(from, to))
futures.add(pool.submit(new SeriesIntegratorTask(result, maxItems)));
//Query data
for (Future future: futures)
data.add(future.get());
return data;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy