/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.jdr.commands;
import java.util.Map;
import java.util.HashMap;
import java.util.LinkedList;
import org.jboss.dmr.ModelNode;
/**
* <p>
* Command to call the AS 7 management system and store the output in a file.
*</p>
* <p>
* This class' methods are meant to be chained together to describe a management call. For example:
*</p>
* <pre>
* new CallAS7("my_file").resource("foo", "bar").operation("read-resource")
*</pre>
*
* <p>
* will return a configured CallAS7 instance that will, when executed call {@code read-resource}
* on the {@code /foo=bar/} resource, and store the output in a file called {@code my_file.json}.
* </p>
*/
public class CallAS7 extends JdrCommand {
private String operation = "read-resource";
private LinkedList<String> resource = new LinkedList<String>();
private Map<String, String> parameters = new HashMap<String, String>();
private String name;
/**
* constructs an instance and sets the resulting file name
*
* @param name of the file to write results to
*/
public CallAS7(String name) {
this.name = name + ".json";
}
/**
* sets the operation to call
*
* @param operation to call, defaults to {@code read-resource}
* @return this
*/
public CallAS7 operation(String operation) {
this.operation = operation;
return this;
}
/**
* adds a key/value parameter pair to the call
*
* @param key
* @param val
* @return this
*/
public CallAS7 param(String key, String val) {
this.parameters.put(key, val);
return this;
}
/**
* appends resource parts to the resource to call
* <p></p>
* If you want to call /foo=bar/baz=boo/, do this:
* <pre>
* .resource("foo", "bar", "baz", "boo")
* </pre>
*
* @param parts to call
* @return this
*/
public CallAS7 resource(String... parts) {
for(String part : parts ) {
this.resource.add(part);
}
return this;
}
@Override
public void execute() throws Exception {
ModelNode request = new ModelNode();
request.get("operation").set(this.operation);
assert this.resource.size() % 2 == 0;
while (this.resource.size() > 0) {
request.get("address").add(this.resource.removeFirst(),
this.resource.removeFirst());
}
for (Map.Entry<String, String> entry : parameters.entrySet()) {
request.get(entry.getKey()).set(entry.getValue());
}
if (this.env.getHostControllerName() != null) {
request.get("host").set(this.env.getHostControllerName());
}
if (this.env.getServerName() != null) {
request.get("server").set(this.env.getServerName());
}
this.env.getZip().add(this.env.getClient().execute(request).toJSONString(true), this.name);
}
}