blob: 315250be6df62cf3a8d34de9c0c85f4b7f511e20 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.qpid.example;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jms.Connection;
import org.apache.qpid.client.AMQConnection;
public class OptionParser
{
static final Option BROKER = new Option("b",
"broker",
"connect to specified broker",
"USER:PASS@HOST:PORT",
"guest:guest@localhost:5672",
String.class);
static final Option HELP = new Option("h",
"help",
"show this help message and exit",
null,
null,
Boolean.class);
static final Option TIMEOUT = new Option("t",
"timeout",
"timeout in seconds to wait before exiting",
"TIMEOUT",
"0",
Integer.class);
static final Option CON_OPTIONS = new Option(null,
"con-option",
"JMS Connection URL options. Ex sync_ack=true sync_publish=all ",
"NAME=VALUE",
null,
String.class);
static final Option BROKER_OPTIONS = new Option(null,
"broker-option",
"JMS Broker URL options. Ex ssl=true sasl_mechs=GSSAPI ",
"NAME=VALUE",
null,
String.class);
private Map<String,Object> optMap = new HashMap<String,Object>();
private static final List<Option> optDefs = new ArrayList<Option>();
private static final String CLIENTID = "test";
private String usage;
private String desc;
private String address;
public OptionParser(String[] args, String usage, String desc)
{
this.usage = usage;
this.desc = desc;
if (args.length == 0 ||
(args.length == 1 && (args[0].equals("-h") || args[0].equals("--help"))))
{
printHelp();
}
address = args[args.length -1];
String[] ops = new String[args.length -1];
System.arraycopy(args, 0, ops, 0, ops.length);
parseOpts(ops);
System.out.println(optMap);
if (isHelp())
{
printHelp();
}
}
public boolean isHelp()
{
return optMap.containsKey("h") || optMap.containsKey("help");
}
public void printHelp()
{
System.out.println(String.format("%s%n",usage));
System.out.println(String.format("%s%n",desc));
System.out.println(String.format("%s%n","Options:"));
for (Option op : optDefs)
{
String valueLabel = op.getValueLabel() != null ? "=" + op.getValueLabel() : "";
String shortForm = op.getShortForm() != null ? "-" + op.getShortForm() + valueLabel : "";
String longForm = op.getLongForm() != null ? "--" + op.getLongForm() + valueLabel : "";
String desc = op.getDesc();
String defaultValue = op.getDefaultValue() != null ?
" (default " + op.getDefaultValue() + ")" : "";
if (!shortForm.equals(""))
{
longForm = shortForm + ", " + longForm;
}
System.out.println(
String.format("%-54s%s%s", longForm,desc,defaultValue));
}
System.exit(0);
}
private void parseOpts(String[] args)
{
String prevOpt = null;
for(String op: args)
{
// covers both -h and --help formats
if (op.startsWith("-"))
{
String key = op.substring(op.startsWith("--")? 2:1 ,
(op.indexOf('=') > 0) ?
op.indexOf('='):
op.length());
boolean match = false;
for (Option option: optDefs)
{
if ((op.startsWith("-") && option.getShortForm() != null && option.getShortForm().equals(key)) ||
(op.startsWith("--") && option.getLongForm() != null && option.getLongForm().equals(key)) )
{
match = true;
break;
}
}
if (!match)
{
System.out.println(op + " is not a valid option");
System.exit(0);
}
if (op.indexOf('=') > 0)
{
String val = extractValue(op.substring(op.indexOf('=')+1));
if (optMap.containsKey(key))
{
optMap.put(key, optMap.get(key) + "," + val);
}
else
{
optMap.put(key, val);
}
}
else
{
if (! optMap.containsKey(key)){ optMap.put(key, ""); }
prevOpt = key;
}
}
else if (prevOpt != null) // this is to catch broker localhost:5672 instead broker=localhost:5672
{
String val = extractValue(op);
if (optMap.containsKey(prevOpt) && !optMap.get(prevOpt).toString().equals(""))
{
optMap.put(prevOpt, optMap.get(prevOpt) + "," + val);
}
else
{
optMap.put(prevOpt, val);
}
prevOpt = null;
}
else
{
System.out.println(optMap);
throw new IllegalArgumentException(op + " is not a valid option");
}
}
}
private String extractValue(String op)
{
if (op.startsWith("'"))
{
if (!op.endsWith("'"))
{
throw new IllegalArgumentException(" The option " + op + " needs to be inside quotes");
}
return op.substring(1,op.length() -1);
}
else
{
return op;
}
}
protected boolean containsOp(Option op)
{
return optMap.containsKey(op.getShortForm()) || optMap.containsKey(op.getLongForm());
}
protected String getOp(Option op)
{
if (optMap.containsKey(op.getShortForm()))
{
return (String)optMap.get(op.getShortForm());
}
else if (optMap.containsKey(op.getLongForm()))
{
return (String)optMap.get(op.getLongForm());
}
else
{
return op.getDefaultValue();
}
}
protected Connection createConnection() throws Exception
{
StringBuffer buf;
buf = new StringBuffer();
buf.append("amqp://");
String userPass = "guest:guest";
String broker = "localhost:5672";
if(containsOp(BROKER))
{
try
{
String b = getOp(BROKER);
userPass = b.substring(0,b.indexOf('@'));
broker = b.substring(b.indexOf('@')+1);
}
catch (StringIndexOutOfBoundsException e)
{
Exception ex = new Exception("Error parsing broker string " + getOp(BROKER));
ex.initCause(e);
throw ex;
}
}
if(containsOp(BROKER_OPTIONS))
{
String bOps = getOp(BROKER_OPTIONS);
bOps = bOps.replaceAll(",", "'&");
bOps = bOps.replaceAll("=", "='");
broker = broker + "?" + bOps + "'";
}
buf.append(userPass);
buf.append("@");
buf.append(CLIENTID);
buf.append("/?brokerlist='tcp://");
buf.append(broker).append("'");
if(containsOp(CON_OPTIONS))
{
String bOps = getOp(CON_OPTIONS);
bOps = bOps.replaceAll(",", "'&");
bOps = bOps.replaceAll("=", "='");
buf.append("&").append(bOps).append("'");
}
Connection con = new AMQConnection(buf.toString());
return con;
}
public static void addOption(Option opt)
{
optDefs.add(opt);
}
protected String getAddress()
{
return address;
}
static class Option
{
private final String shortForm;
private final String longForm;
private final String desc;
private final String valueLabel;
private final String defaultValue;
private final Class type;
public Option(String shortForm, String longForm, String desc,
String valueLabel, String defaultValue, Class type)
{
this.shortForm = shortForm;
this.longForm = longForm;
this.defaultValue = defaultValue;
this.type = type;
this.desc = desc;
this.valueLabel = valueLabel;
}
public String getShortForm()
{
return shortForm;
}
public String getLongForm()
{
return longForm;
}
public String getDefaultValue()
{
return defaultValue;
}
public Class getType()
{
return type;
}
public String getDesc()
{
return desc;
}
public String getValueLabel()
{
return valueLabel;
}
}
}