Skip to content

Commit

Permalink
Use layerId instead of layerName for key prefix
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabriel Roldan committed Jun 18, 2015
1 parent 1dcd2d3 commit 34cf617
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 30 deletions.
Expand Up @@ -21,6 +21,7 @@
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.storage.BlobStore;
import org.geowebcache.storage.StorageException;

Expand Down Expand Up @@ -127,5 +128,5 @@ public int hashCode() {
* @throws IllegalStateException if {@link #isEnabled() isEnabled() == false} or
* {@link #getId() getId() == null}
*/
public abstract BlobStore createInstance() throws StorageException;
public abstract BlobStore createInstance(TileLayerDispatcher layers) throws StorageException;
}
Expand Up @@ -18,6 +18,7 @@

import static com.google.common.base.Preconditions.checkState;

import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.storage.BlobStoreListener;
import org.geowebcache.storage.StorageException;
import org.geowebcache.storage.blobstore.file.FileBlobStore;
Expand Down Expand Up @@ -85,7 +86,7 @@ public String toString() {
}

@Override
public FileBlobStore createInstance() throws StorageException {
public FileBlobStore createInstance(TileLayerDispatcher layers) throws StorageException {
checkState(getId() != null, "id not set");
checkState(isEnabled(),
"Can't call FileBlobStoreConfig.createInstance() is blob store is not enabled");
Expand Down
Expand Up @@ -315,7 +315,7 @@ Map<String, LiveStore> loadBlobStores(List<? extends BlobStoreConfig> configs)

BlobStore store = null;
if (enabled) {
store = config.createInstance();
store = config.createInstance(layers);
}

LiveStore liveStore = new LiveStore(config, store);
Expand Down
Expand Up @@ -17,9 +17,11 @@
package org.geowebcache.config;

import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;

import java.io.File;

import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.storage.StorageException;
import org.geowebcache.storage.blobstore.file.FileBlobStore;
import org.junit.Before;
Expand All @@ -40,16 +42,19 @@ public class FileBlobStoreConfigTest {
@Rule
public ExpectedException ex = ExpectedException.none();

private TileLayerDispatcher layers;

@Before
public void before() {
config = new FileBlobStoreConfig();
layers = mock(TileLayerDispatcher.class);
}

@Test
public void testCreateInstanceNoId() throws StorageException {
ex.expect(IllegalStateException.class);
ex.expectMessage("id not set");
config.createInstance();
config.createInstance(layers);
}

@Test
Expand All @@ -58,7 +63,7 @@ public void testCreateInstanceNotEnabled() throws StorageException {
config.setEnabled(false);
ex.expect(IllegalStateException.class);
ex.expectMessage("store is not enabled");
config.createInstance();
config.createInstance(layers);
}

@Test
Expand All @@ -67,7 +72,7 @@ public void testCreateInstanceNoBaseDirectory() throws StorageException {
config.setEnabled(true);
ex.expect(IllegalStateException.class);
ex.expectMessage("baseDirectory not provided");
config.createInstance();
config.createInstance(layers);
}

@Test
Expand All @@ -78,7 +83,7 @@ public void testCreateInstanceIllegalBlockSize() throws StorageException {
config.setBaseDirectory(tmp.getRoot().getAbsolutePath());
ex.expect(IllegalStateException.class);
ex.expectMessage("must be a positive integer");
config.createInstance();
config.createInstance(layers);
}

@Test
Expand All @@ -88,7 +93,7 @@ public void testCreateInstance() throws StorageException {
File root = tmp.getRoot();
Preconditions.checkState(root.exists() && root.isDirectory());
config.setBaseDirectory(root.getAbsolutePath());
FileBlobStore store = config.createInstance();
FileBlobStore store = config.createInstance(layers);
assertNotNull(store);
}

Expand Down
Expand Up @@ -37,6 +37,7 @@
import org.apache.commons.logging.LogFactory;
import org.geowebcache.io.ByteArrayResource;
import org.geowebcache.io.Resource;
import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.mime.MimeException;
import org.geowebcache.mime.MimeType;
import org.geowebcache.storage.BlobStore;
Expand Down Expand Up @@ -89,13 +90,19 @@ public class S3BlobStore implements BlobStore {

private volatile boolean shutDown;

public S3BlobStore(S3BlobStoreConfig config) {
private final TileLayerDispatcher layers;

public S3BlobStore(S3BlobStoreConfig config, TileLayerDispatcher layers) {
checkNotNull(config);
checkNotNull(layers);
checkNotNull(config.getAwsAccessKey(), "Access key not provided");
checkNotNull(config.getAwsSecretKey(), "Secret key not provided");

this.layers = layers;

this.bucketName = config.getBucket();
String prefix = config.getPrefix() == null ? "" : config.getPrefix();
this.keyBuilder = new TMSKeyBuilder(prefix);
this.keyBuilder = new TMSKeyBuilder(prefix, layers);

String accessKey = config.getAwsAccessKey();
String secretKey = config.getAwsSecretKey();
Expand Down Expand Up @@ -341,7 +348,7 @@ private boolean tilesExist(String prefix) {

@Override
public boolean delete(String layerName) throws StorageException {
String layerPrefix = keyBuilder.forLayer(layerName);
final String layerPrefix = keyBuilder.forLayer(layerName);
final long tileCount = deleteTiles(layerPrefix);
final String metadataKey = keyBuilder.layerMetadata(layerName);
boolean layerExisted;
Expand All @@ -362,12 +369,14 @@ public boolean delete(String layerName) throws StorageException {
@Override
public boolean deleteByGridsetId(String layerName, String gridSetId) throws StorageException {
final String gridsetPrefix = keyBuilder.forGridset(layerName, gridSetId);
final boolean tilesExist = tilesExist(gridsetPrefix);

final long tileCount = deleteTiles(gridsetPrefix);
if (tileCount > 0) {
listeners.sendGridSubsetDeleted(layerName, gridSetId);
}

return tileCount > 0;
return tilesExist;
}

@Nullable
Expand Down Expand Up @@ -402,7 +411,11 @@ public boolean delete(TileObject obj) throws StorageException {

@Override
public boolean rename(String oldLayerName, String newLayerName) throws StorageException {
throw new UnsupportedOperationException("Not yet implemented");
log.debug("No need to rename layers, S3BlobStore uses layer id as key root");
if (tilesExist(oldLayerName)) {
listeners.sendLayerRenamed(oldLayerName, newLayerName);
}
return true;
}

@Override
Expand Down
Expand Up @@ -16,14 +16,15 @@
*/
package org.geowebcache.s3;

import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Preconditions.*;

import javax.annotation.Nullable;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.geowebcache.config.BlobStoreConfig;
import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.storage.BlobStore;
import org.geowebcache.storage.StorageException;

Expand Down Expand Up @@ -288,11 +289,12 @@ public String toString() {
}

@Override
public BlobStore createInstance() throws StorageException {
public BlobStore createInstance(TileLayerDispatcher layers) throws StorageException {
checkNotNull(layers);
checkState(getId() != null);
checkState(isEnabled(),
"Can't call S3BlobStoreConfig.createInstance() is blob store is not enabled");
return new S3BlobStore(this);
return new S3BlobStore(this, layers);
}

}
Expand Up @@ -20,6 +20,9 @@

import java.util.Map;

import org.geowebcache.GeoWebCacheException;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.mime.MimeException;
import org.geowebcache.mime.MimeType;
import org.geowebcache.storage.TileObject;
Expand All @@ -28,7 +31,7 @@

import com.google.common.base.Throwables;

class TMSKeyBuilder {
final class TMSKeyBuilder {

/**
* Key format, comprised of
Expand Down Expand Up @@ -57,8 +60,21 @@ class TMSKeyBuilder {

private String prefix;

public TMSKeyBuilder(final String prefix) {
private TileLayerDispatcher layers;

public TMSKeyBuilder(final String prefix, TileLayerDispatcher layers) {
this.prefix = prefix;
this.layers = layers;
}

public String layerId(String layerName) {
TileLayer layer;
try {
layer = layers.getTileLayer(layerName);
} catch (GeoWebCacheException e) {
throw Throwables.propagate(e);
}
return layer.getId();
}

public String forTile(TileObject obj) {
Expand All @@ -67,7 +83,7 @@ public String forTile(TileObject obj) {
checkNotNull(obj.getBlobFormat());
checkNotNull(obj.getXYZ());

String layer = obj.getLayerName();
String layer = layerId(obj.getLayerName());
String gridset = obj.getGridSetId();
String shortFormat;
String parametersId = obj.getParametersId();
Expand Down Expand Up @@ -99,15 +115,18 @@ public String forTile(TileObject obj) {
}

public String forLayer(final String layerName) {
return String.format(LAYER_PREFIX_FORMAT, prefix, layerName);
String layerId = layerId(layerName);
return String.format(LAYER_PREFIX_FORMAT, prefix, layerId);
}

public String forGridset(final String layerName, final String gridsetId) {
return String.format(GRIDSET_PREFIX_FORMAT, prefix, layerName, gridsetId);
String layerId = layerId(layerName);
return String.format(GRIDSET_PREFIX_FORMAT, prefix, layerId, gridsetId);
}

public String layerMetadata(final String layerName) {
return String.format(LAYER_METADATA_FORMAT, prefix, layerName);
String layerId = layerId(layerName);
return String.format(LAYER_METADATA_FORMAT, prefix, layerId);
}

/**
Expand All @@ -119,7 +138,7 @@ public String coordinatesPrefix(TileRange obj) {
checkNotNull(obj.getGridSetId());
checkNotNull(obj.getMimeType());

String layer = obj.getLayerName();
String layer = layerId(obj.getLayerName());
String gridset = obj.getGridSetId();
MimeType mimeType = obj.getMimeType();

Expand Down
Expand Up @@ -28,6 +28,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.io.File;
import java.io.IOException;
Expand All @@ -44,6 +45,8 @@
import org.geowebcache.io.ByteArrayResource;
import org.geowebcache.io.FileResource;
import org.geowebcache.io.Resource;
import org.geowebcache.layer.TileLayer;
import org.geowebcache.layer.TileLayerDispatcher;
import org.geowebcache.mime.MimeException;
import org.geowebcache.mime.MimeType;
import org.geowebcache.storage.BlobStoreListener;
Expand Down Expand Up @@ -85,10 +88,16 @@ public class S3BlobStoreIntegrationTest {
private S3BlobStore blobStore;

@Before
public void before() {
public void before() throws Exception {
Assume.assumeTrue(tempFolder.isConfigured());
S3BlobStoreConfig config = tempFolder.getConfig();
blobStore = new S3BlobStore(config);

TileLayerDispatcher layers = mock(TileLayerDispatcher.class);
TileLayer layer = mock(TileLayer.class);
when(layers.getTileLayer(eq(DEFAULT_LAYER))).thenReturn(layer);
when(layer.getName()).thenReturn(DEFAULT_LAYER);
when(layer.getId()).thenReturn(DEFAULT_LAYER);
blobStore = new S3BlobStore(config, layers);
}

@Test
Expand Down Expand Up @@ -231,12 +240,12 @@ public void testDeleteGridSubset() throws Exception {

@Test
public void testLayerMetadata() {
blobStore.putLayerMetadata("test:layer", "prop1", "value1");
blobStore.putLayerMetadata("test:layer", "prop2", "value2");
blobStore.putLayerMetadata(DEFAULT_LAYER, "prop1", "value1");
blobStore.putLayerMetadata(DEFAULT_LAYER, "prop2", "value2");

assertNull(blobStore.getLayerMetadata("test:layer", "nonExistingKey"));
assertEquals("value1", blobStore.getLayerMetadata("test:layer", "prop1"));
assertEquals("value2", blobStore.getLayerMetadata("test:layer", "prop2"));
assertNull(blobStore.getLayerMetadata(DEFAULT_LAYER, "nonExistingKey"));
assertEquals("value1", blobStore.getLayerMetadata(DEFAULT_LAYER, "prop1"));
assertEquals("value2", blobStore.getLayerMetadata(DEFAULT_LAYER, "prop2"));
}

@Test
Expand Down

0 comments on commit 34cf617

Please sign in to comment.