org.xmlsh.aws.util.AWSCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.xmlsh.aws.util.AWSCommand.java

Source

/**
 * $Id: $
 * $Date: $
 *
 */

package org.xmlsh.aws.util;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import net.sf.saxon.s9api.SaxonApiException;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.xmlsh.core.CoreException;
import org.xmlsh.core.InvalidArgumentException;
import org.xmlsh.core.Options;
import org.xmlsh.core.Options.OptionValue;
import org.xmlsh.core.UnexpectedException;
import org.xmlsh.core.UnknownOption;
import org.xmlsh.core.XCommand;
import org.xmlsh.core.XValue;
import org.xmlsh.core.io.OutputPort;
import org.xmlsh.sh.shell.SerializeOpts;
import org.xmlsh.util.Util;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.AmazonWebServiceClient;
import com.amazonaws.AmazonWebServiceRequest;
import com.amazonaws.services.ec2.model.DryRunResult;
import com.amazonaws.services.ec2.model.DryRunSupportedRequest;

public abstract class AWSCommand<T extends AmazonWebServiceClient> extends XCommand {

    private AWSClient<T> mAmazon;

    Logger mLogger = LogManager.getLogger();

    protected XMLStreamWriter mWriter;
    private OutputPort mResultOut;

    public static final String sCOMMON_OPTS = "dry-run,region:,endpoint:,client:,config:,accessKey:,secretKey:,rate-retry:,retry-delay:";
    protected int rateRetry = 0;
    protected int retryDelay = 10000; // 10 seconds default

    private boolean bSetEndpoint = false;
    protected boolean bMayDryRun = false;

    protected void setEndpointSet(boolean v) {
        this.bSetEndpoint = v;
    }

    public AWSCommand() {
        super();
    }

    public List<OptionValue> parseOptions(Options options, List<XValue> args)
            throws UnknownOption, InvalidArgumentException, UnexpectedException {
        List<OptionValue> opts = options.parse(args).getOpts();
        parseCommonOptions(options);
        return opts;
    }

    protected Options getOptions() {
        return new Options(getCommonOpts(), SerializeOpts.getOptionDefs());
    }

    protected String getCommonOpts() {
        return sCOMMON_OPTS;
    }

    protected Options getOptions(String... sopts) {
        return new Options(Options.joinOptions(getCommonOpts(), Options.joinOptions(sopts)),
                SerializeOpts.getOptionDefs());
    }

    protected void closeWriter() throws XMLStreamException, IOException, CoreException, SaxonApiException {
        if (mWriter != null) {
            try {
                mWriter.flush();
                mWriter.close();

            } finally {
                mWriter = null;
            }
        }
        if (mResultOut != null) {
            try {
                mResultOut.writeSequenceTerminator(getSerializeOpts());
            } finally {
                mResultOut = null;
            }
        }
    }

    protected void endDocument() throws XMLStreamException {
        mWriter.writeEndDocument();
    }

    protected void endElement() throws XMLStreamException {
        mWriter.writeEndElement();
    }

    protected void startElement(String localname) throws XMLStreamException {
        mWriter.writeStartElement(localname);
    }

    protected void startDocument() throws XMLStreamException {
        mWriter.writeStartDocument();
    }

    protected void attribute(String localName, String value) throws XMLStreamException {
        mWriter.writeAttribute(localName, Util.notNull(value));
    }

    protected void attribute(String localname, Boolean value) throws XMLStreamException {
        attribute(localname, value == null ? false : value.booleanValue());
    }

    protected void characters(String value) throws XMLStreamException {
        if (value != null)
            mWriter.writeCharacters(value);
    }

    public void attribute(String localName, boolean flag) throws XMLStreamException {
        attribute(localName, flag ? "true" : "false");

    }

    protected void writeZones(List<String> zones) throws XMLStreamException {

        writeStringList("zones", "zone", "name", zones);

    }

    protected void attribute(String name, Integer value) throws XMLStreamException {
        attribute(name, value == null ? "" : String.valueOf(value));
    }

    protected void attribute(String name, int value) throws XMLStreamException {
        attribute(name, String.valueOf(value));
    }

    protected void attribute(String name, Date date) throws XMLStreamException {
        attribute(name, date == null ? "" : Util.formatXSDateTime(date));

    }

    protected void writeStringList(String listName, String elementName, String attrName, List<String> strings)
            throws XMLStreamException {
        if (listName != null)
            startElement(listName);
        for (String string : strings) {

            writeElementAttribute(elementName, attrName, string);
        }
        if (listName != null)
            endElement();

    }

    public void writeElementAttribute(String elementName, String attrName, String string)
            throws XMLStreamException {
        startElement(elementName);
        attribute(attrName, string);
        endElement();
    }

    protected void attribute(String name, long n) throws XMLStreamException {
        attribute(name, String.valueOf(n));

    }

    /*
    protected void setEndpointXX(Options opts) throws InvalidArgumentException {
        
       if( opts.hasOpt("endpoint") ){
     setEndpoint(opts.getOptStringRequired("endpoint"));
     bSetEndpoint = true ;
       }
        
        
    }
    protected boolean hasSetEndpoint() {
        return bSetEndpoint;
        
    }
        
    protected void setRegionXX(Options opts) {
        if( hasSetEndpoint() )
       return ;
        
        if( opts.hasOpt("region"))
      setRegion(opts.getOptString("region",Regions.DEFAULT_REGION.getName()) );
        else {
      String region = mShell.getEnv().getVarString("AWS_REGION");
      if( Util.isBlank(region))
         region = mShell.getEnv().getVarString("EC2_REGION");  // ec2 command line compatibility
      if( !Util.isBlank(region))
         setRegion(region);
        }
        
    }*/

    protected void emptyDocument() throws XMLStreamException {
        startDocument();
        startElement(getName());
        endElement();
        endDocument();
    }

    protected void textElement(String name, String s) throws XMLStreamException {
        startElement(name);
        characters(s);
        endElement();
    }

    protected void traceCall(String method) {
        T obj = getAWSClient();
        mLogger.info("AWS Method Call: " + obj.getClass().toString() + "." + method);
    }

    protected void parseCommonOptions(Options opts) {

        rateRetry = opts.getOptInt("rate-retry", 0);
        retryDelay = opts.getOptInt("retry-delay", 10000);
        bMayDryRun = opts.hasOpt("dry-run");
    }

    protected XValue xpath(XValue xv, String expr) throws UnexpectedException {
        return xv.xpath(getShell(), expr);

    }

    protected int handleException(AmazonClientException e) {
        mLogger.error("AWS Exception in " + getName(), e);
        mShell.printErr("AWS Exception in " + getName(), e);
        return -1;
    }

    protected int handleException(AmazonServiceException e)
            throws InvalidArgumentException, XMLStreamException, SaxonApiException, CoreException, IOException {
        startResult();
        startElement("service-exception");
        attribute("error-code", e.getErrorCode());
        attribute("error-message", e.getErrorMessage());
        attribute("service-name", e.getServiceName());
        attribute("request-id", e.getRequestId());
        attribute("status-code", e.getStatusCode());
        endElement();
        endResult();
        return e.getStatusCode();
    }

    protected T getAWSClient() {
        return mAmazon.getClient();
    }

    protected void setAmazon(AWSClient<T> a) {
        mAmazon = a;
    }

    protected AWSClient<T> getClient() {
        return mAmazon;
    }

    protected boolean startResult()
            throws InvalidArgumentException, XMLStreamException, SaxonApiException, CoreException, IOException {
        if (mWriter != null) {
            mLogger.warn(getName() + ": AWS startResult previously called for this request");
            return false;
        }
        if (mResultOut != null) {
            mLogger.warn(getName() + ": AWS startResult with result port open - closing");
        }
        mResultOut = this.getStdout();

        mWriter = mResultOut.asXMLStreamWriter(getSerializeOpts());
        startDocument();
        startElement(getName());
        return true;
    }

    protected void endResult() throws XMLStreamException, IOException, CoreException, SaxonApiException {
        if (mWriter == null)
            return;
        endElement();
        endDocument();
        closeWriter();

    }

}

//
//
// Copyright (C) 2008-2014    David A. Lee.
//
// The contents of this file are subject to the "Simplified BSD License" (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.opensource.org/licenses/bsd-license.php
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied.
// See the License for the specific language governing rights and limitations
// under the License.
//
// The Original Code is: all this file.
//
// The Initial Developer of the Original Code is David A. Lee
//
// Portions created by (your name) are Copyright (C) (your legal entity). All
// Rights Reserved.
//
// Contributor(s): none.
//