Skip to content

Commit

Permalink
Issue javaswift#23 - Refactored container/website creation to make su…
Browse files Browse the repository at this point in the history
…re Account can return Websites too
  • Loading branch information
robert-bor committed May 3, 2013
1 parent 1b44491 commit 9c7d549
Show file tree
Hide file tree
Showing 11 changed files with 146 additions and 42 deletions.
30 changes: 16 additions & 14 deletions src/main/java/org/javaswift/joss/client/core/AbstractAccount.java
Expand Up @@ -9,6 +9,7 @@
import org.javaswift.joss.model.Account;
import org.javaswift.joss.model.Container;
import org.javaswift.joss.model.PaginationMap;
import org.javaswift.joss.model.Website;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -23,16 +24,19 @@ public abstract class AbstractAccount extends AbstractObjectStoreEntity<AccountI

private boolean allowReauthenticate = true;

private boolean allowContainerCaching = true;

private int numberOfCalls = 0;

private final AccountCommandFactory commandFactory;

private final ContainerCache containerCache = new ContainerCache();
private final ContainerCache<Container> containerCache;

private final ContainerCache<Website> websiteCache;

public AbstractAccount(AccountCommandFactory commandFactory, boolean allowCaching) {
public AbstractAccount(AccountCommandFactory commandFactory, ContainerFactory<Container> containerFactory,
ContainerFactory<Website> websiteFactory, boolean allowCaching) {
super(allowCaching);
this.containerCache = new ContainerCache<Container>(this, containerFactory);
this.websiteCache = new ContainerCache<Website>(this, websiteFactory);
this.commandFactory = commandFactory;
this.info = new AccountInformation();
}
Expand Down Expand Up @@ -83,18 +87,15 @@ public AbstractAccount setAllowReauthenticate(boolean allowReauthenticate) {

public AbstractAccount setAllowContainerCaching(boolean allowContainerCaching) {
LOG.info("JOSS / Allow Container caching: "+allowContainerCaching);
this.allowContainerCaching = allowContainerCaching;
this.containerCache.setCacheEnabled(allowContainerCaching);
this.websiteCache.setCacheEnabled(allowContainerCaching);
return this;
}

public boolean isAllowReauthenticate() {
return this.allowReauthenticate;
}

public boolean isAllowContainerCaching() {
return this.allowContainerCaching;
}

public int getCount() {
checkForInfo();
return info.getContainerCount();
Expand Down Expand Up @@ -159,13 +160,14 @@ public String getPathForEntity() throws UnsupportedEncodingException {
return "";
}

protected abstract Container createContainer(String containerName);

@Override
public Container getContainer(String containerName) {
return isAllowContainerCaching() ?
this.containerCache.getContainer(this, containerName) :
createContainer(containerName);
return this.containerCache.getContainer(containerName);
}

@Override
public Website getWebsite(String containerName) {
return this.websiteCache.getContainer(containerName);
}

@Override
Expand Down
29 changes: 24 additions & 5 deletions src/main/java/org/javaswift/joss/client/core/ContainerCache.java
Expand Up @@ -5,14 +5,29 @@
import java.util.Map;
import java.util.TreeMap;

public class ContainerCache {
public class ContainerCache<N extends Container> {

public Map<String, Container> cache = new TreeMap<String, Container>();
private Map<String, N> cache = new TreeMap<String, N>();

public Container getContainer(AbstractAccount account, String containerName) {
Container container = cache.get(containerName);
private final AbstractAccount account;

private final ContainerFactory<N> containerFactory;

private boolean cacheEnabled;

public ContainerCache(AbstractAccount account, ContainerFactory<N> containerFactory) {
this.account = account;
this.containerFactory = containerFactory;
this.cacheEnabled = true;
}

public N getContainer(String containerName) {
if (!cacheEnabled) {
return containerFactory.create(account, containerName);
}
N container = cache.get(containerName);
if (container == null) {
container = account.createContainer(containerName);
container = containerFactory.create(account, containerName);
cache.put(containerName, container);
}
return container;
Expand All @@ -26,4 +41,8 @@ public int size() {
return this.cache.size();
}

public void setCacheEnabled(boolean cacheEnabled) {
this.cacheEnabled = cacheEnabled;
}

}
@@ -0,0 +1,9 @@
package org.javaswift.joss.client.core;

import org.javaswift.joss.model.Container;

public interface ContainerFactory<N extends Container> {

public N create(AbstractAccount account, String containerName);

}
13 changes: 6 additions & 7 deletions src/main/java/org/javaswift/joss/client/impl/AccountImpl.java
Expand Up @@ -5,17 +5,16 @@
import org.javaswift.joss.command.impl.factory.AccountCommandFactoryImpl;
import org.javaswift.joss.command.shared.identity.AuthenticationCommand;
import org.javaswift.joss.command.shared.identity.access.AccessImpl;
import org.javaswift.joss.model.Container;

public class AccountImpl extends AbstractAccount {

public AccountImpl(AuthenticationCommand command, HttpClient httpClient, AccessImpl access, boolean allowCaching) {
super(new AccountCommandFactoryImpl(httpClient, access, command), allowCaching);
}

@Override
public Container createContainer(String containerName) {
return new ContainerImpl(this, containerName, isAllowCaching());
super(
new AccountCommandFactoryImpl(httpClient, access, command),
new ContainerFactoryImpl(),
new WebsiteFactoryImpl(),
allowCaching
);
}

}
@@ -0,0 +1,14 @@
package org.javaswift.joss.client.impl;

import org.javaswift.joss.client.core.AbstractAccount;
import org.javaswift.joss.client.core.ContainerFactory;
import org.javaswift.joss.model.Container;

public class ContainerFactoryImpl implements ContainerFactory<Container> {

@Override
public Container create(AbstractAccount account, String containerName) {
return new ContainerImpl((AccountImpl)account, containerName, account.isAllowCaching());
}

}
@@ -0,0 +1,14 @@
package org.javaswift.joss.client.impl;

import org.javaswift.joss.client.core.AbstractAccount;
import org.javaswift.joss.client.core.ContainerFactory;
import org.javaswift.joss.model.Website;

public class WebsiteFactoryImpl implements ContainerFactory<Website> {

@Override
public Website create(AbstractAccount account, String containerName) {
return new WebsiteImpl((AccountImpl)account, containerName, account.isAllowCaching());
}

}
13 changes: 6 additions & 7 deletions src/main/java/org/javaswift/joss/client/mock/AccountMock.java
Expand Up @@ -2,22 +2,21 @@

import org.javaswift.joss.client.core.AbstractAccount;
import org.javaswift.joss.command.mock.factory.AccountCommandFactoryMock;
import org.javaswift.joss.model.Container;
import org.javaswift.joss.swift.Swift;

public class AccountMock extends AbstractAccount {

public AccountMock(Swift swift) {
super(new AccountCommandFactoryMock(swift), ALLOW_CACHING);
super(
new AccountCommandFactoryMock(swift),
new ContainerFactoryMock(),
new WebsiteFactoryMock(),
ALLOW_CACHING
);
}

public AccountMock() {
this(new Swift());
}

@Override
public Container createContainer(String name) {
return new ContainerMock(this, name);
}

}
@@ -0,0 +1,14 @@
package org.javaswift.joss.client.mock;

import org.javaswift.joss.client.core.AbstractAccount;
import org.javaswift.joss.client.core.ContainerFactory;
import org.javaswift.joss.model.Container;

public class ContainerFactoryMock implements ContainerFactory<Container> {

@Override
public Container create(AbstractAccount account, String containerName) {
return new ContainerMock((AccountMock)account, containerName);
}

}
@@ -0,0 +1,14 @@
package org.javaswift.joss.client.mock;

import org.javaswift.joss.client.core.AbstractAccount;
import org.javaswift.joss.client.core.ContainerFactory;
import org.javaswift.joss.model.Website;

public class WebsiteFactoryMock implements ContainerFactory<Website> {

@Override
public Website create(AbstractAccount account, String containerName) {
return new WebsiteMock((AccountMock)account, containerName);
}

}
8 changes: 8 additions & 0 deletions src/main/java/org/javaswift/joss/model/Account.java
Expand Up @@ -19,6 +19,14 @@ public interface Account extends ObjectStoreEntity, ListHolder<Container> {
*/
public Container getContainer(String name);

/**
* Returns a handle for a website. Note that this method DOES NOT create a website in the Object Store
* or otherwise place a call to the Object Store
* @param name name of the website to create a handle for
* @return the website handle
*/
public Website getWebsite(String name);

/**
* Trigger the authentication against Object Store. There are two use cases for this method. The first is
* triggered pro-actively by the user by calling authenticate on the client. The second is when the token
Expand Down
@@ -1,30 +1,42 @@
package org.javaswift.joss.client.core;

import org.javaswift.joss.client.mock.ClientMock;
import org.javaswift.joss.client.mock.ContainerFactoryMock;
import org.javaswift.joss.model.Container;
import org.junit.Test;

import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotSame;

public class ContainerCacheTest {

@Test
public void getContainerWithCacheEnabled() {
AbstractAccount account = new ClientMock()
.authenticate(null, null, null, null)
.setAllowContainerCaching(true);
ContainerCache cache = new ContainerCache();
cache.getContainer(account, "alpha");
cache.getContainer(account, "alpha");
.authenticate(null, null, null, null);
ContainerCache cache = new ContainerCache<Container>(account, new ContainerFactoryMock());
cache.getContainer("alpha");
cache.getContainer("alpha");
assertEquals(1, cache.size());
}

@Test
public void getContainerWithCacheDisabled() {
AbstractAccount account = new ClientMock()
.authenticate(null, null, null, null);
ContainerCache cache = new ContainerCache<Container>(account, new ContainerFactoryMock());
cache.setCacheEnabled(false);
Container container1 = cache.getContainer("alpha");
Container container2 = cache.getContainer("alpha");
assertNotSame(container1, container2);
}

@Test
public void reset() {
AbstractAccount account = new ClientMock()
.authenticate(null, null, null, null)
.setAllowContainerCaching(true);
ContainerCache cache = new ContainerCache();
cache.getContainer(account, "alpha");
.authenticate(null, null, null, null);
ContainerCache cache = new ContainerCache<Container>(account, new ContainerFactoryMock());
cache.getContainer("alpha");
account.getContainer("alpha");
assertEquals(1, cache.size());
cache.reset();
Expand Down

0 comments on commit 9c7d549

Please sign in to comment.