/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.iwave.ext.windows.winrm;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.text.StrSubstitutor;
import com.google.common.collect.Maps;
import com.iwave.ext.xml.XmlStringBuilder;
public class WinRMRequest {
private static final int DEFAULT_TIMEOUT_SECONDS = 300;
private static final String REQUEST_TEMPLATE = readRequestTemplate();
private static final String URL = "url";
private static final String RESOURCE_URI = "resourceUri";
private static final String ACTION_URI = "actionUri";
private static final String MESSAGE_ID = "messageId";
private static final String SELECTOR_SET = "selectorSet";
private static final String OPTION_SET = "optionSet";
private static final String TIMEOUT_SECONDS = "timeoutSeconds";
private static final String BODY = "body";
private Map<String, String> parameters = Maps.newHashMap();
private StrSubstitutor substitutor = new StrSubstitutor(parameters);
public WinRMRequest() {
setBody("");
setSelectorSet("");
setOptionSet("");
setTimeoutSeconds(DEFAULT_TIMEOUT_SECONDS);
setMessageId(UUID.randomUUID().toString());
}
public void setUrl(String url) {
setParameter(URL, url);
}
public void setResourceUri(String resourceUri) {
setParameter(RESOURCE_URI, resourceUri);
}
public void setActionUri(String actionUri) {
setParameter(ACTION_URI, actionUri);
}
public void setMessageId(String messageId) {
setParameter(MESSAGE_ID, messageId);
}
public void setTimeoutSeconds(int timeoutSeconds) {
setParameter(TIMEOUT_SECONDS, "" + timeoutSeconds);
}
public void setSelectorSet(String selectorSet) {
setParameter(SELECTOR_SET, selectorSet);
}
public void setSelector(String name, String value) {
Map<String, String> selectorSet = Maps.newHashMap();
selectorSet.put(name, value);
setSelectorSet(selectorSet);
}
public void setSelectorSet(Map<String, String> selectorSet) {
XmlStringBuilder sb = new XmlStringBuilder();
if (selectorSet.size() > 0) {
sb.start("w:SelectorSet");
for (Map.Entry<String, String> selector : selectorSet.entrySet()) {
sb.start("w:Selector").attr("Name", selector.getKey());
if (selector.getValue() != null) {
sb.text(selector.getValue());
}
else {
sb.attr("xsi:nil", "true");
}
sb.end();
}
sb.end();
}
setSelectorSet(sb.toString());
}
public void setOptionSet(String optionSet) {
setParameter(OPTION_SET, optionSet);
}
public void setOptionSet(Map<String, String> optionSet) {
XmlStringBuilder sb = new XmlStringBuilder();
if (optionSet.size() > 0) {
sb.start("w:OptionSet");
for (Map.Entry<String, String> option : optionSet.entrySet()) {
sb.start("w:Option").attr("Name", option.getKey());
if (option.getValue() != null) {
sb.text(option.getValue());
}
else {
sb.attr("xsi:nil", "true");
}
sb.end();
}
sb.end();
}
setOptionSet(sb.toString());
}
public void setBody(String body) {
setParameter(BODY, body);
}
public void setParameter(String name, String value) {
parameters.put(name, value);
}
public String evaluate(String value) {
return substitutor.replace(value);
}
public String getContent() {
return evaluate(REQUEST_TEMPLATE);
}
/**
* Reads the WinRM request template.
*
* @return the WinRM request template.
*/
private static String readRequestTemplate() {
InputStream in = WinRMRequest.class.getResourceAsStream("WinRMRequest.xml");
try {
return IOUtils.toString(in, "UTF-8");
} catch (IOException e) {
throw new Error(e);
}
}
}