/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.features;
import com.vividsolutions.jts.geom.Geometry;
import org.deegree.io.shpapi.ShapeFile;
import org.deegree.model.feature.FeatureCollection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class ShapeInfo {
//~ Instance fields --------------------------------------------------------
// caches the last feature properties
private Cache<LinkedHashMap<String, Object>> cache = new Cache<LinkedHashMap<String, Object>>(2);
private Cache<Geometry> geoCache = new Cache<Geometry>(1);
private String typename;
private ShapeFile file;
private int srid;
private FeatureCollection fc;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ShapeInfo object.
*
* @param typename DOCUMENT ME!
* @param file DOCUMENT ME!
* @param srid DOCUMENT ME!
* @param fc DOCUMENT ME!
*/
public ShapeInfo(final String typename, final ShapeFile file, final int srid, final FeatureCollection fc) {
this.typename = typename;
this.file = file;
this.srid = srid;
this.fc = fc;
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return the typename
*/
public String getTypename() {
return typename;
}
/**
* DOCUMENT ME!
*
* @param typename the typename to set
*/
public void setTypename(final String typename) {
this.typename = typename;
}
/**
* DOCUMENT ME!
*
* @return the file
*/
public ShapeFile getFile() {
return file;
}
/**
* DOCUMENT ME!
*
* @param file the file to set
*/
public void setFile(final ShapeFile file) {
this.file = file;
}
/**
* DOCUMENT ME!
*
* @return the srid
*/
public int getSrid() {
return srid;
}
/**
* DOCUMENT ME!
*
* @param srid the srid to set
*/
public void setSrid(final int srid) {
this.srid = srid;
}
/**
* DOCUMENT ME!
*
* @return the fc
*/
public FeatureCollection getFc() {
return fc;
}
/**
* DOCUMENT ME!
*
* @param fc the fc to set
*/
public void setFc(final FeatureCollection fc) {
this.fc = fc;
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public synchronized LinkedHashMap<String, Object> getPropertiesFromCache(final int id) {
return cache.get(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param container DOCUMENT ME!
*/
public synchronized void addPropertiesToCache(final int id, final LinkedHashMap<String, Object> container) {
cache.add(id, container);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public synchronized Geometry getGeometryFromCache(final int id) {
return geoCache.get(id);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param geo container DOCUMENT ME!
*/
public synchronized void addGeometryToCache(final int id, final Geometry geo) {
geoCache.add(id, geo);
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class Cache<T> {
//~ Instance fields ----------------------------------------------------
private Integer[] ids;
private int index = 0;
private Map<Integer, T> dataMap;
//~ Constructors -------------------------------------------------------
/**
* Creates a new Cache object.
*
* @param size DOCUMENT ME!
*/
public Cache(final int size) {
init(size);
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param size DOCUMENT ME!
*/
private void init(final int size) {
ids = new Integer[size];
index = 0;
dataMap = new HashMap<Integer, T>();
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
* @param data DOCUMENT ME!
*/
public void add(final int id, final T data) {
if (ids[index] != null) {
dataMap.remove(ids[index]);
}
ids[index] = id;
increaseIndex();
dataMap.put(id, data);
}
/**
* DOCUMENT ME!
*
* @param id DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public T get(final int id) {
final T res = dataMap.get(id);
if (res != null) {
while ((ids[index] == null) || (ids[index] != id)) {
increaseIndex();
}
increaseIndex();
}
return res;
}
/**
* DOCUMENT ME!
*
* @param size DOCUMENT ME!
*/
private void setSize(final int size) {
init(size);
}
/**
* DOCUMENT ME!
*/
private void increaseIndex() {
++index;
if (index >= ids.length) {
index = 0;
}
}
}
}