//package org.genedb.web.mvc.model;
//
//import java.io.IOException;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import net.sf.json.JSON;
//import net.sf.json.JSONSerializer;
//
//import org.apache.log4j.Logger;
//import org.genedb.db.domain.services.BasicGeneService;
//import org.genedb.web.gui.ContextMapDiagram;
//import org.genedb.web.gui.DiagramCache;
//import org.genedb.web.gui.ImageCreationException;
//import org.genedb.web.gui.RenderedContextMap;
//import org.genedb.web.gui.RenderedDiagramFactory;
//import org.gmod.schema.feature.AbstractGene;
//import org.gmod.schema.mapped.Feature;
//import org.hibernate.Session;
//import org.hibernate.SessionFactory;
//import org.springframework.orm.hibernate3.SessionFactoryUtils;
//
//import com.sleepycat.collections.StoredMap;
//
///**
// * To provide a set of generic helper methods to be used in multiple places
// * @author sangerinstitute
// *
// */
//public class CacheDBHelper {
// private static final Logger logger = Logger.getLogger(CacheDBHelper.class);
//
// private static final int TILE_WIDTH = 5000;
// private static final int THUMBNAIL_WIDTH = 600;
//
// public static final int MIN_CONTEXT_LENGTH_BASES = 100;
//
// /**
// * Find a Gene, using it's unique name
// * @param geneUniqueName
// * @param sessionFactory
// * @return
// */
// public static AbstractGene findGene(String geneUniqueName, SessionFactory sessionFactory) {
// Session session = SessionFactoryUtils.getSession(sessionFactory, false);
//
// return (AbstractGene) session.createQuery(
// "select g from AbstractGene g" +
// " where g.uniqueName = :geneUniqueName")
// .setParameter("geneUniqueName", geneUniqueName)
// .uniqueResult();
// }
//
// /**
// *
// * @param feature
// * @param basicGeneService
// * @param renderedDiagramFactory
// * @param diagramCache
// * @param contextMapMap
// */
// public static void populateContextMapCache(
// Feature feature, BasicGeneService basicGeneService,
// RenderedDiagramFactory renderedDiagramFactory,
// DiagramCache diagramCache, StoredMap<Integer, String> contextMapMap) {
// populateContextMapCache(feature, basicGeneService, renderedDiagramFactory, diagramCache, contextMapMap, TILE_WIDTH);
// }
//
// /**
// *
// * @param feature
// * @param basicGeneService
// * @param renderedDiagramFactory
// * @param diagramCache
// * @param contextMapMap
// * @param tileWidth
// */
// public static void populateContextMapCache(
// Feature feature, BasicGeneService basicGeneService,
// RenderedDiagramFactory renderedDiagramFactory,
// DiagramCache diagramCache, StoredMap<Integer, String> contextMapMap, int tileWidth) {
//
// ContextMapDiagram chromosomeDiagram = ContextMapDiagram.forChromosome(basicGeneService,
// feature.getOrganism().getCommonName(), feature.getUniqueName(), feature.getFeatureId(), feature.getSeqLen());
//
// RenderedContextMap renderedContextMap = (RenderedContextMap) renderedDiagramFactory.getRenderedDiagram(chromosomeDiagram);
// RenderedContextMap renderedChromosomeThumbnail = (RenderedContextMap) renderedDiagramFactory.getRenderedDiagram(chromosomeDiagram).asThumbnail(THUMBNAIL_WIDTH);
//
// logger.debug(String.format("About to try and generate context map for '%s'", feature.getUniqueName()));
// try {
// List<RenderedContextMap.Tile> tiles = renderedContextMap.renderTiles(tileWidth);
// String metadata = contextMapMetadata(renderedChromosomeThumbnail, renderedContextMap, tiles, diagramCache);
// contextMapMap.put(feature.getFeatureId(), metadata);
// logger.debug("Stored contextMap for "+feature.getFeatureId()+" '"+feature.getUniqueName()+"' as '"+metadata+"'");
// } catch (IOException exp) {
// logger.error(exp);
// }
// catch (ImageCreationException exp) {
// logger.error(exp);
// }
// }
//
// /**
// *
// * @param chromosomeThumbnail
// * @param contextMap
// * @param tiles
// * @param diagramCache
// * @return
// * @throws IOException
// * @throws ImageCreationException
// */
// private static String contextMapMetadata(RenderedContextMap chromosomeThumbnail, RenderedContextMap contextMap,
// List<RenderedContextMap.Tile> tiles, DiagramCache diagramCache) throws IOException, ImageCreationException {
// String chromosomeThumbnailKey = diagramCache.fileForContextMap(chromosomeThumbnail);
//
// ContextMapDiagram diagram = contextMap.getDiagram();
//
// Map<String,Object> model = new HashMap<String,Object>();
//
// model.put("organism", diagram.getOrganism());
// model.put("chromosome", diagram.getChromosome());
// model.put("numberOfPositiveTracks", diagram.numberOfPositiveTracks());
// model.put("geneTrackHeight", contextMap.getTrackHeight());
// model.put("scaleTrackHeight", contextMap.getScaleTrackHeight());
// model.put("exonRectHeight", contextMap.getExonRectHeight());
// model.put("tileHeight", contextMap.getHeight());
// model.put("basesPerPixel", contextMap.getBasesPerPixel());
//
// model.put("products", contextMap.getProducts());
// model.put("features", contextMap.getRenderedFeatures());
//
// model.put("start", diagram.getStart());
// model.put("end", diagram.getEnd());
//
// model.put("tilePrefix", "/Image/");
// model.put("tiles", tiles);
//
// Map<String,Object> chromosomeThumbnailModel = new HashMap<String,Object>();
// chromosomeThumbnailModel.put("src", chromosomeThumbnailKey);
// chromosomeThumbnailModel.put("width", chromosomeThumbnail.getWidth());
// model.put("chromosomeThumbnail", chromosomeThumbnailModel);
//
// JSON json = JSONSerializer.toJSON(model);
// String text = json.toString(0);
// return text;
// }
//}