一、前言
关于atmos(1.8.1)的包中基于javax.inject.Singleton注释的方式分别对org.jclouds.atmos.filters.SignRequest、org.jclouds.atmos.filters.ShareUrl以@Singleton的方式注入单例对象,具体源码示例参考如下
二、源码说明
1.ShareUrl类(@Singleton注入其单例对象)
package org.jclouds.atmos.filters;@b@@b@import com.google.common.base.Function;@b@import com.google.common.base.Supplier;@b@import com.google.common.base.Throwables;@b@import com.google.common.collect.ImmutableMap;@b@import com.google.common.io.BaseEncoding;@b@import com.google.common.io.ByteProcessor;@b@import com.google.common.io.ByteStreams;@b@import java.io.IOException;@b@import java.net.URI;@b@import java.security.InvalidKeyException;@b@import javax.annotation.Resource;@b@import javax.inject.Inject;@b@import javax.inject.Named;@b@import javax.inject.Singleton;@b@import org.jclouds.crypto.Crypto;@b@import org.jclouds.crypto.Macs;@b@import org.jclouds.date.TimeStamp;@b@import org.jclouds.domain.Credentials;@b@import org.jclouds.http.HttpException;@b@import org.jclouds.http.Uris;@b@import org.jclouds.http.Uris.UriBuilder;@b@import org.jclouds.logging.Logger;@b@import org.jclouds.util.Strings2;@b@@b@@Singleton@b@public class ShareUrl@b@ implements Function<String, URI>@b@{@b@ private final Supplier<Credentials> creds;@b@ private final Supplier<URI> provider;@b@ private final javax.inject.Provider<Long> timeStampProvider;@b@ private final Crypto crypto;@b@@b@ @Resource@b@ Logger logger = Logger.NULL;@b@@b@ @Resource@b@ @Named("jclouds.signature")@b@ Logger signatureLog = Logger.NULL;@b@@b@ @Inject@b@ public ShareUrl(@org.jclouds.location.Provider Supplier<Credentials> creds, @org.jclouds.location.Provider Supplier<URI> provider, @TimeStamp javax.inject.Provider<Long> timeStampProvider, Crypto crypto)@b@ {@b@ this.creds = creds;@b@ this.provider = provider;@b@ this.timeStampProvider = timeStampProvider;@b@ this.crypto = crypto;@b@ }@b@@b@ public URI apply(String path) throws HttpException@b@ {@b@ String requestedResource = "/rest/namespace/" + path;@b@ String expires = ((Long)this.timeStampProvider.get()).toString();@b@ String signature = signString(createStringToSign(requestedResource, expires));@b@ return Uris.uriBuilder((URI)this.provider.get()).replaceQuery(ImmutableMap.of("uid", ((Credentials)this.creds.get()).identity, "expires", expires, "signature", signature)).appendPath(requestedResource).build();@b@ }@b@@b@ public String createStringToSign(String requestedResource, String expires)@b@ {@b@ StringBuilder toSign = new StringBuilder();@b@ toSign.append("GET\n");@b@ toSign.append(requestedResource.toLowerCase()).append("\n");@b@ toSign.append(((Credentials)this.creds.get()).identity).append("\n");@b@ toSign.append(expires);@b@ return toSign.toString(); }@b@@b@ public String signString(String toSign) {@b@ ByteProcessor hmacSHA1;@b@ try {@b@ hmacSHA1 = Macs.asByteProcessor(this.crypto.hmacSHA1(BaseEncoding.base64().decode(((Credentials)this.creds.get()).credential)));@b@ return BaseEncoding.base64().encode((byte[])ByteStreams.readBytes(Strings2.toInputStream(toSign), hmacSHA1));@b@ } catch (InvalidKeyException e) {@b@ throw Throwables.propagate(e);@b@ } catch (IOException e) {@b@ throw Throwables.propagate(e);@b@ }@b@ }@b@}
2.SignRequest类也同样以@Singleton方式注入单例对象
package org.jclouds.atmos.filters;@b@@b@import com.google.common.annotations.VisibleForTesting;@b@import com.google.common.base.Strings;@b@import com.google.common.base.Supplier;@b@import com.google.common.collect.ImmutableMap;@b@import com.google.common.collect.ImmutableMap.Builder;@b@import com.google.common.collect.Multimap;@b@import com.google.common.collect.Multimaps;@b@import com.google.common.collect.Sets;@b@import com.google.common.io.BaseEncoding;@b@import com.google.common.io.ByteProcessor;@b@import com.google.common.io.ByteStreams;@b@import java.net.URI;@b@import java.util.Set;@b@import java.util.regex.Matcher;@b@import java.util.regex.Pattern;@b@import javax.annotation.Resource;@b@import javax.inject.Inject;@b@import javax.inject.Named;@b@import javax.inject.Singleton;@b@import org.jclouds.crypto.Crypto;@b@import org.jclouds.crypto.Macs;@b@import org.jclouds.date.TimeStamp;@b@import org.jclouds.domain.Credentials;@b@import org.jclouds.http.HttpException;@b@import org.jclouds.http.HttpRequest;@b@import org.jclouds.http.HttpRequest.Builder;@b@import org.jclouds.http.HttpRequestFilter;@b@import org.jclouds.http.HttpUtils;@b@import org.jclouds.http.internal.SignatureWire;@b@import org.jclouds.io.MutableContentMetadata;@b@import org.jclouds.io.Payload;@b@import org.jclouds.logging.Logger;@b@import org.jclouds.util.Patterns;@b@import org.jclouds.util.Strings2;@b@@b@@Singleton@b@public class SignRequest@b@ implements HttpRequestFilter@b@{@b@ private final SignatureWire signatureWire;@b@ private final Supplier<Credentials> creds;@b@ private final javax.inject.Provider<String> timeStampProvider;@b@ private final Crypto crypto;@b@ private final HttpUtils utils;@b@@b@ @Resource@b@ Logger logger = Logger.NULL;@b@@b@ @Resource@b@ @Named("jclouds.signature")@b@ Logger signatureLog = Logger.NULL;@b@@b@ @Inject@b@ public SignRequest(SignatureWire signatureWire, @org.jclouds.location.Provider Supplier<Credentials> creds, @TimeStamp javax.inject.Provider<String> timeStampProvider, Crypto crypto, HttpUtils utils)@b@ {@b@ this.signatureWire = signatureWire;@b@ this.creds = creds;@b@ this.timeStampProvider = timeStampProvider;@b@ this.crypto = crypto;@b@ this.utils = utils;@b@ }@b@@b@ public HttpRequest filter(HttpRequest request) throws HttpException@b@ {@b@ ImmutableMap.Builder builder = ImmutableMap.builder();@b@ builder.put("x-emc-uid", ((Credentials)this.creds.get()).identity);@b@ String date = (String)this.timeStampProvider.get();@b@ builder.put("Date", date);@b@ if (request.getHeaders().containsKey("x-emc-date"))@b@ builder.put("x-emc-date", date);@b@ request = ((HttpRequest.Builder)request.toBuilder().replaceHeaders(Multimaps.forMap(builder.build()))).build();@b@ String signature = calculateSignature(createStringToSign(request));@b@ request = ((HttpRequest.Builder)request.toBuilder().replaceHeader("x-emc-signature", new String[] { signature })).build();@b@ this.utils.logRequest(this.signatureLog, request, "<<");@b@ return request;@b@ }@b@@b@ public String createStringToSign(HttpRequest request) {@b@ this.utils.logRequest(this.signatureLog, request, ">>");@b@ StringBuilder buffer = new StringBuilder();@b@@b@ appendMethod(request, buffer);@b@ appendPayloadMetadata(request, buffer);@b@ appendHttpHeaders(request, buffer);@b@ appendCanonicalizedResource(request, buffer);@b@ appendCanonicalizedHeaders(request, buffer);@b@ if (this.signatureWire.enabled())@b@ this.signatureWire.output(buffer.toString());@b@ return buffer.toString();@b@ }@b@@b@ private String calculateSignature(String toSign) {@b@ String signature = signString(toSign);@b@ if (this.signatureWire.enabled())@b@ this.signatureWire.input(Strings2.toInputStream(signature));@b@ return signature; }@b@@b@ public String signString(String toSign) {@b@ ByteProcessor hmacSHA1;@b@ try {@b@ hmacSHA1 = Macs.asByteProcessor(this.crypto.hmacSHA1(BaseEncoding.base64().decode(((Credentials)this.creds.get()).credential)));@b@ return BaseEncoding.base64().encode((byte[])ByteStreams.readBytes(Strings2.toInputStream(toSign), hmacSHA1));@b@ } catch (Exception e) {@b@ throw new HttpException("error signing request", e);@b@ }@b@ }@b@@b@ private void appendMethod(HttpRequest request, StringBuilder toSign) {@b@ toSign.append(request.getMethod()).append("\n");@b@ }@b@@b@ private void appendCanonicalizedHeaders(HttpRequest request, StringBuilder toSign)@b@ {@b@ Set headers = Sets.newTreeSet(request.getHeaders().keySet());@b@ for (String header : headers)@b@ if ((header.startsWith("x-emc-")) && (!(header.equals("x-emc-signature"))))@b@ {@b@ toSign.append(header.toLowerCase()).append(":");@b@@b@ for (String value : request.getHeaders().get(header)) {@b@ value = value.replace(" ", " ");@b@ value = Patterns.NEWLINE_PATTERN.matcher(value).replaceAll("");@b@ toSign.append(value).append(' ');@b@ }@b@ toSign.deleteCharAt(toSign.lastIndexOf(" "));@b@@b@ toSign.append("\n");@b@ }@b@@b@@b@ if (toSign.charAt(toSign.length() - 1) == '\n')@b@ toSign.deleteCharAt(toSign.length() - 1);@b@ }@b@@b@ private void appendPayloadMetadata(HttpRequest request, StringBuilder buffer) {@b@ buffer.append(Strings.nullToEmpty((request.getPayload() == null) ? null : request.getPayload().getContentMetadata().getContentType())).append("\n");@b@ }@b@@b@ @VisibleForTesting@b@ void appendHttpHeaders(HttpRequest request, StringBuilder toSign)@b@ {@b@ toSign.append(HttpUtils.nullToEmpty(request.getHeaders().get("Range")).toLowerCase()).append("\n");@b@@b@ toSign.append(request.getFirstHeaderOrNull("Date")).append("\n");@b@ }@b@@b@ @VisibleForTesting@b@ void appendCanonicalizedResource(HttpRequest request, StringBuilder toSign)@b@ {@b@ toSign.append(request.getEndpoint().getRawPath().toLowerCase()).append("\n");@b@ }@b@}