package eu.europeana.cloud.service.mcs.persistent.swift;
import java.util.NoSuchElementException;
import javax.annotation.PreDestroy;
import org.jclouds.ContextBuilder;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* Manage connection for Openstack Swift using jClouds library.
*/
@Component
public class SimpleSwiftConnectionProvider implements SwiftConnectionProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(SimpleSwiftConnectionProvider.class);
private BlobStoreContext context;
private final String container;
private BlobStore blobStore;
private final String provider;
private final String endpoint;
private final String user;
private final String password;
/**
* Class constructor. Establish connection to Openstack Swift endpoint using
* provided configuration.
*
* @param provider
* provider name. Pass "transient" if you want to use in-memory
* implementation for tests, and "swift" for accessing live
* Openstack Swift.
* @param container
* name of the Swift container (namespace)
* @param endpoint
* Swift endpoint URL
* @param user
* user identity
* @param password
* user password
*/
public SimpleSwiftConnectionProvider(String provider, String container, String endpoint, String user,
String password) {
this.container = container;
this.provider = provider;
this.endpoint = endpoint;
this.user = user;
this.password = password;
openConnections();
}
private void openConnections()
throws NoSuchElementException {
context = ContextBuilder.newBuilder(provider).endpoint(endpoint).credentials(user, password)
.buildView(BlobStoreContext.class);
blobStore = context.getBlobStore();
if (!blobStore.containerExists(container)) {
blobStore.createContainerInLocation(null, container);
}
LOGGER.info("Connected to swift.");
}
@Override
public void reconnectConnections() {
closeConnections();
openConnections();
}
@Override
@PreDestroy
public void closeConnections() {
LOGGER.info("Shutting down swift connection");
context.close();
}
@Override
public String getContainer() {
return container;
}
@Override
public BlobStore getBlobStore() {
return blobStore;
}
}