package charts.builder; import java.io.IOException; import helpers.FileStoreHelper; import javax.jcr.RepositoryException; import javax.jcr.Session; import play.libs.F; import service.JcrSessionFactory; import service.filestore.FileStore; import charts.builder.spreadsheet.SpreadsheetDataSource; import charts.builder.spreadsheet.XlsDataSource; import charts.builder.spreadsheet.XlsxDataSource; import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton public class FileStoreDataSourceFactory implements DataSourceFactory { private final JcrSessionFactory sessionFactory; private final FileStore fileStore; @Inject public FileStoreDataSourceFactory( JcrSessionFactory sessionFactory, FileStore fileStore) { this.fileStore = fileStore; this.sessionFactory = sessionFactory; } @Override public DataSource getDataSource(final String id) throws IOException, RepositoryException { return sessionFactory.inSession(new F.Function<Session, DataSource>() { @Override public final DataSource apply(final Session session) throws Exception { return getDatasourceFromID(session, id); } }); } private DataSource getDatasourceFromID(Session session, String id) throws IOException, RepositoryException { final FileStore.Manager fm = fileStore.getManager(session); final FileStore.FileOrFolder fof = fm.getByIdentifier(id); if (fof instanceof FileStore.File) { return getDataSource((FileStore.File) fof); } return null; } public static SpreadsheetDataSource getDataSource(FileStore.File file) throws IOException { // Check this is a MS spreadsheet document (no chance otherwise) if (file.getMimeType().equals(FileStoreHelper.XLS_MIME_TYPE)) { return new XlsDataSource(file.getData()); } else if (file.getMimeType().equals(FileStoreHelper.XLSX_MIME_TYPE)) { return new XlsxDataSource(file.getData()); } return null; } }