All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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