package pi.mapping.azureblob;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.sap.aii.mapping.api.AbstractTransformation;
import com.sap.aii.mapping.api.DynamicConfiguration;
import com.sap.aii.mapping.api.DynamicConfigurationKey;
import com.sap.aii.mapping.api.StreamTransformationException;
import com.sap.aii.mapping.api.TransformationInput;
import com.sap.aii.mapping.api.TransformationOutput;
public class AzureBlobConnect extends AbstractTransformation {
public String length = "";
public AzureBlobConnect() {
}
public void transform(TransformationInput input, TransformationOutput output) throws StreamTransformationException {
try {
InputStream in = input.getInputPayload().getInputStream();
OutputStream out = output.getOutputPayload().getOutputStream();
// Get parameters defined in the ICo
String blobtype = input.getInputParameters().getString("Blobtype");
String version = input.getInputParameters().getString("Version");
String storageKey = input.getInputParameters().getString("AccessKey");
String account = input.getInputParameters().getString("AzureAccountName");
String container = input.getInputParameters().getString("AzureContainer");
String filename = input.getInputParameters().getString("FileName");
String contentType = input.getInputParameters().getString("ContentType");
String addTimeStamp = input.getInputParameters().getString("AddTimeStamp");
String timeStampPattern = input.getInputParameters().getString("TimeStampPattern");
// Construct Current time in specific format required to be used for REST API call as header
String pattern = "E, dd MMM yyyy HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String timenow = simpleDateFormat.format(new Date()) + " GMT";
// Construct file name
if (addTimeStamp.equalsIgnoreCase("y")) {
SimpleDateFormat simpleDateFormatTimeStamp = new SimpleDateFormat(timeStampPattern);
if (filename.contains(".")) {
int indexofdot = 0;
indexofdot = filename.indexOf('.');
filename = filename.substring(0, indexofdot) + "_" + simpleDateFormatTimeStamp.format(new Date())
+ "." + filename.substring(indexofdot + 1, filename.length());
} else
filename = filename + "_" + simpleDateFormatTimeStamp.format(new Date());
}
String len = execute(in, out);
// Construct StringToSign to be used to create Hash
String StringToSign = "PUT\n\n\n" + len + "\n\n" + contentType + "\n\n\n\n\n\n\nx-ms-blob-type:" + blobtype
+ "\nx-ms-date:" + timenow + "\nx-ms-version:" + version + "\n/" + account + "/" + container + "/"
+ filename;
byte[] secretKey = Base64.getMimeDecoder().decode(storageKey.getBytes());
byte[] digest = null;
//Construct digest from StringToSign using HmacSHA256 algorithm
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256");
mac.init(secretKeySpec);
digest = mac.doFinal(StringToSign.getBytes());
} catch (InvalidKeyException e) {
throw new RuntimeException("Invalid key exception while converting to HMac SHA256");
}
//Encode digest to Base64
String auth = Base64.getMimeEncoder().encodeToString(digest);
//Create Dynamic configuration headers
DynamicConfiguration conf = input.getDynamicConfiguration();
DynamicConfigurationKey key1 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName1");
DynamicConfigurationKey key2 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName2");
DynamicConfigurationKey key3 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName3");
DynamicConfigurationKey key4 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName4");
DynamicConfigurationKey key5 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName5");
DynamicConfigurationKey key6 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName6");
DynamicConfigurationKey key7 = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST",
"XHeaderName7");
//Put values in header parameters
conf.put(key1, blobtype);
conf.put(key2, version);
conf.put(key3, timenow);
conf.put(key4, "SharedKey " + account + ":" + auth);
conf.put(key5, len);
conf.put(key6, contentType);
conf.put(key7, filename);
} catch (Exception e) {
throw new StreamTransformationException(e.getMessage());
}
}
public String execute(InputStream in, OutputStream out) throws Exception {
byte[] content = new byte[16384];
ByteArrayOutputStream byt = new ByteArrayOutputStream();
int i = 0;
while ((i = in.read(content, 0, content.length)) != -1) {
byt.write(content, 0, i);
}
byt.flush();
content = byt.toByteArray();
// String str = new String(content);
length = Integer.toString(byt.size());
out.write(content);
return length;
}
}



You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
| User | Count |
|---|---|
| 27 | |
| 24 | |
| 20 | |
| 19 | |
| 13 | |
| 13 | |
| 12 | |
| 12 | |
| 11 | |
| 10 |