Merge "Issue #1384 allow the derived parameters to function even if the database has multiple identical coverages, add cluster locking to grid coverage creation." into development

Former-commit-id: f279d478f8 [formerly 251535242b781031c5324708db7be1127844c6d0]
Former-commit-id: 970f1fc201
This commit is contained in:
Richard Peter 2012-12-04 16:15:16 -06:00 committed by Gerrit Code Review
commit ea5314b983
3 changed files with 139 additions and 60 deletions

View file

@ -79,7 +79,7 @@ import com.raytheon.viz.alerts.observers.ProductAlertObserver;
public class CoverageUtils implements IAlertObserver {
private static CoverageUtils instance;
private final Map<String, Set<GridCoverage>> coverageCache = new HashMap<String, Set<GridCoverage>>();
private final Map<String, Set<UniqueIdGridCoverageWrapper>> coverageCache = new HashMap<String, Set<UniqueIdGridCoverageWrapper>>();
private boolean hasPerformedBulkQuery = false;
@ -105,7 +105,8 @@ public class CoverageUtils implements IAlertObserver {
*/
public Collection<GridCoverage> getCoverages(String datasetId)
throws VizException {
Collection<GridCoverage> rval = coverageCache.get(datasetId);
Collection<UniqueIdGridCoverageWrapper> rval = coverageCache
.get(datasetId);
if (rval == null) {
DbQueryRequest query = new DbQueryRequest();
@ -139,17 +140,21 @@ public class CoverageUtils implements IAlertObserver {
String resultId = (String) map
.get(GridInfoConstants.DATASET_ID);
GridCoverage coverage = requestedLocations.get(locationId);
Set<GridCoverage> set = coverageCache.get(resultId);
Set<UniqueIdGridCoverageWrapper> set = coverageCache
.get(resultId);
if (set == null) {
set = new HashSet<GridCoverage>();
set = new HashSet<UniqueIdGridCoverageWrapper>();
coverageCache.put(resultId, set);
}
set.add(coverage);
set.add(new UniqueIdGridCoverageWrapper(coverage));
}
rval = coverageCache.get(datasetId);
}
return rval;
List<GridCoverage> finalSet = new ArrayList<GridCoverage>(rval.size());
for (UniqueIdGridCoverageWrapper wrapper : rval) {
finalSet.add(wrapper.getGridCoverage());
}
return finalSet;
}
/**
@ -161,12 +166,12 @@ public class CoverageUtils implements IAlertObserver {
*/
public void setCoverage(String modelName, GridCoverage coverage) {
if (modelName != null && coverage != null) {
Set<GridCoverage> set = coverageCache.get(modelName);
Set<UniqueIdGridCoverageWrapper> set = coverageCache.get(modelName);
if (set == null) {
set = new HashSet<GridCoverage>();
set = new HashSet<UniqueIdGridCoverageWrapper>();
coverageCache.put(modelName, set);
}
set.add(coverage);
set.add(new UniqueIdGridCoverageWrapper(coverage));
}
}
@ -326,11 +331,61 @@ public class CoverageUtils implements IAlertObserver {
.get(GridConstants.DATASET_ID);
GridCoverage coverage = (GridCoverage) alertMessage.decodedAlert
.get(GridConstants.LOCATION);
Set<GridCoverage> set = coverageCache.get(datasetId);
Set<UniqueIdGridCoverageWrapper> set = coverageCache.get(datasetId);
if (set != null && coverage != null) {
set.add(coverage);
set.add(new UniqueIdGridCoverageWrapper(coverage));
}
}
}
// This class exists so that two coverages that are otherwise equal can be
// stored together in a set if they have different IDs.
private static class UniqueIdGridCoverageWrapper {
private final GridCoverage gridCoverage;
public UniqueIdGridCoverageWrapper(GridCoverage gridCoverage) {
super();
this.gridCoverage = gridCoverage;
}
public GridCoverage getGridCoverage() {
return gridCoverage;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((gridCoverage == null) ? 0 : gridCoverage.hashCode());
result = prime
* result
+ ((gridCoverage.getId() == null) ? 0 : gridCoverage
.getId().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UniqueIdGridCoverageWrapper other = (UniqueIdGridCoverageWrapper) obj;
if (gridCoverage == null) {
if (other.gridCoverage != null)
return false;
} else if (!gridCoverage.equals(other.gridCoverage)) {
return false;
} else if (!gridCoverage.getId().equals(
other.getGridCoverage().getId())) {
return false;
}
return true;
}
}
}

View file

@ -21,3 +21,4 @@ Import-Package: com.raytheon.edex.db.dao,
org.hibernate.criterion,
org.springframework.orm.hibernate3.support
Export-Package: com.raytheon.uf.edex.gridcoverage
Require-Bundle: com.raytheon.uf.edex.database

View file

@ -31,6 +31,9 @@ import com.raytheon.uf.common.gridcoverage.request.GetGridCoverageRequest;
import com.raytheon.uf.common.serialization.comm.IRequestHandler;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils;
import com.raytheon.uf.edex.database.cluster.ClusterLockUtils.LockState;
import com.raytheon.uf.edex.database.cluster.ClusterTask;
import com.raytheon.uf.edex.database.dao.CoreDao;
import com.raytheon.uf.edex.database.dao.DaoConfig;
@ -78,55 +81,25 @@ public class GetGridCoverageHandler implements
sess = dao.getSessionFactory().openSession();
trans = sess.beginTransaction();
Criteria crit = sess.createCriteria(coverage.getClass());
crit.add(Restrictions.eq("nx", coverage.getNx()));
crit.add(Restrictions.eq("ny", coverage.getNx()));
crit.add(Restrictions.between("dx", coverage.getDx()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("dy", coverage.getDy()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("la1", coverage.getLa1()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLa1()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("lo1", coverage.getLo1()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLo1()
+ GridCoverage.SPATIAL_TOLERANCE));
List<?> vals = crit.list();
for (Object val : vals) {
if (((GridCoverage) val).spatialEquals(coverage)) {
rval = (GridCoverage) val;
}
}
if (rval == null
&& (Math.abs(coverage.getLo1()) > 179 || Math.abs(coverage
.getLa1()) > 89)) {
// if we got here nothing matches, try a query with no la1, and
// lo1 in case there are world wrap issues.
crit = sess.createCriteria(coverage.getClass());
crit.add(Restrictions.eq("nx", coverage.getNx()));
crit.add(Restrictions.eq("ny", coverage.getNx()));
crit.add(Restrictions.between("dx", coverage.getDx()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("dy", coverage.getDy()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
+ GridCoverage.SPATIAL_TOLERANCE));
vals = crit.list();
for (Object val : vals) {
if (((GridCoverage) val).spatialEquals(coverage)) {
return (GridCoverage) val;
}
}
}
rval = query(coverage, sess);
if (rval == null && create) {
// if it still does not exist, create it if requested
coverage.initialize();
sess.saveOrUpdate(coverage);
rval = coverage;
ClusterTask ct = null;
do {
ct = ClusterLockUtils.lock("gridcoverage", "create"
+ coverage.getProjectionType(), 120000, true);
} while (!LockState.SUCCESSFUL.equals(ct.getLockState()));
try {
rval = query(coverage, sess);
if (rval == null) {
// if it still does not exist, create it if requested
coverage.initialize();
sess.saveOrUpdate(coverage);
rval = coverage;
}
} finally {
ClusterLockUtils.deleteLock(ct.getId().getName(), ct
.getId().getDetails());
}
}
trans.commit();
@ -154,4 +127,54 @@ public class GetGridCoverageHandler implements
return rval;
}
private GridCoverage query(GridCoverage coverage, Session sess) {
GridCoverage rval = null;
Criteria crit = sess.createCriteria(coverage.getClass());
crit.add(Restrictions.eq("nx", coverage.getNx()));
crit.add(Restrictions.eq("ny", coverage.getNx()));
crit.add(Restrictions.between("dx", coverage.getDx()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("dy", coverage.getDy()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("la1", coverage.getLa1()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLa1()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("lo1", coverage.getLo1()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getLo1()
+ GridCoverage.SPATIAL_TOLERANCE));
List<?> vals = crit.list();
for (Object val : vals) {
if (((GridCoverage) val).spatialEquals(coverage)) {
rval = (GridCoverage) val;
}
}
if (rval == null
&& (Math.abs(coverage.getLo1()) > 179 || Math.abs(coverage
.getLa1()) > 89)) {
// if we got here nothing matches, try a query with no la1, and
// lo1 in case there are world wrap issues.
crit = sess.createCriteria(coverage.getClass());
crit.add(Restrictions.eq("nx", coverage.getNx()));
crit.add(Restrictions.eq("ny", coverage.getNx()));
crit.add(Restrictions.between("dx", coverage.getDx()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDx()
+ GridCoverage.SPATIAL_TOLERANCE));
crit.add(Restrictions.between("dy", coverage.getDy()
- GridCoverage.SPATIAL_TOLERANCE, coverage.getDy()
+ GridCoverage.SPATIAL_TOLERANCE));
vals = crit.list();
for (Object val : vals) {
if (((GridCoverage) val).spatialEquals(coverage)) {
return (GridCoverage) val;
}
}
}
return rval;
}
}