blob: 87b9d2c24e4cf51f4a4a89f542af18ec40dd6e2d [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.web.bindery.requestfactory.vm.impl;
import com.google.gwt.dev.asm.Type;
import com.google.gwt.dev.asm.commons.Method;
import com.google.gwt.dev.util.StringKey;
import com.google.gwt.user.server.Base64Utils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Utility class for encoding RequestFactory operation ids.
*/
public class OperationKey extends StringKey {
/**
* The expected length of values returned from {@link #hash(String)}.
*/
public static final int HASH_LENGTH = 28;
static {
assert HASH_LENGTH == hash("").length();
}
/**
* Compute a base64-encoded SHA1 hash of the input string's UTF8
* representation. The result is a {@value #HASH_LENGTH}-character sequence.
*/
public static String hash(String raw) {
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
byte[] data = md.digest(raw.getBytes("UTF-8"));
return Base64Utils.toBase64(data);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("No MD5 algorithm", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("No UTF-8", e);
}
}
private static String key(String requestContextBinaryName, String methodName, String descriptor) {
Method m = new Method(methodName, Type.VOID_TYPE, Type.getArgumentTypes(descriptor));
String raw = requestContextBinaryName + "::" + methodName + m.getDescriptor();
return raw.length() >= HASH_LENGTH ? hash(raw) : raw;
}
public OperationKey(String encoded) {
super(encoded);
assert encoded.length() == HASH_LENGTH : "Expecting only " + HASH_LENGTH
+ " characters, received " + encoded.length();
}
public OperationKey(String requestContextBinaryName, String methodName, String descriptor) {
super(key(requestContextBinaryName, methodName, descriptor));
}
}