Skip to content

Commit

Permalink
Get blob writer from service instance, not static factory, so that ti…
Browse files Browse the repository at this point in the history
…meouts are passed through
  • Loading branch information
Chris Tavares committed Dec 11, 2012
1 parent 192deaa commit 82602ca
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 71 deletions.
Expand Up @@ -19,6 +19,7 @@

import com.microsoft.windowsazure.services.core.FilterableService;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityContract;
import com.microsoft.windowsazure.services.media.models.LocatorInfo;

/**
* Contract for interacting with the back end of Media Services
Expand All @@ -28,4 +29,13 @@ public interface MediaContract extends FilterableService<MediaContract>, EntityC

URI getRestServiceUri();

/**
* Creates an instance of the <code>WritableBlobContainerContract</code> API that will
* write to the blob container given by the provided locator.
*
* @param locator
* locator specifying where to upload to
* @return the implementation of <code>WritableBlobContainerContract</code>
*/
WritableBlobContainerContract createBlobWriter(LocatorInfo locator);
}
Expand Up @@ -14,13 +14,7 @@
*/
package com.microsoft.windowsazure.services.media;

import java.net.URI;

import com.microsoft.windowsazure.services.core.Configuration;
import com.microsoft.windowsazure.services.media.implementation.MediaBlobContainerWriter;
import com.microsoft.windowsazure.services.media.models.LocatorInfo;
import com.microsoft.windowsazure.services.media.models.LocatorType;
import com.sun.jersey.api.client.Client;

/**
*
Expand Down Expand Up @@ -70,55 +64,4 @@ public static MediaContract create(String profile) {
public static MediaContract create(String profile, Configuration config) {
return config.create(profile, MediaContract.class);
}

/**
* Creates an instance of the <code>WritableBlobContainerContract</code> API that will
* write to the blob container given by the provided locator.
*
* @param locator
* locator specifying where to upload to
* @return the implementation of <code>WritableBlobContainerContract</code>
*/
public static WritableBlobContainerContract createBlobWriter(LocatorInfo locator) {
if (locator.getLocatorType() != LocatorType.SAS) {
throw new IllegalArgumentException("Can only write to SAS locators");
}

LocatorParser p = new LocatorParser(locator);

return new MediaBlobContainerWriter(createUploaderClient(), p.getAccountName(), p.getStorageUri(),
p.getContainer(), p.getSASToken());
}

/**
* Helper class to encapsulate pulling information out of the locator.
*/
private static class LocatorParser {
URI locatorPath;

LocatorParser(LocatorInfo locator) {
locatorPath = URI.create(locator.getPath());
}

String getAccountName() {
return locatorPath.getHost().split("\\.")[0];
}

String getStorageUri() {
return locatorPath.getScheme() + "://" + locatorPath.getAuthority();
}

String getContainer() {
return locatorPath.getPath().substring(1);
}

String getSASToken() {
return locatorPath.getRawQuery();
}
}

private static Client createUploaderClient() {
Client client = Client.create();
return client;
}
}
Expand Up @@ -26,13 +26,15 @@
import com.microsoft.windowsazure.services.core.ServiceFilter;
import com.microsoft.windowsazure.services.core.utils.ServiceExceptionFactory;
import com.microsoft.windowsazure.services.media.MediaContract;
import com.microsoft.windowsazure.services.media.WritableBlobContainerContract;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityActionOperation;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityCreationOperation;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityDeleteOperation;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityGetOperation;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityListOperation;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityUpdateOperation;
import com.microsoft.windowsazure.services.media.models.ListResult;
import com.microsoft.windowsazure.services.media.models.LocatorInfo;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.UniformInterfaceException;

Expand Down Expand Up @@ -196,4 +198,12 @@ public URI getRestServiceUri() {
return service.getRestServiceUri();
}

/* (non-Javadoc)
* @see com.microsoft.windowsazure.services.media.MediaContract#createBlobWriter(com.microsoft.windowsazure.services.media.models.LocatorInfo)
*/
@Override
public WritableBlobContainerContract createBlobWriter(LocatorInfo locator) {
return service.createBlobWriter(locator);
}

}
Expand Up @@ -24,9 +24,15 @@
import org.apache.commons.logging.LogFactory;

import com.microsoft.windowsazure.services.core.ServiceFilter;
import com.microsoft.windowsazure.services.core.utils.pipeline.TimeoutSettings;
import com.microsoft.windowsazure.services.media.MediaContract;
import com.microsoft.windowsazure.services.media.WritableBlobContainerContract;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityRestProxy;
import com.microsoft.windowsazure.services.media.models.LocatorInfo;
import com.microsoft.windowsazure.services.media.models.LocatorType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

/**
* The Class MediaRestProxy.
Expand All @@ -38,6 +44,8 @@ public class MediaRestProxy extends EntityRestProxy implements MediaContract {
/** The redirect filter. */
private RedirectFilter redirectFilter;

private final TimeoutSettings timeoutSettings;

/**
* Instantiates a new media rest proxy.
*
Expand All @@ -49,12 +57,16 @@ public class MediaRestProxy extends EntityRestProxy implements MediaContract {
* the redirect filter
* @param versionHeadersFilter
* the version headers filter
* @param timeoutSettings
* Currently configured HTTP client timeouts
*
*/
@Inject
public MediaRestProxy(Client channel, OAuthFilter authFilter, RedirectFilter redirectFilter,
VersionHeadersFilter versionHeadersFilter) {
VersionHeadersFilter versionHeadersFilter, TimeoutSettings timeoutSettings) {
super(channel, new ServiceFilter[0]);

this.timeoutSettings = timeoutSettings;
this.redirectFilter = redirectFilter;
channel.addFilter(redirectFilter);
channel.addFilter(authFilter);
Expand All @@ -68,9 +80,12 @@ public MediaRestProxy(Client channel, OAuthFilter authFilter, RedirectFilter red
* the channel
* @param filters
* the filters
* @param timeoutSettings
* currently configured HTTP client timeouts
*/
private MediaRestProxy(Client channel, ServiceFilter[] filters) {
private MediaRestProxy(Client channel, ServiceFilter[] filters, TimeoutSettings timeoutSettings) {
super(channel, filters);
this.timeoutSettings = timeoutSettings;
}

/* (non-Javadoc)
Expand All @@ -81,7 +96,7 @@ public MediaContract withFilter(ServiceFilter filter) {
ServiceFilter[] filters = getFilters();
ServiceFilter[] newFilters = Arrays.copyOf(filters, filters.length + 1);
newFilters[filters.length] = filter;
return new MediaRestProxy(getChannel(), newFilters);
return new MediaRestProxy(getChannel(), newFilters, timeoutSettings);
}

/* (non-Javadoc)
Expand All @@ -91,4 +106,53 @@ public MediaContract withFilter(ServiceFilter filter) {
public URI getRestServiceUri() {
return this.redirectFilter.getBaseURI();
}
}

/* (non-Javadoc)
* @see com.microsoft.windowsazure.services.media.MediaContract#createBlobWriter(com.microsoft.windowsazure.services.media.models.LocatorInfo)
*/
@Override
public WritableBlobContainerContract createBlobWriter(LocatorInfo locator) {
if (locator.getLocatorType() != LocatorType.SAS) {
throw new IllegalArgumentException("Can only write to SAS locators");
}

LocatorParser p = new LocatorParser(locator);

return new MediaBlobContainerWriter(createUploaderClient(), p.getAccountName(), p.getStorageUri(),
p.getContainer(), p.getSASToken());
}

/**
* Helper class to encapsulate pulling information out of the locator.
*/
private static class LocatorParser {
URI locatorPath;

LocatorParser(LocatorInfo locator) {
locatorPath = URI.create(locator.getPath());
}

String getAccountName() {
return locatorPath.getHost().split("\\.")[0];
}

String getStorageUri() {
return locatorPath.getScheme() + "://" + locatorPath.getAuthority();
}

String getContainer() {
return locatorPath.getPath().substring(1);
}

String getSASToken() {
return locatorPath.getRawQuery();
}
}

private Client createUploaderClient() {
ClientConfig clientConfig = new DefaultClientConfig();
timeoutSettings.applyTimeout(clientConfig);
Client client = Client.create(clientConfig);
return client;
}
}
Expand Up @@ -62,7 +62,7 @@ public static void setup() throws Exception {
public void canCreateFileForUploadedBlob() throws Exception {
AssetInfo asset = createTestAsset("createFileForUploadedBlob");
LocatorInfo locator = createLocator(writePolicy, asset, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);

createAndUploadBlob(blobWriter, BLOB_NAME, firstPrimes);

Expand All @@ -79,7 +79,7 @@ public void canCreateFileForUploadedBlob() throws Exception {
public void canCreateFileEntityDirectly() throws Exception {
AssetInfo asset = createTestAsset("createFileEntityDirectly");
LocatorInfo locator = createLocator(writePolicy, asset, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);

createAndUploadBlob(blobWriter, BLOB_NAME_2, firstPrimes);

Expand All @@ -104,7 +104,7 @@ public void canCreateAssetWithMultipleFiles() throws Exception {
AccessPolicyInfo policy = createWritePolicy("createWithMultipleFiles", 10);
LocatorInfo locator = createLocator(policy, asset, 5, 10);

WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);

createAndUploadBlob(blobWriter, "blob1.bin", firstPrimes);
createAndUploadBlob(blobWriter, "blob2.bin", onesAndZeros);
Expand Down Expand Up @@ -141,7 +141,7 @@ public void canCreateFileAndThenUpdateIt() throws Exception {
AssetInfo asset = createTestAsset("createAndUpdate");
AccessPolicyInfo policy = createWritePolicy("createAndUpdate", 10);
LocatorInfo locator = createLocator(policy, asset, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);

createAndUploadBlob(blobWriter, "toUpdate.bin", firstPrimes);

Expand All @@ -159,7 +159,7 @@ public void canDeleteFileFromAsset() throws Exception {
AssetInfo asset = createTestAsset("deleteFile");
AccessPolicyInfo policy = createWritePolicy("deleteFile", 10);
LocatorInfo locator = createLocator(policy, asset, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);

createAndUploadBlob(blobWriter, "todelete.bin", firstPrimes);
createAndUploadBlob(blobWriter, "tokeep.bin", onesAndZeros);
Expand Down
Expand Up @@ -72,7 +72,7 @@ private String createFileAsset(String name) throws ServiceException {
AssetInfo assetInfo = service.create(Asset.create().setName(name));
AccessPolicyInfo accessPolicyInfo = createWritableAccessPolicy(name, 10);
LocatorInfo locator = createLocator(accessPolicyInfo, assetInfo, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);
createAndUploadBlob(blobWriter, testBlobName, testBlobData);

service.create(AssetFile.create(assetInfo.getId(), testBlobName).setIsPrimary(true).setIsEncrypted(false)
Expand Down Expand Up @@ -124,7 +124,7 @@ public void createJobSuccess() throws Exception {

AccessPolicyInfo accessPolicyInfo = createWritableAccessPolicy("createJobSuccess", 10);
LocatorInfo locator = createLocator(accessPolicyInfo, assetInfo, 5, 10);
WritableBlobContainerContract blobWriter = MediaService.createBlobWriter(locator);
WritableBlobContainerContract blobWriter = service.createBlobWriter(locator);
createAndUploadBlob(blobWriter, "blob1.bin", testBlobData);

service.create(AssetFile.create(assetInfo.getId(), "blob1.bin").setIsPrimary(true).setIsEncrypted(false)
Expand Down
Expand Up @@ -54,7 +54,7 @@ public static void setup() throws Exception {

LocatorInfo locator = createLocator(policy, asset, 5, 10);

blobWriter = MediaService.createBlobWriter(locator);
blobWriter = service.createBlobWriter(locator);

ExponentialRetryPolicy retryPolicy = new ExponentialRetryPolicy(5000, 5, new int[] { 400, 404 });
blobWriter = blobWriter.withFilter(new RetryPolicyFilter(retryPolicy));
Expand Down
Expand Up @@ -30,7 +30,6 @@
import com.microsoft.windowsazure.services.core.ServiceException;
import com.microsoft.windowsazure.services.core.storage.utils.Base64;
import com.microsoft.windowsazure.services.media.MediaContract;
import com.microsoft.windowsazure.services.media.MediaService;
import com.microsoft.windowsazure.services.media.WritableBlobContainerContract;
import com.microsoft.windowsazure.services.media.implementation.content.AssetFileType;
import com.microsoft.windowsazure.services.media.implementation.entities.EntityListOperation;
Expand Down Expand Up @@ -138,7 +137,8 @@ public void uploadFilesToAsset(AssetInfo asset, int uploadWindowInMinutes, Hasht
AccessPolicyInfo accessPolicy = service.create(AccessPolicy.create(accessPolicyPrefix + "tempAccessPolicy",
uploadWindowInMinutes, EnumSet.of(AccessPolicyPermission.WRITE)));
LocatorInfo locator = service.create(Locator.create(accessPolicy.getId(), asset.getId(), LocatorType.SAS));
WritableBlobContainerContract uploader = MediaService.createBlobWriter(locator);

WritableBlobContainerContract uploader = service.createBlobWriter(locator);

Hashtable<String, AssetFileInfo> infoToUpload = new Hashtable<String, AssetFileInfo>();

Expand Down

0 comments on commit 82602ca

Please sign in to comment.