* @see org.geowebcache.config.Configuration#save()
*/
@Override
public synchronized void save() {
final GWC mediator = GWC.get();
final Set<String/* name */> deletedNames = Sets.newHashSet();
final List<GeoServerTileLayerInfo[/* old, new */]> modifications = Lists.newLinkedList();
lock.writeLock().lock();
// perform the transaction while holding the write lock, then downgrade to the read lock and
// issue the modification events (otherwise another thread asking for any changed layer
// would lock)
try {
for (String deletedId : pendingDeletes) {
try {
GeoServerTileLayerInfo info = tileLayerCatalog.delete(deletedId);
if (info != null) {
// remove it from stack copy to avoid notifying its deletion
deletedNames.add(info.getName());
}
} catch (RuntimeException e) {
LOGGER.log(Level.SEVERE, "Error deleting tile layer '" + deletedId + "'", e);
}
}
for (GeoServerTileLayerInfo modified : pendingModications.values()) {
final GeoServerTileLayerInfo old;
try {
old = tileLayerCatalog.save(modified);
modifications.add(new GeoServerTileLayerInfo[] { old, modified });
} catch (RuntimeException e) {
LOGGER.log(Level.SEVERE,
"Error saving tile layer '" + modified.getName() + "'", e);
}
}
this.pendingModications.clear();
this.pendingDeletes.clear();
} finally {
// Downgrade by acquiring read lock before releasing write lock
lock.readLock().lock();
lock.writeLock().unlock(); // Unlock write, still hold read
try {
// issue notifications
for (String deletedLayerName : deletedNames) {
try {
// let the mediator deal with gwc to get rid of all the caches
mediator.layerRemoved(deletedLayerName);
} catch (RuntimeException e) {
LOGGER.log(Level.SEVERE, "Error deleting tile layer '" + deletedLayerName
+ "'", e);
}
}
for (GeoServerTileLayerInfo[] oldNew : modifications) {
final GeoServerTileLayerInfo old = oldNew[0];
final GeoServerTileLayerInfo modified = oldNew[1];
try {
if (old == null) {
// it's an addition
String layerName = modified.getName();
mediator.layerAdded(layerName);
} else {
// it's a modification
issueTileLayerInfoChangeNotifications(old, modified);
}
} catch (RuntimeException e) {