package org.springframework.data.simpledb.core.domain; import java.util.HashSet; import java.util.List; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.simpledb.exception.SimpleDbExceptionTranslator; import org.springframework.util.Assert; import com.amazonaws.AmazonClientException; import com.amazonaws.services.simpledb.AmazonSimpleDB; import com.amazonaws.services.simpledb.model.CreateDomainRequest; import com.amazonaws.services.simpledb.model.DeleteDomainRequest; import com.amazonaws.services.simpledb.model.ListDomainsRequest; import com.amazonaws.services.simpledb.model.ListDomainsResult; public final class DomainManager { private static final Logger LOGGER = LoggerFactory.getLogger(DomainManager.class); private final Set<String> managedDomains = new HashSet<String>(); /** * Creates a domain, based on the Domain Policy; The default is UPDATE(if it does not exist create it) * * @return true if the domain was successfuly managed, false if the domain has been managed before */ public synchronized boolean manageDomain(final String domainName, final DomainManagementPolicy policy, final AmazonSimpleDB sdb) { Assert.notNull(sdb); if(! managedDomains.contains(domainName)) { try { if(policy == DomainManagementPolicy.UPDATE || policy == null) { createDomain(domainName, sdb); } else if(policy == DomainManagementPolicy.DROP_CREATE) { dropDomain(domainName, sdb); createDomain(domainName, sdb); } managedDomains.add(domainName); return true; } catch(AmazonClientException e) { throw SimpleDbExceptionTranslator.getTranslatorInstance().translateAmazonClientException(e); } } else { LOGGER.debug("Domain has been managed before: {}", domainName); } return false; } /** * Running the delete-domain command over & over again on the same domain, or if the domain does NOT exist will NOT * result in a Amazon Exception * * @param domainName */ protected void dropDomain(final String domainName, final AmazonSimpleDB sdb) { try { LOGGER.debug("Dropping domain: {}", domainName); DeleteDomainRequest request = new DeleteDomainRequest(domainName); sdb.deleteDomain(request); LOGGER.debug("Dropped domain: {}", domainName); } catch(AmazonClientException amazonException) { throw SimpleDbExceptionTranslator.getTranslatorInstance().translateAmazonClientException(amazonException); } } protected void createDomain(final String domainName, final AmazonSimpleDB sdb) { try { LOGGER.debug("Creating domain: {}", domainName); CreateDomainRequest request = new CreateDomainRequest(domainName); sdb.createDomain(request); LOGGER.debug("Created domain: {}", domainName); } catch(AmazonClientException amazonException) { throw SimpleDbExceptionTranslator.getTranslatorInstance().translateAmazonClientException(amazonException); } } protected boolean exists(final String domainName, final AmazonSimpleDB sdb) { try { ListDomainsResult listDomainsResult = sdb.listDomains(new ListDomainsRequest()); List<String> domainNames = listDomainsResult.getDomainNames(); String nextToken = listDomainsResult.getNextToken(); while (nextToken != null && !nextToken.isEmpty()) { listDomainsResult = sdb.listDomains(new ListDomainsRequest().withNextToken(nextToken)); domainNames.addAll(listDomainsResult.getDomainNames()); nextToken = listDomainsResult.getNextToken(); } return domainNames.contains(domainName); } catch(AmazonClientException amazonException) { throw SimpleDbExceptionTranslator.getTranslatorInstance().translateAmazonClientException(amazonException); } } }