More checkstyle fixes

git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@564977 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Hiram R. Chirino 2007-08-11 21:29:21 +00:00
parent 933eb2f9e4
commit 5f1adbe898
317 changed files with 1658 additions and 1732 deletions

View File

@ -1,4 +1,4 @@
/* /**
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -16,16 +16,17 @@
*/ */
package org.apache.activemq.console; package org.apache.activemq.console;
import org.apache.activemq.broker.util.CommandHandler; import java.io.ByteArrayOutputStream;
import org.apache.activemq.console.command.ShellCommand; import java.util.ArrayList;
import org.apache.activemq.console.formatter.GlobalWriter; import java.util.List;
import org.apache.activemq.console.formatter.CommandShellOutputFormatter; import java.util.StringTokenizer;
import javax.jms.TextMessage; import javax.jms.TextMessage;
import java.util.List;
import java.util.ArrayList; import org.apache.activemq.broker.util.CommandHandler;
import java.util.StringTokenizer; import org.apache.activemq.console.command.ShellCommand;
import java.io.ByteArrayOutputStream; import org.apache.activemq.console.formatter.CommandShellOutputFormatter;
import org.apache.activemq.console.formatter.GlobalWriter;
/** /**
* A default implementation of the @{link CommandHandler} interface * A default implementation of the @{link CommandHandler} interface
@ -44,7 +45,7 @@ public class ConsoleCommandHandler implements CommandHandler {
// lets turn the text into a list of arguments // lets turn the text into a list of arguments
String requestText = request.getText(); String requestText = request.getText();
List tokens = tokenize(requestText); List<String> tokens = tokenize(requestText);
command.execute(tokens); command.execute(tokens);
out.flush(); out.flush();
@ -55,8 +56,8 @@ public class ConsoleCommandHandler implements CommandHandler {
response.setText(answer); response.setText(answer);
} }
protected List tokenize(String text) { protected List<String> tokenize(String text) {
List answer = new ArrayList(); List<String> answer = new ArrayList<String>();
StringTokenizer iter = new StringTokenizer(text); StringTokenizer iter = new StringTokenizer(text);
while (iter.hasMoreTokens()) { while (iter.hasMoreTokens()) {
answer.add(iter.nextToken()); answer.add(iter.nextToken());

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -30,37 +29,35 @@ import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.HashSet;
import java.util.StringTokenizer; import java.util.StringTokenizer;
/** /**
* Main class that can bootstrap an ActiveMQ broker console. Handles command line * Main class that can bootstrap an ActiveMQ broker console. Handles command
* argument parsing to set up and run broker tasks. * line argument parsing to set up and run broker tasks.
* *
* @version $Revision$ * @version $Revision$
*/ */
public class Main { public class Main {
public static final String TASK_DEFAULT_CLASS = "org.apache.activemq.console.command.ShellCommand"; public static final String TASK_DEFAULT_CLASS = "org.apache.activemq.console.command.ShellCommand";
private File activeMQHome;
private File activeMQBase;
private ClassLoader classLoader;
private Set extensions = new HashSet(5);
private Set activeMQClassPath = new HashSet(5);
private static boolean useDefExt = true; private static boolean useDefExt = true;
private File activeMQHome;
private File activeMQBase;
private ClassLoader classLoader;
private Set<File> extensions = new HashSet<File>(5);
private Set<File> activeMQClassPath = new HashSet<File>(5);
public static void main(String[] args) { public static void main(String[] args) {
Main app = new Main(); Main app = new Main();
// Convert arguments to collection for easier management // Convert arguments to collection for easier management
List tokens = new LinkedList(Arrays.asList(args)); List<String> tokens = new LinkedList<String>(Arrays.asList(args));
// Parse for extension directory option // Parse for extension directory option
app.parseExtensions(tokens); app.parseExtensions(tokens);
@ -69,24 +66,25 @@ public class Main {
// ${activemq.base}/conf // ${activemq.base}/conf
// ${activemq.base}/lib/* (only if activemq.base != activemq.home) // ${activemq.base}/lib/* (only if activemq.base != activemq.home)
// ${activemq.home}/lib/* // ${activemq.home}/lib/*
// ${activemq.base}/lib/optional/* (only if activemq.base != activemq.home) // ${activemq.base}/lib/optional/* (only if activemq.base !=
// activemq.home)
// ${activemq.home}/lib/optional/* // ${activemq.home}/lib/optional/*
// ${activemq.base}/lib/web/* (only if activemq.base != activemq.home) // ${activemq.base}/lib/web/* (only if activemq.base != activemq.home)
// ${activemq.home}/lib/web/* // ${activemq.home}/lib/web/*
// //
if(useDefExt && app.canUseExtdir()) { if (useDefExt && app.canUseExtdir()) {
boolean baseIsHome = app.getActiveMQBase().equals(app.getActiveMQHome()); boolean baseIsHome = app.getActiveMQBase().equals(app.getActiveMQHome());
File baseLibDir = new File(app.getActiveMQBase(), "lib"); File baseLibDir = new File(app.getActiveMQBase(), "lib");
File homeLibDir = new File(app.getActiveMQHome(), "lib"); File homeLibDir = new File(app.getActiveMQHome(), "lib");
if(!baseIsHome) { if (!baseIsHome) {
app.addExtensionDirectory(baseLibDir); app.addExtensionDirectory(baseLibDir);
} }
app.addExtensionDirectory(homeLibDir); app.addExtensionDirectory(homeLibDir);
if(!baseIsHome) { if (!baseIsHome) {
app.addExtensionDirectory(new File(baseLibDir, "optional")); app.addExtensionDirectory(new File(baseLibDir, "optional"));
app.addExtensionDirectory(new File(baseLibDir, "web")); app.addExtensionDirectory(new File(baseLibDir, "web"));
} }
@ -95,7 +93,8 @@ public class Main {
} }
// Add any custom classpath specified from the system property activemq.classpath // Add any custom classpath specified from the system property
// activemq.classpath
app.addClassPathList(System.getProperty("activemq.classpath")); app.addClassPathList(System.getProperty("activemq.classpath"));
try { try {
@ -104,7 +103,7 @@ public class Main {
System.out.println("Could not load class: " + e.getMessage()); System.out.println("Could not load class: " + e.getMessage());
try { try {
ClassLoader cl = app.getClassLoader(); ClassLoader cl = app.getClassLoader();
if( cl!=null ) { if (cl != null) {
System.out.println("Class loader setup: "); System.out.println("Class loader setup: ");
printClassLoaderTree(cl); printClassLoaderTree(cl);
} }
@ -117,14 +116,14 @@ public class Main {
/** /**
* Print out what's in the classloader tree being used. * Print out what's in the classloader tree being used.
* *
* @param cl * @param cl
* @return depth * @return depth
*/ */
private static int printClassLoaderTree(ClassLoader cl) { private static int printClassLoaderTree(ClassLoader cl) {
int depth = 0; int depth = 0;
if( cl.getParent()!=null ) { if (cl.getParent() != null) {
depth = printClassLoaderTree(cl.getParent())+1; depth = printClassLoaderTree(cl.getParent()) + 1;
} }
StringBuffer indent = new StringBuffer(); StringBuffer indent = new StringBuffer();
@ -132,21 +131,21 @@ public class Main {
indent.append(" "); indent.append(" ");
} }
if( cl instanceof URLClassLoader ) { if (cl instanceof URLClassLoader) {
URLClassLoader ucl = (URLClassLoader) cl; URLClassLoader ucl = (URLClassLoader)cl;
System.out.println(indent+cl.getClass().getName()+" {"); System.out.println(indent + cl.getClass().getName() + " {");
URL[] urls = ucl.getURLs(); URL[] urls = ucl.getURLs();
for (int i = 0; i < urls.length; i++) { for (int i = 0; i < urls.length; i++) {
System.out.println(indent+" "+urls[i]); System.out.println(indent + " " + urls[i]);
} }
System.out.println(indent+"}"); System.out.println(indent + "}");
} else { } else {
System.out.println(indent+cl.getClass().getName()); System.out.println(indent + cl.getClass().getName());
} }
return depth; return depth;
} }
public void parseExtensions(List tokens) { public void parseExtensions(List<String> tokens) {
if (tokens.isEmpty()) { if (tokens.isEmpty()) {
return; return;
} }
@ -156,15 +155,16 @@ public class Main {
// Parse for all --extdir and --noDefExt options // Parse for all --extdir and --noDefExt options
while (i < count) { while (i < count) {
String token = (String)tokens.get(i); String token = tokens.get(i);
// If token is an extension dir option // If token is an extension dir option
if (token.equals("--extdir")) { if (token.equals("--extdir")) {
// Process token // Process token
count--; count--;
tokens.remove(i); tokens.remove(i);
// If no extension directory is specified, or next token is another option // If no extension directory is specified, or next token is
if (i >= count || ((String)tokens.get(i)).startsWith("-")) { // another option
if (i >= count || tokens.get(i).startsWith("-")) {
System.out.println("Extension directory not specified."); System.out.println("Extension directory not specified.");
System.out.println("Ignoring extension directory option."); System.out.println("Ignoring extension directory option.");
continue; continue;
@ -172,9 +172,9 @@ public class Main {
// Process extension dir token // Process extension dir token
count--; count--;
File extDir = new File((String)tokens.remove(i)); File extDir = new File(tokens.remove(i));
if(!canUseExtdir()) { if (!canUseExtdir()) {
System.out.println("Extension directory feature not available due to the system classpath being able to load: " + TASK_DEFAULT_CLASS); System.out.println("Extension directory feature not available due to the system classpath being able to load: " + TASK_DEFAULT_CLASS);
System.out.println("Ignoring extension directory option."); System.out.println("Ignoring extension directory option.");
continue; continue;
@ -187,7 +187,8 @@ public class Main {
} }
addExtensionDirectory(extDir); addExtensionDirectory(extDir);
} else if (token.equals("--noDefExt")) { // If token is --noDefExt option } else if (token.equals("--noDefExt")) { // If token is
// --noDefExt option
count--; count--;
tokens.remove(i); tokens.remove(i);
useDefExt = false; useDefExt = false;
@ -198,19 +199,23 @@ public class Main {
} }
public void runTaskClass(List tokens) throws Throwable { public void runTaskClass(List<String> tokens) throws Throwable {
System.out.println("ACTIVEMQ_HOME: "+ getActiveMQHome()); System.out.println("ACTIVEMQ_HOME: " + getActiveMQHome());
System.out.println("ACTIVEMQ_BASE: "+ getActiveMQBase()); System.out.println("ACTIVEMQ_BASE: " + getActiveMQBase());
ClassLoader cl = getClassLoader(); ClassLoader cl = getClassLoader();
// Use reflection to run the task. // Use reflection to run the task.
try { try {
String[] args = (String[]) tokens.toArray(new String[tokens.size()]); String[] args = tokens.toArray(new String[tokens.size()]);
Class task = cl.loadClass(TASK_DEFAULT_CLASS); Class task = cl.loadClass(TASK_DEFAULT_CLASS);
Method runTask = task.getMethod("main", new Class[] { String[].class, InputStream.class, PrintStream.class }); Method runTask = task.getMethod("main", new Class[] {
runTask.invoke(task.newInstance(), new Object[] { args, System.in, System.out }); String[].class, InputStream.class, PrintStream.class
});
runTask.invoke(task.newInstance(), new Object[] {
args, System.in, System.out
});
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
throw e.getCause(); throw e.getCause();
} }
@ -234,9 +239,10 @@ public class Main {
} }
/** /**
* The extension directory feature will not work if the broker factory is already in the classpath * The extension directory feature will not work if the broker factory is
* since we have to load him from a child ClassLoader we build for it to work correctly. * already in the classpath since we have to load him from a child
* * ClassLoader we build for it to work correctly.
*
* @return true, if extension dir can be used. false otherwise. * @return true, if extension dir can be used. false otherwise.
*/ */
public boolean canUseExtdir() { public boolean canUseExtdir() {
@ -249,39 +255,45 @@ public class Main {
} }
public ClassLoader getClassLoader() throws MalformedURLException { public ClassLoader getClassLoader() throws MalformedURLException {
if(classLoader==null) { if (classLoader == null) {
// Setup the ClassLoader // Setup the ClassLoader
classLoader = Main.class.getClassLoader(); classLoader = Main.class.getClassLoader();
if (!extensions.isEmpty() || !activeMQClassPath.isEmpty()) { if (!extensions.isEmpty() || !activeMQClassPath.isEmpty()) {
ArrayList urls = new ArrayList(); ArrayList<URL> urls = new ArrayList<URL>();
for (Iterator iter = activeMQClassPath.iterator(); iter.hasNext();) { for (Iterator<File> iter = activeMQClassPath.iterator(); iter.hasNext();) {
File dir = (File) iter.next(); File dir = iter.next();
// try{ System.out.println("Adding to classpath: " + dir.getCanonicalPath()); }catch(Exception e){} // try{ System.out.println("Adding to classpath: " +
// dir.getCanonicalPath()); }catch(Exception e){}
urls.add(dir.toURL()); urls.add(dir.toURL());
} }
for (Iterator iter = extensions.iterator(); iter.hasNext();) { for (Iterator<File> iter = extensions.iterator(); iter.hasNext();) {
File dir = (File) iter.next(); File dir = iter.next();
if( dir.isDirectory() ) { if (dir.isDirectory()) {
File[] files = dir.listFiles(); File[] files = dir.listFiles();
if( files!=null ) { if (files != null) {
// Sort the jars so that classpath built is consistently // Sort the jars so that classpath built is
// in the same order. Also allows us to use jar names to control // consistently
// in the same order. Also allows us to use jar
// names to control
// classpath order. // classpath order.
Arrays.sort(files, new Comparator(){ Arrays.sort(files, new Comparator() {
public int compare(Object o1, Object o2) { public int compare(Object o1, Object o2) {
File f1 = (File) o1; File f1 = (File)o1;
File f2 = (File) o2; File f2 = (File)o2;
return f1.getName().compareTo(f2.getName()); return f1.getName().compareTo(f2.getName());
} }
}); });
for (int j = 0; j < files.length; j++) { for (int j = 0; j < files.length; j++) {
if( files[j].getName().endsWith(".zip") || files[j].getName().endsWith(".jar") ) { if (files[j].getName().endsWith(".zip") || files[j].getName().endsWith(".jar")) {
// try{ System.out.println("Adding to classpath: " + files[j].getCanonicalPath()); }catch(Exception e){} // try{ System.out.println("Adding to
// classpath: " +
// files[j].getCanonicalPath());
// }catch(Exception e){}
urls.add(files[j].toURL()); urls.add(files[j].toURL());
} }
} }
@ -303,29 +315,29 @@ public class Main {
} }
public File getActiveMQHome() { public File getActiveMQHome() {
if(activeMQHome==null) { if (activeMQHome == null) {
if(System.getProperty("activemq.home") != null) { if (System.getProperty("activemq.home") != null) {
activeMQHome = new File(System.getProperty("activemq.home")); activeMQHome = new File(System.getProperty("activemq.home"));
} }
if(activeMQHome==null){ if (activeMQHome == null) {
// guess from the location of the jar // guess from the location of the jar
URL url = Main.class.getClassLoader().getResource("org/apache/activemq/console/Main.class"); URL url = Main.class.getClassLoader().getResource("org/apache/activemq/console/Main.class");
if (url != null) { if (url != null) {
try { try {
JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); JarURLConnection jarConnection = (JarURLConnection)url.openConnection();
url = jarConnection.getJarFileURL(); url = jarConnection.getJarFileURL();
URI baseURI = new URI(url.toString()).resolve(".."); URI baseURI = new URI(url.toString()).resolve("..");
activeMQHome = new File(baseURI).getCanonicalFile(); activeMQHome = new File(baseURI).getCanonicalFile();
System.setProperty("activemq.home",activeMQHome.getAbsolutePath()); System.setProperty("activemq.home", activeMQHome.getAbsolutePath());
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} }
} }
if(activeMQHome==null){ if (activeMQHome == null) {
activeMQHome = new File("../."); activeMQHome = new File("../.");
System.setProperty("activemq.home",activeMQHome.getAbsolutePath()); System.setProperty("activemq.home", activeMQHome.getAbsolutePath());
} }
} }
@ -333,14 +345,14 @@ public class Main {
} }
public File getActiveMQBase() { public File getActiveMQBase() {
if(activeMQBase==null) { if (activeMQBase == null) {
if(System.getProperty("activemq.base") != null) { if (System.getProperty("activemq.base") != null) {
activeMQBase = new File(System.getProperty("activemq.base")); activeMQBase = new File(System.getProperty("activemq.base"));
} }
if(activeMQBase==null){ if (activeMQBase == null) {
activeMQBase = getActiveMQHome(); activeMQBase = getActiveMQHome();
System.setProperty("activemq.base",activeMQBase.getAbsolutePath()); System.setProperty("activemq.base", activeMQBase.getAbsolutePath());
} }
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,31 +16,36 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.console.formatter.GlobalWriter;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.JMSException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.console.formatter.GlobalWriter;
public abstract class AbstractAmqCommand extends AbstractCommand { public abstract class AbstractAmqCommand extends AbstractCommand {
private URI brokerUrl; private URI brokerUrl;
private ConnectionFactory factory; private ConnectionFactory factory;
private final List connections = new ArrayList(); private final List<Connection> connections = new ArrayList<Connection>();
/** /**
* Establishes a connection to the remote broker specified by the broker url. * Establishes a connection to the remote broker specified by the broker
* url.
*
* @return - connection to the broker * @return - connection to the broker
* @throws JMSException * @throws JMSException
*/ */
protected Connection createConnection() throws JMSException { protected Connection createConnection() throws JMSException {
if (getBrokerUrl() == null) { if (getBrokerUrl() == null) {
GlobalWriter.printException(new IllegalStateException("You must specify a broker URL to connect to using the --amqurl option.")); GlobalWriter
.printException(new IllegalStateException("You must specify a broker "
+ "URL to connect to using the --amqurl option."));
return null; return null;
} }
@ -56,7 +60,9 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
} }
/** /**
* Establishes a connection to the remote broker specified by the broker url. * Establishes a connection to the remote broker specified by the broker
* url.
*
* @param username - username for the connection * @param username - username for the connection
* @param password - password for the connection * @param password - password for the connection
* @return - connection to the broker * @return - connection to the broker
@ -64,7 +70,9 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
*/ */
protected Connection createConnection(String username, String password) throws JMSException { protected Connection createConnection(String username, String password) throws JMSException {
if (getBrokerUrl() == null) { if (getBrokerUrl() == null) {
GlobalWriter.printException(new IllegalStateException("You must specify a broker URL to connect to using the --amqurl option.")); GlobalWriter
.printException(new IllegalStateException(
"You must specify a broker URL to connect to using the --amqurl option."));
return null; return null;
} }
@ -83,10 +91,11 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
* Close all created connections. * Close all created connections.
*/ */
protected void closeAllConnections() { protected void closeAllConnections() {
for (Iterator i=connections.iterator(); i.hasNext();) { for (Iterator<Connection> i = connections.iterator(); i.hasNext();) {
try { try {
((Connection)i.next()).close(); i.next().close();
} catch (Exception e) { } } catch (Exception e) {
}
} }
connections.clear(); connections.clear();
@ -94,6 +103,7 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
/** /**
* Handle the --amqurl option. * Handle the --amqurl option.
*
* @param token - current option * @param token - current option
* @param tokens - succeeding list of arguments * @param tokens - succeeding list of arguments
* @throws Exception * @throws Exception
@ -110,7 +120,8 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
// If broker url already specified // If broker url already specified
if (getBrokerUrl() != null) { if (getBrokerUrl() != null) {
GlobalWriter.printException(new IllegalArgumentException("Multiple broker URL cannot be specified.")); GlobalWriter
.printException(new IllegalArgumentException("Multiple broker URL cannot be specified."));
tokens.clear(); tokens.clear();
return; return;
} }
@ -132,6 +143,7 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
/** /**
* Set the broker url. * Set the broker url.
*
* @param brokerUrl - new broker url * @param brokerUrl - new broker url
*/ */
protected void setBrokerUrl(URI brokerUrl) { protected void setBrokerUrl(URI brokerUrl) {
@ -140,6 +152,7 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
/** /**
* Set the broker url. * Set the broker url.
*
* @param address - address of the new broker url * @param address - address of the new broker url
* @throws URISyntaxException * @throws URISyntaxException
*/ */
@ -149,6 +162,7 @@ public abstract class AbstractAmqCommand extends AbstractCommand {
/** /**
* Get the current broker url. * Get the current broker url.
*
* @return current broker url * @return current broker url
*/ */
protected URI getBrokerUrl() { protected URI getBrokerUrl() {

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,23 +16,25 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.util.List;
import org.apache.activemq.ActiveMQConnectionMetaData; import org.apache.activemq.ActiveMQConnectionMetaData;
import org.apache.activemq.console.formatter.GlobalWriter; import org.apache.activemq.console.formatter.GlobalWriter;
import java.util.List;
public abstract class AbstractCommand implements Command { public abstract class AbstractCommand implements Command {
public static final String COMMAND_OPTION_DELIMETER = ","; public static final String COMMAND_OPTION_DELIMETER = ",";
private boolean isPrintHelp = false; private boolean isPrintHelp;
private boolean isPrintVersion = false; private boolean isPrintVersion;
/** /**
* Exceute a generic command, which includes parsing the options for the command and running the specific task. * Execute a generic command, which includes parsing the options for the
* command and running the specific task.
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
public void execute(List tokens) throws Exception { public void execute(List<String> tokens) throws Exception {
// Parse the options specified by "-" // Parse the options specified by "-"
parseOptions(tokens); parseOptions(tokens);
@ -41,24 +42,26 @@ public abstract class AbstractCommand implements Command {
if (isPrintHelp) { if (isPrintHelp) {
printHelp(); printHelp();
// Print the AMQ version // Print the AMQ version
} else if (isPrintVersion) { } else if (isPrintVersion) {
GlobalWriter.printVersion(ActiveMQConnectionMetaData.PROVIDER_VERSION); GlobalWriter.printVersion(ActiveMQConnectionMetaData.PROVIDER_VERSION);
// Run the specified task // Run the specified task
} else { } else {
runTask(tokens); runTask(tokens);
} }
} }
/** /**
* Parse any option parameters in the command arguments specified by a '-' as the first character of the token. * Parse any option parameters in the command arguments specified by a '-'
* as the first character of the token.
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void parseOptions(List tokens) throws Exception { protected void parseOptions(List<String> tokens) throws Exception {
while (!tokens.isEmpty()) { while (!tokens.isEmpty()) {
String token = (String)tokens.remove(0); String token = tokens.remove(0);
if (token.startsWith("-")) { if (token.startsWith("-")) {
// Token is an option // Token is an option
handleOption(token, tokens); handleOption(token, tokens);
@ -71,25 +74,25 @@ public abstract class AbstractCommand implements Command {
} }
/** /**
* Handle the general options for each command, which includes -h, -?, --help, -D, --version. * Handle the general options for each command, which includes -h, -?,
* --help, -D, --version.
*
* @param token - option token to handle * @param token - option token to handle
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// If token is a help option // If token is a help option
if (token.equals("-h") || token.equals("-?") || token.equals("--help")) { if (token.equals("-h") || token.equals("-?") || token.equals("--help")) {
isPrintHelp = true; isPrintHelp = true;
tokens.clear(); tokens.clear();
// If token is a version option // If token is a version option
} else if (token.equals("--version")) { } else if (token.equals("--version")) {
isPrintVersion = true; isPrintVersion = true;
tokens.clear(); tokens.clear();
} } else if (token.startsWith("-D")) {
// If token is a system property define option
// If token is a system property define option
else if (token.startsWith("-D")) {
String key = token.substring(2); String key = token.substring(2);
String value = ""; String value = "";
int pos = key.indexOf("="); int pos = key.indexOf("=");
@ -98,11 +101,8 @@ public abstract class AbstractCommand implements Command {
key = key.substring(0, pos); key = key.substring(0, pos);
} }
System.setProperty(key, value); System.setProperty(key, value);
} else {
} // Token is unrecognized
// Token is unrecognized
else {
GlobalWriter.printInfo("Unrecognized option: " + token); GlobalWriter.printInfo("Unrecognized option: " + token);
isPrintHelp = true; isPrintHelp = true;
} }
@ -110,13 +110,14 @@ public abstract class AbstractCommand implements Command {
/** /**
* Run the specific task. * Run the specific task.
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
abstract protected void runTask(List tokens) throws Exception; protected abstract void runTask(List<String> tokens) throws Exception;
/** /**
* Print the help messages for the specific task * Print the help messages for the specific task
*/ */
abstract protected void printHelp(); protected abstract void printHelp();
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,14 +16,15 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.console.formatter.GlobalWriter; import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXConnectorFactory;
import java.util.List; import javax.management.remote.JMXServiceURL;
import java.net.MalformedURLException;
import java.io.IOException; import org.apache.activemq.console.formatter.GlobalWriter;
public abstract class AbstractJmxCommand extends AbstractCommand { public abstract class AbstractJmxCommand extends AbstractCommand {
public static final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"; public static final String DEFAULT_JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi";
@ -107,7 +107,7 @@ public abstract class AbstractJmxCommand extends AbstractCommand {
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// Try to handle the options first // Try to handle the options first
if (token.equals("--jmxurl")) { if (token.equals("--jmxurl")) {
// If no jmx url specified, or next token is a new option // If no jmx url specified, or next token is a new option

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,18 +16,19 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.console.util.AmqMessagesUtil; import java.util.ArrayList;
import org.apache.activemq.console.formatter.GlobalWriter; import java.util.HashSet;
import org.apache.activemq.command.ActiveMQQueue; import java.util.Iterator;
import org.apache.activemq.command.ActiveMQTopic; import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.jms.Destination; import javax.jms.Destination;
import java.util.List;
import java.util.ArrayList; import org.apache.activemq.command.ActiveMQQueue;
import java.util.Set; import org.apache.activemq.command.ActiveMQTopic;
import java.util.HashSet; import org.apache.activemq.console.formatter.GlobalWriter;
import java.util.StringTokenizer; import org.apache.activemq.console.util.AmqMessagesUtil;
import java.util.Iterator;
public class AmqBrowseCommand extends AbstractAmqCommand { public class AmqBrowseCommand extends AbstractAmqCommand {
public static final String QUEUE_PREFIX = "queue:"; public static final String QUEUE_PREFIX = "queue:";
@ -36,176 +36,7 @@ public class AmqBrowseCommand extends AbstractAmqCommand {
public static final String VIEW_GROUP_HEADER = "header:"; public static final String VIEW_GROUP_HEADER = "header:";
public static final String VIEW_GROUP_CUSTOM = "custom:"; public static final String VIEW_GROUP_CUSTOM = "custom:";
public static final String VIEW_GROUP_BODY = "body:"; public static final String VIEW_GROUP_BODY = "body:";
private final List queryAddObjects = new ArrayList(10);
private final List querySubObjects = new ArrayList(10);
private final Set groupViews = new HashSet(10);
private final Set queryViews = new HashSet(10);
/**
* Execute the browse command, which allows you to browse the messages in a given JMS destination
* @param tokens - command arguments
* @throws Exception
*/
protected void runTask(List tokens) throws Exception {
try {
// If no destination specified
if (tokens.isEmpty()) {
GlobalWriter.printException(new IllegalArgumentException("No JMS destination specified."));
return;
}
// If no broker url specified
if (getBrokerUrl() == null) {
GlobalWriter.printException(new IllegalStateException("No broker url specified. Use the --amqurl option to specify a broker url."));
return;
}
// Display the messages for each destination
for (Iterator i=tokens.iterator(); i.hasNext();) {
String destName = (String)i.next();
Destination dest;
// If destination has been explicitly specified as a queue
if (destName.startsWith(QUEUE_PREFIX)) {
dest = new ActiveMQQueue(destName.substring(QUEUE_PREFIX.length()));
// If destination has been explicitly specified as a topic
} else if (destName.startsWith(TOPIC_PREFIX)) {
dest = new ActiveMQTopic(destName.substring(TOPIC_PREFIX.length()));
// By default destination is assumed to be a queue
} else {
dest = new ActiveMQQueue(destName);
}
// Query for the messages to view
List addMsgs = AmqMessagesUtil.getMessages(getBrokerUrl(), dest, queryAddObjects);
// Query for the messages to remove from view
if (querySubObjects.size() > 0) {
List subMsgs = AmqMessagesUtil.getMessages(getBrokerUrl(), dest, querySubObjects);
addMsgs.removeAll(subMsgs);
}
// Display the messages
GlobalWriter.printMessage(AmqMessagesUtil.filterMessagesView(addMsgs, groupViews, queryViews));
}
} catch (Exception e) {
GlobalWriter.printException(new RuntimeException("Failed to execute browse task. Reason: " + e));
throw new Exception(e);
}
}
/**
* Handle the --msgsel, --xmsgsel, --view, -V options.
* @param token - option token to handle
* @param tokens - succeeding command arguments
* @throws Exception
*/
protected void handleOption(String token, List tokens) throws Exception {
// If token is an additive message selector option
if (token.startsWith("--msgsel")) {
// If no message selector is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken());
}
}
// If token is a substractive message selector option
else if (token.startsWith("--xmsgsel")) {
// If no message selector is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken());
}
}
// If token is a view option
else if (token.startsWith("--view")) {
// If no view specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Attributes to view not specified"));
return;
}
// Add the attributes to view
StringTokenizer viewTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (viewTokens.hasMoreTokens()) {
String viewToken = viewTokens.nextToken();
// If view is explicitly specified to belong to the JMS header
if (viewToken.equals(VIEW_GROUP_HEADER)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken.substring(VIEW_GROUP_HEADER.length()));
// If view is explicitly specified to belong to the JMS custom header
} else if (viewToken.equals(VIEW_GROUP_CUSTOM)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken.substring(VIEW_GROUP_CUSTOM.length()));
// If view is explicitly specified to belong to the JMS body
} else if (viewToken.equals(VIEW_GROUP_BODY)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken.substring(VIEW_GROUP_BODY.length()));
// If no view explicitly specified, let's check the view for each group
} else {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken);
}
}
}
// If token is a predefined group view option
else if (token.startsWith("-V")) {
String viewGroup = token.substring(2);
// If option is a header group view
if (viewGroup.equals("header")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX);
// If option is a custom header group view
} else if (viewGroup.equals("custom")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX);
// If option is a body group view
} else if (viewGroup.equals("body")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX);
// Unknown group view
} else {
GlobalWriter.printInfo("Unknown group view: " + viewGroup + ". Ignoring group view option.");
}
}
// Let super class handle unknown option
else {
super.handleOption(token, tokens);
}
}
/**
* Print the help messages for the browse command
*/
protected void printHelp() {
GlobalWriter.printHelp(helpFile);
}
protected String[] helpFile = new String[] { protected String[] helpFile = new String[] {
"Task Usage: Main browse --amqurl <broker url> [browse-options] <destinations>", "Task Usage: Main browse --amqurl <broker url> [browse-options] <destinations>",
@ -238,4 +69,173 @@ public class AmqBrowseCommand extends AbstractAmqCommand {
" * To use wildcard queries, the field must be a string and the query enclosed in ''", " * To use wildcard queries, the field must be a string and the query enclosed in ''",
"", "",
}; };
private final List<String> queryAddObjects = new ArrayList<String>(10);
private final List<String> querySubObjects = new ArrayList<String>(10);
private final Set<String> groupViews = new HashSet<String>(10);
private final Set queryViews = new HashSet(10);
/**
* Execute the browse command, which allows you to browse the messages in a
* given JMS destination
*
* @param tokens - command arguments
* @throws Exception
*/
protected void runTask(List tokens) throws Exception {
try {
// If no destination specified
if (tokens.isEmpty()) {
GlobalWriter.printException(new IllegalArgumentException("No JMS destination specified."));
return;
}
// If no broker url specified
if (getBrokerUrl() == null) {
GlobalWriter.printException(new IllegalStateException("No broker url specified. Use the --amqurl option to specify a broker url."));
return;
}
// Display the messages for each destination
for (Iterator i = tokens.iterator(); i.hasNext();) {
String destName = (String)i.next();
Destination dest;
// If destination has been explicitly specified as a queue
if (destName.startsWith(QUEUE_PREFIX)) {
dest = new ActiveMQQueue(destName.substring(QUEUE_PREFIX.length()));
// If destination has been explicitly specified as a topic
} else if (destName.startsWith(TOPIC_PREFIX)) {
dest = new ActiveMQTopic(destName.substring(TOPIC_PREFIX.length()));
// By default destination is assumed to be a queue
} else {
dest = new ActiveMQQueue(destName);
}
// Query for the messages to view
List addMsgs = AmqMessagesUtil.getMessages(getBrokerUrl(), dest, queryAddObjects);
// Query for the messages to remove from view
if (querySubObjects.size() > 0) {
List subMsgs = AmqMessagesUtil.getMessages(getBrokerUrl(), dest, querySubObjects);
addMsgs.removeAll(subMsgs);
}
// Display the messages
GlobalWriter.printMessage(AmqMessagesUtil.filterMessagesView(addMsgs, groupViews, queryViews));
}
} catch (Exception e) {
GlobalWriter.printException(new RuntimeException("Failed to execute browse task. Reason: " + e));
throw new Exception(e);
}
}
/**
* Handle the --msgsel, --xmsgsel, --view, -V options.
*
* @param token - option token to handle
* @param tokens - succeeding command arguments
* @throws Exception
*/
protected void handleOption(String token, List tokens) throws Exception {
// If token is an additive message selector option
if (token.startsWith("--msgsel")) {
// If no message selector is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("--xmsgsel")) {
// If token is a substractive message selector option
// If no message selector is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("--view")) {
// If token is a view option
// If no view specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Attributes to view not specified"));
return;
}
// Add the attributes to view
StringTokenizer viewTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (viewTokens.hasMoreTokens()) {
String viewToken = viewTokens.nextToken();
// If view is explicitly specified to belong to the JMS header
if (viewToken.equals(VIEW_GROUP_HEADER)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken.substring(VIEW_GROUP_HEADER.length()));
// If view is explicitly specified to belong to the JMS
// custom header
} else if (viewToken.equals(VIEW_GROUP_CUSTOM)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken.substring(VIEW_GROUP_CUSTOM.length()));
// If view is explicitly specified to belong to the JMS body
} else if (viewToken.equals(VIEW_GROUP_BODY)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken.substring(VIEW_GROUP_BODY.length()));
// If no view explicitly specified, let's check the view for
// each group
} else {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken);
}
}
} else if (token.startsWith("-V")) {
// If token is a predefined group view option
String viewGroup = token.substring(2);
// If option is a header group view
if (viewGroup.equals("header")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX);
// If option is a custom header group view
} else if (viewGroup.equals("custom")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX);
// If option is a body group view
} else if (viewGroup.equals("body")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX);
// Unknown group view
} else {
GlobalWriter.printInfo("Unknown group view: " + viewGroup + ". Ignoring group view option.");
}
} else {
// Let super class handle unknown option
super.handleOption(token, tokens);
}
}
/**
* Print the help messages for the browse command
*/
protected void printHelp() {
GlobalWriter.printHelp(helpFile);
}
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,37 +16,72 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import javax.management.ObjectInstance;
import org.apache.activemq.console.formatter.GlobalWriter; import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.AmqMessagesUtil; import org.apache.activemq.console.util.AmqMessagesUtil;
import org.apache.activemq.console.util.JmxMBeansUtil; import org.apache.activemq.console.util.JmxMBeansUtil;
import javax.management.ObjectInstance;
import java.util.List;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class BrowseCommand extends AbstractJmxCommand { public class BrowseCommand extends AbstractJmxCommand {
public static final String QUEUE_PREFIX = "queue:"; public static final String QUEUE_PREFIX = "queue:";
public static final String TOPIC_PREFIX = "topic:"; public static final String TOPIC_PREFIX = "topic:";
public static final String VIEW_GROUP_HEADER = "header:"; public static final String VIEW_GROUP_HEADER = "header:";
public static final String VIEW_GROUP_CUSTOM = "custom:"; public static final String VIEW_GROUP_CUSTOM = "custom:";
public static final String VIEW_GROUP_BODY = "body:"; public static final String VIEW_GROUP_BODY = "body:";
private final List queryAddObjects = new ArrayList(10); protected String[] helpFile = new String[] {
private final List querySubObjects = new ArrayList(10); "Task Usage: Main browse [browse-options] <destinations>", "Description: Display selected destination's messages.",
private final Set groupViews = new HashSet(10); "",
private final Set queryViews = new HashSet(10); "Browse Options:",
" --msgsel <msgsel1,msglsel2> Add to the search list messages matched by the query similar to",
" the messages selector format.",
" -V<header|custom|body> Predefined view that allows you to view the message header, custom",
" message header, or the message body.",
" --view <attr1>,<attr2>,... Select the specific attribute of the message to view.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the browse broker help information.",
"",
"Examples:",
" Main browse FOO.BAR",
" - Print the message header, custom message header, and message body of all messages in the",
" queue FOO.BAR",
"",
" Main browse -Vheader,body queue:FOO.BAR",
" - Print only the message header and message body of all messages in the queue FOO.BAR",
"",
" Main browse -Vheader --view custom:MyField queue:FOO.BAR",
" - Print the message header and the custom field 'MyField' of all messages in the queue FOO.BAR",
"",
" Main browse --msgsel JMSMessageID='*:10',JMSPriority>5 FOO.BAR",
" - Print all the message fields that has a JMSMessageID in the header field that matches the",
" wildcard *:10, and has a JMSPriority field > 5 in the queue FOO.BAR",
" * To use wildcard queries, the field must be a string and the query enclosed in ''",
""
};
private final List<String> queryAddObjects = new ArrayList<String>(10);
private final List<String> querySubObjects = new ArrayList<String>(10);
private final Set<String> groupViews = new HashSet<String>(10);
private final Set queryViews = new HashSet(10);
/** /**
* Execute the browse command, which allows you to browse the messages in a given JMS destination * Execute the browse command, which allows you to browse the messages in a
* given JMS destination
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List<String> tokens) throws Exception {
try { try {
// If there is no queue name specified, let's select all // If there is no queue name specified, let's select all
if (tokens.isEmpty()) { if (tokens.isEmpty()) {
@ -55,11 +89,11 @@ public class BrowseCommand extends AbstractJmxCommand {
} }
// Iterate through the queue names // Iterate through the queue names
for (Iterator i=tokens.iterator(); i.hasNext();) { for (Iterator<String> i = tokens.iterator(); i.hasNext();) {
List queueList = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), "Type=Queue,Destination=" + i.next() + ",*"); List queueList = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), "Type=Queue,Destination=" + i.next() + ",*");
// Iterate through the queue result // Iterate through the queue result
for (Iterator j=queueList.iterator(); j.hasNext();) { for (Iterator j = queueList.iterator(); j.hasNext();) {
List messages = JmxMBeansUtil.createMessageQueryFilter(useJmxServiceUrl(), ((ObjectInstance)j.next()).getObjectName()).query(queryAddObjects); List messages = JmxMBeansUtil.createMessageQueryFilter(useJmxServiceUrl(), ((ObjectInstance)j.next()).getObjectName()).query(queryAddObjects);
GlobalWriter.printMessage(JmxMBeansUtil.filterMessagesView(messages, groupViews, queryViews)); GlobalWriter.printMessage(JmxMBeansUtil.filterMessagesView(messages, groupViews, queryViews));
} }
@ -72,16 +106,18 @@ public class BrowseCommand extends AbstractJmxCommand {
/** /**
* Handle the --msgsel, --xmsgsel, --view, -V options. * Handle the --msgsel, --xmsgsel, --view, -V options.
*
* @param token - option token to handle * @param token - option token to handle
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// If token is an additive message selector option // If token is an additive message selector option
if (token.startsWith("--msgsel")) { if (token.startsWith("--msgsel")) {
// If no message selector is specified, or next token is a new option // If no message selector is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified")); GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return; return;
@ -91,12 +127,11 @@ public class BrowseCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken()); queryAddObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--xmsgsel")) {
// If token is a substractive message selector option
// If token is a substractive message selector option // If no message selector is specified, or next token is a new
else if (token.startsWith("--xmsgsel")) { // option
// If no message selector is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified")); GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return; return;
@ -107,10 +142,8 @@ public class BrowseCommand extends AbstractJmxCommand {
querySubObjects.add(queryTokens.nextToken()); querySubObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--view")) {
// If token is a view option
// If token is a view option
else if (token.startsWith("--view")) {
// If no view specified, or next token is a new option // If no view specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
@ -127,46 +160,44 @@ public class BrowseCommand extends AbstractJmxCommand {
if (viewToken.equals(VIEW_GROUP_HEADER)) { if (viewToken.equals(VIEW_GROUP_HEADER)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken.substring(VIEW_GROUP_HEADER.length())); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken.substring(VIEW_GROUP_HEADER.length()));
// If view is explicitly specified to belong to the JMS custom header // If view is explicitly specified to belong to the JMS
// custom header
} else if (viewToken.equals(VIEW_GROUP_CUSTOM)) { } else if (viewToken.equals(VIEW_GROUP_CUSTOM)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken.substring(VIEW_GROUP_CUSTOM.length())); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken.substring(VIEW_GROUP_CUSTOM.length()));
// If view is explicitly specified to belong to the JMS body // If view is explicitly specified to belong to the JMS body
} else if (viewToken.equals(VIEW_GROUP_BODY)) { } else if (viewToken.equals(VIEW_GROUP_BODY)) {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken.substring(VIEW_GROUP_BODY.length())); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken.substring(VIEW_GROUP_BODY.length()));
// If no view explicitly specified, let's check the view for each group // If no view explicitly specified, let's check the view for
// each group
} else { } else {
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + viewToken);
queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken); queryViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + viewToken);
} }
} }
} } else if (token.startsWith("-V")) {
// If token is a predefined group view option
// If token is a predefined group view option
else if (token.startsWith("-V")) {
String viewGroup = token.substring(2); String viewGroup = token.substring(2);
// If option is a header group view // If option is a header group view
if (viewGroup.equals("header")) { if (viewGroup.equals("header")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX); groupViews.add(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX);
// If option is a custom header group view // If option is a custom header group view
} else if (viewGroup.equals("custom")) { } else if (viewGroup.equals("custom")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX); groupViews.add(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX);
// If option is a body group view // If option is a body group view
} else if (viewGroup.equals("body")) { } else if (viewGroup.equals("body")) {
groupViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX); groupViews.add(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX);
// Unknown group view // Unknown group view
} else { } else {
GlobalWriter.printInfo("Unknown group view: " + viewGroup + ". Ignoring group view option."); GlobalWriter.printInfo("Unknown group view: " + viewGroup + ". Ignoring group view option.");
} }
} } else {
// Let super class handle unknown option
// Let super class handle unknown option
else {
super.handleOption(token, tokens); super.handleOption(token, tokens);
} }
} }
@ -178,35 +209,4 @@ public class BrowseCommand extends AbstractJmxCommand {
GlobalWriter.printHelp(helpFile); GlobalWriter.printHelp(helpFile);
} }
protected String[] helpFile = new String[] {
"Task Usage: Main browse [browse-options] <destinations>",
"Description: Display selected destination's messages.",
"",
"Browse Options:",
" --msgsel <msgsel1,msglsel2> Add to the search list messages matched by the query similar to",
" the messages selector format.",
" -V<header|custom|body> Predefined view that allows you to view the message header, custom",
" message header, or the message body.",
" --view <attr1>,<attr2>,... Select the specific attribute of the message to view.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the browse broker help information.",
"",
"Examples:",
" Main browse FOO.BAR",
" - Print the message header, custom message header, and message body of all messages in the",
" queue FOO.BAR",
"",
" Main browse -Vheader,body queue:FOO.BAR",
" - Print only the message header and message body of all messages in the queue FOO.BAR",
"",
" Main browse -Vheader --view custom:MyField queue:FOO.BAR",
" - Print the message header and the custom field 'MyField' of all messages in the queue FOO.BAR",
"",
" Main browse --msgsel JMSMessageID='*:10',JMSPriority>5 FOO.BAR",
" - Print all the message fields that has a JMSMessageID in the header field that matches the",
" wildcard *:10, and has a JMSPriority field > 5 in the queue FOO.BAR",
" * To use wildcard queries, the field must be a string and the query enclosed in ''",
"",
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,18 +16,34 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BstatCommand extends QueryCommand { public class BstatCommand extends QueryCommand {
protected String[] helpFile = new String[] {
"Task Usage: activemq-admin bstat [bstat-options] [broker-name]",
"Description: Performs a predefined query that displays useful statistics regarding the specified broker.",
" If no broker name is specified, it will try and select from all registered brokers.",
"",
"Bstat Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the query broker help information.",
"",
"Examples:",
" activemq-admin bstat localhost",
" - Display a summary of statistics for the broker 'localhost'"
};
/** /**
* Performs a predefiend query option * Performs a predefiend query option
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List<String> tokens) throws Exception {
List queryTokens = new ArrayList(); List<String> queryTokens = new ArrayList<String>();
// Find the first non-option token // Find the first non-option token
String brokerName = "*"; String brokerName = "*";
for (Iterator i = tokens.iterator(); i.hasNext();) { for (Iterator i = tokens.iterator(); i.hasNext();) {
@ -47,26 +62,12 @@ public class BstatCommand extends QueryCommand {
queryTokens.add("Type=*,BrokerName=" + brokerName); queryTokens.add("Type=*,BrokerName=" + brokerName);
queryTokens.add("-xQTopic=ActiveMQ.Advisory.*"); queryTokens.add("-xQTopic=ActiveMQ.Advisory.*");
queryTokens.add("--vuew"); queryTokens.add("--vuew");
queryTokens.add("Type,BrokerName,Destination,ConnectorName,EnqueueCount," + queryTokens.add("Type,BrokerName,Destination,ConnectorName,EnqueueCount,"
"DequeueCount,TotalEnqueueCount,TotalDequeueCount,Messages," + + "DequeueCount,TotalEnqueueCount,TotalDequeueCount,Messages,"
"TotalMessages,ConsumerCount,TotalConsumerCount,DispatchQueueSize"); + "TotalMessages,ConsumerCount,TotalConsumerCount,DispatchQueueSize");
// Call the query command // Call the query command
super.runTask(queryTokens); super.runTask(queryTokens);
} }
protected String[] helpFile = new String[] {
"Task Usage: activemq-admin bstat [bstat-options] [broker-name]",
"Description: Performs a predefined query that displays useful statistics regarding the specified broker.",
" If no broker name is specified, it will try and select from all registered brokers.",
"",
"Bstat Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the query broker help information.",
"",
"Examples:",
" activemq-admin bstat localhost",
" - Display a summary of statistics for the broker 'localhost'"
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -26,5 +25,5 @@ public interface Command {
* @param tokens - arguments to the command * @param tokens - arguments to the command
* @throws Exception * @throws Exception
*/ */
public void execute(List tokens) throws Exception; void execute(List<String> tokens) throws Exception;
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,15 +16,26 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.activemq.console.formatter.GlobalWriter; import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.JmxMBeansUtil; import org.apache.activemq.console.util.JmxMBeansUtil;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
public class ListCommand extends AbstractJmxCommand { public class ListCommand extends AbstractJmxCommand {
protected String[] helpFile = new String[] {
"Task Usage: Main list [list-options]",
"Description: Lists all available broker in the specified JMX context.",
"",
"List Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the stop broker help information.",
""
};
/** /**
* List all running brokers registered in the specified JMX context * List all running brokers registered in the specified JMX context
* @param tokens - command arguments * @param tokens - command arguments
@ -33,7 +43,7 @@ public class ListCommand extends AbstractJmxCommand {
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List tokens) throws Exception {
try { try {
Set propsView = new HashSet(); Set<String> propsView = new HashSet<String>();
propsView.add("BrokerName"); propsView.add("BrokerName");
GlobalWriter.printMBean(JmxMBeansUtil.filterMBeansView(JmxMBeansUtil.getAllBrokers(useJmxServiceUrl()), propsView)); GlobalWriter.printMBean(JmxMBeansUtil.filterMBeansView(JmxMBeansUtil.getAllBrokers(useJmxServiceUrl()), propsView));
} catch (Exception e) { } catch (Exception e) {
@ -49,14 +59,4 @@ public class ListCommand extends AbstractJmxCommand {
GlobalWriter.printHelp(helpFile); GlobalWriter.printHelp(helpFile);
} }
protected String[] helpFile = new String[] {
"Task Usage: Main list [list-options]",
"Description: Lists all available broker in the specified JMX context.",
"",
"List Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the stop broker help information.",
""
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,30 +16,56 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import org.apache.activemq.console.formatter.GlobalWriter; import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.JmxMBeansUtil; import org.apache.activemq.console.util.JmxMBeansUtil;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.MBeanServerConnection;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import java.util.List;
import java.util.StringTokenizer;
import java.util.ArrayList;
import java.util.Iterator;
public class PurgeCommand extends AbstractJmxCommand { public class PurgeCommand extends AbstractJmxCommand {
private final List queryAddObjects = new ArrayList(10); protected String[] helpFile = new String[] {
private final List querySubObjects = new ArrayList(10); "Task Usage: Main purge [browse-options] <destinations>",
"Description: Delete selected destination's messages that matches the message selector.",
"",
"Browse Options:",
" --msgsel <msgsel1,msglsel2> Add to the search list messages matched by the query similar to",
" the messages selector format.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the browse broker help information.",
"",
"Examples:",
" Main purge FOO.BAR",
" - Delete all the messages in queue FOO.BAR",
" Main purge --msgsel JMSMessageID='*:10',JMSPriority>5 FOO.*",
" - Delete all the messages in the destinations that matches FOO.* and has a JMSMessageID in",
" the header field that matches the wildcard *:10, and has a JMSPriority field > 5 in the",
" queue FOO.BAR",
" * To use wildcard queries, the field must be a string and the query enclosed in ''",
"",
};
private final List<String> queryAddObjects = new ArrayList<String>(10);
private final List<String> querySubObjects = new ArrayList<String>(10);
/** /**
* Execute the purge command, which allows you to purge the messages in a given JMS destination * Execute the purge command, which allows you to purge the messages in a
* given JMS destination
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List<String> tokens) throws Exception {
try { try {
// If there is no queue name specified, let's select all // If there is no queue name specified, let's select all
if (tokens.isEmpty()) { if (tokens.isEmpty()) {
@ -48,10 +73,10 @@ public class PurgeCommand extends AbstractJmxCommand {
} }
// Iterate through the queue names // Iterate through the queue names
for (Iterator i=tokens.iterator(); i.hasNext();) { for (Iterator<String> i = tokens.iterator(); i.hasNext();) {
List queueList = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), "Type=Queue,Destination=" + i.next() + ",*"); List queueList = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), "Type=Queue,Destination=" + i.next() + ",*");
for (Iterator j=queueList.iterator(); j.hasNext();) { for (Iterator j = queueList.iterator(); j.hasNext();) {
ObjectName queueName = ((ObjectInstance)j.next()).getObjectName(); ObjectName queueName = ((ObjectInstance)j.next()).getObjectName();
if (queryAddObjects.isEmpty()) { if (queryAddObjects.isEmpty()) {
purgeQueue(queueName); purgeQueue(queueName);
@ -69,6 +94,7 @@ public class PurgeCommand extends AbstractJmxCommand {
/** /**
* Purge all the messages in the queue * Purge all the messages in the queue
*
* @param queue - ObjectName of the queue to purge * @param queue - ObjectName of the queue to purge
* @throws Exception * @throws Exception
*/ */
@ -82,6 +108,7 @@ public class PurgeCommand extends AbstractJmxCommand {
/** /**
* Purge selected messages in the queue * Purge selected messages in the queue
*
* @param queue - ObjectName of the queue to purge the messages from * @param queue - ObjectName of the queue to purge the messages from
* @param messages - List of messages to purge * @param messages - List of messages to purge
* @throws Exception * @throws Exception
@ -91,11 +118,13 @@ public class PurgeCommand extends AbstractJmxCommand {
MBeanServerConnection server = conn.getMBeanServerConnection(); MBeanServerConnection server = conn.getMBeanServerConnection();
Object[] param = new Object[1]; Object[] param = new Object[1];
for (Iterator i=messages.iterator(); i.hasNext();) { for (Iterator i = messages.iterator(); i.hasNext();) {
CompositeData msg = (CompositeData)i.next(); CompositeData msg = (CompositeData)i.next();
param[0] = "" + msg.get("JMSMessageID"); param[0] = "" + msg.get("JMSMessageID");
GlobalWriter.printInfo("Removing message: " + param[0] + " from queue: " + queue.getKeyProperty("Destination")); GlobalWriter.printInfo("Removing message: " + param[0] + " from queue: " + queue.getKeyProperty("Destination"));
server.invoke(queue, "removeMessage", param, new String[] {"java.lang.String"}); server.invoke(queue, "removeMessage", param, new String[] {
"java.lang.String"
});
} }
conn.close(); conn.close();
@ -103,15 +132,17 @@ public class PurgeCommand extends AbstractJmxCommand {
/** /**
* Handle the --msgsel, --xmsgsel. * Handle the --msgsel, --xmsgsel.
*
* @param token - option token to handle * @param token - option token to handle
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// If token is an additive message selector option // If token is an additive message selector option
if (token.startsWith("--msgsel")) { if (token.startsWith("--msgsel")) {
// If no message selector is specified, or next token is a new option // If no message selector is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified")); GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return; return;
@ -121,12 +152,11 @@ public class PurgeCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken()); queryAddObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--xmsgsel")) {
// If token is a substractive message selector option
// If token is a substractive message selector option // If no message selector is specified, or next token is a new
else if (token.startsWith("--xmsgsel")) { // option
// If no message selector is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Message selector not specified")); GlobalWriter.printException(new IllegalArgumentException("Message selector not specified"));
return; return;
@ -137,10 +167,8 @@ public class PurgeCommand extends AbstractJmxCommand {
querySubObjects.add(queryTokens.nextToken()); querySubObjects.add(queryTokens.nextToken());
} }
} } else {
// Let super class handle unknown option
// Let super class handle unknown option
else {
super.handleOption(token, tokens); super.handleOption(token, tokens);
} }
} }
@ -152,26 +180,4 @@ public class PurgeCommand extends AbstractJmxCommand {
GlobalWriter.printHelp(helpFile); GlobalWriter.printHelp(helpFile);
} }
protected String[] helpFile = new String[] {
"Task Usage: Main purge [browse-options] <destinations>",
"Description: Delete selected destination's messages that matches the message selector.",
"",
"Browse Options:",
" --msgsel <msgsel1,msglsel2> Add to the search list messages matched by the query similar to",
" the messages selector format.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the browse broker help information.",
"",
"Examples:",
" Main purge FOO.BAR",
" - Delete all the messages in queue FOO.BAR",
" Main purge --msgsel JMSMessageID='*:10',JMSPriority>5 FOO.*",
" - Delete all the messages in the destinations that matches FOO.* and has a JMSMessageID in",
" the header field that matches the wildcard *:10, and has a JMSPriority field > 5 in the",
" queue FOO.BAR",
" * To use wildcard queries, the field must be a string and the query enclosed in ''",
"",
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,40 +16,92 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.console.util.JmxMBeansUtil;
import org.apache.activemq.console.formatter.GlobalWriter;
import java.util.List;
import java.util.Properties;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Set;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.JmxMBeansUtil;
public class QueryCommand extends AbstractJmxCommand { public class QueryCommand extends AbstractJmxCommand {
// Predefined type=identifier query // Predefined type=identifier query
private static final Properties PREDEFINED_OBJNAME_QUERY = new Properties(); private static final Properties PREDEFINED_OBJNAME_QUERY = new Properties();
static { static {
PREDEFINED_OBJNAME_QUERY.setProperty("Broker", "Type=Broker,BrokerName=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("Broker", "Type=Broker,BrokerName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Connection", "Type=Connection,Connection=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("Connection", "Type=Connection,Connection=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Connector", "Type=Connector,ConnectorName=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("Connector", "Type=Connector,ConnectorName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("NetworkConnector", "Type=NetworkConnector,BrokerName=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("NetworkConnector", "Type=NetworkConnector,BrokerName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Queue", "Type=Queue,Destination=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("Queue", "Type=Queue,Destination=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Topic", "Type=Topic,Destination=%1,*"); PREDEFINED_OBJNAME_QUERY.setProperty("Topic", "Type=Topic,Destination=%1,*");
}; };
private final List queryAddObjects = new ArrayList(10); protected String[] helpFile = new String[] {
private final List querySubObjects = new ArrayList(10); "Task Usage: Main query [query-options]",
private final Set queryViews = new HashSet(10); "Description: Display selected broker component's attributes and statistics.",
"",
"Query Options:",
" -Q<type>=<name> Add to the search list the specific object type matched",
" by the defined object identifier.",
" -xQ<type>=<name> Remove from the search list the specific object type",
" matched by the object identifier.",
" --objname <query> Add to the search list objects matched by the query similar",
" to the JMX object name format.",
" --xobjname <query> Remove from the search list objects matched by the query",
" similar to the JMX object name format.",
" --view <attr1>,<attr2>,... Select the specific attribute of the object to view.",
" By default all attributes will be displayed.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the query broker help information.",
"", "Examples:",
" query",
" - Print all the attributes of all registered objects queues, topics, connections, etc).",
"",
" query -QQueue=TEST.FOO",
" - Print all the attributes of the queue with destination name TEST.FOO.",
"",
" query -QTopic=*",
" - Print all the attributes of all registered topics.",
"",
" query --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered objects.",
"",
" query -QTopic=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics.",
"",
" query -QTopic=* -QQueue=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics and",
" queues.",
"",
" query -QTopic=* -xQTopic=ActiveMQ.Advisory.*",
" - Print all attributes of all topics except those that has a name that begins",
" with \"ActiveMQ.Advisory\".",
"",
" query --objname Type=*Connect*,BrokerName=local* -xQNetworkConnector=*",
" - Print all attributes of all connectors, connections excluding network connectors",
" that belongs to the broker that begins with local.",
"",
" query -QQueue=* -xQQueue=????",
" - Print all attributes of all queues except those that are 4 letters long.",
"",
};
private final List<String> queryAddObjects = new ArrayList<String>(10);
private final List<String> querySubObjects = new ArrayList<String>(10);
private final Set queryViews = new HashSet(10);
/** /**
* Queries the mbeans registered in the specified JMX context * Queries the mbeans registered in the specified JMX context
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List<String> tokens) throws Exception {
try { try {
// Query for the mbeans to add // Query for the mbeans to add
List addMBeans = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), queryAddObjects, queryViews); List addMBeans = JmxMBeansUtil.queryMBeans(useJmxServiceUrl(), queryAddObjects, queryViews);
@ -61,7 +112,6 @@ public class QueryCommand extends AbstractJmxCommand {
addMBeans.removeAll(subMBeans); addMBeans.removeAll(subMBeans);
} }
GlobalWriter.printMBean(JmxMBeansUtil.filterMBeansView(addMBeans, queryViews)); GlobalWriter.printMBean(JmxMBeansUtil.filterMBeansView(addMBeans, queryViews));
} catch (Exception e) { } catch (Exception e) {
@ -72,11 +122,12 @@ public class QueryCommand extends AbstractJmxCommand {
/** /**
* Handle the -Q, -xQ, --objname, --xobjname, --view options. * Handle the -Q, -xQ, --objname, --xobjname, --view options.
*
* @param token - option token to handle * @param token - option token to handle
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// If token is a additive predefined query define option // If token is a additive predefined query define option
if (token.startsWith("-Q")) { if (token.startsWith("-Q")) {
String key = token.substring(2); String key = token.substring(2);
@ -98,10 +149,8 @@ public class QueryCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken()); queryAddObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("-xQ")) {
// If token is a substractive predefined query define option
// If token is a substractive predefined query define option
else if (token.startsWith("-xQ")) {
String key = token.substring(3); String key = token.substring(3);
String value = ""; String value = "";
int pos = key.indexOf("="); int pos = key.indexOf("=");
@ -121,12 +170,11 @@ public class QueryCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken()); querySubObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--objname")) {
// If token is an additive object name query option
// If token is an additive object name query option // If no object name query is specified, or next token is a new
else if (token.startsWith("--objname")) { // option
// If no object name query is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Object name query not specified")); GlobalWriter.printException(new IllegalArgumentException("Object name query not specified"));
return; return;
@ -136,12 +184,11 @@ public class QueryCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken()); queryAddObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--xobjname")) {
// If token is a substractive object name query option
// If token is a substractive object name query option // If no object name query is specified, or next token is a new
else if (token.startsWith("--xobjname")) { // option
// If no object name query is specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
GlobalWriter.printException(new IllegalArgumentException("Object name query not specified")); GlobalWriter.printException(new IllegalArgumentException("Object name query not specified"));
return; return;
@ -151,10 +198,8 @@ public class QueryCommand extends AbstractJmxCommand {
while (queryTokens.hasMoreTokens()) { while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken()); querySubObjects.add(queryTokens.nextToken());
} }
} } else if (token.startsWith("--view")) {
// If token is a view option
// If token is a view option
else if (token.startsWith("--view")) {
// If no view specified, or next token is a new option // If no view specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) { if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
@ -167,10 +212,8 @@ public class QueryCommand extends AbstractJmxCommand {
while (viewTokens.hasMoreElements()) { while (viewTokens.hasMoreElements()) {
queryViews.add(viewTokens.nextElement()); queryViews.add(viewTokens.nextElement());
} }
} } else {
// Let super class handle unknown option
// Let super class handle unknown option
else {
super.handleOption(token, tokens); super.handleOption(token, tokens);
} }
} }
@ -181,56 +224,5 @@ public class QueryCommand extends AbstractJmxCommand {
protected void printHelp() { protected void printHelp() {
GlobalWriter.printHelp(helpFile); GlobalWriter.printHelp(helpFile);
} }
protected String[] helpFile = new String[] {
"Task Usage: Main query [query-options]",
"Description: Display selected broker component's attributes and statistics.",
"",
"Query Options:",
" -Q<type>=<name> Add to the search list the specific object type matched",
" by the defined object identifier.",
" -xQ<type>=<name> Remove from the search list the specific object type",
" matched by the object identifier.",
" --objname <query> Add to the search list objects matched by the query similar",
" to the JMX object name format.",
" --xobjname <query> Remove from the search list objects matched by the query",
" similar to the JMX object name format.",
" --view <attr1>,<attr2>,... Select the specific attribute of the object to view.",
" By default all attributes will be displayed.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --version Display the version information.",
" -h,-?,--help Display the query broker help information.",
"",
"Examples:",
" query",
" - Print all the attributes of all registered objects queues, topics, connections, etc).",
"",
" query -QQueue=TEST.FOO",
" - Print all the attributes of the queue with destination name TEST.FOO.",
"",
" query -QTopic=*",
" - Print all the attributes of all registered topics.",
"",
" query --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered objects.",
"",
" query -QTopic=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics.",
"",
" query -QTopic=* -QQueue=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics and",
" queues.",
"",
" query -QTopic=* -xQTopic=ActiveMQ.Advisory.*",
" - Print all attributes of all topics except those that has a name that begins",
" with \"ActiveMQ.Advisory\".",
"",
" query --objname Type=*Connect*,BrokerName=local* -xQNetworkConnector=*",
" - Print all attributes of all connectors, connections excluding network connectors",
" that belongs to the broker that begins with local.",
"",
" query -QQueue=* -xQQueue=????",
" - Print all attributes of all queues except those that are 4 letters long.",
"",
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,50 +16,50 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.formatter.CommandShellOutputFormatter;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.activemq.console.formatter.CommandShellOutputFormatter;
import org.apache.activemq.console.formatter.GlobalWriter;
public class ShellCommand extends AbstractCommand { public class ShellCommand extends AbstractCommand {
private boolean interactive; private boolean interactive;
private String[] helpFile; private String[] helpFile;
public ShellCommand() { public ShellCommand() {
this(false); this(false);
} }
public ShellCommand(boolean interactive) { public ShellCommand(boolean interactive) {
this.interactive = interactive; this.interactive = interactive;
this.helpFile = new String[]{ this.helpFile = new String[] {
(interactive ? "Usage: [task] [task-options] [task data]" : "Usage: Main [--extdir <dir>] [task] [task-options] [task data]"), interactive ? "Usage: [task] [task-options] [task data]" : "Usage: Main [--extdir <dir>] [task] [task-options] [task data]",
"", "",
"Tasks (default task is start):", "Tasks (default task is start):",
" start - Creates and starts a broker using a configuration file, or a broker URI.", " start - Creates and starts a broker using a configuration file, or a broker URI.",
" stop - Stops a running broker specified by the broker name.", " stop - Stops a running broker specified by the broker name.",
" list - Lists all available brokers in the specified JMX context.", " list - Lists all available brokers in the specified JMX context.",
" query - Display selected broker component's attributes and statistics.", " query - Display selected broker component's attributes and statistics.",
" browse - Display selected messages in a specified destination.", " browse - Display selected messages in a specified destination.",
"", "",
"Task Options (Options specific to each task):", "Task Options (Options specific to each task):",
" --extdir <dir> - Add the jar files in the directory to the classpath.", " --extdir <dir> - Add the jar files in the directory to the classpath.",
" --version - Display the version information.", " --version - Display the version information.",
" -h,-?,--help - Display this help information. To display task specific help, use " + (interactive ? "" : "Main ") + "[task] -h,-?,--help", " -h,-?,--help - Display this help information. To display task specific help, use " + (interactive ? "" : "Main ") + "[task] -h,-?,--help",
"", "",
"Task Data:", "Task Data:",
" - Information needed by each specific task.", " - Information needed by each specific task.",
"" ""
}; };
} }
/** /**
* Main method to run a command shell client. * Main method to run a command shell client.
*
* @param args - command line arguments * @param args - command line arguments
* @param in - input stream to use * @param in - input stream to use
* @param out - output stream to use * @param out - output stream to use
@ -70,7 +69,7 @@ public class ShellCommand extends AbstractCommand {
GlobalWriter.instantiate(new CommandShellOutputFormatter(out)); GlobalWriter.instantiate(new CommandShellOutputFormatter(out));
// Convert arguments to list for easier management // Convert arguments to list for easier management
List tokens = new ArrayList(Arrays.asList(args)); List<String> tokens = new ArrayList<String>(Arrays.asList(args));
ShellCommand main = new ShellCommand(); ShellCommand main = new ShellCommand();
try { try {
@ -82,7 +81,6 @@ public class ShellCommand extends AbstractCommand {
} }
} }
public boolean isInteractive() { public boolean isInteractive() {
return interactive; return interactive;
} }
@ -93,13 +91,14 @@ public class ShellCommand extends AbstractCommand {
/** /**
* Parses for specific command task. * Parses for specific command task.
*
* @param tokens - command arguments * @param tokens - command arguments
* @throws Exception * @throws Exception
*/ */
protected void runTask(List tokens) throws Exception { protected void runTask(List<String> tokens) throws Exception {
// Process task token // Process task token
if( tokens.size() > 0 ) { if (tokens.size() > 0) {
String taskToken = (String)tokens.remove(0); String taskToken = (String)tokens.remove(0);
if (taskToken.equals("start")) { if (taskToken.equals("start")) {
new StartCommand().execute(tokens); new StartCommand().execute(tokens);
@ -123,7 +122,7 @@ public class ShellCommand extends AbstractCommand {
} else { } else {
printHelp(); printHelp();
} }
} }
/** /**

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,23 +16,43 @@
*/ */
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import org.apache.activemq.console.util.JmxMBeansUtil;
import org.apache.activemq.console.formatter.GlobalWriter;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.ObjectInstance;
import javax.management.remote.JMXServiceURL;
import java.util.List;
import java.util.Iterator;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.JmxMBeansUtil;
public class ShutdownCommand extends AbstractJmxCommand { public class ShutdownCommand extends AbstractJmxCommand {
private boolean isStopAllBrokers = false;
protected String[] helpFile = new String[] {
"Task Usage: Main stop [stop-options] [broker-name1] [broker-name2] ...",
"Description: Stops a running broker.",
"",
"Stop Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --all Stop all brokers.",
" --version Display the version information.",
" -h,-?,--help Display the stop broker help information.",
"",
"Broker Names:",
" Name of the brokers that will be stopped.",
" If omitted, it is assumed that there is only one broker running, and it will be stopped.",
" Use -all to stop all running brokers.",
""
};
private boolean isStopAllBrokers;
/** /**
* Shuts down the specified broker or brokers * Shuts down the specified broker or brokers
*
* @param brokerNames - names of brokers to shutdown * @param brokerNames - names of brokers to shutdown
* @throws Exception * @throws Exception
*/ */
@ -45,10 +64,8 @@ public class ShutdownCommand extends AbstractJmxCommand {
if (isStopAllBrokers) { if (isStopAllBrokers) {
mbeans = JmxMBeansUtil.getAllBrokers(useJmxServiceUrl()); mbeans = JmxMBeansUtil.getAllBrokers(useJmxServiceUrl());
brokerNames.clear(); brokerNames.clear();
} } else if (brokerNames.isEmpty()) {
// Stop the default broker
// Stop the default broker
else if (brokerNames.isEmpty()) {
mbeans = JmxMBeansUtil.getAllBrokers(useJmxServiceUrl()); mbeans = JmxMBeansUtil.getAllBrokers(useJmxServiceUrl());
// If there is no broker to stop // If there is no broker to stop
@ -56,21 +73,19 @@ public class ShutdownCommand extends AbstractJmxCommand {
GlobalWriter.printInfo("There are no brokers to stop."); GlobalWriter.printInfo("There are no brokers to stop.");
return; return;
// There should only be one broker to stop // There should only be one broker to stop
} else if (mbeans.size() > 1) { } else if (mbeans.size() > 1) {
GlobalWriter.printInfo("There are multiple brokers to stop. Please select the broker(s) to stop or use --all to stop all brokers."); GlobalWriter.printInfo("There are multiple brokers to stop. Please select the broker(s) to stop or use --all to stop all brokers.");
return; return;
// Get the first broker only // Get the first broker only
} else { } else {
Object firstBroker = mbeans.iterator().next(); Object firstBroker = mbeans.iterator().next();
mbeans.clear(); mbeans.clear();
mbeans.add(firstBroker); mbeans.add(firstBroker);
} }
} } else {
// Stop each specified broker
// Stop each specified broker
else {
String brokerName; String brokerName;
mbeans = new HashSet(); mbeans = new HashSet();
while (!brokerNames.isEmpty()) { while (!brokerNames.isEmpty()) {
@ -94,6 +109,7 @@ public class ShutdownCommand extends AbstractJmxCommand {
/** /**
* Stops the list of brokers. * Stops the list of brokers.
*
* @param jmxServiceUrl - JMX service url to connect to * @param jmxServiceUrl - JMX service url to connect to
* @param brokerBeans - broker mbeans to stop * @param brokerBeans - broker mbeans to stop
* @throws Exception * @throws Exception
@ -102,18 +118,23 @@ public class ShutdownCommand extends AbstractJmxCommand {
MBeanServerConnection server = createJmxConnector().getMBeanServerConnection(); MBeanServerConnection server = createJmxConnector().getMBeanServerConnection();
ObjectName brokerObjName; ObjectName brokerObjName;
for (Iterator i=brokerBeans.iterator(); i.hasNext();) { for (Iterator i = brokerBeans.iterator(); i.hasNext();) {
brokerObjName = ((ObjectInstance)i.next()).getObjectName(); brokerObjName = ((ObjectInstance)i.next()).getObjectName();
String brokerName = brokerObjName.getKeyProperty("BrokerName"); String brokerName = brokerObjName.getKeyProperty("BrokerName");
GlobalWriter.print("Stopping broker: " + brokerName); GlobalWriter.print("Stopping broker: " + brokerName);
try { try {
server.invoke(brokerObjName, "terminateJVM", new Object[] {Integer.valueOf(0)}, new String[] {"int"}); server.invoke(brokerObjName, "terminateJVM", new Object[] {
Integer.valueOf(0)
}, new String[] {
"int"
});
GlobalWriter.print("Succesfully stopped broker: " + brokerName); GlobalWriter.print("Succesfully stopped broker: " + brokerName);
} catch (Exception e) { } catch (Exception e) {
// TODO: Check exceptions throwned // TODO: Check exceptions throwned
//System.out.println("Failed to stop broker: [ " + brokerName + " ]. Reason: " + e.getMessage()); // System.out.println("Failed to stop broker: [ " + brokerName +
// " ]. Reason: " + e.getMessage());
} }
} }
@ -122,11 +143,12 @@ public class ShutdownCommand extends AbstractJmxCommand {
/** /**
* Handle the --all option. * Handle the --all option.
*
* @param token - option token to handle * @param token - option token to handle
* @param tokens - succeeding command arguments * @param tokens - succeeding command arguments
* @throws Exception * @throws Exception
*/ */
protected void handleOption(String token, List tokens) throws Exception { protected void handleOption(String token, List<String> tokens) throws Exception {
// Try to handle the options first // Try to handle the options first
if (token.equals("--all")) { if (token.equals("--all")) {
isStopAllBrokers = true; isStopAllBrokers = true;
@ -143,20 +165,4 @@ public class ShutdownCommand extends AbstractJmxCommand {
GlobalWriter.printHelp(helpFile); GlobalWriter.printHelp(helpFile);
} }
protected String[] helpFile = new String[] {
"Task Usage: Main stop [stop-options] [broker-name1] [broker-name2] ...",
"Description: Stops a running broker.",
"",
"Stop Options:",
" --jmxurl <url> Set the JMX URL to connect to.",
" --all Stop all brokers.",
" --version Display the version information.",
" -h,-?,--help Display the stop broker help information.",
"",
"Broker Names:",
" Name of the brokers that will be stopped.",
" If omitted, it is assumed that there is only one broker running, and it will be stopped.",
" Use -all to stop all running brokers.",
""
};
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -18,127 +17,19 @@
package org.apache.activemq.console.command; package org.apache.activemq.console.command;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.activemq.broker.BrokerFactory; import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService; import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.console.formatter.GlobalWriter; import org.apache.activemq.console.formatter.GlobalWriter;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.net.URI;
import java.net.URISyntaxException;
public class StartCommand extends AbstractCommand { public class StartCommand extends AbstractCommand {
public static final String DEFAULT_CONFIG_URI = "xbean:activemq.xml"; public static final String DEFAULT_CONFIG_URI = "xbean:activemq.xml";
private URI configURI;
private List brokers = new ArrayList(5);
/**
* The default task to start a broker or a group of brokers
* @param brokerURIs
*/
protected void runTask(List brokerURIs) throws Exception {
try {
// If no config uri, use default setting
if (brokerURIs.isEmpty()) {
setConfigUri(new URI(DEFAULT_CONFIG_URI));
startBroker(getConfigUri());
// Set configuration data, if available, which in this case would be the config URI
} else {
String strConfigURI;
while (!brokerURIs.isEmpty()) {
strConfigURI = (String)brokerURIs.remove(0);
try {
setConfigUri(new URI(strConfigURI));
} catch (URISyntaxException e) {
GlobalWriter.printException(e);
return;
}
startBroker(getConfigUri());
}
}
// Prevent the main thread from exiting unless it is terminated elsewhere
waitForShutdown();
} catch (Exception e) {
GlobalWriter.printException(new RuntimeException("Failed to execute start task. Reason: " + e, e));
throw new Exception(e);
}
}
/**
* Create and run a broker specified by the given configuration URI
* @param configURI
* @throws Exception
*/
public void startBroker(URI configURI) throws Exception {
System.out.println("Loading message broker from: " + configURI);
BrokerService broker = BrokerFactory.createBroker(configURI);
brokers.add(broker);
broker.start();
}
/**
* Wait for a shutdown invocation elsewhere
* @throws Exception
*/
protected void waitForShutdown() throws Exception {
final boolean[] shutdown = new boolean[] {false};
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
synchronized(shutdown) {
shutdown[0]=true;
shutdown.notify();
}
}
});
// Wait for any shutdown event
synchronized(shutdown) {
while( !shutdown[0] ) {
try {
shutdown.wait();
} catch (InterruptedException e) {
}
}
}
// Stop each broker
for (Iterator i=brokers.iterator(); i.hasNext();) {
BrokerService broker = (BrokerService)i.next();
broker.stop();
}
}
/**
* Sets the current configuration URI used by the start task
* @param uri
*/
public void setConfigUri(URI uri) {
configURI = uri;
}
/**
* Gets the current configuration URI used by the start task
* @return current configuration URI
*/
public URI getConfigUri() {
return configURI;
}
/**
* Print the help messages for the browse command
*/
protected void printHelp() {
GlobalWriter.printHelp(helpFile);
}
protected String[] helpFile = new String[] { protected String[] helpFile = new String[] {
"Task Usage: Main start [start-options] [uri]", "Task Usage: Main start [start-options] [uri]",
@ -146,7 +37,7 @@ public class StartCommand extends AbstractCommand {
"", "",
"Start Options:", "Start Options:",
" -D<name>=<value> Define a system property.", " -D<name>=<value> Define a system property.",
" --version Display the version information.", " --version Display the version information.",
" -h,-?,--help Display the start broker help information.", " -h,-?,--help Display the start broker help information.",
"", "",
"URI:", "URI:",
@ -166,4 +57,121 @@ public class StartCommand extends AbstractCommand {
" Configures the broker with 1 transport connector, and 1 network connector and persistence disabled", " Configures the broker with 1 transport connector, and 1 network connector and persistence disabled",
"" ""
}; };
private URI configURI;
private List<BrokerService> brokers = new ArrayList<BrokerService>(5);
/**
* The default task to start a broker or a group of brokers
*
* @param brokerURIs
*/
protected void runTask(List<String> brokerURIs) throws Exception {
try {
// If no config uri, use default setting
if (brokerURIs.isEmpty()) {
setConfigUri(new URI(DEFAULT_CONFIG_URI));
startBroker(getConfigUri());
// Set configuration data, if available, which in this case
// would be the config URI
} else {
String strConfigURI;
while (!brokerURIs.isEmpty()) {
strConfigURI = (String)brokerURIs.remove(0);
try {
setConfigUri(new URI(strConfigURI));
} catch (URISyntaxException e) {
GlobalWriter.printException(e);
return;
}
startBroker(getConfigUri());
}
}
// Prevent the main thread from exiting unless it is terminated
// elsewhere
waitForShutdown();
} catch (Exception e) {
GlobalWriter.printException(new RuntimeException("Failed to execute start task. Reason: " + e, e));
throw new Exception(e);
}
}
/**
* Create and run a broker specified by the given configuration URI
*
* @param configURI
* @throws Exception
*/
public void startBroker(URI configURI) throws Exception {
System.out.println("Loading message broker from: " + configURI);
BrokerService broker = BrokerFactory.createBroker(configURI);
brokers.add(broker);
broker.start();
}
/**
* Wait for a shutdown invocation elsewhere
*
* @throws Exception
*/
protected void waitForShutdown() throws Exception {
final boolean[] shutdown = new boolean[] {
false
};
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
synchronized (shutdown) {
shutdown[0] = true;
shutdown.notify();
}
}
});
// Wait for any shutdown event
synchronized (shutdown) {
while (!shutdown[0]) {
try {
shutdown.wait();
} catch (InterruptedException e) {
}
}
}
// Stop each broker
for (Iterator<BrokerService> i = brokers.iterator(); i.hasNext();) {
BrokerService broker = i.next();
broker.stop();
}
}
/**
* Sets the current configuration URI used by the start task
*
* @param uri
*/
public void setConfigUri(URI uri) {
configURI = uri;
}
/**
* Gets the current configuration URI used by the start task
*
* @return current configuration URI
*/
public URI getConfigUri() {
return configURI;
}
/**
* Print the help messages for the browse command
*/
protected void printHelp() {
GlobalWriter.printHelp(helpFile);
}
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,9 +16,9 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.Collections;
public abstract class AbstractQueryFilter implements QueryFilter { public abstract class AbstractQueryFilter implements QueryFilter {
protected QueryFilter next; protected QueryFilter next;

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,19 +16,20 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.Destination;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.QueueBrowser;
import java.net.URI; import java.net.URI;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
public class AmqMessagesQueryFilter extends AbstractQueryFilter { public class AmqMessagesQueryFilter extends AbstractQueryFilter {
@ -38,17 +38,19 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Create a JMS message query filter * Create a JMS message query filter
*
* @param brokerUrl - broker url to connect to * @param brokerUrl - broker url to connect to
* @param destination - JMS destination to query * @param destination - JMS destination to query
*/ */
public AmqMessagesQueryFilter(URI brokerUrl, Destination destination) { public AmqMessagesQueryFilter(URI brokerUrl, Destination destination) {
super(null); super(null);
this.brokerUrl = brokerUrl; this.brokerUrl = brokerUrl;
this.destination = destination; this.destination = destination;
} }
/** /**
* Queries the specified destination using the message selector format query * Queries the specified destination using the message selector format query
*
* @param queries - message selector queries * @param queries - message selector queries
* @return list messages that matches the selector * @return list messages that matches the selector
* @throws Exception * @throws Exception
@ -57,12 +59,12 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
String selector = ""; String selector = "";
// Convert to message selector // Convert to message selector
for (Iterator i=queries.iterator(); i.hasNext();) { for (Iterator i = queries.iterator(); i.hasNext();) {
selector = selector + "(" + i.next().toString() + ") AND "; selector = selector + "(" + i.next().toString() + ") AND ";
} }
// Remove last AND // Remove last AND
if (selector != "") { if (!selector.equals("")) {
selector = selector.substring(0, selector.length() - 5); selector = selector.substring(0, selector.length() - 5);
} }
@ -75,6 +77,7 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Query the messages of a queue destination using a queue browser * Query the messages of a queue destination using a queue browser
*
* @param queue - queue destination * @param queue - queue destination
* @param selector - message selector * @param selector - message selector
* @return list of messages that matches the selector * @return list of messages that matches the selector
@ -95,19 +98,23 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Query the messages of a topic destination using a message consumer * Query the messages of a topic destination using a message consumer
*
* @param topic - topic destination * @param topic - topic destination
* @param selector - message selector * @param selector - message selector
* @return list of messages that matches the selector * @return list of messages that matches the selector
* @throws Exception * @throws Exception
*/ */
protected List queryMessages(ActiveMQTopic topic, String selector) throws Exception { protected List queryMessages(ActiveMQTopic topic, String selector) throws Exception {
// TODO: should we use a durable subscriber or a retroactive non-durable subscriber? // TODO: should we use a durable subscriber or a retroactive non-durable
// TODO: if a durable subscriber is used, how do we manage it? subscribe/unsubscribe tasks? // subscriber?
// TODO: if a durable subscriber is used, how do we manage it?
// subscribe/unsubscribe tasks?
return null; return null;
} }
/** /**
* Create and start a JMS connection * Create and start a JMS connection
*
* @param brokerUrl - broker url to connect to. * @param brokerUrl - broker url to connect to.
* @return JMS connection * @return JMS connection
* @throws JMSException * @throws JMSException
@ -120,6 +127,7 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Get the broker url being used. * Get the broker url being used.
*
* @return broker url * @return broker url
*/ */
public URI getBrokerUrl() { public URI getBrokerUrl() {
@ -128,6 +136,7 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Set the broker url to use. * Set the broker url to use.
*
* @param brokerUrl - broker url * @param brokerUrl - broker url
*/ */
public void setBrokerUrl(URI brokerUrl) { public void setBrokerUrl(URI brokerUrl) {
@ -136,6 +145,7 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Get the destination being used. * Get the destination being used.
*
* @return - JMS destination * @return - JMS destination
*/ */
public Destination getDestination() { public Destination getDestination() {
@ -144,6 +154,7 @@ public class AmqMessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Set the destination to use. * Set the destination to use.
*
* @param destination - JMS destination * @param destination - JMS destination
*/ */
public void setDestination(Destination destination) { public void setDestination(Destination destination) {

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,15 +16,17 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.Set;
import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class GroupPropertiesViewFilter extends PropertiesViewFilter { public class GroupPropertiesViewFilter extends PropertiesViewFilter {
/** /**
* Creates a group properties filter that is able to filter the display result based on a group prefix * Creates a group properties filter that is able to filter the display
* result based on a group prefix
*
* @param next - the next query filter * @param next - the next query filter
*/ */
public GroupPropertiesViewFilter(QueryFilter next) { public GroupPropertiesViewFilter(QueryFilter next) {
@ -33,7 +34,9 @@ public class GroupPropertiesViewFilter extends PropertiesViewFilter {
} }
/** /**
* Creates a group properties filter that is able to filter the display result based on a group prefix * Creates a group properties filter that is able to filter the display
* result based on a group prefix
*
* @param groupView - the group filter to use * @param groupView - the group filter to use
* @param next - the next query filter * @param next - the next query filter
*/ */
@ -43,6 +46,7 @@ public class GroupPropertiesViewFilter extends PropertiesViewFilter {
/** /**
* Filter the properties that matches the group prefix only. * Filter the properties that matches the group prefix only.
*
* @param data - map data to filter * @param data - map data to filter
* @return - filtered map data * @return - filtered map data
*/ */
@ -55,18 +59,18 @@ public class GroupPropertiesViewFilter extends PropertiesViewFilter {
Map newData; Map newData;
try { try {
// Lets try to use the same class as the original // Lets try to use the same class as the original
newData = (Map)data.getClass().newInstance(); newData = data.getClass().newInstance();
} catch (Exception e) { } catch (Exception e) {
// Lets use a default HashMap // Lets use a default HashMap
newData = new HashMap(); newData = new HashMap();
} }
// Filter the keys to view // Filter the keys to view
for (Iterator i=data.keySet().iterator(); i.hasNext();) { for (Iterator<String> i = data.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = i.next();
// Checks if key matches any of the group filter // Checks if key matches any of the group filter
for (Iterator j=viewFilter.iterator(); j.hasNext();) { for (Iterator j = viewFilter.iterator(); j.hasNext();) {
String group = (String)j.next(); String group = (String)j.next();
if (key.startsWith(group)) { if (key.startsWith(group)) {
newData.put(key, data.get(key)); newData.put(key, data.get(key));

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,33 +16,36 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import javax.management.remote.JMXServiceURL; import java.io.IOException;
import javax.management.remote.JMXConnectorFactory; import java.util.ArrayList;
import javax.management.remote.JMXConnector;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.MBeanServerConnection;
import javax.management.ReflectionException;
import javax.management.InstanceNotFoundException;
import javax.management.AttributeList;
import javax.management.Attribute;
import javax.management.MBeanAttributeInfo;
import javax.management.IntrospectionException;
import java.util.Set;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.io.IOException; import java.util.Set;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.InstanceNotFoundException;
import javax.management.IntrospectionException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class MBeansAttributeQueryFilter extends AbstractQueryFilter { public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
public static final String KEY_OBJECT_NAME_ATTRIBUTE = "Attribute:ObjectName:"; public static final String KEY_OBJECT_NAME_ATTRIBUTE = "Attribute:ObjectName:";
private JMXServiceURL jmxServiceUrl; private JMXServiceURL jmxServiceUrl;
private Set attribView; private Set attribView;
/** /**
* Create an mbean attributes query filter that is able to select specific mbean attributes based on the object name to get. * Create an mbean attributes query filter that is able to select specific
* mbean attributes based on the object name to get.
*
* @param jmxServiceUrl - JMX service url to connect to. * @param jmxServiceUrl - JMX service url to connect to.
* @param attribView - the attributes to extract * @param attribView - the attributes to extract
* @param next - the next query filter * @param next - the next query filter
@ -51,13 +53,16 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
public MBeansAttributeQueryFilter(JMXServiceURL jmxServiceUrl, Set attribView, MBeansObjectNameQueryFilter next) { public MBeansAttributeQueryFilter(JMXServiceURL jmxServiceUrl, Set attribView, MBeansObjectNameQueryFilter next) {
super(next); super(next);
this.jmxServiceUrl = jmxServiceUrl; this.jmxServiceUrl = jmxServiceUrl;
this.attribView = attribView; this.attribView = attribView;
} }
/** /**
* Filter the query by retrieving the attributes specified, this will modify the collection to a list of AttributeList * Filter the query by retrieving the attributes specified, this will modify
* the collection to a list of AttributeList
*
* @param queries - query list * @param queries - query list
* @return List of AttributeList, which includes the ObjectName, which has a key of MBeansAttributeQueryFilter.KEY_OBJECT_NAME_ATTRIBUTE * @return List of AttributeList, which includes the ObjectName, which has a
* key of MBeansAttributeQueryFilter.KEY_OBJECT_NAME_ATTRIBUTE
* @throws Exception * @throws Exception
*/ */
public List query(List queries) throws Exception { public List query(List queries) throws Exception {
@ -66,6 +71,7 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
/** /**
* Retrieve the specified attributes of the mbean * Retrieve the specified attributes of the mbean
*
* @param result - collection of ObjectInstances and/or ObjectNames * @param result - collection of ObjectInstances and/or ObjectNames
* @return List of AttributeList * @return List of AttributeList
* @throws IOException * @throws IOException
@ -76,7 +82,7 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
protected List getMBeanAttributesCollection(Collection result) throws IOException, ReflectionException, InstanceNotFoundException, NoSuchMethodException, IntrospectionException { protected List getMBeanAttributesCollection(Collection result) throws IOException, ReflectionException, InstanceNotFoundException, NoSuchMethodException, IntrospectionException {
List mbeansCollection = new ArrayList(); List mbeansCollection = new ArrayList();
for (Iterator i=result.iterator(); i.hasNext();) { for (Iterator i = result.iterator(); i.hasNext();) {
Object mbean = i.next(); Object mbean = i.next();
if (mbean instanceof ObjectInstance) { if (mbean instanceof ObjectInstance) {
mbeansCollection.add(getMBeanAttributes(((ObjectInstance)mbean).getObjectName(), attribView)); mbeansCollection.add(getMBeanAttributes(((ObjectInstance)mbean).getObjectName(), attribView));
@ -92,6 +98,7 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
/** /**
* Retrieve the specified attributes of the mbean * Retrieve the specified attributes of the mbean
*
* @param obj - mbean ObjectInstance * @param obj - mbean ObjectInstance
* @param attrView - list of attributes to retrieve * @param attrView - list of attributes to retrieve
* @return AttributeList for the mbean * @return AttributeList for the mbean
@ -105,6 +112,7 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
/** /**
* Retrieve the specified attributes of the mbean * Retrieve the specified attributes of the mbean
*
* @param objName - mbean ObjectName * @param objName - mbean ObjectName
* @param attrView - list of attributes to retrieve * @param attrView - list of attributes to retrieve
* @return AttributeList for the mbean * @return AttributeList for the mbean
@ -113,7 +121,7 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
* @throws InstanceNotFoundException * @throws InstanceNotFoundException
*/ */
protected AttributeList getMBeanAttributes(ObjectName objName, Set attrView) throws IOException, ReflectionException, InstanceNotFoundException, IntrospectionException { protected AttributeList getMBeanAttributes(ObjectName objName, Set attrView) throws IOException, ReflectionException, InstanceNotFoundException, IntrospectionException {
JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl); JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceUrl);
MBeanServerConnection server = jmxConnector.getMBeanServerConnection(); MBeanServerConnection server = jmxConnector.getMBeanServerConnection();
// If no attribute view specified, get all attributes // If no attribute view specified, get all attributes
@ -122,18 +130,18 @@ public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
MBeanAttributeInfo[] infos = server.getMBeanInfo(objName).getAttributes(); MBeanAttributeInfo[] infos = server.getMBeanInfo(objName).getAttributes();
attribs = new String[infos.length]; attribs = new String[infos.length];
for (int i=0; i<infos.length; i++) { for (int i = 0; i < infos.length; i++) {
if (infos[i].isReadable()) { if (infos[i].isReadable()) {
attribs[i] = infos[i].getName(); attribs[i] = infos[i].getName();
} }
} }
// Get selected attributes // Get selected attributes
} else { } else {
attribs = new String[attrView.size()]; attribs = new String[attrView.size()];
int count = 0; int count = 0;
for (Iterator i=attrView.iterator(); i.hasNext();) { for (Iterator i = attrView.iterator(); i.hasNext();) {
attribs[count++] = (String)i.next(); attribs[count++] = (String)i.next();
} }
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,28 +16,31 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import javax.management.remote.JMXServiceURL; import java.io.IOException;
import javax.management.remote.JMXConnector; import java.net.MalformedURLException;
import javax.management.remote.JMXConnectorFactory; import java.util.ArrayList;
import javax.management.ObjectName;
import javax.management.MalformedObjectNameException;
import javax.management.MBeanServerConnection;
import javax.management.QueryExp;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.ArrayList;
import java.net.MalformedURLException; import javax.management.MBeanServerConnection;
import java.io.IOException; import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.QueryExp;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class MBeansObjectNameQueryFilter extends AbstractQueryFilter { public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
public static final String DEFAULT_JMX_DOMAIN = "org.apache.activemq"; public static final String DEFAULT_JMX_DOMAIN = "org.apache.activemq";
public static final String QUERY_EXP_PREFIX = "MBeans.QueryExp."; public static final String QUERY_EXP_PREFIX = "MBeans.QueryExp.";
private JMXServiceURL jmxServiceUrl; private JMXServiceURL jmxServiceUrl;
/** /**
* Creates an mbeans object name query filter that will query on the given JMX Service URL * Creates an mbeans object name query filter that will query on the given
* JMX Service URL
*
* @param jmxUrl - JMX service URL to connect to * @param jmxUrl - JMX service URL to connect to
* @throws MalformedURLException * @throws MalformedURLException
*/ */
@ -47,7 +49,9 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Creates an mbeans objecet name query filter that will query on the given JMX Service URL * Creates an mbeans objecet name query filter that will query on the given
* JMX Service URL
*
* @param jmxUrl - JMX service URL to connect to * @param jmxUrl - JMX service URL to connect to
*/ */
public MBeansObjectNameQueryFilter(JMXServiceURL jmxUrl) { public MBeansObjectNameQueryFilter(JMXServiceURL jmxUrl) {
@ -56,10 +60,13 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Queries the JMX service using a mapping of keys and values to construct the object name * Queries the JMX service using a mapping of keys and values to construct
* the object name
*
* @param queries - mapping of keys and values * @param queries - mapping of keys and values
* @return collection of ObjectInstance that matches the query * @return collection of ObjectInstance that matches the query
* @throws MalformedObjectNameException - if the given string is an invalid object name * @throws MalformedObjectNameException - if the given string is an invalid
* object name
* @throws IOException - if there is a problem querying the JMX context * @throws IOException - if there is a problem querying the JMX context
*/ */
public List query(List queries) throws MalformedObjectNameException, IOException { public List query(List queries) throws MalformedObjectNameException, IOException {
@ -72,7 +79,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
// Constructs object name query // Constructs object name query
String objNameQuery = ""; String objNameQuery = "";
String queryExp = ""; String queryExp = "";
for (Iterator i=queries.iterator(); i.hasNext();) { for (Iterator i = queries.iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
String val = ""; String val = "";
int pos = key.indexOf("="); int pos = key.indexOf("=");
@ -83,7 +90,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
if (val.startsWith(QUERY_EXP_PREFIX)) { if (val.startsWith(QUERY_EXP_PREFIX)) {
// do nothing as of the moment // do nothing as of the moment
} else if (key != "" && val != "") { } else if (!key.equals("") && !val.equals("")) {
objNameQuery = objNameQuery + key + "=" + val + ","; objNameQuery = objNameQuery + key + "=" + val + ",";
} }
} }
@ -95,8 +102,9 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Advance query that enables you to specify both the object name and the query expression to use. * Advance query that enables you to specify both the object name and the
* Note: Query expression is currently unsupported. * query expression to use. Note: Query expression is currently unsupported.
*
* @param objName - object name to use for query * @param objName - object name to use for query
* @param queryExpStr - query expression string * @param queryExpStr - query expression string
* @return set of mbeans that matches the query * @return set of mbeans that matches the query
@ -108,7 +116,8 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
QueryExp queryExp = createQueryExp(queryExpStr); QueryExp queryExp = createQueryExp(queryExpStr);
// Convert mbeans set to list to make it standard throughout the query filter // Convert mbeans set to list to make it standard throughout the query
// filter
List mbeans = new ArrayList(server.queryMBeans(objName, queryExp)); List mbeans = new ArrayList(server.queryMBeans(objName, queryExp));
jmxConn.close(); jmxConn.close();
@ -118,6 +127,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
/** /**
* Get the JMX service URL the query is connecting to. * Get the JMX service URL the query is connecting to.
*
* @return JMX service URL * @return JMX service URL
*/ */
public JMXServiceURL getJmxServiceUrl() { public JMXServiceURL getJmxServiceUrl() {
@ -126,6 +136,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
/** /**
* Sets the JMX service URL the query is going to connect to. * Sets the JMX service URL the query is going to connect to.
*
* @param jmxServiceUrl - new JMX service URL * @param jmxServiceUrl - new JMX service URL
*/ */
public void setJmxServiceUrl(JMXServiceURL jmxServiceUrl) { public void setJmxServiceUrl(JMXServiceURL jmxServiceUrl) {
@ -134,6 +145,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
/** /**
* Sets the JMX service URL the query is going to connect to. * Sets the JMX service URL the query is going to connect to.
*
* @param jmxServiceUrl - new JMX service URL * @param jmxServiceUrl - new JMX service URL
*/ */
public void setJmxServiceUrl(String jmxServiceUrl) throws MalformedURLException { public void setJmxServiceUrl(String jmxServiceUrl) throws MalformedURLException {
@ -142,6 +154,7 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
/** /**
* Creates a JMX connector * Creates a JMX connector
*
* @return JMX connector * @return JMX connector
* @throws IOException * @throws IOException
*/ */
@ -150,8 +163,9 @@ public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Creates a query expression based on the query expression string * Creates a query expression based on the query expression string Note:
* Note: currently unsupported * currently unsupported
*
* @param queryExpStr - query expression string * @param queryExpStr - query expression string
* @return the created query expression * @return the created query expression
*/ */

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,18 +16,21 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.ObjectInstance; import javax.management.ObjectInstance;
import javax.management.ObjectName; import javax.management.ObjectName;
import javax.management.AttributeList;
import javax.management.Attribute;
import java.util.Map;
import java.util.Iterator;
import java.util.regex.Pattern;
import java.lang.reflect.Method;
public class MBeansRegExQueryFilter extends RegExQueryFilter { public class MBeansRegExQueryFilter extends RegExQueryFilter {
/** /**
* Creates a regular expression query that is able to match the values of specific mbeans * Creates a regular expression query that is able to match the values of
* specific mbeans
*
* @param next - next query filter * @param next - next query filter
*/ */
public MBeansRegExQueryFilter(QueryFilter next) { public MBeansRegExQueryFilter(QueryFilter next) {
@ -36,9 +38,13 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
} }
/** /**
* Try to match the object data using the regular expression map. The regex map contains a key-value mapping of an attribute * Try to match the object data using the regular expression map. The regex
* key to a regular expression the value of the key should match. The basic rule of matching is that the data must contain * map contains a key-value mapping of an attribute key to a regular
* a property key that is included in the regex map, and that the value of the property key should match the regex specified. * expression the value of the key should match. The basic rule of matching
* is that the data must contain a property key that is included in the
* regex map, and that the value of the property key should match the regex
* specified.
*
* @param data - object data to match * @param data - object data to match
* @param regex - regex map * @param regex - regex map
* @return true if the data matches the regex map specified * @return true if the data matches the regex map specified
@ -49,8 +55,12 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
// Use reflection to determine where the object should go // Use reflection to determine where the object should go
try { try {
Method method = this.getClass().getDeclaredMethod("matches", new Class[] {data.getClass(), Map.class}); Method method = this.getClass().getDeclaredMethod("matches", new Class[] {
return ((Boolean)method.invoke(this, new Object[] {data, regex})).booleanValue(); data.getClass(), Map.class
});
return ((Boolean)method.invoke(this, new Object[] {
data, regex
})).booleanValue();
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
return false; return false;
} }
@ -58,6 +68,7 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
/** /**
* Try to match the object instance using the regular expression map * Try to match the object instance using the regular expression map
*
* @param data - object instance to match * @param data - object instance to match
* @param regex - regex map * @param regex - regex map
* @return true if the object instance matches the regex map * @return true if the object instance matches the regex map
@ -68,12 +79,13 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
/** /**
* Try to match the object name instance using the regular expression map * Try to match the object name instance using the regular expression map
*
* @param data - object name to match * @param data - object name to match
* @param regex - regex map * @param regex - regex map
* @return true if the object name matches the regex map * @return true if the object name matches the regex map
*/ */
protected boolean matches(ObjectName data, Map regex) { protected boolean matches(ObjectName data, Map regex) {
for (Iterator i=regex.keySet().iterator(); i.hasNext();) { for (Iterator i = regex.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
String target = data.getKeyProperty(key); String target = data.getKeyProperty(key);
@ -87,16 +99,18 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
/** /**
* Try to match the attribute list using the regular expression map * Try to match the attribute list using the regular expression map
*
* @param data - attribute list to match * @param data - attribute list to match
* @param regex - regex map * @param regex - regex map
* @return true if the attribute list matches the regex map * @return true if the attribute list matches the regex map
*/ */
protected boolean matches(AttributeList data, Map regex) { protected boolean matches(AttributeList data, Map regex) {
for (Iterator i=regex.keySet().iterator(); i.hasNext();) { for (Iterator i = regex.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
// Try to match each regex to the attributes of the mbean including its ObjectName // Try to match each regex to the attributes of the mbean including
for (Iterator j=data.iterator(); j.hasNext();) { // its ObjectName
for (Iterator j = data.iterator(); j.hasNext();) {
Attribute attrib = (Attribute)j.next(); Attribute attrib = (Attribute)j.next();
// Try to match to the properties of the ObjectName // Try to match to the properties of the ObjectName
@ -110,7 +124,7 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
break; break;
} }
// Try to match to the mbean attributes // Try to match to the mbean attributes
} else if (attrib.getName().equals(key)) { } else if (attrib.getName().equals(key)) {
if (!((Pattern)regex.get(key)).matcher(attrib.getValue().toString()).matches()) { if (!((Pattern)regex.get(key)).matcher(attrib.getValue().toString()).matches()) {
return false; return false;
@ -119,7 +133,7 @@ public class MBeansRegExQueryFilter extends RegExQueryFilter {
break; break;
} }
// If mbean does not contain the specified attribute // If mbean does not contain the specified attribute
} else { } else {
return false; return false;
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,32 +16,36 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import org.apache.activemq.console.formatter.GlobalWriter; import java.lang.reflect.Method;
import org.apache.activemq.console.util.AmqMessagesUtil; import java.util.Enumeration;
import org.apache.activemq.command.ActiveMQDestination; import java.util.HashMap;
import org.apache.activemq.command.ActiveMQObjectMessage; import java.util.Iterator;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.ActiveMQMapMessage;
import org.apache.activemq.command.ActiveMQStreamMessage;
import org.apache.activemq.command.ActiveMQMessage;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.AttributeList;
import javax.management.Attribute;
import javax.management.openmbean.CompositeDataSupport;
import javax.jms.JMSException;
import javax.jms.DeliveryMode;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Iterator;
import java.util.Enumeration; import javax.jms.DeliveryMode;
import java.lang.reflect.Method; import javax.jms.JMSException;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQMapMessage;
import org.apache.activemq.command.ActiveMQMessage;
import org.apache.activemq.command.ActiveMQObjectMessage;
import org.apache.activemq.command.ActiveMQStreamMessage;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.console.formatter.GlobalWriter;
import org.apache.activemq.console.util.AmqMessagesUtil;
public class MapTransformFilter extends ResultTransformFilter { public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Creates a Map transform filter that is able to transform a variety of objects to a properties map object * Creates a Map transform filter that is able to transform a variety of
* objects to a properties map object
*
* @param next - the next query filter * @param next - the next query filter
*/ */
public MapTransformFilter(QueryFilter next) { public MapTransformFilter(QueryFilter next) {
@ -51,14 +54,19 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform the given object to a Map object * Transform the given object to a Map object
*
* @param object - object to transform * @param object - object to transform
* @return map object * @return map object
*/ */
protected Object transformElement(Object object) throws Exception { protected Object transformElement(Object object) throws Exception {
// Use reflection to determine how the object should be transformed // Use reflection to determine how the object should be transformed
try { try {
Method method = this.getClass().getDeclaredMethod("transformToMap", new Class[] {object.getClass()}); Method method = this.getClass().getDeclaredMethod("transformToMap", new Class[] {
return (Map)method.invoke(this, new Object[] {object}); object.getClass()
});
return (Map)method.invoke(this, new Object[] {
object
});
} catch (NoSuchMethodException e) { } catch (NoSuchMethodException e) {
GlobalWriter.print("Unable to transform mbean of type: " + object.getClass().getName() + ". No corresponding transformToMap method found."); GlobalWriter.print("Unable to transform mbean of type: " + object.getClass().getName() + ". No corresponding transformToMap method found.");
return null; return null;
@ -67,6 +75,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ObjectInstance mbean to a Map * Transform an ObjectInstance mbean to a Map
*
* @param obj - ObjectInstance format of an mbean * @param obj - ObjectInstance format of an mbean
* @return map object * @return map object
*/ */
@ -76,6 +85,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ObjectName mbean to a Map * Transform an ObjectName mbean to a Map
*
* @param objname - ObjectName format of an mbean * @param objname - ObjectName format of an mbean
* @return map object * @return map object
*/ */
@ -84,7 +94,7 @@ public class MapTransformFilter extends ResultTransformFilter {
// Parse object properties // Parse object properties
Map objProps = objname.getKeyPropertyList(); Map objProps = objname.getKeyPropertyList();
for (Iterator i=objProps.keySet().iterator(); i.hasNext();) { for (Iterator i = objProps.keySet().iterator(); i.hasNext();) {
Object key = i.next(); Object key = i.next();
Object val = objProps.get(key); Object val = objProps.get(key);
if (val != null) { if (val != null) {
@ -97,12 +107,13 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an Attribute List format of an mbean to a Map * Transform an Attribute List format of an mbean to a Map
*
* @param list - AttributeList format of an mbean * @param list - AttributeList format of an mbean
* @return map object * @return map object
*/ */
protected Map transformToMap(AttributeList list) { protected Map transformToMap(AttributeList list) {
Properties props = new Properties(); Properties props = new Properties();
for (Iterator i=list.iterator(); i.hasNext();) { for (Iterator i = list.iterator(); i.hasNext();) {
Attribute attrib = (Attribute)i.next(); Attribute attrib = (Attribute)i.next();
// If attribute is an ObjectName // If attribute is an ObjectName
@ -120,6 +131,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ActiveMQTextMessage to a Map * Transform an ActiveMQTextMessage to a Map
*
* @param msg - text message to trasnform * @param msg - text message to trasnform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
@ -137,6 +149,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ActiveMQBytesMessage to a Map * Transform an ActiveMQBytesMessage to a Map
*
* @param msg - bytes message to transform * @param msg - bytes message to transform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
@ -148,20 +161,21 @@ public class MapTransformFilter extends ResultTransformFilter {
long bodyLength = msg.getBodyLength(); long bodyLength = msg.getBodyLength();
byte[] msgBody; byte[] msgBody;
int i=0; int i = 0;
// Create separate bytes messages // Create separate bytes messages
for (i=0; i<(bodyLength/Integer.MAX_VALUE); i++) { for (i = 0; i < (bodyLength / Integer.MAX_VALUE); i++) {
msgBody = new byte[Integer.MAX_VALUE]; msgBody = new byte[Integer.MAX_VALUE];
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i+1), new String(msgBody)); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i + 1), new String(msgBody));
} }
msgBody = new byte[(int)(bodyLength % Integer.MAX_VALUE)]; msgBody = new byte[(int)(bodyLength % Integer.MAX_VALUE)];
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i+1), new String(msgBody)); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i + 1), new String(msgBody));
return props; return props;
} }
/** /**
* Transform an ActiveMQMessage to a Map * Transform an ActiveMQMessage to a Map
*
* @param msg - object message to transform * @param msg - object message to transform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
@ -180,6 +194,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ActiveMQMapMessage to a Map * Transform an ActiveMQMapMessage to a Map
*
* @param msg - map message to transform * @param msg - map message to transform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
@ -204,6 +219,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ActiveMQStreamMessage to a Map * Transform an ActiveMQStreamMessage to a Map
*
* @param msg - stream message to transform * @param msg - stream message to transform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
@ -212,7 +228,8 @@ public class MapTransformFilter extends ResultTransformFilter {
Properties props = new Properties(); Properties props = new Properties();
props.putAll(transformToMap((ActiveMQMessage)msg)); props.putAll(transformToMap((ActiveMQMessage)msg));
// Just set the toString of the message as the body of the stream message // Just set the toString of the message as the body of the stream
// message
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSStreamMessage", msg.toString()); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSStreamMessage", msg.toString());
return props; return props;
@ -220,31 +237,32 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an ActiveMQMessage to a Map * Transform an ActiveMQMessage to a Map
*
* @param msg - message to transform * @param msg - message to transform
* @return map object * @return map object
* @throws JMSException * @throws JMSException
*/ */
protected Map transformToMap(ActiveMQMessage msg) throws JMSException { protected Map<String, String> transformToMap(ActiveMQMessage msg) throws JMSException {
Properties props = new Properties(); Map<String, String> props = new HashMap<String, String>();
// Get JMS properties // Get JMS properties
if (msg.getJMSCorrelationID() != null) { if (msg.getJMSCorrelationID() != null) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSCorrelationID", msg.getJMSCorrelationID()); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSCorrelationID", msg.getJMSCorrelationID());
} }
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDeliveryMode", (msg.getJMSDeliveryMode()==DeliveryMode.PERSISTENT) ? "persistent" : "non-persistent"); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDeliveryMode", (msg.getJMSDeliveryMode() == DeliveryMode.PERSISTENT) ? "persistent" : "non-persistent");
if (msg.getJMSDestination() != null) { if (msg.getJMSDestination() != null) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDestination", ((ActiveMQDestination)msg.getJMSDestination()).getPhysicalName()); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDestination", ((ActiveMQDestination)msg.getJMSDestination()).getPhysicalName());
} }
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSExpiration", Long.toString(msg.getJMSExpiration())); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSExpiration", Long.toString(msg.getJMSExpiration()));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSMessageID", msg.getJMSMessageID()); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSMessageID", msg.getJMSMessageID());
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSPriority", Integer.toString(msg.getJMSPriority())); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSPriority", Integer.toString(msg.getJMSPriority()));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSRedelivered", Boolean.toString(msg.getJMSRedelivered())); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSRedelivered", Boolean.toString(msg.getJMSRedelivered()));
if (msg.getJMSReplyTo() != null) { if (msg.getJMSReplyTo() != null) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSReplyTo", ((ActiveMQDestination)msg.getJMSReplyTo()).getPhysicalName()); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSReplyTo", ((ActiveMQDestination)msg.getJMSReplyTo()).getPhysicalName());
} }
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSTimestamp", Long.toString(msg.getJMSTimestamp())); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSTimestamp", Long.toString(msg.getJMSTimestamp()));
if (msg.getJMSType() != null) { if (msg.getJMSType() != null) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSType", msg.getJMSType()); props.put(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSType", msg.getJMSType());
} }
// Get custom properties // Get custom properties
@ -252,7 +270,7 @@ public class MapTransformFilter extends ResultTransformFilter {
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
String name = (String)e.nextElement(); String name = (String)e.nextElement();
if (msg.getObjectProperty(name) != null) { if (msg.getObjectProperty(name) != null) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + name, msg.getObjectProperty(name).toString()); props.put(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + name, msg.getObjectProperty(name).toString());
} }
} }
@ -261,6 +279,7 @@ public class MapTransformFilter extends ResultTransformFilter {
/** /**
* Transform an openMBean composite data to a Map * Transform an openMBean composite data to a Map
*
* @param data - composite data to transform * @param data - composite data to transform
* @return map object * @return map object
*/ */
@ -273,40 +292,38 @@ public class MapTransformFilter extends ResultTransformFilter {
if (typeName.equals(ActiveMQTextMessage.class.getName())) { if (typeName.equals(ActiveMQTextMessage.class.getName())) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "Text", data.get("Text").toString()); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "Text", data.get("Text").toString());
// Retrieve byte preview // Retrieve byte preview
} else if (typeName.equals(ActiveMQBytesMessage.class.getName())) { } else if (typeName.equals(ActiveMQBytesMessage.class.getName())) {
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "BodyLength", data.get("BodyLength").toString()); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "BodyLength", data.get("BodyLength").toString());
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "BodyPreview", new String((byte[])data.get("BodyPreview"))); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "BodyPreview", new String((byte[])data.get("BodyPreview")));
// Expand content map // Expand content map
} else if (typeName.equals(ActiveMQMapMessage.class.getName())) { } else if (typeName.equals(ActiveMQMapMessage.class.getName())) {
Map contentMap = (Map)data.get("ContentMap"); Map contentMap = (Map)data.get("ContentMap");
for (Iterator i=contentMap.keySet().iterator(); i.hasNext();) { for (Iterator i = contentMap.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + key, contentMap.get(key).toString()); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + key, contentMap.get(key).toString());
} }
// Do nothing // Do nothing
} else if (typeName.equals(ActiveMQObjectMessage.class.getName()) || } else if (typeName.equals(ActiveMQObjectMessage.class.getName()) || typeName.equals(ActiveMQStreamMessage.class.getName()) || typeName.equals(ActiveMQMessage.class.getName())) {
typeName.equals(ActiveMQStreamMessage.class.getName()) ||
typeName.equals(ActiveMQMessage.class.getName())) {
// Unrecognized composite data. Throw exception. // Unrecognized composite data. Throw exception.
} else { } else {
throw new IllegalArgumentException("Unrecognized composite data to transform. composite type: " + typeName); throw new IllegalArgumentException("Unrecognized composite data to transform. composite type: " + typeName);
} }
// Process the JMS message header values // Process the JMS message header values
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSCorrelationID", "" + data.get("JMSCorrelationID")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSCorrelationID", "" + data.get("JMSCorrelationID"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDestination", "" + data.get("JMSDestination")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDestination", "" + data.get("JMSDestination"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSMessageID", "" + data.get("JMSMessageID")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSMessageID", "" + data.get("JMSMessageID"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSReplyTo", "" + data.get("JMSReplyTo")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSReplyTo", "" + data.get("JMSReplyTo"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSType", "" + data.get("JMSType")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSType", "" + data.get("JMSType"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDeliveryMode", "" + data.get("JMSDeliveryMode")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDeliveryMode", "" + data.get("JMSDeliveryMode"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSExpiration", "" + data.get("JMSExpiration")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSExpiration", "" + data.get("JMSExpiration"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSPriority", "" + data.get("JMSPriority")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSPriority", "" + data.get("JMSPriority"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSRedelivered", "" + data.get("JMSRedelivered")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSRedelivered", "" + data.get("JMSRedelivered"));
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSTimestamp", "" + data.get("JMSTimestamp")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSTimestamp", "" + data.get("JMSTimestamp"));
// Process the JMS custom message properties // Process the JMS custom message properties
props.setProperty(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + "Properties", "" + data.get("Properties")); props.setProperty(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + "Properties", "" + data.get("Properties"));

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,36 +16,39 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import javax.management.remote.JMXConnector; import java.io.IOException;
import javax.management.remote.JMXServiceURL; import java.net.MalformedURLException;
import javax.management.remote.JMXConnectorFactory; import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.management.MBeanServerConnection; import javax.management.MBeanServerConnection;
import javax.management.ObjectName; import javax.management.ObjectName;
import javax.management.openmbean.CompositeData; import javax.management.openmbean.CompositeData;
import java.net.MalformedURLException; import javax.management.remote.JMXConnector;
import java.util.List; import javax.management.remote.JMXConnectorFactory;
import java.util.Iterator; import javax.management.remote.JMXServiceURL;
import java.util.Arrays;
import java.io.IOException;
public class MessagesQueryFilter extends AbstractQueryFilter { public class MessagesQueryFilter extends AbstractQueryFilter {
private JMXServiceURL jmxServiceUrl; private JMXServiceURL jmxServiceUrl;
private ObjectName destName; private ObjectName destName;
/** /**
* Create a JMS message query filter * Create a JMS message query filter
*
* @param jmxServiceUrl - JMX service URL to connect to * @param jmxServiceUrl - JMX service URL to connect to
* @param destName - object name query to retrieve the destination * @param destName - object name query to retrieve the destination
*/ */
public MessagesQueryFilter(JMXServiceURL jmxServiceUrl, ObjectName destName) { public MessagesQueryFilter(JMXServiceURL jmxServiceUrl, ObjectName destName) {
super(null); super(null);
this.jmxServiceUrl = jmxServiceUrl; this.jmxServiceUrl = jmxServiceUrl;
this.destName = destName; this.destName = destName;
} }
/** /**
* Queries the specified destination using the message selector format query * Queries the specified destination using the message selector format query
*
* @param queries - message selector queries * @param queries - message selector queries
* @return list messages that matches the selector * @return list messages that matches the selector
* @throws Exception * @throws Exception
@ -55,12 +57,12 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
String selector = ""; String selector = "";
// Convert to message selector // Convert to message selector
for (Iterator i=queries.iterator(); i.hasNext();) { for (Iterator i = queries.iterator(); i.hasNext();) {
selector = selector + "(" + i.next().toString() + ") AND "; selector = selector + "(" + i.next().toString() + ") AND ";
} }
// Remove last AND // Remove last AND
if (selector != "") { if (!selector.equals("")) {
selector = selector.substring(0, selector.length() - 5); selector = selector.substring(0, selector.length() - 5);
} }
@ -69,6 +71,7 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Query the messages of a queue destination using JMX * Query the messages of a queue destination using JMX
*
* @param selector - message selector * @param selector - message selector
* @return list of messages that matches the selector * @return list of messages that matches the selector
* @throws Exception * @throws Exception
@ -84,6 +87,7 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Get the JMX service URL the query is connecting to. * Get the JMX service URL the query is connecting to.
*
* @return JMX service URL * @return JMX service URL
*/ */
public JMXServiceURL getJmxServiceUrl() { public JMXServiceURL getJmxServiceUrl() {
@ -92,6 +96,7 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Sets the JMX service URL the query is going to connect to. * Sets the JMX service URL the query is going to connect to.
*
* @param jmxServiceUrl - new JMX service URL * @param jmxServiceUrl - new JMX service URL
*/ */
public void setJmxServiceUrl(JMXServiceURL jmxServiceUrl) { public void setJmxServiceUrl(JMXServiceURL jmxServiceUrl) {
@ -100,6 +105,7 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Sets the JMX service URL the query is going to connect to. * Sets the JMX service URL the query is going to connect to.
*
* @param jmxServiceUrl - new JMX service URL * @param jmxServiceUrl - new JMX service URL
*/ */
public void setJmxServiceUrl(String jmxServiceUrl) throws MalformedURLException { public void setJmxServiceUrl(String jmxServiceUrl) throws MalformedURLException {
@ -108,6 +114,7 @@ public class MessagesQueryFilter extends AbstractQueryFilter {
/** /**
* Creates a JMX connector * Creates a JMX connector
*
* @return JMX connector * @return JMX connector
* @throws java.io.IOException * @throws java.io.IOException
*/ */

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,13 +16,13 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set;
public class PropertiesViewFilter implements QueryFilter { public class PropertiesViewFilter implements QueryFilter {
protected QueryFilter next; protected QueryFilter next;
@ -31,6 +30,7 @@ public class PropertiesViewFilter implements QueryFilter {
/** /**
* Creates a filter that will select the properties of a map object to view * Creates a filter that will select the properties of a map object to view
*
* @param next - the next query filter that will return a collection of maps * @param next - the next query filter that will return a collection of maps
*/ */
public PropertiesViewFilter(QueryFilter next) { public PropertiesViewFilter(QueryFilter next) {
@ -39,6 +39,7 @@ public class PropertiesViewFilter implements QueryFilter {
/** /**
* Creates a filter that will select the properties of a map object to view * Creates a filter that will select the properties of a map object to view
*
* @param viewFilter - the properties to view * @param viewFilter - the properties to view
* @param next - the next query filter that will return a collection of maps * @param next - the next query filter that will return a collection of maps
*/ */
@ -49,35 +50,38 @@ public class PropertiesViewFilter implements QueryFilter {
/** /**
* Filter the properties to view of the query result * Filter the properties to view of the query result
*
* @param query - the query string * @param query - the query string
* @return list of objects that has been view filtered * @return list of objects that has been view filtered
*/ */
public List query(String query) throws Exception { public List<Map<Object, Object>> query(String query) throws Exception {
return filterViewCollection(next.query(query), viewFilter); return filterViewCollection(next.query(query), viewFilter);
} }
/** /**
* Filter the properties to view of the query result * Filter the properties to view of the query result
*
* @param queries - the query map * @param queries - the query map
* @return list of objects that has been view filtered * @return list of objects that has been view filtered
* @throws Exception * @throws Exception
*/ */
public List query(List queries) throws Exception { public List<Map<Object, Object>> query(List queries) throws Exception {
return filterViewCollection(next.query(queries), viewFilter); return filterViewCollection(next.query(queries), viewFilter);
} }
/** /**
* Filter the view of each element in the collection * Filter the view of each element in the collection
*
* @param result - the lists to filter the view from * @param result - the lists to filter the view from
* @param viewFilter - the views to select * @param viewFilter - the views to select
* @return lsit of objects whose view has been filtered * @return list of objects whose view has been filtered
*/ */
protected List filterViewCollection(Collection result, Set viewFilter) { protected List<Map<Object, Object>> filterViewCollection(Collection<Map<Object, Object>> result, Set viewFilter) {
// Use a list to allow duplicate entries // Use a list to allow duplicate entries
List newCollection = new ArrayList(); List<Map<Object, Object>> newCollection = new ArrayList<Map<Object, Object>>();
for (Iterator i=result.iterator(); i.hasNext();) { for (Iterator<Map<Object, Object>> i = result.iterator(); i.hasNext();) {
newCollection.add(filterView((Map)i.next())); newCollection.add(filterView(i.next()));
} }
return newCollection; return newCollection;
@ -85,26 +89,27 @@ public class PropertiesViewFilter implements QueryFilter {
/** /**
* Select only the attributes to view from the map data * Select only the attributes to view from the map data
*
* @param data - data to filter the view from * @param data - data to filter the view from
* @return - data with the view filtered * @return - data with the view filtered
*/ */
protected Map filterView(Map data) { protected Map<Object, Object> filterView(Map<Object, Object> data) {
// If no view specified, display all attributes // If no view specified, display all attributes
if (viewFilter == null || viewFilter.isEmpty()) { if (viewFilter == null || viewFilter.isEmpty()) {
return data; return data;
} }
Map newData; Map<Object, Object> newData;
try { try {
// Lets try to use the same class as the original // Lets try to use the same class as the original
newData = (Map)data.getClass().newInstance(); newData = data.getClass().newInstance();
} catch (Exception e) { } catch (Exception e) {
// Lets use a default HashMap // Lets use a default HashMap
newData = new HashMap(); newData = new HashMap<Object, Object>();
} }
// Filter the keys to view // Filter the keys to view
for (Iterator i=viewFilter.iterator(); i.hasNext();) { for (Iterator i = viewFilter.iterator(); i.hasNext();) {
Object key = i.next(); Object key = i.next();
Object val = data.get(key); Object val = data.get(key);

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -18,9 +17,11 @@
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.List; import java.util.List;
import java.util.Map;
public interface QueryFilter { public interface QueryFilter {
public static final String QUERY_DELIMETER = ",";
String QUERY_DELIMETER = ",";
/** /**
* Interface for querying * Interface for querying
@ -28,7 +29,7 @@ public interface QueryFilter {
* @return collection of objects that satisfies the query * @return collection of objects that satisfies the query
* @throws Exception * @throws Exception
*/ */
public List query(String queryStr) throws Exception; List query(String queryStr) throws Exception;
/** /**
* Interface for querying * Interface for querying
@ -36,5 +37,5 @@ public interface QueryFilter {
* @return collection of objects that satisfies the query * @return collection of objects that satisfies the query
* @throws Exception * @throws Exception
*/ */
public List query(List queries) throws Exception; List query(List queries) throws Exception;
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,18 +16,20 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.regex.Pattern; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.Iterator;
public abstract class RegExQueryFilter extends AbstractQueryFilter { public abstract class RegExQueryFilter extends AbstractQueryFilter {
public static final String REGEX_PREFIX = "REGEX:QUERY:"; public static final String REGEX_PREFIX = "REGEX:QUERY:";
/** /**
* Creates a regular expression query that is able to match an object using key-value pattern regex filtering * Creates a regular expression query that is able to match an object using
* key-value pattern regex filtering
*
* @param next * @param next
*/ */
protected RegExQueryFilter(QueryFilter next) { protected RegExQueryFilter(QueryFilter next) {
@ -36,8 +37,10 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Separates the regular expressions queries from the usual queries. A query is a regex query, if it is key-value pair * Separates the regular expressions queries from the usual queries. A query
* with the format <key>=<value>, and value is a pattern that satisfies the isRegularExpression method. * is a regex query, if it is key-value pair with the format <key>=<value>,
* and value is a pattern that satisfies the isRegularExpression method.
*
* @param queries - list of queries * @param queries - list of queries
* @return filtered objects that matches the regex query * @return filtered objects that matches the regex query
* @throws Exception * @throws Exception
@ -47,7 +50,7 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
List newQueries = new ArrayList(); List newQueries = new ArrayList();
// Lets parse for regular expression queries // Lets parse for regular expression queries
for (Iterator i=queries.iterator(); i.hasNext();) { for (Iterator i = queries.iterator(); i.hasNext();) {
// Get key-value pair // Get key-value pair
String token = (String)i.next(); String token = (String)i.next();
String key = ""; String key = "";
@ -58,11 +61,12 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
key = token.substring(0, pos); key = token.substring(0, pos);
} }
// Add the regex query to list and make it a non-factor in the succeeding queries // Add the regex query to list and make it a non-factor in the
// succeeding queries
if (isRegularExpression(val)) { if (isRegularExpression(val)) {
regex.put(key, compileQuery(val)); regex.put(key, compileQuery(val));
// Add the normal query to the query list // Add the normal query to the query list
} else { } else {
newQueries.add(token); newQueries.add(token);
} }
@ -73,8 +77,10 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
} }
/** /**
* Checks if a given string is a regular expression query. Currently, a pattern is a regex query, if it starts with * Checks if a given string is a regular expression query. Currently, a
* the RegExQueryFilter.REGEX_PREFIX. * pattern is a regex query, if it starts with the
* RegExQueryFilter.REGEX_PREFIX.
*
* @param query * @param query
* @return * @return
*/ */
@ -84,6 +90,7 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
/** /**
* Compiles the regex query to a pattern. * Compiles the regex query to a pattern.
*
* @param query - query string to compile * @param query - query string to compile
* @return regex pattern * @return regex pattern
*/ */
@ -93,6 +100,7 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
/** /**
* Filter the specified colleciton using the regex patterns extracted. * Filter the specified colleciton using the regex patterns extracted.
*
* @param regex - regex map * @param regex - regex map
* @param data - list of objects to filter * @param data - list of objects to filter
* @return filtered list of objects that matches the regex map * @return filtered list of objects that matches the regex map
@ -100,14 +108,14 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
*/ */
protected List filterCollectionUsingRegEx(Map regex, List data) throws Exception { protected List filterCollectionUsingRegEx(Map regex, List data) throws Exception {
// No regular expressions filtering needed // No regular expressions filtering needed
if (regex==null || regex.isEmpty()) { if (regex == null || regex.isEmpty()) {
return data; return data;
} }
List filteredElems = new ArrayList(); List filteredElems = new ArrayList();
// Get each data object to filter // Get each data object to filter
for (Iterator i=data.iterator(); i.hasNext();) { for (Iterator i = data.iterator(); i.hasNext();) {
Object dataElem = i.next(); Object dataElem = i.next();
// If properties of data matches all the regex pattern, add it // If properties of data matches all the regex pattern, add it
if (matches(dataElem, regex)) { if (matches(dataElem, regex)) {
@ -120,6 +128,7 @@ public abstract class RegExQueryFilter extends AbstractQueryFilter {
/** /**
* Determines how the object is to be matched to the regex map. * Determines how the object is to be matched to the regex map.
*
* @param data - object to match * @param data - object to match
* @param regex - regex map * @param regex - regex map
* @return true, if the object matches the regex map, false otherwise * @return true, if the object matches the regex map, false otherwise

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -25,7 +24,8 @@ public abstract class ResultTransformFilter implements QueryFilter {
private QueryFilter next; private QueryFilter next;
/** /**
* Contructs a query filter that transform the format of the query result * Constructs a query filter that transform the format of the query result
*
* @param next - the query filter to retrieve the results from * @param next - the query filter to retrieve the results from
*/ */
protected ResultTransformFilter(QueryFilter next) { protected ResultTransformFilter(QueryFilter next) {
@ -34,6 +34,7 @@ public abstract class ResultTransformFilter implements QueryFilter {
/** /**
* Transforms the queried results to a collection of different objects * Transforms the queried results to a collection of different objects
*
* @param query - the query string * @param query - the query string
* @return collections of transformed objects * @return collections of transformed objects
* @throws Exception * @throws Exception
@ -44,23 +45,25 @@ public abstract class ResultTransformFilter implements QueryFilter {
/** /**
* Transforms the queried results to a collection of different objects * Transforms the queried results to a collection of different objects
*
* @param queries - the query map * @param queries - the query map
* @return collections of transformed objects * @return collections of transformed objects
* @throws Exception * @throws Exception
*/ */
public List query(List queries) throws Exception { public List<Object> query(List queries) throws Exception {
return transformList(next.query(queries)); return transformList(next.query(queries));
} }
/** /**
* Transforms a collection to a collection of different objects. * Transforms a collection to a collection of different objects.
*
* @param result - the collection to transform * @param result - the collection to transform
* @return collection of properties objects * @return collection of properties objects
*/ */
protected List transformList(List result) throws Exception { protected List<Object> transformList(List<Object> result) throws Exception {
List props = new ArrayList(); List<Object> props = new ArrayList<Object>();
for (Iterator i=result.iterator(); i.hasNext();) { for (Iterator<Object> i = result.iterator(); i.hasNext();) {
props.add(transformElement(i.next())); props.add(transformElement(i.next()));
} }
@ -69,6 +72,7 @@ public abstract class ResultTransformFilter implements QueryFilter {
/** /**
* Transform a result object * Transform a result object
*
* @param obj - the object instance to transform * @param obj - the object instance to transform
* @return the transformed object * @return the transformed object
*/ */

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -19,11 +18,13 @@ package org.apache.activemq.console.filter;
import java.util.List; import java.util.List;
public class StubQueryFilter implements QueryFilter{ public class StubQueryFilter implements QueryFilter {
private List data; private List data;
/** /**
* Creates a stub query that returns the given collections as the query result * Creates a stub query that returns the given collections as the query
* result
*
* @param data - the stub query result * @param data - the stub query result
*/ */
public StubQueryFilter(List data) { public StubQueryFilter(List data) {
@ -32,6 +33,7 @@ public class StubQueryFilter implements QueryFilter{
/** /**
* Returns the provided stub data as a stub query result * Returns the provided stub data as a stub query result
*
* @param queryStr - not use * @param queryStr - not use
* @return the stub query result * @return the stub query result
* @throws Exception * @throws Exception
@ -42,6 +44,7 @@ public class StubQueryFilter implements QueryFilter{
/** /**
* Returns the provided stub data as a stub query result * Returns the provided stub data as a stub query result
*
* @param queries - not use * @param queries - not use
* @return the stub query result * @return the stub query result
* @throws Exception * @throws Exception

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,9 +16,11 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
public class WildcardToMsgSelectorTransformFilter extends WildcardTransformFilter{ public class WildcardToMsgSelectorTransformFilter extends WildcardTransformFilter {
/** /**
* Creates a filter that is able to transform a wildcard query to a message selector format * Creates a filter that is able to transform a wildcard query to a message
* selector format
*
* @param next - next query filter * @param next - next query filter
*/ */
public WildcardToMsgSelectorTransformFilter(QueryFilter next) { public WildcardToMsgSelectorTransformFilter(QueryFilter next) {
@ -27,8 +28,10 @@ public class WildcardToMsgSelectorTransformFilter extends WildcardTransformFilte
} }
/** /**
* Use to determine if a query string is a wildcard query. A query string is a wildcard query if it is a key-value * Use to determine if a query string is a wildcard query. A query string is
* pair with the format <key>=<value> and the value is enclosed in '' and contains '*' and '?'. * a wildcard query if it is a key-value pair with the format <key>=<value>
* and the value is enclosed in '' and contains '*' and '?'.
*
* @param query - query string * @param query - query string
* @return true, if the query string is a wildcard query, false otherwise * @return true, if the query string is a wildcard query, false otherwise
*/ */
@ -47,6 +50,7 @@ public class WildcardToMsgSelectorTransformFilter extends WildcardTransformFilte
/** /**
* Transform a wildcard query to message selector format * Transform a wildcard query to message selector format
*
* @param query - query string to transform * @param query - query string to transform
* @return message selector format string * @return message selector format string
*/ */

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -19,7 +18,9 @@ package org.apache.activemq.console.filter;
public class WildcardToRegExTransformFilter extends WildcardTransformFilter { public class WildcardToRegExTransformFilter extends WildcardTransformFilter {
/** /**
* Creates a filter that is able to transform a wildcard query to a regular expression query string * Creates a filter that is able to transform a wildcard query to a regular
* expression query string
*
* @param next - next query filter * @param next - next query filter
*/ */
public WildcardToRegExTransformFilter(RegExQueryFilter next) { public WildcardToRegExTransformFilter(RegExQueryFilter next) {
@ -27,8 +28,10 @@ public class WildcardToRegExTransformFilter extends WildcardTransformFilter {
} }
/** /**
* Use to determine if a query string is a wildcard query. A query string is a wildcard query if it is a key-value * Use to determine if a query string is a wildcard query. A query string is
* pair with the format <key>=<value> and the value contains '*' and '?'. * a wildcard query if it is a key-value pair with the format <key>=<value>
* and the value contains '*' and '?'.
*
* @param query - query string * @param query - query string
* @return true, if the query string is a wildcard query, false otherwise * @return true, if the query string is a wildcard query, false otherwise
*/ */
@ -42,11 +45,12 @@ public class WildcardToRegExTransformFilter extends WildcardTransformFilter {
} }
// If the value contains wildcards // If the value contains wildcards
return ((val.indexOf("*") >= 0) || (val.indexOf("?") >= 0)); return (val.indexOf("*") >= 0) || (val.indexOf("?") >= 0);
} }
/** /**
* Transform a wildcard query to regular expression format * Transform a wildcard query to regular expression format
*
* @param query - query string to transform * @param query - query string to transform
* @return regex query string * @return regex query string
*/ */
@ -60,11 +64,14 @@ public class WildcardToRegExTransformFilter extends WildcardTransformFilter {
key = key.substring(0, pos); key = key.substring(0, pos);
} }
val = val.replaceAll("[.]", "\\\\."); // Escape all dot characters. From (.) to (\.) val = val.replaceAll("[.]", "\\\\."); // Escape all dot characters.
val = val.replaceAll("[?]", "."); // Match single characters // From (.) to (\.)
val = val.replaceAll("[*]", ".*?"); // Match all characters, use reluctant quantifier val = val.replaceAll("[?]", "."); // Match single characters
val = "(" + val +")"; // Let's group the query for clarity val = val.replaceAll("[*]", ".*?"); // Match all characters, use
val = RegExQueryFilter.REGEX_PREFIX + val; // Flag as a regular expression query // reluctant quantifier
val = "(" + val + ")"; // Let's group the query for clarity
val = RegExQueryFilter.REGEX_PREFIX + val; // Flag as a regular
// expression query
return key + "=" + val; return key + "=" + val;
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,15 +16,17 @@
*/ */
package org.apache.activemq.console.filter; package org.apache.activemq.console.filter;
import java.util.Iterator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
public abstract class WildcardTransformFilter extends AbstractQueryFilter { public abstract class WildcardTransformFilter extends AbstractQueryFilter {
/** /**
* Creates a wildcard transform filter that is able to convert a wildcard expression (determined by isWildcardQuery) * Creates a wildcard transform filter that is able to convert a wildcard
* to a another query type (use transformWildcardQuery). * expression (determined by isWildcardQuery) to a another query type (use
* transformWildcardQuery).
*
* @param next - the next query filter * @param next - the next query filter
*/ */
protected WildcardTransformFilter(QueryFilter next) { protected WildcardTransformFilter(QueryFilter next) {
@ -34,6 +35,7 @@ public abstract class WildcardTransformFilter extends AbstractQueryFilter {
/** /**
* Converts the query list to set of different queries * Converts the query list to set of different queries
*
* @param queries - query list to transform * @param queries - query list to transform
* @return - result of the query * @return - result of the query
* @throws Exception * @throws Exception
@ -41,7 +43,7 @@ public abstract class WildcardTransformFilter extends AbstractQueryFilter {
public List query(List queries) throws Exception { public List query(List queries) throws Exception {
List newQueries = new ArrayList(); List newQueries = new ArrayList();
for (Iterator i=queries.iterator(); i.hasNext();) { for (Iterator i = queries.iterator(); i.hasNext();) {
String queryToken = (String)i.next(); String queryToken = (String)i.next();
// Transform the wildcard query // Transform the wildcard query
@ -49,7 +51,7 @@ public abstract class WildcardTransformFilter extends AbstractQueryFilter {
// Transform the value part only // Transform the value part only
newQueries.add(transformWildcardQuery(queryToken)); newQueries.add(transformWildcardQuery(queryToken));
// Maintain the query as is // Maintain the query as is
} else { } else {
newQueries.add(queryToken); newQueries.add(queryToken);
} }
@ -60,6 +62,7 @@ public abstract class WildcardTransformFilter extends AbstractQueryFilter {
/** /**
* Use to determine is a query string is a wildcard query * Use to determine is a query string is a wildcard query
*
* @param query - query string * @param query - query string
* @return true, if the query string is a wildcard query, false otherwise * @return true, if the query string is a wildcard query, false otherwise
*/ */
@ -67,6 +70,7 @@ public abstract class WildcardTransformFilter extends AbstractQueryFilter {
/** /**
* Use to transform a wildcard query string to another query format * Use to transform a wildcard query string to another query format
*
* @param query - query string to transform * @param query - query string to transform
* @return transformed query * @return transformed query
*/ */

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,16 +16,17 @@
*/ */
package org.apache.activemq.console.formatter; package org.apache.activemq.console.formatter;
import javax.management.ObjectInstance; import java.io.OutputStream;
import javax.management.ObjectName; import java.io.PrintStream;
import javax.management.AttributeList;
import javax.management.Attribute;
import javax.jms.Message;
import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.io.PrintStream; import java.util.Map;
import java.io.OutputStream;
import javax.jms.Message;
import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
public class CommandShellOutputFormatter implements OutputFormatter { public class CommandShellOutputFormatter implements OutputFormatter {
private OutputStream outputStream; private OutputStream outputStream;
@ -44,6 +44,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Retrieve the output stream being used by the formatter * Retrieve the output stream being used by the formatter
*
* @return * @return
*/ */
public OutputStream getOutputStream() { public OutputStream getOutputStream() {
@ -52,6 +53,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print an ObjectInstance format of an mbean * Print an ObjectInstance format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(ObjectInstance mbean) { public void printMBean(ObjectInstance mbean) {
@ -60,6 +62,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print an ObjectName format of an mbean * Print an ObjectName format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(ObjectName mbean) { public void printMBean(ObjectName mbean) {
@ -68,10 +71,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print an AttributeList format of an mbean * Print an AttributeList format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(AttributeList mbean) { public void printMBean(AttributeList mbean) {
for (Iterator i=mbean.iterator(); i.hasNext();) { for (Iterator i = mbean.iterator(); i.hasNext();) {
Attribute attrib = (Attribute)i.next(); Attribute attrib = (Attribute)i.next();
if (attrib.getValue() instanceof ObjectName) { if (attrib.getValue() instanceof ObjectName) {
printMBean((ObjectName)attrib.getValue()); printMBean((ObjectName)attrib.getValue());
@ -86,10 +90,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a Map format of an mbean * Print a Map format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(Map mbean) { public void printMBean(Map mbean) {
for (Iterator i=mbean.keySet().iterator(); i.hasNext();) { for (Iterator i = mbean.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
String val = mbean.get(key).toString(); String val = mbean.get(key).toString();
out.println(key + " = " + val); out.println(key + " = " + val);
@ -99,10 +104,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a collection of mbean * Print a collection of mbean
*
* @param mbean - collection of mbeans * @param mbean - collection of mbeans
*/ */
public void printMBean(Collection mbean) { public void printMBean(Collection mbean) {
for (Iterator i=mbean.iterator(); i.hasNext();) { for (Iterator i = mbean.iterator(); i.hasNext();) {
Object obj = i.next(); Object obj = i.next();
if (obj instanceof ObjectInstance) { if (obj instanceof ObjectInstance) {
printMBean((ObjectInstance)obj); printMBean((ObjectInstance)obj);
@ -122,10 +128,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a Map format of a JMS message * Print a Map format of a JMS message
*
* @param msg * @param msg
*/ */
public void printMessage(Map msg) { public void printMessage(Map msg) {
for (Iterator i=msg.keySet().iterator(); i.hasNext();) { for (Iterator i = msg.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
String val = msg.get(key).toString(); String val = msg.get(key).toString();
out.println(key + " = " + val); out.println(key + " = " + val);
@ -135,6 +142,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a Message format of a JMS message * Print a Message format of a JMS message
*
* @param msg - JMS message to print * @param msg - JMS message to print
*/ */
public void printMessage(Message msg) { public void printMessage(Message msg) {
@ -143,10 +151,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a collection of JMS messages * Print a collection of JMS messages
*
* @param msg - collection of JMS messages * @param msg - collection of JMS messages
*/ */
public void printMessage(Collection msg) { public void printMessage(Collection msg) {
for (Iterator i=msg.iterator(); i.hasNext();) { for (Iterator i = msg.iterator(); i.hasNext();) {
Object obj = i.next(); Object obj = i.next();
if (obj instanceof Message) { if (obj instanceof Message) {
printMessage((Message)obj); printMessage((Message)obj);
@ -162,10 +171,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print help messages * Print help messages
*
* @param helpMsgs - help messages to print * @param helpMsgs - help messages to print
*/ */
public void printHelp(String[] helpMsgs) { public void printHelp(String[] helpMsgs) {
for (int i=0; i<helpMsgs.length; i++) { for (int i = 0; i < helpMsgs.length; i++) {
out.println(helpMsgs[i]); out.println(helpMsgs[i]);
} }
out.println(); out.println();
@ -173,6 +183,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print an information message * Print an information message
*
* @param info - information message to print * @param info - information message to print
*/ */
public void printInfo(String info) { public void printInfo(String info) {
@ -181,6 +192,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print an exception message * Print an exception message
*
* @param e - exception to print * @param e - exception to print
*/ */
public void printException(Exception e) { public void printException(Exception e) {
@ -190,6 +202,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a version information * Print a version information
*
* @param version - version info to print * @param version - version info to print
*/ */
public void printVersion(String version) { public void printVersion(String version) {
@ -201,10 +214,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a generic key value mapping * Print a generic key value mapping
*
* @param map to print * @param map to print
*/ */
public void print(Map map) { public void print(Map map) {
for (Iterator i=map.keySet().iterator(); i.hasNext();) { for (Iterator i = map.keySet().iterator(); i.hasNext();) {
String key = (String)i.next(); String key = (String)i.next();
String val = map.get(key).toString(); String val = map.get(key).toString();
out.println(key + " = " + val); out.println(key + " = " + val);
@ -214,10 +228,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a generic array of strings * Print a generic array of strings
*
* @param strings - string array to print * @param strings - string array to print
*/ */
public void print(String[] strings) { public void print(String[] strings) {
for (int i=0; i<strings.length; i++) { for (int i = 0; i < strings.length; i++) {
out.println(strings[i]); out.println(strings[i]);
} }
out.println(); out.println();
@ -225,10 +240,11 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a collection of objects * Print a collection of objects
*
* @param collection - collection to print * @param collection - collection to print
*/ */
public void print(Collection collection) { public void print(Collection collection) {
for (Iterator i=collection.iterator(); i.hasNext();) { for (Iterator i = collection.iterator(); i.hasNext();) {
out.println(i.next().toString()); out.println(i.next().toString());
} }
out.println(); out.println();
@ -236,6 +252,7 @@ public class CommandShellOutputFormatter implements OutputFormatter {
/** /**
* Print a java string * Print a java string
*
* @param string - string to print * @param string - string to print
*/ */
public void print(String string) { public void print(String string) {

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,15 +16,16 @@
*/ */
package org.apache.activemq.console.formatter; package org.apache.activemq.console.formatter;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Map;
import javax.jms.Message;
import javax.management.AttributeList;
import javax.management.ObjectInstance; import javax.management.ObjectInstance;
import javax.management.ObjectName; import javax.management.ObjectName;
import javax.management.AttributeList;
import javax.jms.Message;
import java.util.Map;
import java.util.Collection;
import java.io.OutputStream;
public class GlobalWriter { public final class GlobalWriter {
private static OutputFormatter formatter; private static OutputFormatter formatter;
/** /**
@ -36,14 +36,16 @@ public class GlobalWriter {
/** /**
* Maintains a global output formatter * Maintains a global output formatter
*
* @param formatter - the output formatter to use * @param formatter - the output formatter to use
*/ */
public static void instantiate(OutputFormatter formatter) { public static void instantiate(OutputFormatter formatter) {
GlobalWriter.formatter = formatter; GlobalWriter.formatter = formatter;
} }
/** /**
* Retrieve the output stream being used by the global formatter * Retrieve the output stream being used by the global formatter
*
* @return * @return
*/ */
public static OutputStream getOutputStream() { public static OutputStream getOutputStream() {
@ -55,6 +57,7 @@ public class GlobalWriter {
/** /**
* Print an ObjectInstance format of an mbean * Print an ObjectInstance format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public static void printMBean(ObjectInstance mbean) { public static void printMBean(ObjectInstance mbean) {
@ -66,6 +69,7 @@ public class GlobalWriter {
/** /**
* Print an ObjectName format of an mbean * Print an ObjectName format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public static void printMBean(ObjectName mbean) { public static void printMBean(ObjectName mbean) {
@ -77,6 +81,7 @@ public class GlobalWriter {
/** /**
* Print an AttributeList format of an mbean * Print an AttributeList format of an mbean
*
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public static void printMBean(AttributeList mbean) { public static void printMBean(AttributeList mbean) {
@ -88,6 +93,7 @@ public class GlobalWriter {
/** /**
* Print a Map format of an mbean * Print a Map format of an mbean
*
* @param mbean * @param mbean
*/ */
public static void printMBean(Map mbean) { public static void printMBean(Map mbean) {
@ -99,6 +105,7 @@ public class GlobalWriter {
/** /**
* Print a Collection format of mbeans * Print a Collection format of mbeans
*
* @param mbean - collection of mbeans * @param mbean - collection of mbeans
*/ */
public static void printMBean(Collection mbean) { public static void printMBean(Collection mbean) {
@ -110,6 +117,7 @@ public class GlobalWriter {
/** /**
* Print a Map format of a JMS message * Print a Map format of a JMS message
*
* @param msg * @param msg
*/ */
public static void printMessage(Map msg) { public static void printMessage(Map msg) {
@ -121,6 +129,7 @@ public class GlobalWriter {
/** /**
* Print a Message format of a JMS message * Print a Message format of a JMS message
*
* @param msg - JMS message to print * @param msg - JMS message to print
*/ */
public static void printMessage(Message msg) { public static void printMessage(Message msg) {
@ -132,6 +141,7 @@ public class GlobalWriter {
/** /**
* Print a collection of JMS messages * Print a collection of JMS messages
*
* @param msg - collection of JMS messages * @param msg - collection of JMS messages
*/ */
public static void printMessage(Collection msg) { public static void printMessage(Collection msg) {
@ -143,6 +153,7 @@ public class GlobalWriter {
/** /**
* Print help messages * Print help messages
*
* @param helpMsgs - help messages to print * @param helpMsgs - help messages to print
*/ */
public static void printHelp(String[] helpMsgs) { public static void printHelp(String[] helpMsgs) {
@ -154,6 +165,7 @@ public class GlobalWriter {
/** /**
* Print an information message * Print an information message
*
* @param info - information message to print * @param info - information message to print
*/ */
public static void printInfo(String info) { public static void printInfo(String info) {
@ -165,6 +177,7 @@ public class GlobalWriter {
/** /**
* Print an exception message * Print an exception message
*
* @param e - exception to print * @param e - exception to print
*/ */
public static void printException(Exception e) { public static void printException(Exception e) {
@ -176,6 +189,7 @@ public class GlobalWriter {
/** /**
* Print a version information * Print a version information
*
* @param version - version info to print * @param version - version info to print
*/ */
public static void printVersion(String version) { public static void printVersion(String version) {
@ -187,6 +201,7 @@ public class GlobalWriter {
/** /**
* Print a generic key value mapping * Print a generic key value mapping
*
* @param map to print * @param map to print
*/ */
public static void print(Map map) { public static void print(Map map) {
@ -198,6 +213,7 @@ public class GlobalWriter {
/** /**
* Print a generic array of strings * Print a generic array of strings
*
* @param strings - string array to print * @param strings - string array to print
*/ */
public static void print(String[] strings) { public static void print(String[] strings) {
@ -209,6 +225,7 @@ public class GlobalWriter {
/** /**
* Print a collection of objects * Print a collection of objects
*
* @param collection - collection to print * @param collection - collection to print
*/ */
public static void print(Collection collection) { public static void print(Collection collection) {
@ -220,6 +237,7 @@ public class GlobalWriter {
/** /**
* Print a java string * Print a java string
*
* @param string - string to print * @param string - string to print
*/ */
public static void print(String string) { public static void print(String string) {

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,115 +16,116 @@
*/ */
package org.apache.activemq.console.formatter; package org.apache.activemq.console.formatter;
import javax.management.ObjectInstance; import java.io.OutputStream;
import javax.management.ObjectName;
import javax.management.AttributeList;
import javax.jms.Message;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.io.OutputStream;
public interface OutputFormatter { import javax.jms.Message;
import javax.management.AttributeList;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
interface OutputFormatter {
/** /**
* Retrieve the output stream being used by the formatter * Retrieve the output stream being used by the formatter
* @return * @return
*/ */
public OutputStream getOutputStream(); OutputStream getOutputStream();
/** /**
* Print an ObjectInstance format of an mbean * Print an ObjectInstance format of an mbean
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(ObjectInstance mbean); void printMBean(ObjectInstance mbean);
/** /**
* Print an ObjectName format of an mbean * Print an ObjectName format of an mbean
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(ObjectName mbean); void printMBean(ObjectName mbean);
/** /**
* Print an AttributeList format of an mbean * Print an AttributeList format of an mbean
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(AttributeList mbean); void printMBean(AttributeList mbean);
/** /**
* Print a Map format of an mbean * Print a Map format of an mbean
* @param mbean - mbean to print * @param mbean - mbean to print
*/ */
public void printMBean(Map mbean); void printMBean(Map mbean);
/** /**
* Print a Collection format of mbeans * Print a Collection format of mbeans
* @param mbean - collection of mbeans * @param mbean - collection of mbeans
*/ */
public void printMBean(Collection mbean); void printMBean(Collection mbean);
/** /**
* Print a Map format of a JMS message * Print a Map format of a JMS message
* @param msg * @param msg
*/ */
public void printMessage(Map msg); void printMessage(Map msg);
/** /**
* Print a Message format of a JMS message * Print a Message format of a JMS message
* @param msg - JMS message to print * @param msg - JMS message to print
*/ */
public void printMessage(Message msg); void printMessage(Message msg);
/** /**
* Print a Collection format of JMS messages * Print a Collection format of JMS messages
* @param msg - collection of JMS messages * @param msg - collection of JMS messages
*/ */
public void printMessage(Collection msg); void printMessage(Collection msg);
/** /**
* Print help messages * Print help messages
* @param helpMsgs - help messages to print * @param helpMsgs - help messages to print
*/ */
public void printHelp(String[] helpMsgs); void printHelp(String[] helpMsgs);
/** /**
* Print an information message * Print an information message
* @param info - information message to print * @param info - information message to print
*/ */
public void printInfo(String info); void printInfo(String info);
/** /**
* Print an exception message * Print an exception message
* @param e - exception to print * @param e - exception to print
*/ */
public void printException(Exception e); void printException(Exception e);
/** /**
* Print a version information * Print a version information
* @param version - version info to print * @param version - version info to print
*/ */
public void printVersion(String version); void printVersion(String version);
/** /**
* Print a generic key value mapping * Print a generic key value mapping
* @param map to print * @param map to print
*/ */
public void print(Map map); void print(Map map);
/** /**
* Print a generic array of strings * Print a generic array of strings
* @param strings - string array to print * @param strings - string array to print
*/ */
public void print(String[] strings); void print(String[] strings);
/** /**
* Print a collection of objects * Print a collection of objects
* @param collection - collection to print * @param collection - collection to print
*/ */
public void print(Collection collection); void print(Collection collection);
/** /**
* Print a java string * Print a java string
* @param string - string to print * @param string - string to print
*/ */
public void print(String string); void print(String string);
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,26 +16,31 @@
*/ */
package org.apache.activemq.console.util; package org.apache.activemq.console.util;
import org.apache.activemq.console.filter.QueryFilter;
import org.apache.activemq.console.filter.WildcardToMsgSelectorTransformFilter;
import org.apache.activemq.console.filter.PropertiesViewFilter;
import org.apache.activemq.console.filter.StubQueryFilter;
import org.apache.activemq.console.filter.MapTransformFilter;
import org.apache.activemq.console.filter.GroupPropertiesViewFilter;
import org.apache.activemq.console.filter.AmqMessagesQueryFilter;
import javax.jms.Destination;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
public class AmqMessagesUtil { import javax.jms.Destination;
import org.apache.activemq.console.filter.AmqMessagesQueryFilter;
import org.apache.activemq.console.filter.GroupPropertiesViewFilter;
import org.apache.activemq.console.filter.MapTransformFilter;
import org.apache.activemq.console.filter.PropertiesViewFilter;
import org.apache.activemq.console.filter.QueryFilter;
import org.apache.activemq.console.filter.StubQueryFilter;
import org.apache.activemq.console.filter.WildcardToMsgSelectorTransformFilter;
public final class AmqMessagesUtil {
public static final String JMS_MESSAGE_HEADER_PREFIX = "JMS_HEADER_FIELD:"; public static final String JMS_MESSAGE_HEADER_PREFIX = "JMS_HEADER_FIELD:";
public static final String JMS_MESSAGE_CUSTOM_PREFIX = "JMS_CUSTOM_FIELD:"; public static final String JMS_MESSAGE_CUSTOM_PREFIX = "JMS_CUSTOM_FIELD:";
public static final String JMS_MESSAGE_BODY_PREFIX = "JMS_BODY_FIELD:"; public static final String JMS_MESSAGE_BODY_PREFIX = "JMS_BODY_FIELD:";
private AmqMessagesUtil() {
}
public static List getAllMessages(URI brokerUrl, Destination dest) throws Exception { public static List getAllMessages(URI brokerUrl, Destination dest) throws Exception {
return getMessages(brokerUrl, dest, ""); return getMessages(brokerUrl, dest, "");
} }
public static List getMessages(URI brokerUrl, Destination dest, String selector) throws Exception { public static List getMessages(URI brokerUrl, Destination dest, String selector) throws Exception {
@ -48,18 +52,10 @@ public class AmqMessagesUtil {
} }
public static List filterMessagesView(List messages, Set groupViews, Set attributeViews) throws Exception { public static List filterMessagesView(List messages, Set groupViews, Set attributeViews) throws Exception {
return (new PropertiesViewFilter(attributeViews, return (new PropertiesViewFilter(attributeViews, new GroupPropertiesViewFilter(groupViews, new MapTransformFilter(new StubQueryFilter(messages))))).query("");
new GroupPropertiesViewFilter(groupViews,
new MapTransformFilter(
new StubQueryFilter(messages)
)
)
)).query("");
} }
public static QueryFilter createMessageQueryFilter(URI brokerUrl, Destination dest) { public static QueryFilter createMessageQueryFilter(URI brokerUrl, Destination dest) {
return new WildcardToMsgSelectorTransformFilter( return new WildcardToMsgSelectorTransformFilter(new AmqMessagesQueryFilter(brokerUrl, dest));
new AmqMessagesQueryFilter(brokerUrl, dest)
);
} }
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,15 +16,29 @@
*/ */
package org.apache.activemq.console.util; package org.apache.activemq.console.util;
import org.apache.activemq.console.filter.*;
import javax.management.remote.JMXServiceURL;
import javax.management.ObjectName;
import java.util.Set;
import java.util.List;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class JmxMBeansUtil { import javax.management.ObjectName;
import javax.management.remote.JMXServiceURL;
import org.apache.activemq.console.filter.GroupPropertiesViewFilter;
import org.apache.activemq.console.filter.MBeansAttributeQueryFilter;
import org.apache.activemq.console.filter.MBeansObjectNameQueryFilter;
import org.apache.activemq.console.filter.MBeansRegExQueryFilter;
import org.apache.activemq.console.filter.MapTransformFilter;
import org.apache.activemq.console.filter.MessagesQueryFilter;
import org.apache.activemq.console.filter.PropertiesViewFilter;
import org.apache.activemq.console.filter.QueryFilter;
import org.apache.activemq.console.filter.StubQueryFilter;
import org.apache.activemq.console.filter.WildcardToMsgSelectorTransformFilter;
import org.apache.activemq.console.filter.WildcardToRegExTransformFilter;
public final class JmxMBeansUtil {
private JmxMBeansUtil() {
}
public static List getAllBrokers(JMXServiceURL jmxUrl) throws Exception { public static List getAllBrokers(JMXServiceURL jmxUrl) throws Exception {
return (new MBeansObjectNameQueryFilter(jmxUrl)).query("Type=Broker"); return (new MBeansObjectNameQueryFilter(jmxUrl)).query("Type=Broker");
@ -45,10 +58,10 @@ public class JmxMBeansUtil {
public static List queryMBeans(JMXServiceURL jmxUrl, List queryList) throws Exception { public static List queryMBeans(JMXServiceURL jmxUrl, List queryList) throws Exception {
// If there is no query defined get all mbeans // If there is no query defined get all mbeans
if (queryList==null || queryList.size()==0) { if (queryList == null || queryList.size() == 0) {
return createMBeansObjectNameQuery(jmxUrl).query(""); return createMBeansObjectNameQuery(jmxUrl).query("");
// Parse through all the query strings // Parse through all the query strings
} else { } else {
return createMBeansObjectNameQuery(jmxUrl).query(queryList); return createMBeansObjectNameQuery(jmxUrl).query(queryList);
} }
@ -56,10 +69,10 @@ public class JmxMBeansUtil {
public static List queryMBeans(JMXServiceURL jmxUrl, List queryList, Set attributes) throws Exception { public static List queryMBeans(JMXServiceURL jmxUrl, List queryList, Set attributes) throws Exception {
// If there is no query defined get all mbeans // If there is no query defined get all mbeans
if (queryList==null || queryList.size()==0) { if (queryList == null || queryList.size() == 0) {
return createMBeansAttributeQuery(jmxUrl, attributes).query(""); return createMBeansAttributeQuery(jmxUrl, attributes).query("");
// Parse through all the query strings // Parse through all the query strings
} else { } else {
return createMBeansAttributeQuery(jmxUrl, attributes).query(queryList); return createMBeansAttributeQuery(jmxUrl, attributes).query(queryList);
} }
@ -74,54 +87,43 @@ public class JmxMBeansUtil {
} }
public static List filterMBeansView(List mbeans, Set viewFilter) throws Exception { public static List filterMBeansView(List mbeans, Set viewFilter) throws Exception {
return (new PropertiesViewFilter(viewFilter, new MapTransformFilter(new StubQueryFilter(mbeans))).query("")); return new PropertiesViewFilter(viewFilter, new MapTransformFilter(new StubQueryFilter(mbeans))).query("");
} }
public static String createQueryString(String query, String param) { public static String createQueryString(String query, String param) {
return query.replaceAll("%1", param); return query.replaceAll("%1", param);
} }
public static String createQueryString(String query, List params) { public static String createQueryString(String query, List params) {
String output = query; String output = query;
int count = 1; int count = 1;
for (Iterator i = params.iterator(); i.hasNext();) { for (Iterator i = params.iterator(); i.hasNext();) {
output = output.replaceAll("%" + count++, i.next().toString()); output = output.replaceAll("%" + count++, i.next().toString());
} }
return output; return output;
} }
public static QueryFilter createMBeansObjectNameQuery(JMXServiceURL jmxUrl) { public static QueryFilter createMBeansObjectNameQuery(JMXServiceURL jmxUrl) {
return new WildcardToRegExTransformFilter( // Let us be able to accept wildcard queries // Let us be able to accept wildcard queries
new MBeansRegExQueryFilter( // Use regular expressions to filter the query results // Use regular expressions to filter the query results
new MBeansObjectNameQueryFilter(jmxUrl) // Let us retrieve the mbeans object name specified by the query // Let us retrieve the mbeans object name specified by the query
) return new WildcardToRegExTransformFilter(new MBeansRegExQueryFilter(new MBeansObjectNameQueryFilter(jmxUrl)));
);
} }
public static QueryFilter createMBeansAttributeQuery(JMXServiceURL jmxUrl, Set attributes) { public static QueryFilter createMBeansAttributeQuery(JMXServiceURL jmxUrl, Set attributes) {
return new WildcardToRegExTransformFilter( // Let use be able to accept wildcard queries // Let use be able to accept wildcard queries
new MBeansRegExQueryFilter( // Use regular expressions to filter the query result // Use regular expressions to filter the query result
new MBeansAttributeQueryFilter(jmxUrl, attributes, // Retrieve the attributes needed // Retrieve the attributes needed
new MBeansObjectNameQueryFilter(jmxUrl) // Retrieve the mbeans object name specified by the query // Retrieve the mbeans object name specified by the query
) return new WildcardToRegExTransformFilter(new MBeansRegExQueryFilter(new MBeansAttributeQueryFilter(jmxUrl, attributes, new MBeansObjectNameQueryFilter(jmxUrl))));
)
);
} }
public static QueryFilter createMessageQueryFilter(JMXServiceURL jmxUrl, ObjectName destName) { public static QueryFilter createMessageQueryFilter(JMXServiceURL jmxUrl, ObjectName destName) {
return new WildcardToMsgSelectorTransformFilter( return new WildcardToMsgSelectorTransformFilter(new MessagesQueryFilter(jmxUrl, destName));
new MessagesQueryFilter(jmxUrl, destName)
);
} }
public static List filterMessagesView(List messages, Set groupViews, Set attributeViews) throws Exception { public static List filterMessagesView(List messages, Set groupViews, Set attributeViews) throws Exception {
return (new PropertiesViewFilter(attributeViews, return (new PropertiesViewFilter(attributeViews, new GroupPropertiesViewFilter(groupViews, new MapTransformFilter(new StubQueryFilter(messages))))).query("");
new GroupPropertiesViewFilter(groupViews,
new MapTransformFilter(
new StubQueryFilter(messages)
)
)
)).query("");
} }
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -17,18 +16,21 @@
*/ */
package org.apache.activemq.console.util; package org.apache.activemq.console.util;
import org.apache.activemq.broker.util.CommandMessageListener;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import org.apache.activemq.broker.util.CommandMessageListener;
/** /**
* A simple interactive console which can be used to communicate with a running broker * A simple interactive console which can be used to communicate with a running
* assuming that the classpath is fully setup * broker assuming that the classpath is fully setup
* *
* @version $Revision$ * @version $Revision$
*/ */
public class SimpleConsole { public final class SimpleConsole {
private SimpleConsole() {
}
public static void main(String[] args) { public static void main(String[] args) {
CommandMessageListener listener = new CommandMessageListener(null); CommandMessageListener listener = new CommandMessageListener(null);
@ -47,8 +49,7 @@ public class SimpleConsole {
System.out.println(listener.processCommandText(line)); System.out.println(listener.processCommandText(line));
} }
} } catch (Exception e) {
catch (Exception e) {
System.out.println("Caught: " + e); System.out.println("Caught: " + e);
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -38,34 +37,43 @@ import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQQueue;
public class Consumer { /**
*
*/
public final class Consumer {
/**
*
*/
private Consumer() {
}
public static void main(String[] args) throws JMSException, InterruptedException { public static void main(String[] args) throws JMSException, InterruptedException {
String url = "tcp://localhost:61616"; String url = "tcp://localhost:61616";
if( args.length>0 ) { if (args.length > 0) {
url = args[0]; url = args[0];
} }
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Destination destination = new ActiveMQQueue("TEST.QUEUE"); Destination destination = new ActiveMQQueue("TEST.QUEUE");
Connection connection = connectionFactory.createConnection(); Connection connection = connectionFactory.createConnection();
connection.start(); connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(destination); MessageConsumer consumer = session.createConsumer(destination);
for( ;; ) { for (;;) {
System.out.println("Waiting for message."); System.out.println("Waiting for message.");
Message message = consumer.receive(); Message message = consumer.receive();
if( message == null ) { if (message == null) {
break; break;
} }
System.out.println("Got message: " + message); System.out.println("Got message: " + message);
} }
connection.close(); connection.close();
} }
} }

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
@ -36,16 +35,20 @@ import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQQueue;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Producer { public final class Producer {
private static final Log LOG = LogFactory.getLog(Producer.class);
private Producer() {
}
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
.getLog(Producer.class);
public static void main(String[] args) throws JMSException, InterruptedException { public static void main(String[] args) throws JMSException, InterruptedException {
String url = "peer://localhost1/groupA?persistent=false"; String url = "peer://localhost1/groupA?persistent=false";
if( args.length>0 ) { if (args.length > 0) {
url = args[0]; url = args[0];
} }
@ -58,12 +61,12 @@ public class Producer {
TextMessage message = session.createTextMessage(); TextMessage message = session.createTextMessage();
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
message.setText("This is message " + (i + 1)); message.setText("This is message " + (i + 1));
log.info("Sending message: " + message.getText()); LOG.info("Sending message: " + message.getText());
producer.send(message); producer.send(message);
Thread.sleep(1000); Thread.sleep(1000);
} }
connection.close(); connection.close();
} }
} }

View File

@ -17,7 +17,6 @@
package org.apache.activemq; package org.apache.activemq;
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -25,7 +24,7 @@ package org.apache.activemq;
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

View File

@ -1,5 +1,4 @@
/** /**
*
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. * this work for additional information regarding copyright ownership.
@ -7,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with * (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at * the License. You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,

Some files were not shown because too many files have changed in this diff Show More