| /* |
| * |
| * 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.amqp_1_0.client; |
| |
| import org.apache.qpid.amqp_1_0.transport.Container; |
| import org.apache.commons.cli.*; |
| |
| import java.util.logging.*; |
| |
| public abstract class Util |
| { |
| |
| private static final Logger FRAME_LOGGER = Logger.getLogger("FRM"); |
| private static final Logger RAW_LOGGER = Logger.getLogger("RAW"); |
| private String _host; |
| private String _username; |
| private String _password; |
| private int _port; |
| private int _count; |
| private boolean _useStdIn; |
| private boolean _useTran; |
| private String[] _args; |
| private AcknowledgeMode _mode; |
| private boolean _block; |
| private int _frameSize; |
| private int _messageSize; |
| private String _responseQueue; |
| private int _batchSize; |
| private double _rollbackRatio; |
| private String _linkName; |
| private String _containerName; |
| private boolean _durableLink; |
| private boolean _useMultipleConnections; |
| private int _windowSize = 100; |
| private String _subject; |
| private String _filter; |
| private String _remoteHost; |
| private boolean _useSSL; |
| |
| protected Util(String[] args) |
| { |
| CommandLineParser cmdLineParse = new PosixParser(); |
| |
| Options options = new Options(); |
| options.addOption("h","help",false,"show this help message and exit"); |
| options.addOption(OptionBuilder.withLongOpt("host") |
| .withDescription( "host to connect to (default 0.0.0.0)" ) |
| .hasArg(true) |
| .withArgName("HOST") |
| .create('H')); |
| options.addOption(OptionBuilder.withLongOpt("username") |
| .withDescription( "username to use for authentication" ) |
| .hasArg(true) |
| .withArgName("USERNAME") |
| .create('u')); |
| options.addOption(OptionBuilder.withLongOpt("password") |
| .withDescription( "password to use for authentication" ) |
| .hasArg(true) |
| .withArgName("PASSWORD") |
| .create('w')); |
| options.addOption(OptionBuilder.withLongOpt("port") |
| .withDescription( "port to connect to (default 5672)" ) |
| .hasArg(true) |
| .withArgName("PORT") |
| .create('p')); |
| options.addOption(OptionBuilder.withLongOpt("frame-size") |
| .withDescription( "specify the maximum frame size" ) |
| .hasArg(true) |
| .withArgName("FRAME_SIZE") |
| .create('f')); |
| options.addOption(OptionBuilder.withLongOpt("container-name") |
| .withDescription( "Container name" ) |
| .hasArg(true) |
| .withArgName("CONTAINER_NAME") |
| .create('C')); |
| |
| options.addOption(OptionBuilder.withLongOpt("ssl") |
| .withDescription("Use SSL") |
| .create('S')); |
| |
| options.addOption(OptionBuilder.withLongOpt("remote-hostname") |
| .withDescription( "hostname to supply in the open frame" ) |
| .hasArg(true) |
| .withArgName("HOST") |
| .create('O')); |
| |
| if(hasBlockOption()) |
| options.addOption(OptionBuilder.withLongOpt("block") |
| .withDescription("block until messages arrive") |
| .create('b')); |
| |
| if(hasCountOption()) |
| options.addOption(OptionBuilder.withLongOpt("count") |
| .withDescription( "number of messages to send (default 1)" ) |
| .hasArg(true) |
| .withArgName("COUNT") |
| .create('c')); |
| if(hasModeOption()) |
| options.addOption(OptionBuilder.withLongOpt("acknowledge-mode") |
| .withDescription( "acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once" ) |
| .hasArg(true) |
| .withArgName("MODE") |
| .create('k')); |
| |
| if(hasSubjectOption()) |
| options.addOption(OptionBuilder.withLongOpt("subject") |
| .withDescription( "subject message property" ) |
| .hasArg(true) |
| .withArgName("SUBJECT") |
| .create('s')); |
| |
| |
| if(hasSingleLinkPerConnectionMode()) |
| options.addOption(OptionBuilder.withLongOpt("single-link-per-connection") |
| .withDescription("acknowledgement mode: AMO|ALO|EO (At Least Once, At Most Once, Exactly Once") |
| .hasArg(false) |
| .create('Z')); |
| |
| if(hasFilterOption()) |
| options.addOption(OptionBuilder.withLongOpt("filter") |
| .withDescription("filter, e.g. exact-subject=hello; matching-subject=%.a.#") |
| .hasArg(true) |
| .withArgName("<TYPE>=<VALUE>") |
| .create('F')); |
| |
| |
| if(hasTxnOption()) |
| { |
| options.addOption("x","txn",false,"use transactions"); |
| options.addOption(OptionBuilder.withLongOpt("batch-size") |
| .withDescription( "transaction batch size (default: 1)" ) |
| .hasArg(true) |
| .withArgName("BATCH-SIZE") |
| .create('B')); |
| options.addOption(OptionBuilder.withLongOpt("rollback-ratio") |
| .withDescription( "rollback ratio - must be between 0 and 1 (default: 0)" ) |
| .hasArg(true) |
| .withArgName("RATIO") |
| .create('R')); |
| } |
| |
| if(hasLinkDurableOption()) |
| { |
| options.addOption("d","durable-link",false,"use a durable link"); |
| } |
| |
| if(hasStdInOption()) |
| options.addOption("i","stdin",false,"read messages from stdin (one message per line)"); |
| |
| options.addOption(OptionBuilder.withLongOpt("trace") |
| .withDescription("trace logging specified categories: RAW, FRM") |
| .hasArg(true) |
| .withArgName("TRACE") |
| .create('t')); |
| if(hasSizeOption()) |
| options.addOption(OptionBuilder.withLongOpt("message-size") |
| .withDescription( "size to pad outgoing messages to" ) |
| .hasArg(true) |
| .withArgName("SIZE") |
| .create('z')); |
| |
| if(hasResponseQueueOption()) |
| options.addOption(OptionBuilder.withLongOpt("response-queue") |
| .withDescription( "response queue to reply to" ) |
| .hasArg(true) |
| .withArgName("RESPONSE_QUEUE") |
| .create('r')); |
| |
| if(hasLinkNameOption()) |
| { |
| options.addOption(OptionBuilder.withLongOpt("link") |
| .withDescription( "link name" ) |
| .hasArg(true) |
| .withArgName("LINK") |
| .create('l')); |
| } |
| |
| if(hasWindowSizeOption()) |
| { |
| options.addOption(OptionBuilder.withLongOpt("window-size") |
| .withDescription("credit window size") |
| .hasArg(true) |
| .withArgName("WINDOW-SIZE") |
| .create('W')); |
| } |
| |
| CommandLine cmdLine = null; |
| try |
| { |
| cmdLine = cmdLineParse.parse(options, args); |
| |
| } |
| catch (ParseException e) |
| { |
| printUsage(options); |
| System.exit(-1); |
| } |
| |
| if(cmdLine.hasOption('h') || cmdLine.getArgList().isEmpty()) |
| { |
| printUsage(options); |
| System.exit(0); |
| } |
| _host = cmdLine.getOptionValue('H',"0.0.0.0"); |
| _remoteHost = cmdLine.getOptionValue('O',null); |
| String portStr = cmdLine.getOptionValue('p',"5672"); |
| String countStr = cmdLine.getOptionValue('c',"1"); |
| |
| _useSSL = cmdLine.hasOption('S'); |
| |
| if(hasWindowSizeOption()) |
| { |
| String windowSizeStr = cmdLine.getOptionValue('W',"100"); |
| _windowSize = Integer.parseInt(windowSizeStr); |
| } |
| |
| if(hasSubjectOption()) |
| { |
| _subject = cmdLine.getOptionValue('s'); |
| } |
| |
| if(cmdLine.hasOption('u')) |
| { |
| _username = cmdLine.getOptionValue('u'); |
| } |
| |
| if(cmdLine.hasOption('w')) |
| { |
| _password = cmdLine.getOptionValue('w'); |
| } |
| |
| if(cmdLine.hasOption('F')) |
| { |
| _filter = cmdLine.getOptionValue('F'); |
| } |
| |
| _port = Integer.parseInt(portStr); |
| |
| _containerName = cmdLine.getOptionValue('C'); |
| |
| if(hasBlockOption()) |
| _block = cmdLine.hasOption('b'); |
| |
| if(hasLinkNameOption()) |
| _linkName = cmdLine.getOptionValue('l'); |
| |
| |
| if(hasLinkDurableOption()) |
| _durableLink = cmdLine.hasOption('d'); |
| |
| if(hasCountOption()) |
| _count = Integer.parseInt(countStr); |
| |
| if(hasStdInOption()) |
| _useStdIn = cmdLine.hasOption('i'); |
| |
| if(hasSingleLinkPerConnectionMode()) |
| _useMultipleConnections = cmdLine.hasOption('Z'); |
| |
| if(hasTxnOption()) |
| { |
| _useTran = cmdLine.hasOption('x'); |
| _batchSize = Integer.parseInt(cmdLine.getOptionValue('B',"1")); |
| _rollbackRatio = Double.parseDouble(cmdLine.getOptionValue('R',"0")); |
| } |
| |
| if(hasModeOption()) |
| { |
| _mode = AcknowledgeMode.ALO; |
| |
| if(cmdLine.hasOption('k')) |
| { |
| _mode = AcknowledgeMode.valueOf(cmdLine.getOptionValue('k')); |
| } |
| } |
| |
| if(hasResponseQueueOption()) |
| { |
| _responseQueue = cmdLine.getOptionValue('r'); |
| } |
| |
| _frameSize = Integer.parseInt(cmdLine.getOptionValue('f',"65536")); |
| |
| if(hasSizeOption()) |
| { |
| _messageSize = Integer.parseInt(cmdLine.getOptionValue('z',"-1")); |
| } |
| |
| String categoriesList = cmdLine.getOptionValue('t'); |
| String[]categories = categoriesList == null ? new String[0] : categoriesList.split("[, ]"); |
| for(String cat : categories) |
| { |
| if(cat.equalsIgnoreCase("FRM")) |
| { |
| FRAME_LOGGER.setLevel(Level.FINE); |
| Formatter formatter = new Formatter() |
| { |
| @Override |
| public String format(final LogRecord record) |
| { |
| return "[" + record.getMillis() + " FRM]\t" + record.getMessage() + "\n"; |
| } |
| }; |
| for(Handler handler : FRAME_LOGGER.getHandlers()) |
| { |
| FRAME_LOGGER.removeHandler(handler); |
| } |
| Handler handler = new ConsoleHandler(); |
| handler.setLevel(Level.FINE); |
| handler.setFormatter(formatter); |
| FRAME_LOGGER.addHandler(handler); |
| } |
| else if (cat.equalsIgnoreCase("RAW")) |
| { |
| RAW_LOGGER.setLevel(Level.FINE); |
| Formatter formatter = new Formatter() |
| { |
| @Override |
| public String format(final LogRecord record) |
| { |
| return "[" + record.getMillis() + " RAW]\t" + record.getMessage() + "\n"; |
| } |
| }; |
| for(Handler handler : RAW_LOGGER.getHandlers()) |
| { |
| RAW_LOGGER.removeHandler(handler); |
| } |
| Handler handler = new ConsoleHandler(); |
| handler.setLevel(Level.FINE); |
| handler.setFormatter(formatter); |
| RAW_LOGGER.addHandler(handler); |
| } |
| } |
| |
| |
| _args = cmdLine.getArgs(); |
| |
| } |
| |
| protected boolean hasFilterOption() |
| { |
| return false; |
| } |
| |
| protected boolean hasSubjectOption() |
| { |
| return false; |
| } |
| |
| protected boolean hasWindowSizeOption() |
| { |
| return false; |
| } |
| |
| protected boolean hasSingleLinkPerConnectionMode() |
| { |
| return false; |
| } |
| |
| protected abstract boolean hasLinkDurableOption(); |
| |
| protected abstract boolean hasLinkNameOption(); |
| |
| protected abstract boolean hasResponseQueueOption(); |
| |
| protected abstract boolean hasSizeOption(); |
| |
| protected abstract boolean hasBlockOption(); |
| |
| protected abstract boolean hasStdInOption(); |
| |
| protected abstract boolean hasTxnOption(); |
| |
| protected abstract boolean hasModeOption(); |
| |
| protected abstract boolean hasCountOption(); |
| |
| public String getHost() |
| { |
| return _host; |
| } |
| |
| public String getUsername() |
| { |
| return _username; |
| } |
| |
| public String getPassword() |
| { |
| return _password; |
| } |
| |
| public int getPort() |
| { |
| return _port; |
| } |
| |
| public int getCount() |
| { |
| return _count; |
| } |
| |
| public boolean useStdIn() |
| { |
| return _useStdIn; |
| } |
| |
| public boolean useTran() |
| { |
| return _useTran; |
| } |
| |
| public AcknowledgeMode getMode() |
| { |
| return _mode; |
| } |
| |
| public boolean isBlock() |
| { |
| return _block; |
| } |
| |
| public String[] getArgs() |
| { |
| return _args; |
| } |
| |
| public int getMessageSize() |
| { |
| return _messageSize; |
| } |
| |
| public String getResponseQueue() |
| { |
| return _responseQueue; |
| } |
| |
| public int getBatchSize() |
| { |
| return _batchSize; |
| } |
| |
| public double getRollbackRatio() |
| { |
| return _rollbackRatio; |
| } |
| |
| public String getLinkName() |
| { |
| return _linkName; |
| } |
| |
| public boolean isDurableLink() |
| { |
| return _durableLink; |
| } |
| |
| public boolean isUseMultipleConnections() |
| { |
| return _useMultipleConnections; |
| } |
| |
| public void setUseMultipleConnections(boolean useMultipleConnections) |
| { |
| _useMultipleConnections = useMultipleConnections; |
| } |
| |
| public String getSubject() |
| { |
| return _subject; |
| } |
| |
| public void setSubject(String subject) |
| { |
| _subject = subject; |
| } |
| |
| protected abstract void printUsage(final Options options); |
| |
| protected abstract void run(); |
| |
| |
| public Connection newConnection() throws Connection.ConnectionException |
| { |
| Container container = getContainerName() == null ? new Container() : new Container(getContainerName()); |
| return getUsername() == null ? new Connection(getHost(), getPort(), null, null, _frameSize, container, |
| _remoteHost == null ? getHost() : _remoteHost, _useSSL) |
| : new Connection(getHost(), getPort(), getUsername(), getPassword(), _frameSize, |
| container, _remoteHost == null ? getHost() : _remoteHost, _useSSL); |
| } |
| |
| public String getContainerName() |
| { |
| return _containerName; |
| } |
| |
| public int getWindowSize() |
| { |
| return _windowSize; |
| } |
| |
| public void setWindowSize(int windowSize) |
| { |
| _windowSize = windowSize; |
| } |
| |
| public String getFilter() |
| { |
| return _filter; |
| } |
| } |