diff options
author | Bhupendra Bhusman Bhardwaj <bhupendrab@apache.org> | 2006-12-04 14:19:10 +0000 |
---|---|---|
committer | Bhupendra Bhusman Bhardwaj <bhupendrab@apache.org> | 2006-12-04 14:19:10 +0000 |
commit | 48f8d5571f8aa9b068203e37195b9050b368506c (patch) | |
tree | 38d067370d0ec3dcffd2cde714cb2afb28f86874 | |
parent | 32a087d3897367574cff89a0f1c04b4bfef2b694 (diff) | |
download | qpid-python-48f8d5571f8aa9b068203e37195b9050b368506c.tar.gz |
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@482181 13f79535-47bb-0310-9956-ffa450edef68
87 files changed, 7933 insertions, 0 deletions
diff --git a/java/management/eclipse-plugin/META-INF/MANIFEST.MF b/java/management/eclipse-plugin/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..e1859bbf1a --- /dev/null +++ b/java/management/eclipse-plugin/META-INF/MANIFEST.MF @@ -0,0 +1,11 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Qpid Management Console Plug-in +Bundle-SymbolicName: org.apache.qpid.management.ui; singleton:=true +Bundle-Version: 0.1.0 +Bundle-Activator: org.apache.qpid.management.ui.Activator +Bundle-Localization: plugin +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.eclipse.ui.forms +Eclipse-LazyStart: true diff --git a/java/management/eclipse-plugin/bin/qpidmc.bat b/java/management/eclipse-plugin/bin/qpidmc.bat new file mode 100644 index 0000000000..4ddb88d22c --- /dev/null +++ b/java/management/eclipse-plugin/bin/qpidmc.bat @@ -0,0 +1,55 @@ +@REM
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM
+
+@echo off
+REM Script to run the Qpid Management Console
+
+rem Guess QPIDMC_HOME if not defined
+set CURRENT_DIR=%cd%
+if not "%QPIDMC_HOME%" == "" goto gotHome
+set QPIDMC_HOME=%CURRENT_DIR%
+echo %QPIDMC_HOME%
+if exist "%QPIDMC_HOME%\bin\qpidmc.bat" goto okHome
+cd ..
+set QPIDMC_HOME=%cd%
+cd %CURRENT_DIR%
+:gotHome
+if exist "%QPIDMC_HOME%\bin\qpidmc.bat" goto okHome
+echo The QPIDMC_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+if not "%JAVA_HOME%" == "" goto gotJavaHome
+echo The JAVA_HOME environment variable is not defined
+echo This environment variable is needed to run this program
+goto exit
+:gotJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+goto okJavaHome
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program.
+goto exit
+:okJavaHome
+
+rem Slurp the command line arguments. This loop allows for an unlimited number
+rem of agruments (up to the command line limit, anyway).
+
+"%JAVA_HOME%\bin\java" -Xms40m -Xmx256m -Declipse.consoleLog=true -jar %QPIDMC_HOME%\startup.jar org.eclipse.core.launcher.Main -name "Qpid Management Console" -nosplash -application org.apache.qpid.management.ui.application -data %QPIDMC_HOME%\data -configuration "file:%QPIDMC_HOME%/configuration" -os win32 -ws win32 -arch x86
diff --git a/java/management/eclipse-plugin/build.properties b/java/management/eclipse-plugin/build.properties new file mode 100644 index 0000000000..d9eefdc502 --- /dev/null +++ b/java/management/eclipse-plugin/build.properties @@ -0,0 +1,8 @@ +source.. = src/main/java/ +output.. = target/classes/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + icons/,\ + plugin.properties,\ + splash.bmp diff --git a/java/management/eclipse-plugin/build.xml b/java/management/eclipse-plugin/build.xml new file mode 100644 index 0000000000..ae102d1e72 --- /dev/null +++ b/java/management/eclipse-plugin/build.xml @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="org.apache.qpid.management.ui" default="build.update.jar" basedir="."> + + <property name="basews" value="${ws}"/> + <property name="baseos" value="${os}"/> + <property name="basearch" value="${arch}"/> + <property name="basenl" value="${nl}"/> + + <!-- Compiler settings. --> + <property name="javacFailOnError" value="false"/> + <property name="javacDebugInfo" value="on"/> + <property name="javacVerbose" value="false"/> + <property name="logExtension" value=".log"/> + <property name="compilerArg" value=""/> + <property name="javacSource" value="1.5"/> + <property name="javacTarget" value="1.5"/> + <path id="path_bootclasspath"> + <fileset dir="${java.home}/lib"> + <include name="*.jar"/> + </fileset> + </path> + <property name="bootclasspath" refid="path_bootclasspath"/> + <property name="bundleJavacSource" value="${javacSource}"/> + <property name="bundleJavacTarget" value="${javacTarget}"/> + <property name="bundleBootClasspath" value="${bootclasspath}"/> + <property name="pluginName" value="org.apache.qpid.management.ui"/> + <property name="version" value="0.1.0"/> + + <target name="init" depends="properties"> + <condition property="pluginTemp" value="${buildTempFolder}/plugins"> + <isset property="buildTempFolder"/> + </condition> + <property name="pluginTemp" value="${basedir}"/> + <condition property="build.result.folder" value="${pluginTemp}/eclipse-plugin"> + <isset property="buildTempFolder"/> + </condition> + <property name="build.result.folder" value="${basedir}"/> + <property name="temp.folder" value="${basedir}/temp.folder"/> + <property name="plugin.destination" value="${basedir}"/> + <property name="target.folder" value="${basedir}/target"/> + <property name="compile.folder" value="${target.folder}/classes"/> + <property name="plugins.folder" value="${basedir}/plugins"/> + </target> + + <target name="properties" if="eclipse.running"> + <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> + + </target> + + <target name="build.update.jar" depends="init" description="Build the plug-in: org.apache.qpid.management.ui for an update site."> + <delete dir="${temp.folder}"/> + <mkdir dir="${temp.folder}"/> + <antcall target="build.jars"/> + <antcall target="gather.bin.parts"> + <param name="destination.temp.folder" value="${temp.folder}/"/> + </antcall> + <zip destfile="${plugins.folder}/${pluginName}_${version}.jar" basedir="${temp.folder}/${pluginName}" filesonly="false" whenempty="skip" update="false"/> + <delete dir="${temp.folder}"/> + </target> + + <target name="compile" depends="init" unless="compile" description="Create jar: org.apache.qpid.management.ui compile."> + <delete dir="${temp.folder}/compile.bin"/> + <mkdir dir="${temp.folder}/compile.bin"/> + <path id="compile.classpath"> + <pathelement path="plugins/org.eclipse.ui_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.runtime_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.osgi_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.equinox.common_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.jobs_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/runtime_registry_compatibility.jar"/> + <pathelement path="plugins/org.eclipse.equinox.registry_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.equinox.preferences_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.contenttype_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.runtime.compatibility.auth_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.swt_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.swt.win32.win32.x86_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.jface_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.commands_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.ui.workbench_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.ui.workbench.compatibility_3.2.0/compatibility.jar"/> + <pathelement path="plugins/com.ibm.icu_3.4.4.1.jar"/> + <pathelement path="plugins/org.eclipse.help_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.core.expressions_3.2.0.jar"/> + <pathelement path="plugins/org.eclipse.ui.forms_3.2.0.jar"/> + </path> + <!-- compile the source code --> + <javac destdir="${temp.folder}/compile.bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bundleBootClasspath}" source="${bundleJavacSource}" target="${bundleJavacTarget}" > + <compilerarg line="${compilerArg}" compiler="${build.compiler}"/> + <classpath refid="compile.classpath" /> + <src path="src/main/java/" /> + <!--compilerarg value="@${basedir}/javaCompiler...args" compiler="org.eclipse.jdt.core.JDTCompilerAdapter" --> + <compilerarg line="-log '${temp.folder}/compile.bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/> + </javac> + <!-- Copy necessary resources --> + <copy todir="${temp.folder}/compile.bin" failonerror="true" overwrite="false"> + <fileset dir="src/main/java/" excludes="**/*.java, **/package.htm*" /> + </copy> + <mkdir dir="${build.result.folder}"/> + <copy todir="${target.folder}/classes" failonerror="true" overwrite="false"> + <fileset dir="${temp.folder}/compile.bin" /> + </copy> + <delete dir="${temp.folder}/compile.bin"/> + </target> + + <target name="src.zip" depends="init" unless="src.zip"> + <mkdir dir="${build.result.folder}"/> + <zip destfile="${build.result.folder}/src.zip" filesonly="false" whenempty="skip" update="false"> + <fileset dir="src/main/java/" includes="**/*.java" /> + </zip> + </target> + + <target name="build.jars" depends="init" description="Build all the jars for the plug-in: org.apache.qpid.management.ui."> + <available property="compile" file="${target.folder}/classes"/> + <antcall target="compile"/> + </target> + + <target name="build.sources" depends="init"> + <available property="src.zip" file="${build.result.folder}/src.zip"/> + <antcall target="src.zip"/> + </target> + + <target name="gather.bin.parts" depends="init" if="destination.temp.folder"> + <mkdir dir="${destination.temp.folder}/${pluginName}"/> + <copy todir="${destination.temp.folder}/${pluginName}" failonerror="true" overwrite="false"> + <fileset dir="${target.folder}/classes" includes="**"/> + </copy> + <copy todir="${destination.temp.folder}/${pluginName}" failonerror="true" overwrite="false"> + <fileset dir="${basedir}" includes="plugin.xml,META-INF/,icons/,plugin.properties,splash.bmp"/> + </copy> + </target> + + <target name="gather.sources" depends="init" if="destination.temp.folder"> + <mkdir dir="${destination.temp.folder}"/> + <copy file="${build.result.folder}/src.zip" todir="${destination.temp.folder}" failonerror="false" overwrite="false"/> + </target> + + <target name="gather.logs" depends="init" if="destination.temp.folder"> + <mkdir dir="${destination.temp.folder}/${pluginName}_${version}"/> + <copy file="${temp.folder}/compile.bin${logExtension}" todir="${destination.temp.folder}/${pluginName}_${version}" failonerror="false" overwrite="false"/> + </target> + + <target name="clean" depends="init" description="Clean the plug-in: org.apache.qpid.management.ui of all the zips, jars and logs created."> + <delete dir="${target.folder}/classes"/> + <delete file="${build.result.folder}/src.zip"/> + <delete file="${plugins.folder}/${pluginName}_${version}.jar"/> + <delete file="${target.folder}/${pluginName}_${version}.zip"/> + <delete dir="${temp.folder}"/> + </target> + + <target name="build.zip" depends="init" description="Create a zip containing all the elements for the plug-in: org.apache.qpid.management.ui."> + <delete dir="${temp.folder}"/> + <mkdir dir="${temp.folder}"/> + <antcall target="build.update.jar"/> + <antcall target="build.sources"/> + <antcall target="gather.sources"> + <param name="destination.temp.folder" value="${temp.folder}/plugins/${pluginName}_${version}/"/> + </antcall> + <delete> + <fileset dir="${temp.folder}" includes="**/*.bin${logExtension}"/> + </delete> + <copy todir="${temp.folder}/plugins" failonerror="true" overwrite="false"> + <fileset dir="${plugins.folder}" includes="${pluginName}_${version}.jar"/> + </copy> + <zip destfile="${target.folder}/${pluginName}_${version}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/> + <delete dir="${temp.folder}"/> + </target> + + <target name="dist" depends="init" description="Create a zip containing all the elements for deploying the plug-in: org.apache.qpid.management.ui."> + <antcall target="clean"/> + <antcall target="build.update.jar"/> + <antcall target="build.sources"/> + <antcall target="gather.sources"> + <param name="destination.temp.folder" value="${temp.folder}/${pluginName}"/> + </antcall> + <copy todir="${temp.folder}/${pluginName}/plugins" failonerror="true" overwrite="false"> + <fileset dir="${plugins.folder}" includes="**" /> + </copy> + <copy todir="${temp.folder}/${pluginName}/bin" failonerror="true" overwrite="false"> + <fileset dir="${basedir}/bin" includes="**" /> + </copy> + <copy todir="${temp.folder}/${pluginName}" failonerror="true" overwrite="false"> + <fileset dir="${basedir}" includes="startup.jar,plugin.xml,META-INF/,icons/,plugin.properties,splash.bmp"/> + </copy> + <copy todir="${temp.folder}/${pluginName}/configuration" failonerror="true" overwrite="false"> + <fileset dir="${basedir}/configuration" includes="**"/> + </copy> + + <delete> + <fileset dir="${temp.folder}" includes="**/*.bin${logExtension}"/> + </delete> + <zip destfile="${target.folder}/${pluginName}_${version}.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/> + <delete dir="${temp.folder}"/> + </target> + +</project> diff --git a/java/management/eclipse-plugin/configuration/config.ini b/java/management/eclipse-plugin/configuration/config.ini new file mode 100644 index 0000000000..432f0f1ff5 --- /dev/null +++ b/java/management/eclipse-plugin/configuration/config.ini @@ -0,0 +1,6 @@ +#Product Runtime Configuration File
+
+osgi.splashPath=platform:/base/plugins/org.apache.qpid.management.ui
+eclipse.product=org.apache.qpid.management.ui.product
+osgi.bundles=org.eclipse.equinox.common@2:start,org.eclipse.core.runtime@start,com.ibm.icu,org.apache.qpid.management.ui,org.eclipse.core.commands,org.eclipse.core.contenttype,org.eclipse.core.expressions,org.eclipse.core.jobs,org.eclipse.core.runtime.compatibility.auth,org.eclipse.core.runtime.compatibility.registry,org.eclipse.equinox.preferences,org.eclipse.equinox.registry,org.eclipse.help,org.eclipse.jface,org.eclipse.swt,org.eclipse.swt.win32.win32.x86,org.eclipse.ui,org.eclipse.ui.forms,org.eclipse.ui.workbench
+osgi.bundles.defaultStartLevel=4
diff --git a/java/management/eclipse-plugin/configuration/org.eclipse.osgi/bundles/16/1/.cp/swt-win32-3232.dll b/java/management/eclipse-plugin/configuration/org.eclipse.osgi/bundles/16/1/.cp/swt-win32-3232.dll Binary files differnew file mode 100644 index 0000000000..f028cec28d --- /dev/null +++ b/java/management/eclipse-plugin/configuration/org.eclipse.osgi/bundles/16/1/.cp/swt-win32-3232.dll diff --git a/java/management/eclipse-plugin/icons/Thumbs.db b/java/management/eclipse-plugin/icons/Thumbs.db Binary files differnew file mode 100644 index 0000000000..306bfb2eda --- /dev/null +++ b/java/management/eclipse-plugin/icons/Thumbs.db diff --git a/java/management/eclipse-plugin/icons/add.gif b/java/management/eclipse-plugin/icons/add.gif Binary files differnew file mode 100644 index 0000000000..252d7ebcb8 --- /dev/null +++ b/java/management/eclipse-plugin/icons/add.gif diff --git a/java/management/eclipse-plugin/icons/delete.gif b/java/management/eclipse-plugin/icons/delete.gif Binary files differnew file mode 100644 index 0000000000..6f647666d3 --- /dev/null +++ b/java/management/eclipse-plugin/icons/delete.gif diff --git a/java/management/eclipse-plugin/icons/icon_ClosedFolder.gif b/java/management/eclipse-plugin/icons/icon_ClosedFolder.gif Binary files differnew file mode 100644 index 0000000000..beb6ed134c --- /dev/null +++ b/java/management/eclipse-plugin/icons/icon_ClosedFolder.gif diff --git a/java/management/eclipse-plugin/icons/icon_OpenFolder.gif b/java/management/eclipse-plugin/icons/icon_OpenFolder.gif Binary files differnew file mode 100644 index 0000000000..a9c777343c --- /dev/null +++ b/java/management/eclipse-plugin/icons/icon_OpenFolder.gif diff --git a/java/management/eclipse-plugin/icons/mbean_view.png b/java/management/eclipse-plugin/icons/mbean_view.png Binary files differnew file mode 100644 index 0000000000..9871b72bb8 --- /dev/null +++ b/java/management/eclipse-plugin/icons/mbean_view.png diff --git a/java/management/eclipse-plugin/icons/notifications.gif b/java/management/eclipse-plugin/icons/notifications.gif Binary files differnew file mode 100644 index 0000000000..f1e585bdf7 --- /dev/null +++ b/java/management/eclipse-plugin/icons/notifications.gif diff --git a/java/management/eclipse-plugin/icons/qpidConnections.gif b/java/management/eclipse-plugin/icons/qpidConnections.gif Binary files differnew file mode 100644 index 0000000000..89489f11f2 --- /dev/null +++ b/java/management/eclipse-plugin/icons/qpidConnections.gif diff --git a/java/management/eclipse-plugin/icons/qpidmc.gif b/java/management/eclipse-plugin/icons/qpidmc.gif Binary files differnew file mode 100644 index 0000000000..baf929fbc5 --- /dev/null +++ b/java/management/eclipse-plugin/icons/qpidmc.gif diff --git a/java/management/eclipse-plugin/icons/qpidmc32.bmp b/java/management/eclipse-plugin/icons/qpidmc32.bmp Binary files differnew file mode 100644 index 0000000000..e42ce01dff --- /dev/null +++ b/java/management/eclipse-plugin/icons/qpidmc32.bmp diff --git a/java/management/eclipse-plugin/icons/qpidmc32.gif b/java/management/eclipse-plugin/icons/qpidmc32.gif Binary files differnew file mode 100644 index 0000000000..e42ce01dff --- /dev/null +++ b/java/management/eclipse-plugin/icons/qpidmc32.gif diff --git a/java/management/eclipse-plugin/icons/reconnect.gif b/java/management/eclipse-plugin/icons/reconnect.gif Binary files differnew file mode 100644 index 0000000000..e2f8c3e1fe --- /dev/null +++ b/java/management/eclipse-plugin/icons/reconnect.gif diff --git a/java/management/eclipse-plugin/icons/refresh.gif b/java/management/eclipse-plugin/icons/refresh.gif Binary files differnew file mode 100644 index 0000000000..a063c230ac --- /dev/null +++ b/java/management/eclipse-plugin/icons/refresh.gif diff --git a/java/management/eclipse-plugin/icons/stop.gif b/java/management/eclipse-plugin/icons/stop.gif Binary files differnew file mode 100644 index 0000000000..dc47edf069 --- /dev/null +++ b/java/management/eclipse-plugin/icons/stop.gif diff --git a/java/management/eclipse-plugin/plugin.properties b/java/management/eclipse-plugin/plugin.properties new file mode 100644 index 0000000000..77a85f201c --- /dev/null +++ b/java/management/eclipse-plugin/plugin.properties @@ -0,0 +1,10 @@ +aboutText=This RCP Application was generated from\n\ +the PDE Plug-in Project wizard.\n\n\ +This sample shows how to:\n\ +- add a top-level menu and toolbar with actions\n\ +- add keybindings to actions\n\ +- create views that can't be closed and\n\ + multiple instances of the same view\n\ +- perspectives with placeholders for new views\n\ +- use the default about dialog\n\ +- create a product definition\n
\ No newline at end of file diff --git a/java/management/eclipse-plugin/plugin.xml b/java/management/eclipse-plugin/plugin.xml new file mode 100644 index 0000000000..8eda7cdfe3 --- /dev/null +++ b/java/management/eclipse-plugin/plugin.xml @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.2"?> +<plugin> + + <extension + id="application" + point="org.eclipse.core.runtime.applications"> + <application> + <run + class="org.apache.qpid.management.ui.Application"> + </run> + </application> + </extension> + <extension + point="org.eclipse.ui.perspectives"> + <perspective + name="qpid.management.perspective" + class="org.apache.qpid.management.ui.Perspective" + id="org.apache.qpid.management.ui.perspective"> + </perspective> + </extension> + <extension + point="org.eclipse.ui.views"> + <category + id="org.apache.qpid.management.ui.viewcategory" + name="Qpid Management Console"/> + <view + allowMultiple="false" + category="org.apache.qpid.management.ui.viewcategory" + class="org.apache.qpid.management.ui.views.NavigationView" + icon="icons/qpidConnections.gif" + id="org.apache.qpid.management.ui.navigationView" + name="Qpid Connections"> + </view> + <view + allowMultiple="false" + category="org.apache.qpid.management.ui.viewcategory" + class="org.apache.qpid.management.ui.views.MBeanView" + icon="icons/mbean_view.png" + id="org.apache.qpid.management.ui.mbeanView" + name="Qpid Management"> + </view> + </extension> + <extension + point="org.eclipse.ui.commands"> + <category + name="qpid.manager.commands" + id="org.apache.qpid.management.ui.category"> + </category> + <command + name="New Connection" + description="Created a new Qpid server connection" + categoryId="org.apache.qpid.management.ui.category" + id="org.apache.qpid.management.ui.actions.cmd_add"> + </command> + <command + categoryId="org.apache.qpid.management.ui.category" + description="Reconnect the Qpid server connection" + id="org.apache.qpid.management.ui.actions.cmd_reconnect" + name="Reconnect"/> + <command + categoryId="org.apache.qpid.management.ui.category" + description="Disconnects the Qpid server connection" + id="org.apache.qpid.management.ui.actions.cmd_disconnect" + name="Disconnect"/> + <command + categoryId="org.apache.qpid.management.ui.category" + description="Removes the server from management console" + id="org.apache.qpid.management.ui.actions.cmd_remove" + name="Remove Connection"/> + <command + categoryId="org.apache.qpid.management.ui.category" + description="refreshes the views" + id="org.apache.qpid.management.ui.actions.cmd_refresh" + name="Refresh"/> + <command + categoryId="org.apache.qpid.management.ui.category" + description="pops up the window for editing selected attribute" + id="org.apache.qpid.management.ui.actions.cmd_editAttribute" + name="Edit Attribute"/> + </extension> + <extension + point="org.eclipse.ui.bindings"> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_add" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+N"> + </key> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_reconnect" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+C"/> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_disconnect" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+D"> + </key> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_remove" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+R"/> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_refresh" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+F5"/> + <key + commandId="org.apache.qpid.management.ui.actions.cmd_editAttribute" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+E"/> + <key + commandId="org.eclipse.ui.file.exit" + schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" + sequence="CTRL+Alt+X"> + </key> + </extension> + + <extension + id="product" + point="org.eclipse.core.runtime.products"> + <product + application="org.apache.qpid.management.ui.application" + name="Qpid Management Console"> + <property + name="about Qpid Management Console" + value="version 0.1.0"> + </property> + <property + name="windowImages" + value="icons/qpidmc32.gif"> + </property> + <property + name="aboutText" + value="Qpid Management Console
version 0.1.0"/> + </product> + </extension> + <extension + point="org.eclipse.ui.actionSets"> + <actionSet + id="org.apache.qpid.management.ui.actionSet" + label="Qpid Action Set" + visible="true"> + <menu + id="qpidmanager" + label="&Qpid Manager"> + <separator name="qpidActionsGroup"/> + </menu> + <action + class="org.apache.qpid.management.ui.actions.EditAttribute" + definitionId="org.apache.qpid.management.ui.actions.cmd_editAttribute" + id="org.apache.qpid.management.ui.actions.editAttribute" + label="Edit Attribute" + menubarPath="qpidmanager/mbeanactions" + style="push" + tooltip="Edit Attribute"/> + <action + class="org.apache.qpid.management.ui.actions.Refresh" + definitionId="org.apache.qpid.management.ui.actions.cmd_refresh" + icon="icons/refresh.gif" + id="org.apache.qpid.management.ui.actions.refresh" + label="Refresh" + menubarPath="qpidmanager/additions" + style="push" + toolbarPath="qpidActionsGroup" + tooltip="Refresh"/> + <action + class="org.apache.qpid.management.ui.actions.RemoveServer" + definitionId="org.apache.qpid.management.ui.actions.cmd_remove" + icon="icons/delete.gif" + id="org.apache.qpid.management.ui.actions.remove" + label="Remove Connection" + menubarPath="qpidmanager/additions" + style="push" + toolbarPath="qpidActionsGroup"/> + <action + class="org.apache.qpid.management.ui.actions.CloseConnection" + definitionId="org.apache.qpid.management.ui.actions.cmd_disconnect" + icon="icons/stop.gif" + id="org.apache.qpid.management.ui.disconnect" + label="Disconnect" + menubarPath="qpidmanager/additions" + toolbarPath="qpidActionsGroup" + tooltip="Disconnect"/> + <action + class="org.apache.qpid.management.ui.actions.ReconnectServer" + definitionId="org.apache.qpid.management.ui.actions.cmd_reconnect" + icon="icons/reconnect.gif" + id="org.apache.qpid.management.ui.reconnect" + label="Reconnect" + menubarPath="qpidmanager/additions" + toolbarPath="qpidActionsGroup" + tooltip="Reconnect"/> + <action + class="org.apache.qpid.management.ui.actions.AddServer" + definitionId="org.apache.qpid.management.ui.actions.cmd_add" + icon="icons/add.gif" + id="org.apache.qpid.management.ui.add" + label="New Connection" + menubarPath="qpidmanager/additions" + toolbarPath="qpidActionsGroup" + tooltip="New Connection"/> + </actionSet> + </extension> + +</plugin> diff --git a/java/management/eclipse-plugin/plugins/com.ibm.icu_3.4.4.1.jar b/java/management/eclipse-plugin/plugins/com.ibm.icu_3.4.4.1.jar Binary files differnew file mode 100644 index 0000000000..c33f004a95 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/com.ibm.icu_3.4.4.1.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.commands_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.commands_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..215f09bf12 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.commands_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.contenttype_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.contenttype_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..f7f8e93d22 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.contenttype_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.expressions_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.expressions_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..9672474250 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.expressions_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.jobs_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.jobs_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..63ae34b87b --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.jobs_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.auth_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.auth_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..9e1a33cfa9 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.auth_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/META-INF/MANIFEST.MF b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..0e8c61f1b7 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0
+Bundle-Name: %fragmentName
+Bundle-ClassPath: runtime_registry_compatibility.jar
+Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0,J2SE-1.3
+Eclipse-PatchFragment: true
+Bundle-Vendor: %providerName
+Bundle-ManifestVersion: 2
+Fragment-Host: org.eclipse.equinox.registry
+Bundle-Localization: fragment
+Bundle-SymbolicName: org.eclipse.core.runtime.compatibility.registry
+Bundle-Version: 3.2.0.v20060603
+
diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/runtime_registry_compatibility.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/runtime_registry_compatibility.jar Binary files differnew file mode 100644 index 0000000000..aae3e74ad7 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime.compatibility.registry_3.2.0/runtime_registry_compatibility.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..3834c9802c --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.core.runtime_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.equinox.common_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.common_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..ee0e7865c2 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.common_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.equinox.preferences_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.preferences_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..32f8e048dc --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.preferences_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.equinox.registry_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.registry_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..1fe65676d5 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.equinox.registry_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.help_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.help_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..809be21af0 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.help_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.jface_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.jface_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..5c7509b07e --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.jface_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.osgi_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.osgi_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..5f86e420d6 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.osgi_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.swt.win32.win32.x86_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.swt.win32.win32.x86_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..392713689c --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.swt.win32.win32.x86_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.swt_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.swt_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..7e1dbb85da --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.swt_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.ui.forms_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.ui.forms_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..9c1bee69f4 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.ui.forms_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/META-INF/MANIFEST.MF b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..04a1db7c85 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0
+Bundle-Name: %fragmentName
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-Vendor: %providerName
+Bundle-ManifestVersion: 2
+Fragment-Host: org.eclipse.ui.workbench;bundle-version="[3.0.0,4.0.0)"
+Bundle-Localization: fragment-compatibility
+Bundle-SymbolicName: org.eclipse.ui.workbench.compatibility
+Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.
+ 0)"
+Bundle-Version: 3.2.0.I20060605-1400
+
diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/compatibility.jar b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/compatibility.jar Binary files differnew file mode 100644 index 0000000000..13682c5d36 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench.compatibility_3.2.0/compatibility.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..40e7d55f58 --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.ui.workbench_3.2.0.jar diff --git a/java/management/eclipse-plugin/plugins/org.eclipse.ui_3.2.0.jar b/java/management/eclipse-plugin/plugins/org.eclipse.ui_3.2.0.jar Binary files differnew file mode 100644 index 0000000000..5821d85bac --- /dev/null +++ b/java/management/eclipse-plugin/plugins/org.eclipse.ui_3.2.0.jar diff --git a/java/management/eclipse-plugin/splash.bmp b/java/management/eclipse-plugin/splash.bmp Binary files differnew file mode 100644 index 0000000000..b528a508c5 --- /dev/null +++ b/java/management/eclipse-plugin/splash.bmp diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Activator.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Activator.java new file mode 100644 index 0000000000..61b6cfaa59 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Activator.java @@ -0,0 +1,84 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends AbstractUIPlugin +{ + // The plug-in ID + public static final String PLUGIN_ID = "org.apache.qpid.management.ui"; + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() + { + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception + { + super.start(context); + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception + { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + + /** + * Returns an image descriptor for the image file at the given + * plug-in relative path + * + * @param path the path + * @return the image descriptor + */ + public static ImageDescriptor getImageDescriptor(String path) { + return imageDescriptorFromPlugin(PLUGIN_ID, path); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Application.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Application.java new file mode 100644 index 0000000000..3d014e6968 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Application.java @@ -0,0 +1,63 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.eclipse.core.runtime.IPlatformRunnable; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; + +/** + * This class controls all aspects of the application's execution + * @author Bhupendra Bhardwaj + */ +public class Application implements IPlatformRunnable +{ + static Shell shell = null; + + /* + * (non-Javadoc) + * + * @see org.eclipse.core.runtime.IPlatformRunnable#run(java.lang.Object) + */ + public Object run(Object args) throws Exception + { + Display display = PlatformUI.createDisplay(); + try + { + int returnCode = PlatformUI.createAndRunWorkbench(display, + new ApplicationWorkbenchAdvisor()); + if (returnCode == PlatformUI.RETURN_RESTART) + { + return IPlatformRunnable.EXIT_RESTART; + } + return IPlatformRunnable.EXIT_OK; + } finally + { + display.dispose(); + } + } + + static Shell getActiveShell() + { + return shell; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationActionBarAdvisor.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationActionBarAdvisor.java new file mode 100644 index 0000000000..9015b74f3f --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationActionBarAdvisor.java @@ -0,0 +1,96 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.eclipse.jface.action.GroupMarker; +import org.eclipse.jface.action.ICoolBarManager; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.actions.ActionFactory; +import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; + +/** + * An action bar advisor is responsible for creating, adding, and disposing of the + * actions added to a workbench window. Each window will be populated with + * new actions. + */ +public class ApplicationActionBarAdvisor extends ActionBarAdvisor +{ + + // Actions - important to allocate these only in makeActions, and then use them + // in the fill methods. This ensures that the actions aren't recreated + // when fillActionBars is called with FILL_PROXY. + private IWorkbenchAction exitAction; + private IWorkbenchAction aboutAction; + + + public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) + { + super(configurer); + } + + protected void makeActions(final IWorkbenchWindow window) + { + // Creates the actions and registers them. + // Registering is needed to ensure that key bindings work. + // The corresponding commands keybindings are defined in the plugin.xml file. + // Registering also provides automatic disposal of the actions when + // the window is closed. + + exitAction = ActionFactory.QUIT.create(window); + register(exitAction); + + aboutAction = ActionFactory.ABOUT.create(window); + register(aboutAction); + } + + + protected void fillMenuBar(IMenuManager menuBar) + { + MenuManager fileMenu = new MenuManager("&Qpid Manager", "qpidmanager"); + MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP); + + menuBar.add(fileMenu); + // Add a group marker indicating where action set menus will appear. + menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); + menuBar.add(helpMenu); + + fileMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); + fileMenu.add(new Separator()); + fileMenu.add(new GroupMarker("mbeanactions")); + fileMenu.add(new Separator()); + fileMenu.add(exitAction); + + // Help + //aboutAction.setText("about Qpid Management Console"); + helpMenu.add(aboutAction); + } + + protected void fillCoolBar(ICoolBarManager coolBar) + { + + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationRegistry.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationRegistry.java new file mode 100644 index 0000000000..175130aea9 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationRegistry.java @@ -0,0 +1,129 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.eclipse.jface.resource.FontRegistry; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +public abstract class ApplicationRegistry +{ + private static ImageRegistry imageRegistry = new ImageRegistry(); + private static FontRegistry fontRegistry = new FontRegistry(); + + static + { + imageRegistry.put(Constants.CONSOLE_IMAGE, + org.apache.qpid.management.ui.Activator.getImageDescriptor("/icons/qpidmc.gif")); + imageRegistry.put(Constants.CLOSED_FOLDER_IMAGE, + org.apache.qpid.management.ui.Activator.getImageDescriptor("/icons/icon_ClosedFolder.gif")); + imageRegistry.put(Constants.OPEN_FOLDER_IMAGE, + PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER)); + imageRegistry.put(Constants.MBEAN_IMAGE, + PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT)); + imageRegistry.put(Constants.NOTIFICATION_IMAGE, + org.apache.qpid.management.ui.Activator.getImageDescriptor("/icons/notifications.gif")); + } + + static + { + fontRegistry.put(Constants.FONT_BUTTON, new FontData[]{new FontData("Arial", 8, SWT.BOLD)} ); + fontRegistry.put(Constants.FONT_BOLD, new FontData[]{new FontData("Bold", 9, SWT.BOLD)} ); + fontRegistry.put(Constants.FONT_ITALIC, new FontData[]{new FontData("Italic", 9, SWT.ITALIC)} ); + fontRegistry.put(Constants.FONT_TABLE_CELL, new FontData[]{new FontData("Tablecell", 8, SWT.NORMAL)} ); + fontRegistry.put(Constants.FONT_NORMAL, new FontData[]{new FontData("Normal", 9, SWT.NORMAL)} ); + } + + /* + * This maps all the managed servers to the respective server registry. + * Server can be JMX MBeanServer or a C++ server + */ + private static HashMap<ManagedServer, ServerRegistry> _serverRegistryMap = new HashMap<ManagedServer, ServerRegistry>(); + + // This map gets updated when a server connection closes. + private static List<ManagedServer> _closedServerList = new CopyOnWriteArrayList<ManagedServer>(); + + public static Image getImage(String key) + { + return imageRegistry.get(key); + } + + public static Font getFont(String key) + { + return fontRegistry.get(key); + } + + public static void addServer(ManagedServer server, ServerRegistry registry) + { + _serverRegistryMap.put(server, registry); + } + + public static void removeServer(ManagedServer server) + { + _serverRegistryMap.remove(server); + } + + public static ServerRegistry getServerRegistry(ManagedServer server) + { + return _serverRegistryMap.get(server); + } + + public static ServerRegistry getServerRegistry(ManagedBean mbean) + { + ManagedServer server = mbean.getServer(); + return _serverRegistryMap.get(server); + } + + public static boolean isServerConnected(ManagedServer server) + { + return _serverRegistryMap.containsKey(server); + } + + // remove the server from the registry + public static void serverConnectionClosed(ManagedServer server) + { + _closedServerList.add(server); + _serverRegistryMap.remove(server); + } + + /* + * Returns the lis of closed servers. The Thread in GUI, which keeps checking for closed connection + * will check this and will remove the server links from the GUI. + */ + public static List<ManagedServer> getClosedServers() + { + if (_closedServerList.isEmpty()) + return null; + + List<ManagedServer> list = new CopyOnWriteArrayList<ManagedServer>(_closedServerList); + _closedServerList.clear(); + return list; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchAdvisor.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchAdvisor.java new file mode 100644 index 0000000000..a46fa870e4 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchAdvisor.java @@ -0,0 +1,46 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +/** + * This workbench advisor creates the window advisor, and specifies + * the perspective id for the initial window. + */ +public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor +{ + public static final String PERSPECTIVE_ID = "org.apache.qpid.management.ui.perspective"; + + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) + { + return new ApplicationWorkbenchWindowAdvisor(configurer); + } + + + public String getInitialWindowPerspectiveId() + { + return PERSPECTIVE_ID; + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchWindowAdvisor.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchWindowAdvisor.java new file mode 100644 index 0000000000..472d003657 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ApplicationWorkbenchWindowAdvisor.java @@ -0,0 +1,61 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor +{ + public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) + { + super(configurer); + } + + public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) + { + return new ApplicationActionBarAdvisor(configurer); + } + + public void preWindowOpen() + { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + int x = Display.getDefault().getBounds().width; + int y = Display.getDefault().getBounds().height; + configurer.setInitialSize(new Point(4*x/5, 3*y/4)); + configurer.setShowCoolBar(true); + configurer.setShowStatusLine(false); + + configurer.setTitle("Qpid Management Console"); + } + + public void postWindowCreate() + { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + Shell shell = configurer.getWindow().getShell(); + shell.setImage(ApplicationRegistry.getImage(Constants.CONSOLE_IMAGE)); + } +}
\ No newline at end of file diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Constants.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Constants.java new file mode 100644 index 0000000000..1678cbac62 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Constants.java @@ -0,0 +1,79 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +public class Constants +{ + public final static String APPLICATION_NAME = "Qpid Management Console"; + public final static String ITEM_VALUE = "value"; + public final static String ITEM_TYPE = "type"; + public final static String SERVER = "server"; + public final static String DOMAIN = "domain"; + public final static String TYPE = "mbeantype"; + public final static String MBEAN = "mbean"; + public final static String ATTRIBUTES = "Attributes"; + public final static String NOTIFICATION = "Notifications"; + + public final static String ALL = "All"; + + public final static String NAVIGATION_ROOT = "Qpid Connections"; + public final static String DESCRIPTION = " Description : "; + + public final static String BROKER_MANAGER = "Broker_Manager"; + public final static String QUEUE = "Queue"; + public final static String EXCHANGE = "Exchange"; + public final static String EXCHANGE_TYPE = "ExchangeType"; + public final static String[] EXCHANGE_TYPE_VALUES = {"direct", "topic", "headers"}; + public final static String CONNECTION ="Connection"; + + public final static String ACTION_ADDSERVER = "New Connection"; + + + public final static String SUBSCRIBE_BUTTON = "Subscribe"; + public final static String UNSUBSCRIBE_BUTTON = "Unsubscribe"; + + public final static String CONSOLE_IMAGE = "ConsoelImage"; + public final static String CLOSED_FOLDER_IMAGE = "ClosedFolderImage"; + public final static String OPEN_FOLDER_IMAGE = "OpenFolderImage"; + public final static String MBEAN_IMAGE = "MBeanImage"; + public final static String NOTIFICATION_IMAGE = "NotificationImage"; + + public final static String FONT_BUTTON = "ButtonFont"; + public final static String FONT_BOLD = "BoldFont"; + public final static String FONT_ITALIC = "ItalicFont"; + public final static String FONT_TABLE_CELL = "TableCellFont"; + public final static String FONT_NORMAL = "Normal"; + + public final static String BUTTON_DETAILS = "Details"; + public final static String BUTTON_EDIT_ATTRIBUTE = "Edit Attribute"; + public final static String BUTTON_REFRESH = "Refresh"; + public final static String BUTTON_GRAPH = "Graph"; + public final static int TIMER_INTERVAL = 5000; + public final static String BUTTON_EXECUTE = "Execute"; + public final static String BUTTON_CLEAR = "Clear"; + public final static String BUTTON_CONNECT = "Connect"; + public final static String BUTTON_CANCEL = "Cancel"; + + public final static int OPERATION_IMPACT_INFO = 0; + public final static int OPERATION_IMPACT_ACTION = 1; + public final static int OPERATION_IMPACT_ACTIONINFO = 2; + public final static int OPERATION_IMPACT_UNKNOWN = 3; +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ICommandIds.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ICommandIds.java new file mode 100644 index 0000000000..12dea649c6 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ICommandIds.java @@ -0,0 +1,36 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +/** + * Interface defining the application's command IDs. + * Key bindings can be defined for specific commands. + * To associate an action with a command, use IAction.setActionDefinitionId(commandId). + * + * @see org.eclipse.jface.action.IAction#setActionDefinitionId(String) + */ +public interface ICommandIds +{ + //public static final String CMD_ADD_SERVER = "org.apache.qpid.management.ui.add"; + //public static final String CMD_RECONNECT_SERVER = "org.apache.qpid.management.ui.reconnect"; + //public static final String CMD_DISCONNECT_SERVER = "org.apache.qpid.management.ui.disconnect"; + //public static final String CMD_REFRESH = "org.apache.qpid.management.ui.actions.refresh"; +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedBean.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedBean.java new file mode 100644 index 0000000000..767fd8b721 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedBean.java @@ -0,0 +1,80 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import java.util.HashMap; + +public abstract class ManagedBean extends ManagedObject +{ + private String _uniqueName = ""; + private String _domain = ""; + private String _type = ""; + private ManagedServer _server = null; + private HashMap _properties = null; + + public String getProperty(String key) + { + return (String)_properties.get(key); + } + + public HashMap getProperties() + { + return _properties; + } + public void setProperties(HashMap properties) + { + this._properties = properties; + } + public String getDomain() + { + return _domain; + } + public void setDomain(String domain) + { + this._domain = domain; + } + + public ManagedServer getServer() + { + return _server; + } + public void setServer(ManagedServer server) + { + this._server = server; + } + public String getType() + { + return _type; + } + public void setType(String type) + { + this._type = type; + } + public String getUniqueName() + { + return _uniqueName; + } + public void setUniqueName(String uniqueName) + { + this._uniqueName = uniqueName; + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedObject.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedObject.java new file mode 100644 index 0000000000..2ed463bdf8 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedObject.java @@ -0,0 +1,36 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +public abstract class ManagedObject +{ + private String _name; + + public String getName() + { + return _name; + } + + public void setName(String name) + { + this._name = name; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedServer.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedServer.java new file mode 100644 index 0000000000..44f933a5d1 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ManagedServer.java @@ -0,0 +1,75 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +public class ManagedServer extends ManagedObject +{ + private String host; + private String port; + private String url; + private String domain; + + public ManagedServer(String host, String port, String domain) + { + this.host = host; + this.port = port; + this.domain = domain; + setName(host + ":" + port); + } + + public ManagedServer(String url, String domain) + { + this.url = url; + this.domain = domain; + } + + public String getDomain() + { + return domain; + } + + public String getHost() + { + return host; + } + + public String getPort() + { + return port; + } + + public String getUrl() + { + return url; + } + + public void setHostAndPort(String host, String port) + { + this.host = host; + this.port = port; + setName(host + ":" + port); + } + + public void setUrl(String url) + { + this.url = url; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Perspective.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Perspective.java new file mode 100644 index 0000000000..03477cb117 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/Perspective.java @@ -0,0 +1,53 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + +import org.apache.qpid.management.ui.views.MBeanView; +import org.apache.qpid.management.ui.views.NavigationView; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +public class Perspective implements IPerspectiveFactory +{ + public void createInitialLayout(IPageLayout layout) + { + String editorArea = layout.getEditorArea(); + layout.setEditorAreaVisible(false); + + // standalone view meaning it can't be docked or stacked with other views, + // and it doesn't have a title bar. + + layout.addStandaloneView(NavigationView.ID, + true, + IPageLayout.LEFT, + 0.25f, + editorArea); + + layout.addStandaloneView(MBeanView.ID, + true, + IPageLayout.RIGHT, + 0.75f, + editorArea); + + layout.getViewLayout(NavigationView.ID).setCloseable(false); + layout.getViewLayout(MBeanView.ID).setCloseable(false); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java new file mode 100644 index 0000000000..0beeda84dd --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/ServerRegistry.java @@ -0,0 +1,79 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui; + + +import java.util.List; + +import org.apache.qpid.management.ui.jmx.ClientListener; +import org.apache.qpid.management.ui.model.NotificationObject; +import org.apache.qpid.management.ui.model.OperationDataModel; + +public abstract class ServerRegistry +{ + private ManagedServer _managedServer = null; + + public ServerRegistry() + { + + } + + public ServerRegistry(ManagedServer server) + { + _managedServer = server; + } + + public ManagedServer getManagedServer() + { + return _managedServer; + } + + public void setManagedServer(ManagedServer server) + { + _managedServer = server; + } + + public abstract Object getServerConnection(); + + public abstract void closeServerConnection() throws Exception; + + public abstract OperationDataModel getOperationModel(ManagedBean mbean); + + public abstract String[] getQueueNames(); + + public abstract String[] getExchangeNames(); + + public abstract List<NotificationObject> getNotifications(ManagedBean mbean); + + public abstract boolean hasSubscribedForNotifications(ManagedBean mbean, String name, String type); + + public abstract void clearNotifications(ManagedBean mbean); + + public ClientListener getNotificationListener() + { + return null; + } + + public ClientListener getClientListener() + { + return null; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/AddServer.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/AddServer.java new file mode 100644 index 0000000000..14c214ad5f --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/AddServer.java @@ -0,0 +1,282 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.views.NavigationView; +import org.apache.qpid.management.ui.views.ViewUtility; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class AddServer/* extends Action*/ implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + private static final String[] _connectionTypes ={"RMI"}; + private static final String[] _domains ={"org.apache.qpid"}; + + public AddServer() + { + + } + + /* + public AddServer(IWorkbenchWindow window)//, String label) + { + _window = window; + //setText(label); + // The id is used to refer to the action in a menu or toolbar + setId(ICommandIds.CMD_ADD_SERVER); + // Associate the action with a pre-defined command, to allow key bindings. + setActionDefinitionId(ICommandIds.CMD_ADD_SERVER); + //setImageDescriptor(org.apache.qpid.management.ui.Activator.getImageDescriptor("/icons/add.gif")); + } + */ + + public void run(IAction action) + { + if(_window != null) + { + try + { + // TODO + //_window.getActivePage().showView(NavigationView.ID, Integer.toString(0), IWorkbenchPage.VIEW_ACTIVATE); + //_window.getActivePage().showView(MBeanView.ID, Integer.toString(0), IWorkbenchPage.VIEW_ACTIVATE); + } + catch (Exception ex) + { + + } + createWidgets(); + } + } + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) { + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() { + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) { + this._window = window; + } + + + /* + public void run() + { + if(_window != null) + { + createWidgets(); + } + } + */ + private void createWidgets() + { + Display display = Display.getCurrent(); + final Shell shell = new Shell(display, SWT.BORDER | SWT.CLOSE); + shell.setText(Constants.ACTION_ADDSERVER); + shell.setLayout(new GridLayout()); + + int x = display.getBounds().width; + int y = display.getBounds().height; + shell.setBounds(x/4, y/4, 425, 250); + + Composite composite = new Composite(shell, SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + GridLayout layout = new GridLayout(2, false); + layout.horizontalSpacing = 10; + layout.verticalSpacing = 10; + layout.marginHeight = 20; + layout.marginWidth = 20; + composite.setLayout(layout); + + Label name = new Label(composite, SWT.NONE); + name.setText("Connection Type"); + GridData layoutData = new GridData(SWT.TRAIL, SWT.TOP, false, false); + name.setLayoutData(layoutData); + + final Combo comboTransport = new Combo(composite, SWT.READ_ONLY); + comboTransport.setItems(_connectionTypes); + comboTransport.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + comboTransport.select(0); + + Label host = new Label(composite, SWT.NONE); + host.setText("Host"); + host.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + + final Text textHost = new Text(composite, SWT.BORDER); + textHost.setText(""); + textHost.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + textHost.setFocus(); + textHost.addVerifyListener(new VerifyListener(){ + public void verifyText(VerifyEvent event) + { + if (!(Character.isLetterOrDigit(event.character) || + (event.character == '.') || + (event.character == '\b') )) + { + event.doit = false; + } + } + }); + + + Label port = new Label(composite, SWT.NONE); + port.setText("Port"); + port.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + + final Text textPort = new Text(composite, SWT.BORDER); + textPort.setText(""); + textPort.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + textPort.addVerifyListener(new VerifyListener(){ + public void verifyText(VerifyEvent event) + { + if (textPort.getText().length() == 4) + event.doit = false; + else if (!(Character.isDigit(event.character) || + (event.character == '\b'))) + { + event.doit = false; + } + } + }); + + + Label domain = new Label(composite, SWT.NONE); + domain.setText("Domain"); + domain.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + + final Combo comboDomain = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); + comboDomain.setItems(_domains); + comboDomain.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + comboDomain.select(0); + + Composite buttonsComposite = new Composite(composite, SWT.NONE); + buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + buttonsComposite.setLayout(new GridLayout(2, true)); + + + final Button connectButton = new Button(buttonsComposite, SWT.PUSH | SWT.CENTER); + connectButton.setText(Constants.BUTTON_CONNECT); + GridData gridData = new GridData (SWT.TRAIL, SWT.BOTTOM, true, true); + gridData.widthHint = 100; + connectButton.setLayoutData(gridData); + connectButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + connectButton.addSelectionListener(new SelectionAdapter(){ + public void widgetSelected(SelectionEvent event) + { + String transport = comboTransport.getText(); + String host = textHost.getText(); + String port = textPort.getText(); + String domain = comboDomain.getText(); + + NavigationView view = (NavigationView)_window.getActivePage().findView(NavigationView.ID); + try + { + view.addNewServer(transport, host, port, domain); + + if (!connectButton.getShell().isDisposed()) + connectButton.getShell().dispose(); + } + catch(InfoRequiredException ex) + { + ViewUtility.popupInfoMessage("New connection", ex.getMessage()); + } + catch(Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.OK, ex.getMessage(), ex.getCause()); + ErrorDialog.openError(shell, "Error", "Server could not be added", status); + } + } + }); + + final Button cancelButton = new Button(buttonsComposite, SWT.PUSH); + cancelButton.setText(Constants.BUTTON_CANCEL); + gridData = new GridData (SWT.LEAD, SWT.BOTTOM, true, true); + gridData.widthHint = 100; + cancelButton.setLayoutData(gridData); + cancelButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + cancelButton.addSelectionListener(new SelectionAdapter(){ + public void widgetSelected(SelectionEvent event) + { + shell.dispose(); + } + }); + + shell.open(); + _window.getShell().setEnabled(false); + while (!shell.isDisposed()) + { + if (!display.readAndDispatch()) + { + display.sleep(); + } + } + + //If you create it, you dispose it. + shell.dispose(); + + // enable the main shell + _window.getShell().setEnabled(true); + _window.getShell().open(); + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/CloseConnection.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/CloseConnection.java new file mode 100644 index 0000000000..3f44274a92 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/CloseConnection.java @@ -0,0 +1,93 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.views.NavigationView; +import org.apache.qpid.management.ui.views.ViewUtility; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class CloseConnection implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + + public CloseConnection() + { + + } + + public void run(IAction action) + { + if(_window != null) + { + NavigationView view = (NavigationView)_window.getActivePage().findView(NavigationView.ID); + try + { + view.disconnect(); + } + catch(InfoRequiredException ex) + { + ViewUtility.popupInfoMessage("Close connection", ex.getMessage()); + } + catch(Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.OK, ex.getMessage(), ex.getCause()); + ErrorDialog.openError(_window.getShell(), "Error", "Server could not be removed", status); + } + } + } + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) { + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() { + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) { + this._window = window; + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/EditAttribute.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/EditAttribute.java new file mode 100644 index 0000000000..0030330b06 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/EditAttribute.java @@ -0,0 +1,87 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.views.MBeanView; +import org.apache.qpid.management.ui.views.ViewUtility; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class EditAttribute implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + + public void run(IAction action) + { + if(_window != null) + { + MBeanView view = (MBeanView)_window.getActivePage().findView(MBeanView.ID); + try + { + view.editAttribute(); + } + catch(InfoRequiredException ex) + { + ViewUtility.popupInfoMessage("Edit Attribute", ex.getMessage()); + } + catch(Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.OK, ex.getMessage(), ex.getCause()); + ErrorDialog.openError(_window.getShell(), "Error", "Attribute could not be edited", status); + } + } + } + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) { + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() { + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) { + this._window = window; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/ReconnectServer.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/ReconnectServer.java new file mode 100644 index 0000000000..25337f3fbe --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/ReconnectServer.java @@ -0,0 +1,92 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.views.NavigationView; +import org.apache.qpid.management.ui.views.ViewUtility; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class ReconnectServer implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) + { + + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() + { + + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) + { + this._window = window; + } + + public void run(IAction action) + { + if(_window != null) + { + NavigationView view = (NavigationView)_window.getActivePage().findView(NavigationView.ID); + try + { + view.reconnect(); + } + catch(InfoRequiredException ex) + { + ViewUtility.popupInfoMessage("Reconnect Qpid server", ex.getMessage()); + } + catch(Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.OK, ex.getMessage(), ex.getCause()); + ErrorDialog.openError(_window.getShell(), "Error", "Server could not be connected", status); + } + } + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/Refresh.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/Refresh.java new file mode 100644 index 0000000000..85b312cf99 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/Refresh.java @@ -0,0 +1,77 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.views.MBeanView; +import org.apache.qpid.management.ui.views.NavigationView; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class Refresh implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) + { + + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() + { + + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) + { + this._window = window; + } + + public void run(IAction action) + { + if(_window != null) + { + NavigationView view = (NavigationView)_window.getActivePage().findView(NavigationView.ID); + view.refresh(); + + MBeanView mbeanview = (MBeanView)_window.getActivePage().findView(MBeanView.ID); + mbeanview.refreshMBeanView(); + } + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/RemoveServer.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/RemoveServer.java new file mode 100644 index 0000000000..189f0f811b --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/actions/RemoveServer.java @@ -0,0 +1,92 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.actions; + +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.views.NavigationView; +import org.apache.qpid.management.ui.views.ViewUtility; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +public class RemoveServer implements IWorkbenchWindowActionDelegate +{ + private IWorkbenchWindow _window; + + /** + * Selection in the workbench has been changed. We + * can change the state of the 'real' action here + * if we want, but this can only happen after + * the delegate has been created. + * @see IWorkbenchWindowActionDelegate#selectionChanged + */ + public void selectionChanged(IAction action, ISelection selection) + { + + } + + /** + * We can use this method to dispose of any system + * resources we previously allocated. + * @see IWorkbenchWindowActionDelegate#dispose + */ + public void dispose() + { + + } + + /** + * We will cache window object in order to + * be able to provide parent shell for the message dialog. + * @see IWorkbenchWindowActionDelegate#init + */ + public void init(IWorkbenchWindow window) + { + this._window = window; + } + + public void run(IAction action) + { + if(_window != null) + { + NavigationView view = (NavigationView)_window.getActivePage().findView(NavigationView.ID); + try + { + view.removeServer(); + } + catch(InfoRequiredException ex) + { + ViewUtility.popupInfoMessage("Remove Qpid server", ex.getMessage()); + } + catch(Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.OK, ex.getMessage(), ex.getCause()); + ErrorDialog.openError(_window.getShell(), "Error", "Server could not be removed", status); + } + } + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/exceptions/InfoRequiredException.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/exceptions/InfoRequiredException.java new file mode 100644 index 0000000000..672426a59d --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/exceptions/InfoRequiredException.java @@ -0,0 +1,36 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.exceptions; + +public class InfoRequiredException extends Exception +{ + private static final long serialVersionUID = 1L; + + public InfoRequiredException(String message) + { + super(message); + } + + public InfoRequiredException(String msg, Throwable t) + { + super(msg, t); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientListener.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientListener.java new file mode 100644 index 0000000000..00a9ae7653 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientListener.java @@ -0,0 +1,77 @@ + +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */package org.apache.qpid.management.ui.jmx; + +import javax.management.MBeanServerNotification; +import javax.management.Notification; +import javax.management.NotificationListener; +import javax.management.ObjectName; +import javax.management.remote.JMXConnectionNotification; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.ManagedServer; + + +public class ClientListener implements NotificationListener +{ + protected ManagedServer server = null; + protected JMXServerRegistry serverRegistry = null; + + public ClientListener(ManagedServer server) + { + this.server = server; + serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + } + + public void handleNotification(Notification notification, Object handback) + { + System.out.println("\nReceived server notification: " + notification); + + ObjectName objName = null; + String type = notification.getType(); + if (MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(type)) + { + objName = ((MBeanServerNotification)notification).getMBeanName(); + getServerRegistry().registerManagedObject(objName); + } + else if (MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(type)) + { + objName = ((MBeanServerNotification)notification).getMBeanName(); + getServerRegistry().unregisterManagedObject(objName); + } + else if (JMXConnectionNotification.FAILED.equals(type)) + { + ApplicationRegistry.serverConnectionClosed(server); + } + } + + protected JMXServerRegistry getServerRegistry() + { + if (serverRegistry == null) + serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + + return serverRegistry; + } + public ManagedServer getServer() + { + return server; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientNotificationListener.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientNotificationListener.java new file mode 100644 index 0000000000..31b761fcf3 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/ClientNotificationListener.java @@ -0,0 +1,42 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.jmx; + +import javax.management.Notification; +import javax.management.ObjectName; + +import org.apache.qpid.management.ui.ManagedServer; + +public class ClientNotificationListener extends ClientListener +{ + public ClientNotificationListener(ManagedServer server) + { + super(server); + } + + public void handleNotification(Notification notification, Object handback) + { + System.out.println("\nReceived mbean notification: " + notification); + ObjectName objName = (ObjectName)notification.getSource(); + //String type = notification.getType(); + getServerRegistry().addNotification(objName, notification); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXManagedObject.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXManagedObject.java new file mode 100644 index 0000000000..dd665eabb3 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXManagedObject.java @@ -0,0 +1,50 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.jmx; + +import java.util.HashMap; + +import javax.management.ObjectName; + +import org.apache.qpid.management.ui.ManagedBean; + + +public class JMXManagedObject extends ManagedBean +{ + private ObjectName _objName; + + @SuppressWarnings("unchecked") + public JMXManagedObject(ObjectName objName) + { + super(); + this._objName = objName; + setName(_objName.getKeyProperty("name")); + setType(_objName.getKeyProperty("type")); + setUniqueName(_objName.toString()); + setDomain(_objName.getDomain()); + super.setProperties(new HashMap(_objName.getKeyPropertyList())); + } + + public ObjectName getObjectName() + { + return _objName; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXServerRegistry.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXServerRegistry.java new file mode 100644 index 0000000000..9bc3ea1b0f --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/JMXServerRegistry.java @@ -0,0 +1,336 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.jmx; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.management.MBeanInfo; +import javax.management.MBeanServerConnection; +import javax.management.Notification; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; + +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ManagedServer; +import org.apache.qpid.management.ui.ServerRegistry; +import org.apache.qpid.management.ui.model.ManagedAttributeModel; +import org.apache.qpid.management.ui.model.NotificationInfoModel; +import org.apache.qpid.management.ui.model.NotificationObject; +import org.apache.qpid.management.ui.model.OperationDataModel; + + +public class JMXServerRegistry extends ServerRegistry +{ + private ObjectName _serverObjectName = null; + private JMXConnector _jmxc = null; + private MBeanServerConnection _mbsc = null; + + private List<ManagedBean> _mbeansToBeAdded = new ArrayList<ManagedBean>(); + private List<ManagedBean> _mbeansToBeRemoved = new ArrayList<ManagedBean>(); + + private List<String> _queues = new ArrayList<String>(); + private List<String> _exchanges = new ArrayList<String>(); + + private HashMap<String, ManagedBean> _mbeansMap = new HashMap<String, ManagedBean>(); + private HashMap<String, MBeanInfo> _mbeanInfoMap = new HashMap<String, MBeanInfo>(); + private HashMap<String, ManagedAttributeModel> _attributeModelMap = new HashMap<String, ManagedAttributeModel>(); + private HashMap<String, OperationDataModel> _operationModelMap = new HashMap<String, OperationDataModel>(); + private HashMap<String, List<NotificationInfoModel>> _notificationInfoMap = new HashMap<String, List<NotificationInfoModel>>(); + private HashMap<String, List<NotificationObject>> _notificationsMap = new HashMap<String, List<NotificationObject>>(); + private HashMap<String, HashMap<String, List<String>>> _subscribedNotificationMap = new HashMap<String, HashMap<String, List<String>>>(); + + private ClientNotificationListener _notificationListener = null; + private ClientListener _clientListener = null; + + public JMXServerRegistry(ManagedServer server) throws Exception + { + super(server); + JMXServiceURL jmxUrl = new JMXServiceURL(server.getUrl()); + _jmxc = JMXConnectorFactory.connect(jmxUrl, null); + _mbsc = _jmxc.getMBeanServerConnection(); + + _clientListener = new ClientListener(server); + _notificationListener = new ClientNotificationListener(server); + + _jmxc.addConnectionNotificationListener(_clientListener, null, null); + _serverObjectName = new ObjectName("JMImplementation:type=MBeanServerDelegate"); + _mbsc.addNotificationListener(_serverObjectName, _clientListener, null, null); + } + + public MBeanServerConnection getServerConnection() + { + return _mbsc; + } + + /** + * removes all listeners from the mbean server. This is required when user + * disconnects the Qpid server connection + */ + public void closeServerConnection() throws Exception + { + if (_jmxc != null) + _jmxc.removeConnectionNotificationListener(_clientListener); + + if (_mbsc != null) + _mbsc.removeNotificationListener(_serverObjectName, _clientListener); + + // remove mbean notification listeners + for (String mbeanName : _subscribedNotificationMap.keySet()) + { + _mbsc.removeNotificationListener(new ObjectName(mbeanName), _notificationListener); + } + } + + public ManagedBean getManagedObject(String uniqueName) + { + return _mbeansMap.get(uniqueName); + } + + public void addManagedObject(ManagedBean key) + { + if (Constants.QUEUE.equals(key.getType())) + _queues.add(key.getName()); + else if (Constants.EXCHANGE.equals(key.getType())) + _exchanges.add(key.getName()); + + _mbeansMap.put(key.getUniqueName(), key); + } + + public void removeManagedObject(ManagedBean mbean) + { + if (Constants.QUEUE.equals(mbean.getType())) + _queues.remove(mbean.getName()); + else if (Constants.EXCHANGE.equals(mbean.getType())) + _exchanges.remove(mbean.getName()); + + _mbeansMap.remove(mbean.getUniqueName()); + } + + public void putMBeanInfo(ManagedBean mbean, MBeanInfo mbeanInfo) + { + _mbeanInfoMap.put(mbean.getUniqueName(), mbeanInfo); + } + public MBeanInfo getMBeanInfo(ManagedBean mbean) + { + return _mbeanInfoMap.get(mbean.getUniqueName()); + } + + public void setNotificationInfo(ManagedBean mbean, List<NotificationInfoModel>value) + { + _notificationInfoMap.put(mbean.getUniqueName(), value); + } + + public List<NotificationInfoModel> getNotificationInfo(ManagedBean mbean) + { + return _notificationInfoMap.get(mbean.getUniqueName()); + } + + public void addNotification(ObjectName objName, Notification notification) + { + List<NotificationObject> list = _notificationsMap.get(objName.toString()); + NotificationObject obj = new NotificationObject(notification.getSequenceNumber(), + new Date(notification.getTimeStamp()), + notification.getMessage(), + notification.getSource(), + notification.getType()); + + if (list == null) + { + list = new ArrayList<NotificationObject>(); + _notificationsMap.put(objName.toString(), list); + } + + list.add(obj); + } + + public List<NotificationObject> getNotifications(ManagedBean mbean) + { + return _notificationsMap.get(mbean.getUniqueName()); + } + + public void clearNotifications(ManagedBean mbean) + { + if (_notificationsMap.containsKey(mbean.getUniqueName())) + _notificationsMap.get(mbean.getUniqueName()).clear(); + } + + public void addNotificationListener(ManagedBean mbean, String name, String type) + { + HashMap<String, List<String>> map = _subscribedNotificationMap.get(mbean.getUniqueName()); + if (map == null) + { + map = new HashMap<String, List<String>>(); + _subscribedNotificationMap.put(mbean.getUniqueName(),map); + } + + List<String> list = map.get(name); + if (list == null) + { + list = new ArrayList<String>(); + map.put(name, list); + } + if (Constants.ALL.equals(type)) + { + List<NotificationInfoModel> infoList = _notificationInfoMap.get(mbean.getUniqueName()); + for (NotificationInfoModel model : infoList) + { + if (model.getName().equals(name)) + { + String[] types = model.getTypes(); + for (int i = 0; i < types.length; i++) + { + list.add(types[i]); + } + } + } + } + else + { + list.add(type); + } + + System.out.println("Subscribed for notification :" + mbean.getUniqueName()); + } + + public boolean hasSubscribedForNotifications(ManagedBean mbean, String name, String type) + { + if (_subscribedNotificationMap.containsKey(mbean.getUniqueName())) + { + HashMap<String, List<String>> map = _subscribedNotificationMap.get(mbean.getUniqueName()); + if (map.containsKey(name)) + { + if (map.get(name).contains(type)) + { + return true; + } + } + } + return false; + } + + public void removeNotificationListener(ManagedBean mbean, String name, String type) throws Exception + { + System.out.println("Removed notification listener :" + mbean.getUniqueName() + name +type); + if (_subscribedNotificationMap.containsKey(mbean.getUniqueName())) + { + HashMap<String, List<String>> map = _subscribedNotificationMap.get(mbean.getUniqueName()); + if (map.containsKey(name)) + { + if (Constants.ALL.equals(type)) + { + map.remove(name); + } + else if (type != null) + { + map.get(name).remove(type); + } + } + + JMXManagedObject jmxbean = (JMXManagedObject)mbean; + _mbsc.removeNotificationListener(jmxbean.getObjectName(), _notificationListener); + } + } + + public void registerManagedObject(ObjectName objName) + { + JMXManagedObject managedObject = new JMXManagedObject(objName); + managedObject.setServer(getManagedServer()); + _mbeansToBeAdded.add(managedObject); + } + + public void unregisterManagedObject(ObjectName objName) + { + JMXManagedObject managedObject = new JMXManagedObject(objName); + managedObject.setServer(getManagedServer()); + _mbeansToBeRemoved.add(managedObject); + } + + public List<ManagedBean> getObjectsToBeAdded() + { + if (_mbeansToBeAdded.isEmpty()) + return null; + else + { + List<ManagedBean> list = _mbeansToBeAdded; + _mbeansToBeAdded = new ArrayList<ManagedBean>(); + return list; + } + } + + public List<ManagedBean> getObjectsToBeRemoved() + { + if (_mbeansToBeRemoved.isEmpty()) + return null; + else + { + List<ManagedBean> list = new CopyOnWriteArrayList<ManagedBean>(_mbeansToBeRemoved); + _mbeansToBeRemoved.clear(); + return list; + } + } + + public void setAttributeModel(ManagedBean mbean, ManagedAttributeModel value) + { + _attributeModelMap.put(mbean.getUniqueName(), value); + } + + public ManagedAttributeModel getAttributeModel(ManagedBean mbean) + { + return _attributeModelMap.get(mbean.getUniqueName()); + } + + public void setOperationModel(ManagedBean mbean, OperationDataModel value) + { + _operationModelMap.put(mbean.getUniqueName(), value); + } + + public OperationDataModel getOperationModel(ManagedBean mbean) + { + return _operationModelMap.get(mbean.getUniqueName()); + } + + public String[] getQueueNames() + { + return _queues.toArray(new String[0]); + } + + public String[] getExchangeNames() + { + return _exchanges.toArray(new String[0]); + } + + public ClientNotificationListener getNotificationListener() + { + return _notificationListener; + } + + public ClientListener getClientListener() + { + return _clientListener; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java new file mode 100644 index 0000000000..800a5b6ce3 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/jmx/MBeanUtility.java @@ -0,0 +1,349 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.jmx; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.InstanceNotFoundException; +import javax.management.JMException; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanNotificationInfo; +import javax.management.MBeanOperationInfo; +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.ReflectionException; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ManagedServer; +import org.apache.qpid.management.ui.model.AttributeData; +import org.apache.qpid.management.ui.model.ManagedAttributeModel; +import org.apache.qpid.management.ui.model.NotificationInfoModel; +import org.apache.qpid.management.ui.model.OperationData; +import org.apache.qpid.management.ui.model.OperationDataModel; +import org.apache.qpid.management.ui.model.ParameterData; +import org.apache.qpid.management.ui.views.ViewUtility; + + +public class MBeanUtility +{ + + public static MBeanInfo getMBeanInfo(ManagedBean mbean) + throws IOException, JMException + { + ManagedServer server = mbean.getServer(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + if (mbsc == null) + System.out.println("MBeanServerConnection does not exist in the Application registry."); + + JMXManagedObject jmxbean = (JMXManagedObject)mbean; + MBeanInfo mbeanInfo = mbsc.getMBeanInfo(jmxbean.getObjectName()); + serverRegistry.putMBeanInfo(mbean, mbeanInfo); + + getAttributes(mbean); + getOperations(mbean); + + return mbeanInfo; + } + + + public static Object execute(ManagedBean mbean, OperationData opData) throws Exception + { + String opName = opData.getName(); + Object[] values = null; + String[] signature = null; + + List<ParameterData> params = opData.getParameters(); + if (params != null && !params.isEmpty()) + { + signature = new String[params.size()];; + values = new Object[params.size()]; + for (int i = 0; i < params.size(); i++) + { + signature[i] = params.get(i).getType(); + values[i] = params.get(i).getValue(); + System.out.println(params.get(i).getName() + " : " + params.get(i).getValue()); + } + } + + ManagedServer server = mbean.getServer(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + if (mbsc == null) + { + System.out.println("MBeanServerConnection doesn't exist in the Application registry."); + // TODO + // throw exception to check if the server is added + // Or try and get the connection again if it was disconnected + return null; + } + JMXManagedObject jmxbean = (JMXManagedObject)mbean; + return mbsc.invoke(jmxbean.getObjectName(), opName, values, signature); + + /* + try + { + + } + catch(MBeanException ex) + { + ex.printStackTrace(); + + } + catch(OperationsException ex) + { + ex.printStackTrace(); + + } + catch(JMException ex) + { + ex.printStackTrace(); + ViewUtility.popupError(new Exception(ex), "Operation failed"); + } + catch(IOException ex) + { + ex.printStackTrace(); + ViewUtility.popupError(new Exception(ex), "Operation failed"); + } + */ + } + + public static void handleException(Exception ex) + { + handleException(null, ex); + } + + public static void handleException(ManagedBean mbean, Exception ex) + { + if (mbean == null) + { + ViewUtility.popupErrorMessage("Error", ex.getMessage()); + } + else if (ex instanceof IOException) + { + ViewUtility.popupErrorMessage(mbean.getName(), ex.getMessage()); + } + else if (ex instanceof ReflectionException) + { + ViewUtility.popupErrorMessage(mbean.getName(), ex.getMessage()); + } + else if (ex instanceof InstanceNotFoundException) + { + ViewUtility.popupErrorMessage(mbean.getName(), ex.getMessage()); + } + else if (ex instanceof MBeanException) + { + ViewUtility.popupInfoMessage(mbean.getName(), ex.getMessage()); + } + else + { + ViewUtility.popupError(mbean.getName(), "Error occured", ex); + } + ex.printStackTrace(); + } + + public static void createNotificationlistener(ManagedBean mbean, String name, String type) + throws IOException, Exception + { + JMXManagedObject jmxbean = (JMXManagedObject)mbean; + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + serverRegistry.addNotificationListener(mbean, name, type); + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + + if (mbsc == null) + { + throw new Exception("MBeanServer connection is broken"); + } + mbsc.addNotificationListener(jmxbean.getObjectName(), serverRegistry.getNotificationListener(), null, null); + System.out.println("Listener created : " + jmxbean.getObjectName()); + } + + public static void removeNotificationListener(ManagedBean mbean, String name, String type) throws Exception + { + //JMXManagedObject jmxbean = (JMXManagedObject)mbean; + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + serverRegistry.removeNotificationListener(mbean, name, type); + //MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + + //if (mbsc != null) + //{ + // mbsc.removeNotificationListener(jmxbean.getObjectName(), serverRegistry.getNotificationListener()); + //} + } + + public static int refreshAttribute(ManagedBean mbean, String attribute) throws Exception + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + + if (mbsc == null) + throw new Exception("Server connection is not available for " + mbean.getUniqueName()); + + Object value = mbsc.getAttribute(((JMXManagedObject)mbean).getObjectName(), attribute); + + ManagedAttributeModel attributeModel = serverRegistry.getAttributeModel(mbean); + attributeModel.setAttributeValue(attribute, value); + return Integer.parseInt(String.valueOf(value)); + } + + public static ManagedAttributeModel getAttributes(ManagedBean mbean) + { + ObjectName objName = ((JMXManagedObject)mbean).getObjectName(); + String[] attributes = null; + AttributeList list = null; + + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + MBeanAttributeInfo[] attributesInfo = null; + ManagedAttributeModel attributeModel = serverRegistry.getAttributeModel(mbean); + // If retrieving attributeInfo for the first time. + if (attributeModel == null) + { + attributeModel = new ManagedAttributeModel(); + attributesInfo = serverRegistry.getMBeanInfo(mbean).getAttributes(); + attributes = new String[attributesInfo.length]; + for (int i = 0; i< attributesInfo.length ; i++) + { + attributes[i] = attributesInfo[i].getName(); + attributeModel.setAttributeDescription(attributes[i], attributesInfo[i].getDescription()); + attributeModel.setAttributeWritable(attributes[i], attributesInfo[i].isWritable()); + attributeModel.setAttributeReadable(attributes[i], attributesInfo[i].isReadable()); + } + } + else + { + attributes = attributeModel.getAttributeNames().toArray(new String[0]); + } + + try + { + if (attributes.length != 0) + { + list = mbsc.getAttributes(objName, attributes); + for (Iterator itr = list.iterator(); itr.hasNext();) + { + Attribute attrib = (Attribute)itr.next(); + attributeModel.setAttributeValue(attrib.getName(), attrib.getValue()); + } + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + + serverRegistry.setAttributeModel(mbean, attributeModel); + + return attributeModel; + } + + public static void updateAttribute(ManagedBean mbean, AttributeData attribute, String value) + { + JMXManagedObject jmxbean = (JMXManagedObject)mbean; + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + + Object newValue = value; + if (attribute.getDataType().equals(String.class.getName())) + { + + } + else if (attribute.getDataType().equals(Long.class.getName())) + { + newValue = new Long(Long.parseLong(value)); + } + else if (attribute.getDataType().equals(Integer.class.getName())) + { + newValue = new Integer(Integer.parseInt(value)); + } + + try + { + mbsc.setAttribute(jmxbean.getObjectName(), new Attribute(attribute.getName(), newValue)); + + // Update the value in the registry, to avoid refreshing from mbsc + ManagedAttributeModel attributeModel = serverRegistry.getAttributeModel(mbean); + attributeModel.setAttributeValue(attribute.getName(), newValue); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + } + + public static OperationDataModel getOperations(ManagedBean mbean) + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + + OperationDataModel dataModel = serverRegistry.getOperationModel(mbean); + if (dataModel == null) + { + MBeanInfo mbeanInfo = serverRegistry.getMBeanInfo(mbean); + MBeanOperationInfo[] operationsInfo = mbeanInfo.getOperations(); + dataModel = new OperationDataModel(); + + for (int i = 0; i < operationsInfo.length; i++) + { + dataModel.addOperation(operationsInfo[i]); + } + + serverRegistry.setOperationModel(mbean, dataModel); + } + + return dataModel; + } + + public static NotificationInfoModel[] getNotificationInfo(ManagedBean mbean) + { + + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(mbean); + MBeanNotificationInfo[] info = serverRegistry.getMBeanInfo(mbean).getNotifications(); + + if (info == null || info.length == 0) + return null; + + List<NotificationInfoModel> list = serverRegistry.getNotificationInfo(mbean); + + if (list != null) + return list.toArray(new NotificationInfoModel[0]); + else + list = new ArrayList<NotificationInfoModel>(); + + for (int i = 0; i < info.length; i++) + { + list.add(new NotificationInfoModel(info[i].getName(), info[i].getDescription(), info[i].getNotifTypes())); + } + serverRegistry.setNotificationInfo(mbean, list); + + return list.toArray(new NotificationInfoModel[0]); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/AttributeData.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/AttributeData.java new file mode 100644 index 0000000000..601f499a0c --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/AttributeData.java @@ -0,0 +1,95 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +public class AttributeData +{ + String name = ""; + String description = ""; + String dataType = ""; + Object value = null; + boolean readable = true; + boolean writable = false; + + + public String getDataType() + { + return dataType; + } + public void setDataType(String dataType) + { + this.dataType = dataType; + } + + public String getDescription() + { + return description; + } + public void setDescription(String description) + { + this.description = description; + } + + public String getName() + { + return name; + } + public void setName(String name) + { + this.name = name; + } + + public Object getValue() + { + return value; + } + public void setValue(Object value) + { + this.value = value; + } + public boolean isReadable() + { + return readable; + } + public void setReadable(boolean readable) + { + this.readable = readable; + } + public boolean isWritable() + { + return writable; + } + public void setWritable(boolean writable) + { + this.writable = writable; + } + + public boolean isNumber() + { + if ("int".equals(dataType) || "java.lang.Integer".equals(dataType) || + "long".equals(dataType) || "java.lang.Long".equals(dataType) ) + { + return true; + } + else + return false; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ManagedAttributeModel.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ManagedAttributeModel.java new file mode 100644 index 0000000000..692e72fc5a --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ManagedAttributeModel.java @@ -0,0 +1,113 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ManagedAttributeModel +{ + HashMap<String, AttributeData> _attributeMap = new HashMap<String, AttributeData>(); + + public void setAttributeValue(String name, Object value) + { + if (value == null) + return; + + AttributeData data = null; + String dataType = value.getClass().getName(); + if (_attributeMap.containsKey(name)) + { + data = _attributeMap.get(name); + data.setValue(value); + } + else + { + data = new AttributeData(); + data.setName(name); + data.setValue(value); + _attributeMap.put(name, data); + } + data.setDataType(dataType); + } + + + public void setAttributeDescription(String name, String value) + { + if (_attributeMap.containsKey(name)) + { + _attributeMap.get(name).setDescription(value); + } + else + { + AttributeData data = new AttributeData(); + data.setName(name); + data.setDescription(value); + _attributeMap.put(name, data); + } + } + + public void setAttributeReadable(String name, boolean readable) + { + if (_attributeMap.containsKey(name)) + { + _attributeMap.get(name).setReadable(readable); + } + else + { + AttributeData data = new AttributeData(); + data.setName(name); + data.setReadable(readable); + _attributeMap.put(name, data); + } + } + + public void setAttributeWritable(String name, boolean writable) + { + if (_attributeMap.containsKey(name)) + { + _attributeMap.get(name).setWritable(writable); + } + else + { + AttributeData data = new AttributeData(); + data.setName(name); + data.setWritable(writable); + _attributeMap.put(name, data); + } + } + + public List<String> getAttributeNames() + { + return new ArrayList<String>(_attributeMap.keySet()); + } + + public AttributeData[] getAttributes() + { + return _attributeMap.values().toArray(new AttributeData[0]); + } + + public int getCount() + { + return _attributeMap.size(); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationInfoModel.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationInfoModel.java new file mode 100644 index 0000000000..6d4160889e --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationInfoModel.java @@ -0,0 +1,51 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +public class NotificationInfoModel +{ + String name; + String description; + String[] types; + + public NotificationInfoModel(String name, String desc, String[] types) + { + this.name = name; + this.description = desc; + this.types = types; + } + + public String getDescription() + { + return description; + } + + public String getName() + { + return name; + } + + public String[] getTypes() + { + return types; + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationObject.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationObject.java new file mode 100644 index 0000000000..8ba74b3ce8 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/NotificationObject.java @@ -0,0 +1,88 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class NotificationObject +{ + + private long _sequenceNo; + private Date _timeStamp; + private String _message; + private Object _source; + private String _type; // INFO, WARN, etc + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss dd/MM/yy z"); + + public NotificationObject(long seqNo, Date timeStamp, String message, Object source, String type) + { + this._sequenceNo = seqNo; + this._message = message; + this._source = source; + this._type = type; + this._timeStamp = timeStamp; + dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); + } + + public Object getSource() + { + return _source; + } + public void setSource(Object _source) + { + this._source = _source; + } + public String getMessage() + { + return _message; + } + public void setMessage(String _message) + { + this._message = _message; + } + public long getSequenceNo() + { + return _sequenceNo; + } + public void setSequenceNo(long no) + { + _sequenceNo = no; + } + public String getTimeStamp() + { + return dateFormat.format(_timeStamp); + } + public void setTimeStamp(Date stamp) + { + _timeStamp = stamp; + } + public String getType() + { + return _type; + } + public void setType(String _type) + { + this._type = _type; + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationData.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationData.java new file mode 100644 index 0000000000..9b6750c21a --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationData.java @@ -0,0 +1,84 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +import java.util.List; + +public class OperationData +{ + private String _name; + private String _description; + private String _returnType; + private int _impact; + private List<ParameterData> _parameters; + + public OperationData(String value) + { + this._name = value; + } + + public String getName() + { + return _name; + } + + public String getDescription() + { + return _description; + } + + public void setDescription(String description) + { + this._description = description; + } + + public List<ParameterData> getParameters() + { + return _parameters; + } + + public void setParameters(List<ParameterData> parameters) + { + this._parameters = parameters; + } + + public int getImpact() + { + return _impact; + } + + public void setImpact(int impact) + { + this._impact = impact; + } + + public String getReturnType() + { + return _returnType; + } + + public void setReturnType(String returnType) + { + this._returnType = returnType; + } + + +}
\ No newline at end of file diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationDataModel.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationDataModel.java new file mode 100644 index 0000000000..2df36ee8c6 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/OperationDataModel.java @@ -0,0 +1,73 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import javax.management.MBeanOperationInfo; +import javax.management.MBeanParameterInfo; + +public class OperationDataModel +{ + HashMap<String, OperationData> _operationMap = new HashMap<String, OperationData>(); + + public void addOperation(MBeanOperationInfo opInfo) + { + OperationData opData = new OperationData(opInfo.getName()); + opData.setDescription(opInfo.getDescription()); + opData.setImpact(opInfo.getImpact()); + opData.setReturnType(opInfo.getReturnType()); + + int parametersCount = opInfo.getSignature().length; + if (parametersCount != 0) + { + List<ParameterData> paramList = new ArrayList<ParameterData>(); + for (int i = 0; i < parametersCount; i++) + { + MBeanParameterInfo paramInfo = opInfo.getSignature()[i]; + ParameterData param = new ParameterData(paramInfo.getName()); + param.setDescription(paramInfo.getDescription()); + param.setType(paramInfo.getType()); + paramList.add(param); + } + opData.setParameters(paramList); + } + + _operationMap.put(opInfo.getName(), opData); + } + + public OperationData getOperation(String name) + { + return _operationMap.get(name); + } + + public List<OperationData> getOperations() + { + return new ArrayList<OperationData>(_operationMap.values()); + } + + public int getCount() + { + return _operationMap.size(); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ParameterData.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ParameterData.java new file mode 100644 index 0000000000..4ca47c88ea --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/model/ParameterData.java @@ -0,0 +1,79 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.model; + +public class ParameterData +{ + private String name; + private String description; + private String type; + private Object value; + + ParameterData(String value) + { + this.name = value; + } + + public String getDescription() + { + return description; + } + public void setDescription(String description) + { + this.description = description; + } + + public String getName() + { + return name; + } + + public String getType() + { + return type; + } + public void setType(String type) + { + this.type = type; + } + + public Object getValue() + { + return value; + } + + public void setValueFromString(String strValue) + { + if ("int".equals(type)) + value = Integer.parseInt(strValue); + else if ("boolean".equals(type)) + value = Boolean.valueOf(strValue); + else if ("long".equals(type)) + value = Long.parseLong(strValue); + else + value = strValue; + } + + public void setValue(Object value) + { + this.value = value; + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/AttributesTabControl.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/AttributesTabControl.java new file mode 100644 index 0000000000..b5c044e7be --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/AttributesTabControl.java @@ -0,0 +1,937 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import javax.management.openmbean.TabularDataSupport; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.jmx.JMXServerRegistry; +import org.apache.qpid.management.ui.jmx.MBeanUtility; +import org.apache.qpid.management.ui.model.AttributeData; +import org.apache.qpid.management.ui.model.ManagedAttributeModel; +import org.eclipse.jface.viewers.IColorProvider; +import org.eclipse.jface.viewers.IFontProvider; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseMoveListener; +import org.eclipse.swt.events.MouseTrackListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; + + +public class AttributesTabControl extends TabControl +{ + private FormToolkit _toolkit; + private Form _form; + private Table _table = null; + private TableViewer _tableViewer = null; + private static final int[] tableWidths = new int[] {300, 300}; + private static final String DESCRIPTION = "Description"; + private static final String UPDATE_BUTTON = "Update"; + private final String[] _tableTitles = {"Attribute Name", "Value"}; + + private DisposeListener tableDisposeListener = new DisposeListenerImpl(); + final Image image; + private Button _detailsButton = null; + private Button _editButton = null; + private Button _graphButton = null; + private Button _refreshButton = null; + private boolean disableEditing = false; + + private static final String MAX_VALUE = "MaxValue"; + private static final String GRAPH_VALUES = "GraphValues"; + private int GRAPH_WIDTH = 700; + private int GRAPH_HEIGHT = 450; + private int GRAPH_ITEM_GAP = 100; + private int startX = 80; + private int startY = 60; + + static int number = 0; + + public AttributesTabControl(TabFolder tabFolder) + { + super(tabFolder); + _toolkit = new FormToolkit(_tabFolder.getDisplay()); + _form = _toolkit.createForm(_tabFolder); + GridLayout gridLayout = new GridLayout(2, false); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + _form.getBody().setLayout(gridLayout); + + image = Display.getCurrent().getSystemImage(SWT.ICON_INFORMATION); + createWidgets(); + } + + public Control getControl() + { + return _form; + } + + protected void createWidgets() + { + createTable(); + createTableViewer(); + createButtons(); + addTableListeners(); + } + + private void createTable() + { + _table = _toolkit.createTable(_form.getBody(), SWT.FULL_SELECTION); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 6); + _table.setLayoutData(gridData); + + for (int i = 0; i < _tableTitles.length; ++i) + { + final TableColumn column = new TableColumn(_table, SWT.NONE); + column.setText(_tableTitles[i]); + column.setWidth(tableWidths[i]); + column.setResizable(false); + } + + _table.setLinesVisible (true); + _table.setHeaderVisible (true); + } + + private void createTableViewer() + { + _tableViewer = new TableViewer(_table); + _tableViewer.setUseHashlookup(true); + //_tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 6)); + + // Set the column properties that will be used in callbacks to recognize + // the column on which we will want to operate + _tableViewer.setColumnProperties(_tableTitles); + /* + // Create the cell editors + CellEditor[] cellEditors = new CellEditor[_tableTitles.length]; + + + TextCellEditor textEditor = new TextCellEditor(_table); + cellEditors[0] = textEditor; + textEditor = new TextCellEditor(_table); + cellEditors[1] = textEditor; + + // Assign the cell editors to the viewer + _tableViewer.setCellEditors(cellEditors); + _tableViewer.setCellModifier(new TableCellModifier()); + */ + + + + _tableViewer.setContentProvider(new ContentProviderImpl()); + _tableViewer.setLabelProvider(new LabelProviderImpl()); + + } + + private void createButtons() + { + addDetailsButton(); + addEditButton(); + addGraphButton(); + addRefreshButton(); + } + + + private void addDetailsButton() + { + // Create and configure the button for attribute details + _detailsButton = _toolkit.createButton(_form.getBody(), + Constants.BUTTON_DETAILS, + SWT.PUSH | SWT.CENTER); + + _detailsButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData gridData = new GridData(SWT.BEGINNING, SWT.TOP, true, false); + gridData.widthHint = 80; + _detailsButton.setLayoutData(gridData); + _detailsButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + disableEditing = true; + int index = _table.getSelectionIndex(); + TableItem item = _table.getItem(index); + createDetailsPopup((AttributeData)item.getData()); + disableEditing = false; + setFocus(); + } + }); + } + + private void addEditButton() + { + // Create and configure the button for editing attribute + _editButton = _toolkit.createButton(_form.getBody(), + Constants.BUTTON_EDIT_ATTRIBUTE, + SWT.PUSH | SWT.CENTER); + _editButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData gridData = new GridData(SWT.BEGINNING, SWT.TOP, true, false); + gridData.widthHint = 80; + _editButton.setLayoutData(gridData); + _editButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + int index = _table.getSelectionIndex(); + TableItem item = _table.getItem(index); + createDetailsPopup((AttributeData)item.getData()); + setFocus(); + } + }); + } + + private void addGraphButton() + { + _graphButton = _toolkit.createButton(_form.getBody(), + Constants.BUTTON_GRAPH, + SWT.PUSH | SWT.CENTER); + _graphButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData gridData = new GridData(SWT.BEGINNING, SWT.TOP, true, false); + gridData.widthHint = 80; + _graphButton.setLayoutData(gridData); + _graphButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent event) + { + int selectionIndex = _table.getSelectionIndex(); + AttributeData data = (AttributeData)_table.getItem(selectionIndex).getData(); + createGraph(data); + setFocus(); + } + }); + } + + private void addRefreshButton() + { + // Create and configure the "Refresh" button + _refreshButton = _toolkit.createButton(_form.getBody(), + Constants.BUTTON_REFRESH, + SWT.PUSH | SWT.CENTER); + + _refreshButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData gridData = new GridData(SWT.BEGINNING, SWT.TOP, true, false); + gridData.widthHint = 80; + _refreshButton.setLayoutData(gridData); + _refreshButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + // refresh the attributes list + refresh(_mbean); + } + }); + } + + private void addTableListeners() + { + _tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){ + public void selectionChanged(SelectionChangedEvent evt) + { + IStructuredSelection ss = (IStructuredSelection)evt.getSelection(); + checkForEnablingButtons((AttributeData)ss.getFirstElement()); + } + }); + + MouseListenerImpl listener = new MouseListenerImpl(); + _tableViewer.getTable().addMouseTrackListener(listener); + _tableViewer.getTable().addMouseMoveListener(listener); + _tableViewer.getTable().addMouseListener(listener); + + _table.addDisposeListener(tableDisposeListener); + + // _table is equal to _tableViewer.getControl() + _table.addListener(SWT.MeasureItem, new Listener() { + public void handleEvent(Event event) + { + event.height = event.gc.getFontMetrics().getHeight() * 3/2; + } + }); + + // Below to be worked on to set an image in front of each row. + /* + _table.addListener(SWT.PaintItem, new Listener() { + public void handleEvent(Event event) + { + int x = event.x + event.width; + Rectangle rect = image.getBounds(); + int offset = Math.max(0, (event.height - rect.height) / 2); + event.gc.drawImage(image, event.x, event.y + offset); + } + }); + */ + } + + private class MouseListenerImpl implements MouseTrackListener, MouseMoveListener, + KeyListener, MouseListener + + { + Shell tooltipShell = null; + Label tooltipLabel = null; + public void mouseHover(MouseEvent event) + { + TableItem item = _table.getItem (new Point (event.x, event.y)); + + if (item != null) + { + AttributeData data = (AttributeData)item.getData(); + if (tooltipShell != null && !tooltipShell.isDisposed ()) tooltipShell.dispose (); + tooltipShell = new Shell(_table.getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL); + tooltipShell.setBackground(event.display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + FillLayout layout = new FillLayout(); + layout.marginWidth = 2; + tooltipShell.setLayout(layout); + tooltipLabel = new Label(tooltipShell, SWT.NONE); + tooltipLabel.setForeground(event.display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); + tooltipLabel.setBackground(event.display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); + tooltipLabel.setText(data.getDescription()); + tooltipLabel.setData("_TABLEITEM", item); + tooltipLabel.addListener(SWT.MouseExit, tooltipLabelListener); + tooltipLabel.addListener(SWT.MouseDown, tooltipLabelListener); + Point size = tooltipShell.computeSize(SWT.DEFAULT, SWT.DEFAULT); + Rectangle rect = item.getBounds(0); + Point pt = _table.toDisplay(rect.x, rect.y); + tooltipShell.setBounds(pt.x, pt.y, size.x, size.y); + tooltipShell.setVisible(true); + } + } + public void mouseEnter(MouseEvent e) + { + } + public void mouseExit(MouseEvent e) + { + } + + // MouseMoveListener implementation + public void mouseMove(MouseEvent event) + { + if (tooltipShell == null) + return; + + tooltipShell.dispose(); + tooltipShell = null; + tooltipLabel = null; + } + + // KeyListener implementation + public void keyPressed(KeyEvent e) + { + if (tooltipShell == null) + return; + + tooltipShell.dispose(); + tooltipShell = null; + tooltipLabel = null; + } + public void keyReleased(KeyEvent e) + { + + } + + // MouseListener implementation + public void mouseDoubleClick(MouseEvent event) + { + if (tooltipShell != null) + { + tooltipShell.dispose(); + tooltipShell = null; + tooltipLabel = null; + } + Table table = (Table)event.getSource(); + int selectionIndex = table.getSelectionIndex(); + AttributeData data = (AttributeData)table.getItem(selectionIndex).getData(); + createDetailsPopup(data); + } + public void mouseDown(MouseEvent e) + { + if (tooltipShell != null) + { + tooltipShell.dispose(); + tooltipShell = null; + tooltipLabel = null; + } + } + public void mouseUp(MouseEvent e) + { + + } + } // end of MouseListenerImpl + + public void createDetailsPopup(AttributeData data) + { + int width = 500; + int height = 250; + if (data.getValue() instanceof TabularDataSupport) + { + width = 650; + height = 450; + } + + Display display = Display.getCurrent(); + Shell shell = ViewUtility.createPopupShell("Attribute", width, height); + createDetailsPopupContents(shell, data); + + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + shell.dispose(); + } + + final Listener tooltipLabelListener = new Listener () + { + public void handleEvent (Event event) + { + Label label = (Label)event.widget; + Shell shell = label.getShell(); + switch (event.type) + { + case SWT.MouseDown: + Event e = new Event(); + e.item = (TableItem)label.getData ("_TABLEITEM"); + _table.setSelection(new TableItem[] {(TableItem)e.item}); + shell.dispose(); + _table.setFocus(); + break; + case SWT.MouseExit: + shell.dispose(); + break; + } + } + }; + + + private void createDetailsPopupContents(Composite shell, AttributeData attribute) + { + GridLayout layout = new GridLayout(2, false); + layout.horizontalSpacing = 10; + layout.verticalSpacing = 10; + layout.marginHeight = 20; + layout.marginWidth = 20; + + Composite parent = new Composite(shell, SWT.NONE); + parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + parent.setLayout(layout); + + // Name + Label label = new Label(parent, SWT.NONE); + label.setText(_tableTitles[0]); + GridData layoutData = new GridData(SWT.TRAIL, SWT.TOP, false, false); + label.setLayoutData(layoutData); + Text value = new Text(parent, SWT.BEGINNING | SWT.BORDER |SWT.READ_ONLY); + value.setText(attribute.getName()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + + // Description + label = new Label(parent, SWT.NONE); + label.setText(DESCRIPTION); + label.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY); + value.setText(attribute.getDescription()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + // value + label = new Label(parent, SWT.NONE); + label.setText(_tableTitles[1]); + label.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + + if (!attribute.isReadable()) + { + value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY); + value.setText(""); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + } + else + { + if (attribute.getValue() instanceof TabularDataSupport) + { + Composite composite = new Composite(parent, SWT.BORDER); + composite.setLayout(new GridLayout()); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + ViewUtility.createTabularDataHolder(composite,(TabularDataSupport)attribute.getValue()); + } + else + { + int style = 0; + if (attribute.isWritable()) + { + style = SWT.BEGINNING | SWT.BORDER; + value = new Text(parent, style); + value.addVerifyListener(new VerifyListener() + { + public void verifyText(VerifyEvent event) + { + String string = event.text; + char [] chars = new char [string.length ()]; + string.getChars (0, chars.length, chars, 0); + for (int i=0; i<chars.length; i++) + { + if (!('0' <= chars [i] && chars [i] <= '9')) + { + event.doit = false; + return; + } + } + } + }); + + // set data to access in the listener + parent.setData(attribute); + } + else + { + style = SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY; + value = new Text(parent, style); + } + + value.setText(attribute.getValue().toString()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + } + } + + + // Update button + Button updateButton = addUpdateButton(parent); + updateButton.setData(value); + if (!attribute.isWritable()) + { + updateButton.setVisible(false); + } + + if (disableEditing) + { + value.setEditable(false); + updateButton.setVisible(false); + } + } + + private Button addUpdateButton(Composite parent) + { + final Button updateButton = new Button(parent, SWT.PUSH | SWT.CENTER); + // set the data to access in the listener + parent.setData(UPDATE_BUTTON, updateButton); + + updateButton.setText(UPDATE_BUTTON); + GridData gridData = new GridData (SWT.CENTER, SWT.BOTTOM, true, true, 2, 1); + gridData.widthHint = 100; + updateButton.setLayoutData(gridData); + updateButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent event) + { + Button button = (Button)event.widget; + Text text = (Text)button.getData(); + AttributeData data = (AttributeData)button.getParent().getData(); + MBeanUtility.updateAttribute(_mbean, data, text.getText()); + button.getShell().close(); + refresh(); + } + }); + + return updateButton; + } + + // Refresh from the server registry + private void refresh() + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean); + ManagedAttributeModel attributesList = serverRegistry.getAttributeModel(_mbean); + _tableViewer.setInput(attributesList); + } + + // Refreshes the attribute tab by querying the mbean server for latest values + @Override + public void refresh(ManagedBean mbean) + { + _mbean = mbean; + if (_mbean == null) + { + _tableViewer.setInput(null); + return; + } + ManagedAttributeModel attributesList = MBeanUtility.getAttributes(mbean); + _tableViewer.setInput(attributesList); + _table.setItemCount(attributesList.getCount()); + + // No attribtue selected when refreshing the tab + checkForEnablingButtons(null); + _form.layout(); + } + + public void setFocus() + { + _table.setFocus(); + } + + private void checkForEnablingButtons(AttributeData attribute) + { + if (attribute == null) + { + _detailsButton.setEnabled(false); + _editButton.setEnabled(false); + _graphButton.setEnabled(false); + _refreshButton.setEnabled(false); + return; + } + + _detailsButton.setEnabled(true); + _refreshButton.setEnabled(true); + if (attribute.isWritable()) + { + _editButton.setEnabled(true); + _graphButton.setEnabled(false); + } + else + { + _editButton.setEnabled(false); + if (attribute.isNumber()) + { + _graphButton.setEnabled(true); + } + else + { + _graphButton.setEnabled(false); + } + } + } + + private void createGraph(final AttributeData data) + { + Display display = Display.getCurrent(); + Shell shell = new Shell(display, SWT.BORDER | SWT.CLOSE | SWT.MIN | SWT.MAX); + shell.setText(_mbean.getName()); + int x = display.getBounds().width; + int y = display.getBounds().height; + shell.setBounds(x/4, y/4, GRAPH_WIDTH, GRAPH_HEIGHT); + shell.setLayout(new FillLayout()); + + final Canvas canvas = new Canvas(shell, SWT.NONE); + long currentValue = Long.parseLong(data.getValue().toString()); + long mValue = getGraphMaxValue(currentValue); + canvas.setData(MAX_VALUE, mValue); + canvas.setData(GRAPH_VALUES, new long[] {0,0,0,0,0,currentValue}); + + canvas.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + canvas.addPaintListener(new PaintListener() + { + public void paintControl(PaintEvent event) + { + Canvas canvas = (Canvas)event.widget; + int maxX = canvas.getSize().x; + int maxY = canvas.getSize().y; + event.gc.fillRectangle(canvas.getBounds()); + event.gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); + event.gc.setLineWidth(4); + + Object canvasData = canvas.getData(MAX_VALUE); + String str = canvasData.toString(); + long maxValue = Long.parseLong(str); + // Set the graph dimensions + event.gc.drawText("0", startX - 40, maxY - startY - 10); + event.gc.drawText("" + maxValue/2, startX - 40, maxY/2); + event.gc.drawText("" + maxValue, startX - 40, startY); + + // horizontal line + event.gc.drawLine(startX, maxY - startY, maxX - 60, maxY - startY); + // vertical line + event.gc.drawLine(startX, maxY - startY, startX, startY); + // set graph text + event.gc.drawText(data.getName(), startX - 40, startY - 40); + event.gc.drawText("25 sec", startX, maxY - startY + 10); + event.gc.drawText("20 sec", startX + GRAPH_ITEM_GAP, maxY - startY + 10); + event.gc.drawText("15 sec", startX + GRAPH_ITEM_GAP * 2, maxY - startY + 10); + event.gc.drawText("10 sec", startX + GRAPH_ITEM_GAP * 3, maxY - startY + 10); + event.gc.drawText(" 5 sec", startX + GRAPH_ITEM_GAP * 4, maxY - startY + 10); + event.gc.drawText(" 0 sec", startX + GRAPH_ITEM_GAP * 5, maxY - startY + 10); + + // plot the graph now for values + event.gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE)); + canvasData = canvas.getData(GRAPH_VALUES); + long[] graphValues = (long[]) canvasData; + for (int i = 0; i < graphValues.length; i++) + { + int x = startX + i * GRAPH_ITEM_GAP; + int yTotalLength = (maxY - 2 * startY); + float ratio = ((float)graphValues[i]/(float)maxValue); + int itemlength = (int)(yTotalLength * ratio); + int y = maxY - startY - itemlength; + event.gc.drawLine(x, maxY- startY, x, y); + event.gc.drawText(String.valueOf(graphValues[i]), x, y - 20); + } + } + }); + + shell.open(); + + // Set up the timer for the animation + Runnable runnable = new Runnable() + { + public void run() + { + try + { + animate(canvas, data); + Display.getCurrent().timerExec(Constants.TIMER_INTERVAL, this); + } + catch(Exception ex) + { + MBeanUtility.handleException(ex); + } + } + }; + + // Launch the timer + display.timerExec(Constants.TIMER_INTERVAL, runnable); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + + // Kill the timer + display.timerExec(-1, runnable); + shell.dispose(); + } + + public AttributeData getSelectionAttribute() + { + int index = _table.getSelectionIndex(); + if (index == -1) + return null; + + return (AttributeData)_table.getItem(index).getData(); + } + + private void animate(Canvas canvas, AttributeData data) throws Exception + { + String attribute = data.getName(); + int value = MBeanUtility.refreshAttribute(_mbean, attribute); + Object canvasData = canvas.getData(GRAPH_VALUES); + long[] graphValues = (long[]) canvasData; + + for (int i = 0; i < graphValues.length -1; i++) + { + graphValues[i] = graphValues[i + 1]; + } + graphValues[graphValues.length - 1] = value; + + canvasData = canvas.getData(MAX_VALUE); + long maxValue = Long.parseLong(String.valueOf(canvasData)); + if (maxValue < value) + { + maxValue = getGraphMaxValue(value); + canvas.setData(MAX_VALUE, maxValue); + } + + canvas.redraw(); + } + + private long getGraphMaxValue(long maxAttributeValue) + { + long maxGraphValue = 100; + long temp = maxAttributeValue * 3/2; + if (temp > maxGraphValue) + { + long modulus = temp % 100; + maxGraphValue = temp + ( 100 - modulus); + } + + return maxGraphValue; + } + + private class ContentProviderImpl implements IStructuredContentProvider + { + + public void inputChanged(Viewer v, Object oldInput, Object newInput) + { + + } + + public void dispose() + { + + } + + public Object[] getElements(Object parent) + { + return ((ManagedAttributeModel)parent).getAttributes(); + } + } + + private class LabelProviderImpl extends LabelProvider implements ITableLabelProvider, + IFontProvider, + IColorProvider + { + + AttributeData attribute = null; + public String getColumnText(Object element, int columnIndex) + { + String result = ""; + attribute = (AttributeData) element; + + switch (columnIndex) + { + case 0 : // attribute name column + result = ViewUtility.getDisplayText(attribute.getName()); + break; + case 1 : // attribute value column + if (attribute.getValue() != null) + result = String.valueOf(attribute.getValue()); + break; + default : + result = ""; + } + + return result; + } + + public Image getColumnImage(Object element, int columnIndex) + { + return null; + } + + public Font getFont(Object element) + { + return ApplicationRegistry.getFont(Constants.FONT_TABLE_CELL); + } + + public Color getForeground(Object element) + { + attribute = (AttributeData) element; + if (attribute.isWritable()) + return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE); + else + return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK); + } + public Color getBackground(Object element) + { + return _form.getBackground(); + } + } + + private class DisposeListenerImpl implements DisposeListener + { + public void widgetDisposed(DisposeEvent e) + { + + } + } + + /* + class TableCellModifier implements ICellModifier + { + + public boolean canModify(Object element, String property) + { + int columnIndex = Arrays.asList(_tableTitles).indexOf(property); + if (columnIndex == 0) + return false; + + return true; + } + + public Object getValue(Object element, String property) { + + // Find the index of the column + int columnIndex = Arrays.asList(_tableTitles).indexOf(property); + Attribute attribute = (Attribute)element; + + + Object result = null; + + switch (columnIndex) + { + case 0 : // attribute name column + result = attribute.getName(); + break; + case 1 : // attribute value column + result = attribute.getValue(); + break; + default : + result = ""; + } + + return result; + } + + + public void modify(Object element, String property, Object value) + { + // Find the index of the column + int columnIndex = Arrays.asList(_tableTitles).indexOf(property); + + if (columnIndex == 1) + { + //TODO + // update the attribute value and call the MBean setAttribute method + // then refresh the attribute tab with new values + } + } + } + */ + +}
\ No newline at end of file diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/INotificationViewer.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/INotificationViewer.java new file mode 100644 index 0000000000..bc560b6064 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/INotificationViewer.java @@ -0,0 +1,32 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.util.List; + +import org.apache.qpid.management.ui.model.NotificationObject; + +public interface INotificationViewer +{ + public void addNotification(NotificationObject notification); + + public void addNotification(List<NotificationObject> notificationList); +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java new file mode 100644 index 0000000000..063f80fd3f --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/MBeanView.java @@ -0,0 +1,431 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.util.HashMap; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.jmx.JMXServerRegistry; +import org.apache.qpid.management.ui.jmx.MBeanUtility; +import org.apache.qpid.management.ui.model.AttributeData; +import org.apache.qpid.management.ui.model.OperationData; +import org.apache.qpid.management.ui.model.OperationDataModel; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.TabItem; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.part.ViewPart; + + +public class MBeanView extends ViewPart +{ + public static final String ID = "org.apache.qpid.management.ui.mbeanView"; + + private FormToolkit _toolkit = null; + private Form _form = null; + private ManagedBean _mbean = null; + private HashMap<String, TabFolder> tabFolderMap = new HashMap<String, TabFolder>(); + private ISelectionListener selectionListener = new SelectionListenerImpl(); + + private static final String ATTRIBUTES_CONTROL = "AttributesTabControl"; + private static final String OPERATIONS_CONTROL = "OperationsTabControl"; + private static final String NOTIFICATIONS_CONTROL = "NotificationsTabControl"; + + + /* + * Listener for the selection events in the navigation view + */ + private class SelectionListenerImpl implements ISelectionListener + { + public void selectionChanged(IWorkbenchPart part, ISelection sel) + { + if (!(sel instanceof IStructuredSelection)) + return; + + IStructuredSelection ss = (IStructuredSelection) sel; + TreeObject node = (TreeObject)ss.getFirstElement(); + showSelectedMBean(node); + /* + _mbean = null; + setInvisible(); + + if (node == null) + { + _form.setText("Qpid Management Console"); + return; + } + + if (Constants.NOTIFICATION.equals(node.getType())) + { + _mbean = (ManagedBean)node.getParent().getManagedObject(); + } + else if (Constants.MBEAN.equals(node.getType())) + { + _mbean = (ManagedBean)node.getManagedObject(); + } + else + { + _form.setText("Qpid Management Console"); + return; + } + + setFocus(); + try + { + MBeanUtility.getMBeanInfo(_mbean); + } + catch(Exception ex) + { + MBeanUtility.handleException(_mbean, ex); + return; + } + + TabFolder tabFolder = tabFolderMap.get(_mbean.getType()); + if (tabFolder == null) + { + tabFolder = createTabFolder(); + } + + String text = _mbean.getType(); + if (_mbean.getName() != null && _mbean.getName().length() != 0) + { + text = text + ": " + _mbean.getName(); + } + _form.setText(text); + int tabIndex = 0; + if (Constants.NOTIFICATION.equals(node.getType())) + { + tabIndex = tabFolder.getItemCount() -1; + } + + TabItem tab = tabFolder.getItem(tabIndex); + // refreshTab(tab); + // If folder is being set as visible after tab refresh, then the tab + // doesn't have the focus. + + tabFolder.setSelection(tabIndex); + refreshTab(tab); + setVisible(tabFolder); + _form.layout(); + + // Set the focus on the first attribute in attributes table + if (tab.getText().equals(Constants.ATTRIBUTES)) + { + ((TabControl)tabFolder.getData(ATTRIBUTES_CONTROL)).setFocus(); + }*/ + } + } + + public void showSelectedMBean(TreeObject node) + { + _mbean = null; + setInvisible(); + + if (node == null) + { + _form.setText("Qpid Management Console"); + return; + } + + if (Constants.NOTIFICATION.equals(node.getType())) + { + _mbean = (ManagedBean)node.getParent().getManagedObject(); + } + else if (Constants.MBEAN.equals(node.getType())) + { + _mbean = (ManagedBean)node.getManagedObject(); + } + else + { + _form.setText("Qpid Management Console"); + return; + } + + setFocus(); + try + { + MBeanUtility.getMBeanInfo(_mbean); + } + catch(Exception ex) + { + MBeanUtility.handleException(_mbean, ex); + return; + } + + TabFolder tabFolder = tabFolderMap.get(_mbean.getType()); + if (tabFolder == null) + { + tabFolder = createTabFolder(); + } + + String text = _mbean.getType(); + if (_mbean.getName() != null && _mbean.getName().length() != 0) + { + text = text + ": " + _mbean.getName(); + } + _form.setText(text); + int tabIndex = 0; + if (Constants.NOTIFICATION.equals(node.getType())) + { + tabIndex = tabFolder.getItemCount() -1; + } + + TabItem tab = tabFolder.getItem(tabIndex); + // refreshTab(tab); + // If folder is being set as visible after tab refresh, then the tab + // doesn't have the focus. + + tabFolder.setSelection(tabIndex); + refreshTab(tab); + setVisible(tabFolder); + _form.layout(); + } + + public void createPartControl(Composite parent) + { + // Create the Form + _toolkit = new FormToolkit(parent.getDisplay()); + _form = _toolkit.createForm(parent); + _form.getBody().setLayout(new FormLayout()); + _form.setText(Constants.APPLICATION_NAME); + + // Add selection listener for selection events in the Navigation view + getSite().getPage().addSelectionListener(NavigationView.ID, selectionListener); + } + + public void refreshMBeanView() + { + if (_mbean == null) + return; + + TabFolder tabFolder = tabFolderMap.get(_mbean.getType()); + if (tabFolder == null) + return; + + int index = tabFolder.getSelectionIndex(); + TabItem tab = tabFolder.getItem(index); + if (tab == null) + return; + + refreshTab(tab); + _form.layout(); + } + + private TabFolder createTabFolder() + { + TabFolder tabFolder = new TabFolder(_form.getBody(), SWT.NONE); + FormData layoutData = new FormData(); + layoutData.left = new FormAttachment(0); + layoutData.top = new FormAttachment(0); + layoutData.right = new FormAttachment(100); + layoutData.bottom = new FormAttachment(100); + tabFolder.setLayoutData(layoutData); + tabFolder.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + tabFolder.setVisible(false); + + createAttributesTab(tabFolder); + createOperationTabs(tabFolder); + createNotificationsTab(tabFolder); + + tabFolder.addListener(SWT.Selection, new Listener() + { + public void handleEvent(Event evt) + { + TabItem tab = (TabItem)evt.item; + refreshTab(tab); + } + }); + + tabFolderMap.put(_mbean.getType(), tabFolder); + return tabFolder; + } + + private void refreshTab(TabItem tab) + { + // We can avoid refreshing the attributes tab because it's control + // already contains the required values. But it is added for now and + // will remove if there is any perfornce or any such issue. + // The operations control should be refreshed because there is only one + // controller for all operations tab. + // The Notifications control needs to refresh with latest set of notifications + + if (tab == null) + return; + + TabFolder tabFolder = tab.getParent(); + if (tab.getData() != null && (tab.getData() instanceof OperationData)) + { + // Refresh selected operation tab + TabControl control = (TabControl)tabFolder.getData(OPERATIONS_CONTROL); + if (control == null) + return; + + control.refresh(_mbean, (OperationData)tab.getData()); + } + else if (tab.getText().equals(Constants.NOTIFICATION)) + { + TabControl control = (TabControl)tabFolder.getData(NOTIFICATIONS_CONTROL); + if (control == null) + return; + + control.refresh(_mbean); + } + else if (tab.getText().equals(Constants.ATTRIBUTES)) + { + TabControl control = (TabControl)tabFolder.getData(ATTRIBUTES_CONTROL); + if (control == null) + return; + + control.refresh(_mbean); + } + + } + + public void setFocus() + { + //_form.setFocus(); + } + + public void dispose() + { + _toolkit.dispose(); + super.dispose(); + } + + private void createAttributesTab(TabFolder tabFolder) + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean); + if (serverRegistry.getAttributeModel(_mbean).getCount() == 0) + { + return; + } + + TabItem tab = new TabItem(tabFolder, SWT.NONE); + tab.setText(Constants.ATTRIBUTES); + AttributesTabControl control = new AttributesTabControl(tabFolder); + tab.setControl(control.getControl()); + tabFolder.setData(ATTRIBUTES_CONTROL, control); + } + + private void createOperationTabs(TabFolder tabFolder) + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean); + int operationsCount = serverRegistry.getOperationModel(_mbean).getCount(); + if (operationsCount == 0) + { + return; + } + + OperationTabControl control = new OperationTabControl(tabFolder); + tabFolder.setData(OPERATIONS_CONTROL, control); + + OperationDataModel operationModel = serverRegistry.getOperationModel(_mbean); + for (OperationData operationData : operationModel.getOperations()) + { + TabItem operationTab = new TabItem(tabFolder, SWT.NONE); + operationTab.setText(ViewUtility.getDisplayText(operationData.getName())); + operationTab.setData(operationData); + operationTab.setControl(control.getControl()); + } + } + + private void createNotificationsTab(TabFolder tabFolder) + { + NotificationsTabControl controller = new NotificationsTabControl(tabFolder); + tabFolder.setData(NOTIFICATIONS_CONTROL, controller); + + TabItem tab = new TabItem(tabFolder, SWT.NONE); + tab.setText(Constants.NOTIFICATION); + tab.setControl(controller.getControl()); + } + + /** + * For the EditAttribtue Action. Invoking this from action is same as clicking + * "EditAttribute" button from Attribute tab. + */ + public void editAttribute() throws Exception + { + if (_mbean == null) + throw new InfoRequiredException("Please select the managed object and then attribute to be edited"); + + String name = (_mbean.getName() != null) ? _mbean.getName() : _mbean.getType(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(_mbean); + if (serverRegistry.getAttributeModel(_mbean).getCount() == 0) + { + throw new InfoRequiredException("There are no attributes to be edited for " + name); + } + + TabFolder tabFolder = tabFolderMap.get(_mbean.getType()); + int index = tabFolder.getSelectionIndex(); + if (index != 0) + { + tabFolder.setSelection(0); + throw new InfoRequiredException("Please select the attribute to be edited"); + } + + AttributesTabControl tabControl = (AttributesTabControl)tabFolder.getData(ATTRIBUTES_CONTROL); + AttributeData attribute = tabControl.getSelectionAttribute(); + if (attribute == null) + throw new InfoRequiredException("Please select the attribute to be edited"); + + tabControl.createDetailsPopup(attribute); + } + + + /** + * hides other folders and makes the given one visible. + * @param tabFolder + */ + private void setVisible(TabFolder tabFolder) + { + for (TabFolder folder : tabFolderMap.values()) + { + if (folder == tabFolder) + folder.setVisible(true); + else + folder.setVisible(false); + } + } + + private void setInvisible() + { + for (TabFolder folder : tabFolderMap.values()) + { + folder.setVisible(false); + } + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java new file mode 100644 index 0000000000..4319a4bd10 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NavigationView.java @@ -0,0 +1,787 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectInstance; +import javax.management.ObjectName; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ManagedServer; +import org.apache.qpid.management.ui.ServerRegistry; +import org.apache.qpid.management.ui.exceptions.InfoRequiredException; +import org.apache.qpid.management.ui.jmx.JMXManagedObject; +import org.apache.qpid.management.ui.jmx.JMXServerRegistry; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IFontProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.ITreeViewerListener; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TreeExpansionEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.part.ViewPart; + + +public class NavigationView extends ViewPart +{ + public static final String ID = "org.apache.qpid.management.ui.navigationView"; + public static final String INI_FILENAME = System.getProperty("user.home") + File.separator + "qpidManagementConsole.ini"; + + private TreeViewer _treeViewer = null; + private TreeObject _rootNode = null; + private TreeObject _serversRootNode = null; + // List of all server nodes (connecged or removed) + //private List<TreeObject> _serverNodeList = new ArrayList<TreeObject>(); + // Map of connected servers + private HashMap<ManagedServer, TreeObject> _managedServerMap = new HashMap<ManagedServer, TreeObject>(); + + private void createTreeViewer(Composite parent) + { + _treeViewer = new TreeViewer(parent); + _treeViewer.setContentProvider(new ContentProviderImpl()); + _treeViewer.setLabelProvider(new LabelProviderImpl()); + _treeViewer.setSorter(new ViewerSorterImpl()); + + // layout the tree viewer below the label field, to cover the area + GridData layoutData = new GridData(); + layoutData = new GridData(); + layoutData.grabExcessHorizontalSpace = true; + layoutData.grabExcessVerticalSpace = true; + layoutData.horizontalAlignment = GridData.FILL; + layoutData.verticalAlignment = GridData.FILL; + _treeViewer.getControl().setLayoutData(layoutData); + _treeViewer.setUseHashlookup(true); + + createListeners(); + } + + private void createListeners() + { + _treeViewer.addDoubleClickListener(new IDoubleClickListener() + { + public void doubleClick(DoubleClickEvent event) + { + IStructuredSelection ss = (IStructuredSelection)event.getSelection(); + if (ss == null || ss.getFirstElement() == null) + { + return; + } + boolean state = _treeViewer.getExpandedState(ss.getFirstElement()); + _treeViewer.setExpandedState(ss.getFirstElement(), !state); + } + }); + + _treeViewer.addTreeListener(new ITreeViewerListener() + { + public void treeExpanded(TreeExpansionEvent event) + { + _treeViewer.setExpandedState(event.getElement(), true); + // Following will cause the selection event to be sent, so commented + //_treeViewer.setSelection(new StructuredSelection(event.getElement())); + _treeViewer.refresh(); + } + + public void treeCollapsed(TreeExpansionEvent event) + { + _treeViewer.setExpandedState(event.getElement(), false); + _treeViewer.refresh(); + } + }); + } + + private void createRMIServerConnection(ManagedServer server) throws Exception + { + try + { + // Currently Qpid Management Console only supports JMX MBeanServer + JMXServerRegistry serverRegistry = new JMXServerRegistry(server); + ApplicationRegistry.addServer(server, serverRegistry); + } + catch(Exception ex) + { + throw new Exception("Error in connecting to Qpid broker at " + server.getUrl(), ex); + } + } + + private String getRMIURL(String host) + { + return "service:jmx:rmi:///jndi/rmi://" + host + "/jmxrmi"; + } + + + public void addNewServer(String transportProtocol, String host, String port, String domain) + throws Exception + { + if ("RMI".equals(transportProtocol)) + { + String serverAddress = host + ":" + port; + String url = getRMIURL(serverAddress); + List<TreeObject> list = _serversRootNode.getChildren(); + for (TreeObject node : list) + { + if (url.equals(node.getUrl())) + throw new InfoRequiredException("Server " + serverAddress + " is already added"); + } + + ManagedServer managedServer = new ManagedServer(url, domain); + managedServer.setName(serverAddress); + createRMIServerConnection(managedServer); + + // RMI server connection is successful. Now add the server in the tree + TreeObject serverNode = new TreeObject(serverAddress, Constants.SERVER); + serverNode.setUrl(url); + serverNode.setManagedObject(managedServer); + _serversRootNode.addChild(serverNode); + + // Add server in the connected server map + _managedServerMap.put(managedServer, serverNode); + populateServer(serverNode); + _treeViewer.refresh(); + + // save server address in file + addServerAddressInFile(serverAddress); + } + else + { + throw new InfoRequiredException(transportProtocol + " transport is not supported"); + } + } + + private void addServerAddressInFile(String serverAddress) + { + File file = new File(INI_FILENAME); + try + { + if (!file.exists()) + file.createNewFile(); + + BufferedWriter out = new BufferedWriter(new FileWriter(file, true)); + out.write(serverAddress + "\n"); + out.close(); + + } + catch(Exception ex) + { + System.out.println("Could not write to the file " + INI_FILENAME); + System.out.println(ex); + } + } + + + private void populateServer(TreeObject serverNode) + { + ManagedServer server = (ManagedServer)serverNode.getManagedObject(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + String domain = server.getDomain(); + try + { + if (!domain.equals("All")) + { + TreeObject domainNode = new TreeObject(domain, Constants.DOMAIN); + domainNode.setParent(serverNode); + + populateDomain(domainNode); + } + else + { + List<TreeObject> domainList = new ArrayList<TreeObject>(); + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + String[] domains = mbsc.getDomains(); + for (int i = 0; i < domains.length; i++) + { + TreeObject domainNode = new TreeObject(domains[i], Constants.DOMAIN); + domainNode.setParent(serverNode); + + domainList.add(domainNode); + populateDomain(domainNode); + } + } + } + catch(Exception ex) + { + System.out.println("\nError in connecting to Qpid broker "); + System.out.println("\n" + ex.toString()); + } + } + + @SuppressWarnings("unchecked") + private void populateDomain(TreeObject domain) throws IOException, Exception + { + ManagedServer server = (ManagedServer)domain.getParent().getManagedObject(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + + String domainName = domain.getName(); + MBeanServerConnection mbsc = serverRegistry.getServerConnection(); + + + ObjectName objName = new ObjectName(domainName + ":*"); + Set queryMBeans = mbsc.queryMBeans(objName, null); + final Set<ObjectInstance> objectInstances = queryMBeans; + + for (Iterator<ObjectInstance> itr = objectInstances.iterator(); itr.hasNext();) + { + ObjectInstance instance = itr.next(); + ManagedBean obj = new JMXManagedObject(instance.getObjectName()); + obj.setServer(server); + addManagedBean(domain, obj); + } + } + + private TreeObject getIfTypeAlreadyExists(TreeObject domain, String type) + { + List<TreeObject> types = domain.getChildren(); + + for (TreeObject child : types) + { + if (Constants.TYPE.equals(child.getType()) && type.equals(child.getName())) + return child; + } + return null; + } + + private void addManagedBean(TreeObject domain, ManagedBean obj) + { + ManagedServer server = (ManagedServer)domain.getParent().getManagedObject(); + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + serverRegistry.addManagedObject(obj); + + String type = obj.getType(); + String name = obj.getName(); + + TreeObject typeChild = getIfTypeAlreadyExists(domain, type); + TreeObject mbeanNode = null; + if (typeChild != null) // if type is already added as a TreeItem + { + if (name == null) + { + System.out.println("Two mbeans can't exist without a name and with same type"); + return; + } + mbeanNode = new TreeObject(obj); + mbeanNode.setParent(typeChild); + } + else + { + if (name != null) // An managedObject with type and name + { + typeChild = new TreeObject(type, Constants.TYPE); + typeChild.setParent(domain); + mbeanNode = new TreeObject(obj); + mbeanNode.setParent(typeChild); + } + else // An managedObject with only type + { + mbeanNode = new TreeObject(obj); + mbeanNode.setParent(domain); + } + } + + // Add notification node + // TODO: show this only of the mbean sends any notification + TreeObject notificationNode = new TreeObject(Constants.NOTIFICATION, Constants.NOTIFICATION); + notificationNode.setParent(mbeanNode); + } + + /** + * Removes all the child nodes of the given parent node + * @param parent + */ + private void removeManagedObject(TreeObject parent) + { + List<TreeObject> list = parent.getChildren(); + for (TreeObject child : list) + { + removeManagedObject(child); + } + + list.clear(); + } + + /** + * Removes the mbean from the tree + * @param parent + * @param mbean + */ + private void removeManagedObject(TreeObject parent, ManagedBean mbean) + { + List<TreeObject> list = parent.getChildren(); + TreeObject objectToRemove = null; + for (TreeObject child : list) + { + if (Constants.MBEAN.equals(child.getType())) + { + String name = mbean.getName() != null ? mbean.getName() : mbean.getType(); + if (child.getName().equals(name)) + { + objectToRemove = child; + break; + } + } + else + { + removeManagedObject(child, mbean); + } + } + + if (objectToRemove != null) + { + list.remove(objectToRemove); + } + + } + + public void disconnect() throws Exception + { + TreeObject selectedNode = getSelectedServerNode(); + ManagedServer managedServer = (ManagedServer)selectedNode.getManagedObject(); + if (!_managedServerMap.containsKey(managedServer)) + return; + + // Close server connection + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(managedServer); + if (serverRegistry == null) // server connection is already closed + return; + + serverRegistry.closeServerConnection(); + // Add server to the closed server list and the worker thread will remove the server from required places. + ApplicationRegistry.serverConnectionClosed(managedServer); + } + + /** + * Connects the selected server node + * @throws Exception + */ + public void reconnect() throws Exception + { + TreeObject selectedNode = getSelectedServerNode(); + ManagedServer managedServer = (ManagedServer)selectedNode.getManagedObject(); + if(_managedServerMap.containsKey(managedServer)) + { + throw new InfoRequiredException("Server " + managedServer.getName() + " is already connected"); + } + createRMIServerConnection(managedServer); + _managedServerMap.put(managedServer, selectedNode); + populateServer(selectedNode); + _treeViewer.refresh(); + } + + public void removeServer() throws Exception + { + disconnect(); + + // Remove from the Tree + String serverNodeName = getSelectedServerNode().getName(); + List<TreeObject> list = _serversRootNode.getChildren(); + TreeObject objectToRemove = null; + for (TreeObject child : list) + { + if (child.getName().equals(serverNodeName)) + { + objectToRemove = child; + break; + } + } + + if (objectToRemove != null) + { + list.remove(objectToRemove); + } + + //_serverNodeList.remove(objectToRemove); + _treeViewer.refresh(); + + // Remove from the ini file + List<String> serversList = getServerListFromFile(); + serversList.remove(serverNodeName); + + BufferedWriter out = new BufferedWriter(new FileWriter(INI_FILENAME)); + for (String serverAddress : serversList) + { + out.write(serverAddress + "\n"); + } + out.close(); + } + + private List<String> getServerListFromFile() throws Exception + { + BufferedReader in = new BufferedReader(new FileReader(INI_FILENAME)); + List<String> serversList = new ArrayList<String>(); + String str; + while ((str = in.readLine()) != null) + { + serversList.add(str); + } + in.close(); + + return serversList; + } + + private TreeObject getSelectedServerNode() throws Exception + { + IStructuredSelection ss = (IStructuredSelection)_treeViewer.getSelection(); + TreeObject selectedNode = (TreeObject)ss.getFirstElement(); + if (ss.isEmpty() || selectedNode == null || (!selectedNode.getType().equals(Constants.SERVER))) + { + throw new InfoRequiredException("Please select the server"); + } + + return selectedNode; + } + /** + * This is a callback that will allow us to create the viewer and initialize + * it. + */ + public void createPartControl(Composite parent) + { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout gridLayout = new GridLayout(); + gridLayout.marginHeight = 2; + gridLayout.marginWidth = 2; + gridLayout.horizontalSpacing = 0; + gridLayout.verticalSpacing = 2; + composite.setLayout(gridLayout); + + createTreeViewer(composite); + _rootNode = new TreeObject("ROOT", "ROOT"); + _serversRootNode = new TreeObject(Constants.NAVIGATION_ROOT, "ROOT"); + _serversRootNode.setParent(_rootNode); + + _treeViewer.setInput(_rootNode); + // set viewer as selection event provider for MBeanView + getSite().setSelectionProvider(_treeViewer); + + // Start worker thread to refresh tree for added or removed objects + (new Thread(new Worker())).start(); + + try + { + // load the list of servers already added from file + List<String> serversList = getServerListFromFile(); + for (String serverAddress : serversList) + { + try + { + String url = getRMIURL(serverAddress); + ManagedServer managedServer = new ManagedServer(url, "org.apache.qpid"); + managedServer.setName(serverAddress); + TreeObject serverNode = new TreeObject(serverAddress, Constants.SERVER); + serverNode.setUrl(url); + serverNode.setManagedObject(managedServer); + _serversRootNode.addChild(serverNode); + } + catch(Exception ex) + { + System.out.println(ex); + } + } + _treeViewer.refresh(); + } + catch(Exception ex) + { + System.out.println(ex); + } + } + + /** + * Passing the focus request to the viewer's control. + */ + public void setFocus() + { + + } + + public void refresh() + { + _treeViewer.refresh(); + } + + private class ContentProviderImpl implements ITreeContentProvider + { + public Object[] getElements(Object parent) + { + return getChildren(parent); + } + + public Object[] getChildren(final Object parentElement) + { + final TreeObject node = (TreeObject)parentElement; + return node.getChildren().toArray(new TreeObject[0]); + } + + public Object getParent(final Object element) + { + final TreeObject node = (TreeObject)element; + return node.getParent(); + } + + public boolean hasChildren(final Object element) + { + final TreeObject node = (TreeObject) element; + return !node.getChildren().isEmpty(); + } + + public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) + { + // Do nothing + } + + public void dispose() + { + // Do nothing + } + } + + private class LabelProviderImpl extends LabelProvider implements IFontProvider + { + public Image getImage(Object element) + { + TreeObject node = (TreeObject)element; + if (node.getType().equals(Constants.NOTIFICATION)) + { + return ApplicationRegistry.getImage(Constants.NOTIFICATION_IMAGE); + } + else if (!node.getType().equals(Constants.MBEAN)) + { + if (_treeViewer.getExpandedState(node)) + return ApplicationRegistry.getImage(Constants.OPEN_FOLDER_IMAGE); + else + return ApplicationRegistry.getImage(Constants.CLOSED_FOLDER_IMAGE); + + } + else + { + return ApplicationRegistry.getImage(Constants.MBEAN_IMAGE); + } + } + + public String getText(Object element) + { + TreeObject node = (TreeObject)element; + return node.getName(); + } + + public Font getFont(Object element) + { + TreeObject node = (TreeObject)element; + if (node.getType().equals(Constants.SERVER)) + { + if (node.getChildren().isEmpty()) + return ApplicationRegistry.getFont(Constants.FONT_NORMAL); + else + return ApplicationRegistry.getFont(Constants.FONT_BOLD); + } + return ApplicationRegistry.getFont(Constants.FONT_NORMAL); + } + + /* + public Color getForeground(Object element) + { + TreeObject node = (TreeObject)element; + if (node.getType().equals(Constants.SERVER)) + { + if (!node.getChildren().isEmpty()) + return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN); + else + return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY); + } + return Display.getCurrent().getSystemColor(SWT.COLOR_BLACK); + } + public Color getBackground(Object element) + { + return _treeViewer.getControl().getBackground(); + }*/ + } // End of LabelProviderImpl + + + private class ViewerSorterImpl extends ViewerSorter + { + public int category(Object element) + { + TreeObject node = (TreeObject)element; + if (node.getType().equals(Constants.MBEAN)) + return 1; + return 2; + } + } + + /** + * Worker thread, which keeps looking for new ManagedObjects to be added and + * unregistered objects to be removed from the tree. + * @author Bhupendra Bhardwaj + */ + private class Worker implements Runnable + { + public void run() + { + while(true) + { + if (_managedServerMap.isEmpty()) + continue; + + try + { + Thread.sleep(2000); + } + catch(Exception ex) + { + + } + refreshAddedObjects(); + refreshRemovedObjects(); + refreshClosedServerConnections(); + }// end of while loop + }// end of run method. + }// end of Worker class + + + private void refreshAddedObjects() + { + for (ManagedServer server : _managedServerMap.keySet()) + { + JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + if (serverRegistry == null) // server connection is closed + continue; + + final List<ManagedBean> list = serverRegistry.getObjectsToBeAdded(); + if (list != null) + { + Display display = getSite().getShell().getDisplay(); + display.syncExec(new Runnable() + { + public void run() + { + for (ManagedBean obj : list) + { + System.out.println("adding " + obj.getName() + " " + obj.getType()); + TreeObject treeServerObject = _managedServerMap.get(obj.getServer()); + List<TreeObject> domains = treeServerObject.getChildren(); + TreeObject domain = null; + for (TreeObject child : domains) + { + if (child.getName().equals(obj.getDomain())) + { + domain = child; + break; + } + } + + addManagedBean(domain, obj); + } + _treeViewer.refresh(); + } + }); + } + } + } + + private void refreshRemovedObjects() + { + for (ManagedServer server : _managedServerMap.keySet()) + { + final JMXServerRegistry serverRegistry = (JMXServerRegistry)ApplicationRegistry.getServerRegistry(server); + if (serverRegistry == null) // server connection is closed + continue; + + final List<ManagedBean> removalList = serverRegistry.getObjectsToBeRemoved(); + if (removalList != null) + { + Display display = getSite().getShell().getDisplay(); + display.syncExec(new Runnable() + { + public void run() + { + for (ManagedBean mbean : removalList) + { + System.out.println("removing " + mbean.getName() + " " + mbean.getType()); + TreeObject treeServerObject = _managedServerMap.get(mbean.getServer()); + List<TreeObject> domains = treeServerObject.getChildren(); + TreeObject domain = null; + for (TreeObject child : domains) + { + if (child.getName().equals(mbean.getDomain())) + { + domain = child; + break; + } + } + removeManagedObject(domain, mbean); + serverRegistry.removeManagedObject(mbean); + } + _treeViewer.refresh(); + } + }); + } + } + } + + /** + * + * + */ + private void refreshClosedServerConnections() + { + final List<ManagedServer> closedServers = ApplicationRegistry.getClosedServers(); + if (closedServers != null) + { + Display display = getSite().getShell().getDisplay(); + display.syncExec(new Runnable() + { + public void run() + { + for (ManagedServer server : closedServers) + { + removeManagedObject(_managedServerMap.get(server)); + _managedServerMap.remove(server); + ApplicationRegistry.removeServer(server); + } + + _treeViewer.refresh(); + } + }); + } + } + +}
\ No newline at end of file diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java new file mode 100644 index 0000000000..c3f42f46aa --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/NotificationsTabControl.java @@ -0,0 +1,708 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ServerRegistry; +import org.apache.qpid.management.ui.jmx.MBeanUtility; +import org.apache.qpid.management.ui.model.NotificationInfoModel; +import org.apache.qpid.management.ui.model.NotificationObject; +import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; + +/** + * + * @author Bhupendra Bhardwaj + * + */ +public class NotificationsTabControl extends TabControl +{ + private FormToolkit _toolkit; + private Form _form; + private Table table = null; + private TableViewer _tableViewer = null; + + private IStructuredContentProvider contentProvider = new ContentProviderImpl(); + private SelectionListener selectionListener = new SelectionListenerImpl(); + private SelectionListener comboListener = new ComboSelectionListener(); + + private Thread worker = null; + + private List<NotificationObject> _notifications = null; + private static final String COLUMN_SEQ = "Sequence No"; + private static final String COLUMN_TIME = "TimeStamp"; + private static final String COLUMN_TYPE = "Type"; + private static final String COLUMN_MSG = "Notification Message"; + private static final String[] _tableTitles = new String [] { + COLUMN_SEQ, + COLUMN_TIME, + COLUMN_TYPE, + COLUMN_MSG + }; + + private Combo notificationNameCombo = null; + private Combo typesCombo = null; + private Label descriptionLabel = null; + private Button _subscribeButton = null; + private Button _unsubscribeButton = null; + private Button _clearButton = null; + private Button _refreshButton = null; + + + public NotificationsTabControl(TabFolder tabFolder) + { + super(tabFolder); + _toolkit = new FormToolkit(_tabFolder.getDisplay()); + _form = _toolkit.createForm(_tabFolder); + GridLayout gridLayout = new GridLayout(); + gridLayout.marginWidth = 0; + gridLayout.marginHeight = 0; + _form.getBody().setLayout(gridLayout); + + createWidgets(); + worker = new Thread(new Worker()); + worker.start(); + } + + private void createWidgets() + { + createNotificationInfoComposite(); + //addFilterComposite(); + addButtons(); + createTableViewer(); + } + + public Control getControl() + { + return _form; + } + + private void createNotificationInfoComposite() + { + Composite composite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + composite.setLayout(new FormLayout()); + + Label label = _toolkit.createLabel(composite, "Select the notification to subscribe or unsubscribe"); + label.setFont(ApplicationRegistry.getFont(Constants.FONT_BOLD)); + FormData formData = new FormData(); + formData.top = new FormAttachment(0, 10); + formData.left = new FormAttachment(0, 10); + label.setLayoutData(formData); + + notificationNameCombo = new Combo(composite, SWT.READ_ONLY | SWT.DROP_DOWN); + formData = new FormData(); + formData.top = new FormAttachment(label, 10); + formData.left = new FormAttachment(0, 10); + formData.right = new FormAttachment(40); + notificationNameCombo.setLayoutData(formData); + notificationNameCombo.addSelectionListener(comboListener); + + typesCombo = new Combo(composite, SWT.READ_ONLY | SWT.DROP_DOWN); + formData = new FormData(); + formData.top = new FormAttachment(label, 10); + formData.left = new FormAttachment(notificationNameCombo, 5); + formData.right = new FormAttachment(65); + typesCombo.setLayoutData(formData); + typesCombo.addSelectionListener(comboListener); + + _subscribeButton = new Button(composite, SWT.PUSH | SWT.CENTER); + _subscribeButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + _subscribeButton.setText(Constants.SUBSCRIBE_BUTTON); + formData = new FormData(); + formData.top = new FormAttachment(label, 10); + formData.left = new FormAttachment(65, 10); + formData.width = 80; + _subscribeButton.setLayoutData(formData); + _subscribeButton.addSelectionListener(selectionListener); + + _unsubscribeButton = new Button(composite, SWT.PUSH | SWT.CENTER); + _unsubscribeButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + _unsubscribeButton.setText(Constants.UNSUBSCRIBE_BUTTON); + formData = new FormData(); + formData.top = new FormAttachment(label, 10); + formData.left = new FormAttachment(_subscribeButton, 10); + formData.width = 80; + _unsubscribeButton.setLayoutData(formData); + _unsubscribeButton.addSelectionListener(selectionListener); + + Label fixedLabel = _toolkit.createLabel(composite, ""); + formData = new FormData(); + formData.top = new FormAttachment(notificationNameCombo, 5); + formData.left = new FormAttachment(0, 10); + fixedLabel.setLayoutData(formData); + fixedLabel.setText(Constants.DESCRIPTION); + fixedLabel.setFont(ApplicationRegistry.getFont(Constants.FONT_BOLD)); + + descriptionLabel = _toolkit.createLabel(composite, ""); + formData = new FormData(); + formData.top = new FormAttachment(notificationNameCombo, 5); + formData.left = new FormAttachment(fixedLabel, 10); + formData.right = new FormAttachment(80); + descriptionLabel.setLayoutData(formData); + descriptionLabel.setText(" "); + descriptionLabel.setFont(ApplicationRegistry.getFont(Constants.FONT_ITALIC)); + } + + private void addButtons() + { + Composite composite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + composite.setLayout(new GridLayout(2, true)); + + // Add Clear Button + _clearButton = _toolkit.createButton(composite, Constants.BUTTON_CLEAR, SWT.PUSH | SWT.CENTER); + _clearButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData gridData = new GridData(SWT.LEAD, SWT.TOP, true, false); + gridData.widthHint = 80; + _clearButton.setLayoutData(gridData); + _clearButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + if (_mbean == null) + return; + + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean); + serverRegistry.clearNotifications(_mbean); + refresh(); + } + }); + + // Add Refresh Button + _refreshButton = _toolkit.createButton(composite, Constants.BUTTON_REFRESH, SWT.PUSH | SWT.CENTER); + _refreshButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + gridData = new GridData(SWT.TRAIL, SWT.TOP, true, false); + gridData.widthHint = 80; + _refreshButton.setLayoutData(gridData); + _refreshButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + if (_mbean == null) + return; + + refresh(); + } + }); + } + + private void createTable() + { + table = _toolkit.createTable(_form.getBody(), SWT.FULL_SELECTION); + table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + TableColumn column = new TableColumn(table, SWT.NONE); + column.setText(_tableTitles[0]); + column.pack(); //column.setWidth(200); + + column = new TableColumn(table, SWT.NONE); + column.setText(_tableTitles[1]); + column.setWidth(150); + + column = new TableColumn(table, SWT.NONE); + column.setText(_tableTitles[2]); + column.setWidth(100); + + column = new TableColumn(table, SWT.NONE); + column.setText(_tableTitles[3]); + column.setWidth(500); + + table.setHeaderVisible(true); + table.setLinesVisible(true); + } + + protected void createTableViewer() + { + createTable(); + _tableViewer = new TableViewer(table); + //_tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + _tableViewer.setUseHashlookup(true); + _tableViewer.setContentProvider(contentProvider); + _tableViewer.setLabelProvider(new LabelProviderImpl()); + _tableViewer.setColumnProperties(_tableTitles); + /* + CellEditor[] cellEditors = new CellEditor[_tableTitles.length]; + TextCellEditor textEditor = new TextCellEditor(table); + cellEditors[0] = textEditor; + textEditor = new TextCellEditor(table); + cellEditors[1] = textEditor; + textEditor = new TextCellEditor(table); + cellEditors[2] = textEditor; + textEditor = new TextCellEditor(table); + cellEditors[3] = textEditor; + + // Assign the cell editors to the viewer + _tableViewer.setCellEditors(cellEditors); + _tableViewer.setCellModifier(new TableCellModifier()); + */ + + addTableListeners(); + + //_tableViewer.addSelectionChangedListener(new ); + + //_notificationDetails = new Composite(_tabControl, SWT.BORDER); + //_notificationDetails.setLayoutData(new GridData(GridData.FILL_BOTH)); + + //_tabControl.layout(); + //viewerComposite.layout(); + } + + private void addTableListeners() + { + _tableViewer.addDoubleClickListener(new IDoubleClickListener() + { + Display display = null; + Shell shell = null; + public void doubleClick(DoubleClickEvent event) + { + System.out.println("DoubleClickEvent" + event); + display = Display.getCurrent(); + shell = new Shell(display, SWT.BORDER | SWT.CLOSE | SWT.MIN | + SWT.MAX | SWT.RESIZE); + shell.setText("Notification"); + + int x = display.getBounds().width; + int y = display.getBounds().height; + shell.setBounds(x/4, y/4, x/2, y/3); + StructuredSelection selection = (StructuredSelection)event.getSelection(); + createPopupContents((NotificationObject)selection.getFirstElement()); + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + + //If you create it, you dispose it. + shell.dispose(); + } + + private void createPopupContents(NotificationObject obj) + { + shell.setLayout(new GridLayout()); + + Composite parent = new Composite(shell, SWT.NONE); + parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + GridLayout layout = new GridLayout(4, true); + parent.setLayout(layout); + + Label key = new Label(parent, SWT.TRAIL); + key.setText(COLUMN_SEQ); + GridData layoutData = new GridData(SWT.TRAIL, SWT.TOP, false, false,1,1); + key.setLayoutData(layoutData); + Text value = new Text(parent, SWT.BEGINNING | SWT.BORDER |SWT.READ_ONLY); + value.setText(""+obj.getSequenceNo()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1)); + + // Time row + key = new Label(parent, SWT.TRAIL); + key.setText(COLUMN_TIME); + key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1)); + value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY); + value.setText(""+obj.getTimeStamp()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1)); + + key = new Label(parent, SWT.TRAIL); + key.setText(COLUMN_TYPE); + key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1)); + value = new Text(parent, SWT.BEGINNING | SWT.BORDER | SWT.READ_ONLY); + value.setText(""+obj.getType()); + value.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false,3,1)); + + key = new Label(parent, SWT.TRAIL); + key.setText(COLUMN_MSG); + key.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, true, false,1,1)); + value = new Text(parent, SWT.MULTI | SWT.WRAP| SWT.BORDER | SWT.V_SCROLL | SWT.READ_ONLY); + value.setText(""+obj.getMessage()); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1); + gridData.heightHint = 100; + value.setLayoutData(gridData); + } + }); + } + + @Override + public void refresh(ManagedBean mbean) + { + _mbean = mbean; + _notifications = null; + _tableViewer.getTable().clearAll(); + + if (_mbean == null) + { + _tableViewer.getTable().clearAll(); + _subscribeButton.setEnabled(false); + _unsubscribeButton.setEnabled(false); + return; + } + + if (!doesMBeanSendsNotification()) + { + Control[] children = _form.getBody().getChildren(); + for (int i = 0; i < children.length; i++) + { + children[i].setVisible(false); + } + + String name = (_mbean.getName() != null) ? _mbean.getName() : _mbean.getType(); + _form.setText(name + " does not send any notification"); + return; + } + + Control[] children = _form.getBody().getChildren(); + for (int i = 0; i < children.length; i++) + { + children[i].setVisible(true); + } + + populateNotificationInfo(); + /* + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean); + _notifications = serverRegistry.getNotifications(_mbean); + if (_notifications != null) + { + _tableViewer.setInput(_notifications); + + }*/ + //_tableViewer.setInput(null); + workerRunning = true; + _form.layout(); + } + + private void refresh() + { + _notifications = null; + _tableViewer.getTable().clearAll(); + } + + private void populateNotificationInfo() + { + notificationNameCombo.removeAll(); + NotificationInfoModel[] items = MBeanUtility.getNotificationInfo(_mbean); + notificationNameCombo.add("Select Notification"); + for (int i = 0; i < items.length; i++) + { + notificationNameCombo.add(items[i].getName()); + notificationNameCombo.setData(items[i].getName(), items[i]); + } + notificationNameCombo.select(0); + + typesCombo.removeAll(); + typesCombo.add("Select Type", 0); + typesCombo.select(0); + typesCombo.setEnabled(false); + + checkForEnablingButtons(); + } + + private void checkForEnablingButtons() + { + int nameIndex = notificationNameCombo.getSelectionIndex(); + if (nameIndex == 0) + { + _subscribeButton.setEnabled(false); + _unsubscribeButton.setEnabled(false); + descriptionLabel.setText(""); + return; + } + + int typeIndex = typesCombo.getSelectionIndex(); + if (typeIndex == 0) + { + _subscribeButton.setEnabled(false); + _unsubscribeButton.setEnabled(false); + return; + } + + String type = typesCombo.getItem(typeIndex); + String name = notificationNameCombo.getItem(nameIndex); + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean); + + if (serverRegistry.hasSubscribedForNotifications(_mbean, name, type)) + { + _subscribeButton.setEnabled(false); + _unsubscribeButton.setEnabled(true); + } + else + { + _subscribeButton.setEnabled(true); + _unsubscribeButton.setEnabled(false); + } + } + + private boolean doesMBeanSendsNotification() + { + NotificationInfoModel[] items = MBeanUtility.getNotificationInfo(_mbean); + if (items == null || items.length == 0) + return false; + else + return true; + } + + private class SelectionListenerImpl extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + if (_mbean == null) + return; + + Button source = (Button)e.getSource(); + String type = typesCombo.getItem(typesCombo.getSelectionIndex()); + String name = notificationNameCombo.getItem(notificationNameCombo.getSelectionIndex()); + if (source == _unsubscribeButton) + { + try + { + MBeanUtility.removeNotificationListener(_mbean, name, type); + } + catch(Exception ex) + { + MBeanUtility.handleException(ex); + } + } + else if (source == _subscribeButton) + { + try + { + MBeanUtility.createNotificationlistener(_mbean, name, type); + } + catch(Exception ex) + { + MBeanUtility.handleException(ex); + } + } + checkForEnablingButtons(); + } + } + + + private class ComboSelectionListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + if (_mbean == null) + return; + + Combo combo = (Combo)e.getSource(); + if (combo == notificationNameCombo) + { + if (combo.getSelectionIndex() == 0) + { + descriptionLabel.setText(""); + typesCombo.select(0); + typesCombo.setEnabled(false); + return; + } + String index = combo.getItem(combo.getSelectionIndex()); + NotificationInfoModel data = (NotificationInfoModel)combo.getData(index); + descriptionLabel.setText(data.getDescription()); + typesCombo.removeAll(); + typesCombo.setItems(data.getTypes()); + typesCombo.add("Select Type", 0); + typesCombo.select(0); + typesCombo.setEnabled(true); + } + checkForEnablingButtons(); + } + } + + private class ContentProviderImpl implements IStructuredContentProvider, INotificationViewer + { + public void inputChanged(Viewer v, Object oldInput, Object newInput) + { + + } + public void dispose() + { + + } + public Object[] getElements(Object parent) + { + return _notifications.toArray(new NotificationObject[0]); + } + public void addNotification(NotificationObject notification) + { + _tableViewer.add(notification); + } + + public void addNotification(List<NotificationObject> notificationList) + { + _tableViewer.add(notificationList.toArray(new NotificationObject[0])); + } + } + + private class LabelProviderImpl implements ITableLabelProvider + { + List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener>(); + public void addListener(ILabelProviderListener listener) + { + listeners.add(listener); + } + + public void dispose(){ + + } + + public Image getColumnImage(Object element, int columnIndex) + { + return null; + } + + public String getColumnText(Object element, int columnIndex) + { + String result = null; + NotificationObject t = (NotificationObject)element; + switch(columnIndex) + { + case 0 : + result = String.valueOf(t.getSequenceNo()); + break; + case 1 : + result = String.valueOf(t.getTimeStamp()); + break; + case 2 : + result = t.getType(); + break; + case 3 : + result = t.getMessage(); + break; + default : + result = ""; + } + + return result; + } + + public boolean isLabelProperty(Object element, String property) + { + return false; + } + + public void removeListener(ILabelProviderListener listener) + { + listeners.remove(listener); + } + } // end of LabelProviderImpl + + private boolean workerRunning = false; + private void setWorkerRunning(boolean running) + { + workerRunning = running; + } + + private class Worker implements Runnable + { + public void run() + { + Display display = _tabFolder.getDisplay(); + while(true) + { + if (!workerRunning || _mbean == null || display == null) + { + sleep(); + continue; + } + + display.syncExec(new Runnable() + { + public void run() + { + setWorkerRunning(_form.isVisible()); + if (!workerRunning) return; + + updateTableViewer(); + } + }); + + sleep(); + } + } + + private void sleep() + { + try + { + Thread.sleep(2000); + } + catch(Exception ex) + { + + } + } + } + + private void updateTableViewer() + { + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(_mbean); + List<NotificationObject> newList = serverRegistry.getNotifications(_mbean); + if (newList == null) + return; + + /* + int notificationCount = 0; + if (_notifications != null) + notificationCount = _notifications.size(); + + for (int i = notificationCount; i < newList.size(); i++) + { + ((INotificationViewer)contentProvider).addNotification(newList.get(i)); + }*/ + + _notifications = newList; + _tableViewer.setInput(_notifications); + _tableViewer.refresh(); + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/OperationTabControl.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/OperationTabControl.java new file mode 100644 index 0000000000..8563bdb882 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/OperationTabControl.java @@ -0,0 +1,718 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.TabularDataSupport; + +import org.apache.qpid.management.ui.ApplicationRegistry; +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ServerRegistry; +import org.apache.qpid.management.ui.jmx.MBeanUtility; +import org.apache.qpid.management.ui.model.OperationData; +import org.apache.qpid.management.ui.model.ParameterData; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.forms.widgets.Form; +import org.eclipse.ui.forms.widgets.FormToolkit; + + +/** + * Control class for the MBean operations tab. It creates the required widgets + * for the selected MBean. + * @author Bhupendra Bhardwaj + * + */ +public class OperationTabControl extends TabControl +{ + private int heightForAParameter = 30; + private int labelNumerator = 30; + private int valueNumerator = labelNumerator + 20; + + private FormToolkit _toolkit; + private Form _form; + private OperationData _opData; + + private SelectionListener operationExecutionListener = new OperationExecutionListener(); + private SelectionListener refreshListener = new RefreshListener(); + private SelectionListener parameterSelectionListener = new ParameterSelectionListener(); + private SelectionListener bolleanSelectionListener = new BooleanSelectionListener(); + private VerifyListener verifyListener = new VerifyListenerImpl(); + private KeyListener keyListener = new KeyListenerImpl(); + private KeyListener headerBindingListener = new HeaderBindingKeyListener(); + + private Composite _headerComposite = null; + private Composite _paramsComposite = null; + private Composite _resultsComposite = null; + private Button _executionButton = null; + + // for customized method in header exchange + private HashMap<Text, Text> headerBindingHashMap = null; + + public OperationTabControl(TabFolder tabFolder) + { + super(tabFolder); + _toolkit = new FormToolkit(_tabFolder.getDisplay()); + _form = _toolkit.createForm(_tabFolder); + _form.getBody().setLayout(new GridLayout()); + + // Form area is devided in four parts: + // Header composite - displays operaiton information + // Patameters composite - displays parameters if there + // Button - operation execution button + // Results composite - displays results for operations, which have + // no parameters but have some return value + _headerComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + _headerComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + _paramsComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + + _executionButton = _toolkit.createButton(_form.getBody(), Constants.BUTTON_EXECUTE, SWT.PUSH | SWT.CENTER); + _executionButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON)); + GridData layoutData = new GridData(SWT.CENTER, SWT.TOP, true, false); + layoutData.verticalIndent = 20; + _executionButton.setLayoutData(layoutData); + + _resultsComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); + layoutData.verticalIndent = 20; + _resultsComposite.setLayoutData(layoutData); + _resultsComposite.setLayout(new GridLayout()); + } + + public Control getControl() + { + return _form; + } + + public void refresh(ManagedBean mbean) + { + _mbean = mbean; + ServerRegistry serverRegistry = ApplicationRegistry.getServerRegistry(mbean); + _opData = serverRegistry.getOperationModel(mbean).getOperations().get(0); + refresh(_mbean, _opData); + } + public void refresh(ManagedBean mbean, OperationData opData) + { + _mbean = mbean; + _opData = opData; + + // Setting the form to be invisible. Just in case the mbean server connection + // is done and it takes time in getting the response, then the ui should be blank + // instead of having half the widgets displayed. + _form.setVisible(false); + + ViewUtility.disposeChildren(_headerComposite); + ViewUtility.disposeChildren(_paramsComposite); + ViewUtility.disposeChildren(_resultsComposite); + + setHeader(); + createParameterWidgets(); + + List<ParameterData> params = opData.getParameters(); + if (params != null && !params.isEmpty()) + { + setButton(Constants.BUTTON_EXECUTE); + } + else if (opData.getImpact() == Constants.OPERATION_IMPACT_ACTION) + { + setButton(Constants.BUTTON_EXECUTE); + } + else if (opData.getImpact() == Constants.OPERATION_IMPACT_INFO) + { + setButton(Constants.BUTTON_REFRESH); + executeAndShowResults(); + } + + _form.setVisible(true); + _form.layout(); + } + + private void setHeader() + { + _form.setText(ViewUtility.getDisplayText(_opData.getName())); + _headerComposite.setLayout(new GridLayout(2, false)); + //operation description + Label label = _toolkit.createLabel(_headerComposite, Constants.DESCRIPTION); + label.setFont(ApplicationRegistry.getFont(Constants.FONT_BOLD)); + label.setLayoutData(new GridData(SWT.LEAD, SWT.TOP, false, false)); + + label = _toolkit.createLabel(_headerComposite, _opData.getDescription()); + label.setFont(ApplicationRegistry.getFont(Constants.FONT_NORMAL)); + label.setLayoutData(new GridData(SWT.LEAD, SWT.TOP, true, false)); + + _headerComposite.layout(); + } + + private void createParameterWidgets() + { + List<ParameterData> params = _opData.getParameters(); + if (params == null || params.isEmpty()) + { + return; + } + + // Customised parameter widgets + if (_mbean.getType().equals(Constants.EXCHANGE) && + "headers".equals(_mbean.getProperty(Constants.EXCHANGE_TYPE)) && + _opData.getName().equalsIgnoreCase("createNewBinding")) + { + customCreateNewBinding(); + return; + } + // end of Customised parameter widgets + + _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); + _paramsComposite.setLayout(new FormLayout()); + for (ParameterData param : params) + { + boolean valueInCombo = false; + Label label = _toolkit.createLabel(_paramsComposite, ViewUtility.getDisplayText(param.getName())); + FormData formData = new FormData(); + formData.top = new FormAttachment(0, params.indexOf(param) * heightForAParameter + 2); + formData.right = new FormAttachment(labelNumerator); + label.setLayoutData(formData); + label.setToolTipText(param.getDescription()); + + formData = new FormData(); + formData.top = new FormAttachment(0, params.indexOf(param) * heightForAParameter); + formData.left = new FormAttachment(label, 5); + formData.right = new FormAttachment(valueNumerator); + if (param.getName().equals(Constants.QUEUE)) + { + Combo combo = new Combo(_paramsComposite, SWT.READ_ONLY | SWT.DROP_DOWN); + String[] items = ApplicationRegistry.getServerRegistry(_mbean).getQueueNames(); + combo.setItems(items); + combo.add("Select Queue", 0); + combo.select(0); + combo.setLayoutData(formData); + combo.setData(param); + combo.addSelectionListener(parameterSelectionListener); + valueInCombo = true; + } + else if (param.getName().equals(Constants.EXCHANGE)) + { + Combo combo = new Combo(_paramsComposite, SWT.READ_ONLY | SWT.DROP_DOWN); + String[] items = ApplicationRegistry.getServerRegistry(_mbean).getExchangeNames(); + combo.setItems(items); + combo.add("Select Exchange", 0); + combo.select(0); + combo.setLayoutData(formData); + combo.setData(param); + combo.addSelectionListener(parameterSelectionListener); + valueInCombo = true; + } + else if (param.getName().equals(Constants.EXCHANGE_TYPE)) + { + Combo combo = new Combo(_paramsComposite, SWT.READ_ONLY | SWT.DROP_DOWN); + combo.setItems(Constants.EXCHANGE_TYPE_VALUES); + combo.add("Select Exchange Type", 0); + combo.select(0); + combo.setLayoutData(formData); + combo.setData(param); + combo.addSelectionListener(parameterSelectionListener); + valueInCombo = true; + } + else if (param.getType().equals("boolean") || param.getType().equals("java.lang.Boolean")) + { + Combo combo = new Combo(_paramsComposite, SWT.READ_ONLY | SWT.DROP_DOWN); + combo.setItems(new String[] {"false", "true"}); + combo.select(0); + param.setValueFromString(combo.getItem(0)); + combo.setLayoutData(formData); + combo.setData(param); + combo.addSelectionListener(bolleanSelectionListener); + valueInCombo = true; + } + else + { + Text text = _toolkit.createText(_paramsComposite, "", SWT.NONE); + formData = new FormData(); + formData.top = new FormAttachment(0, params.indexOf(param) * heightForAParameter); + formData.left = new FormAttachment(label, 5); + formData.right = new FormAttachment(valueNumerator); + text.setLayoutData(formData); + text.addKeyListener(keyListener); + text.addVerifyListener(verifyListener); + text.setData(param); + } + + // parameter type (int, String etc) + if (valueInCombo) + label = _toolkit.createLabel(_paramsComposite, ""); + else + { + String str = param.getType() ; + if (param.getType().lastIndexOf(".") != -1) + str = param.getType().substring(1 + param.getType().lastIndexOf(".")); + + label = _toolkit.createLabel(_paramsComposite, "(" + str + ")"); + } + formData = new FormData(); + formData.top = new FormAttachment(0, params.indexOf(param) * heightForAParameter); + formData.left = new FormAttachment(valueNumerator, 5); + label.setLayoutData(formData); + } + + //_parametersHolder.setMinSize(_parametersComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + //_parametersComposite.layout(); + } + + private void customCreateNewBinding() + { + headerBindingHashMap = new HashMap<Text, Text>(); + + _paramsComposite.setLayout(new GridLayout()); + _paramsComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true)); + final ScrolledComposite scrolledComposite = new ScrolledComposite(_paramsComposite, SWT.BORDER | SWT.V_SCROLL); + scrolledComposite.setExpandHorizontal(true); + scrolledComposite.setExpandVertical(true); + GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, true); + scrolledComposite.setLayoutData(layoutData); + scrolledComposite.setLayout(new GridLayout()); + + final Composite composite = _toolkit.createComposite(scrolledComposite, SWT.NONE); + scrolledComposite.setContent(composite); + layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); + layoutData.verticalIndent = 20; + composite.setLayoutData(layoutData); + composite.setLayout(new FormLayout()); + + List<ParameterData> params = _opData.getParameters(); + ParameterData param = params.get(0); + // Queue selection widget + Label label = _toolkit.createLabel(composite, ViewUtility.getDisplayText(param.getName())); + FormData formData = new FormData(); + formData.top = new FormAttachment(0, 2); + formData.right = new FormAttachment(labelNumerator); + label.setLayoutData(formData); + label.setToolTipText(param.getDescription()); + + formData = new FormData(); + formData.top = new FormAttachment(0); + formData.left = new FormAttachment(label, 5); + formData.right = new FormAttachment(valueNumerator); + + Combo combo = new Combo(composite, SWT.READ_ONLY | SWT.DROP_DOWN); + String[] items = ApplicationRegistry.getServerRegistry(_mbean).getQueueNames(); + combo.setItems(items); + combo.add("Select Queue", 0); + combo.select(0); + combo.setLayoutData(formData); + combo.setData(param); + combo.addSelectionListener(parameterSelectionListener); + + // Binding creation widgets + createARowForCreatingHeadersBinding(composite, 1); + createARowForCreatingHeadersBinding(composite, 2); + createARowForCreatingHeadersBinding(composite, 3); + createARowForCreatingHeadersBinding(composite, 4); + createARowForCreatingHeadersBinding(composite, 5); + createARowForCreatingHeadersBinding(composite, 6); + createARowForCreatingHeadersBinding(composite, 7); + createARowForCreatingHeadersBinding(composite, 8); + + final Button addMoreButton = _toolkit.createButton(composite, "Add More", SWT.PUSH); + formData = new FormData(); + formData.top = new FormAttachment(0, heightForAParameter); + formData.left = new FormAttachment(70, 5); + addMoreButton.setLayoutData(formData); + addMoreButton.setData("rowCount", 8); + addMoreButton.addSelectionListener(new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + int count = Integer.parseInt(addMoreButton.getData("rowCount").toString()); + createARowForCreatingHeadersBinding(composite, ++count); + addMoreButton.setData("rowCount", count); + scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + composite.layout(); + _form.layout(); + } + }); + + scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + composite.layout(); + } + + private void createARowForCreatingHeadersBinding(Composite parent, int rowCount) + { + Label key = _toolkit.createLabel(parent, "Name"); + FormData formData = new FormData(); + formData.top = new FormAttachment(0, rowCount * heightForAParameter + 2); + formData.right = new FormAttachment(15); + key.setLayoutData(formData); + + Text keyText = _toolkit.createText(parent, "", SWT.NONE); + formData = new FormData(); + formData.top = new FormAttachment(0, rowCount * heightForAParameter); + formData.left = new FormAttachment(key, 5); + formData.right = new FormAttachment(40); + keyText.setLayoutData(formData); + keyText.addKeyListener(headerBindingListener); + + Label value = _toolkit.createLabel(parent, "Value"); + formData = new FormData(); + formData.top = new FormAttachment(0, rowCount * heightForAParameter + 2); + formData.right = new FormAttachment(45); + value.setLayoutData(formData); + + Text valueText = _toolkit.createText(parent, "", SWT.NONE); + formData = new FormData(); + formData.top = new FormAttachment(0, rowCount * heightForAParameter); + formData.left = new FormAttachment(value, 5); + formData.right = new FormAttachment(70); + valueText.setLayoutData(formData); + valueText.addKeyListener(headerBindingListener); + + // Add these to the map, to retrieve the values while setting the parameter value + headerBindingHashMap.put(keyText, valueText); + } + + private void setButton(String text) + { + _executionButton.setText(text); + _executionButton.removeSelectionListener(refreshListener); + _executionButton.removeSelectionListener(operationExecutionListener); + + if (Constants.BUTTON_EXECUTE.equals(text)) + { + _executionButton.addSelectionListener(operationExecutionListener); + } + else + { + _executionButton.addSelectionListener(refreshListener); + } + } + + private void populateResults(Object result) + { + Display display = Display.getCurrent(); + int width = 600; + int height = 400; + Shell shell = ViewUtility.createPopupShell("Result", width, height); + populateResults(result, shell); + + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + shell.dispose(); + } + + private void populateResults(Object result, Composite parent) + { + if (result instanceof TabularDataSupport) + { + ViewUtility.createTabularDataHolder(parent, (TabularDataSupport)result); + } + else if (result instanceof CompositeDataSupport) + { + ViewUtility.populateCompositeDataHolder(parent, (CompositeDataSupport)result); + } + } + + /** + * clears the parameter values entered. + * @param opName + + private void clearParameterValues() + { + List<ParameterData> params = _opData.getParameters(); + if (params != null && !params.isEmpty()) + { + for (ParameterData param : params) + { + param.setValue(null); + } + + Control[] controls = _paramsComposite.getChildren(); + + for (int i = 0; i < controls.length; i++) + { + if (controls[i] instanceof Combo) + ((Combo)controls[i]).select(0); + else if (controls[i] instanceof Text) + ((Text)controls[i]).setText(""); + } + } + }*/ + + private void clearParameters() + { + List<ParameterData> params = _opData.getParameters(); + if (params != null && !params.isEmpty()) + { + for (ParameterData param : params) + { + param.setValue(null); + } + } + } + + private void clearParameterValues(Composite control) + { + Control[] controls = control.getChildren(); + if (controls == null || controls.length == 0) + return; + + for (int i = 0; i < controls.length; i++) + { + if (controls[i] instanceof Combo) + ((Combo)controls[i]).select(0); + else if (controls[i] instanceof Text) + ((Text)controls[i]).setText(""); + else if (controls[i] instanceof Composite) + clearParameterValues((Composite)controls[i]); + } + } + + /** + * Listener class for operation execution events + */ + private class OperationExecutionListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + List<ParameterData> params = _opData.getParameters(); + if (params != null && !params.isEmpty()) + { + for (ParameterData param : params) + { + if (param.getValue() == null || param.getValue().toString().length() == 0) + { + ViewUtility.popupInfoMessage(_form.getText(), + "Please select the " + ViewUtility.getDisplayText(param.getName())); + + return; + } + } + } + + if (_opData.getImpact() == Constants.OPERATION_IMPACT_ACTION) + { + String bean = _mbean.getName() == null ? _mbean.getType() : _mbean.getName(); + int response = ViewUtility.popupConfirmationMessage(bean, + "Do you want to " + _form.getText()+ " ?"); + if (response == SWT.YES) + { + executeAndShowResults(); + } + } + else + { + executeAndShowResults(); + } + clearParameters(); + clearParameterValues(_paramsComposite); + } + } + + private class RefreshListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + executeAndShowResults(); + } + } + + + private void executeAndShowResults() + { + Object result = null; + try + { + result = MBeanUtility.execute(_mbean, _opData); + } + catch(Exception ex) + { + MBeanUtility.handleException(_mbean, ex); + return; + } + + String title = _mbean.getType(); + if (_mbean.getName() != null && _mbean.getName().length() != 0) + { + title = _mbean.getName(); + } + + if (_opData.getReturnType().equals("void") || _opData.getReturnType().equals("java.lang.Void")) + { + ViewUtility.popupInfoMessage(title, "Operation successful"); + } + else if (_opData.getParameters() != null && !_opData.getParameters().isEmpty()) + { + populateResults(result); + } + else + { + ViewUtility.disposeChildren(_resultsComposite); + /* + if (_resultsComposite == null || _resultsComposite.isDisposed()) + { + _resultsComposite = _toolkit.createComposite(_form.getBody(), SWT.NONE); + GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); + layoutData.verticalIndent = 20; + _resultsComposite.setLayoutData(layoutData); + _resultsComposite.setLayout(new GridLayout()); + }*/ + populateResults(result, _resultsComposite); + _resultsComposite.layout(); + _form.layout(); + } + + } + + /** + * Listener class for the operation parameters widget + */ + private class ParameterSelectionListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + Combo combo = (Combo)e.widget; + ParameterData parameter = (ParameterData)combo.getData(); + if (combo.getSelectionIndex() > 0) + { + String item = combo.getItem(combo.getSelectionIndex()); + parameter.setValueFromString(item); + } + else + { + parameter.setValue(null); + } + } + } + + private class BooleanSelectionListener extends SelectionAdapter + { + public void widgetSelected(SelectionEvent e) + { + Combo combo = (Combo)e.widget; + ParameterData parameter = (ParameterData)combo.getData(); + String item = combo.getItem(combo.getSelectionIndex()); + parameter.setValueFromString(item); + } + } + + /** + * Listener class for the operation parameter value widget (Text field) + */ + private class KeyListenerImpl extends KeyAdapter + { + public void keyReleased(KeyEvent e) + { + if (!(e.widget instanceof Text)) + return; + + Text text = (Text)e.widget; + // Get the parameters widget and assign the text to the parameter + String strValue = text.getText(); + ParameterData parameter = (ParameterData)text.getData(); + parameter.setValueFromString(strValue); + } + } + + private class HeaderBindingKeyListener extends KeyAdapter + { + public void keyReleased(KeyEvent e) + { + ParameterData param = _opData.getParameters().get(1); + StringBuffer paramValue = new StringBuffer(); + for (Entry<Text, Text> entry : headerBindingHashMap.entrySet()) + { + + Text nameText = entry.getKey(); + String name = nameText.getText(); + Text valueText = entry.getValue(); + String value = valueText.getText(); + if ((name != null) && (name.length() != 0) && (value != null) && (value.length() != 0)) + { + if (paramValue.length() != 0) + { + paramValue.append(","); + } + paramValue.append(name + "=" + value); + } + } + + param.setValue(paramValue.toString()); + } + } + + private class VerifyListenerImpl implements VerifyListener + { + public void verifyText(VerifyEvent event) + { + Text text = (Text)event.widget; + String string = event.text; + char [] chars = new char [string.length ()]; + string.getChars (0, chars.length, chars, 0); + + ParameterData parameter = (ParameterData)text.getData(); + String type = parameter.getType(); + if (type.equals("int") || type.equals("java.lang.Integer") || + type.equals("long") || type.equals("java.lang.Long")) + { + for (int i=0; i<chars.length; i++) + { + if (!('0' <= chars [i] && chars [i] <= '9')) + { + event.doit = false; + return; + } + } + + } + } + } + +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TabControl.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TabControl.java new file mode 100644 index 0000000000..4b89b7ca30 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TabControl.java @@ -0,0 +1,57 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.model.OperationData; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.TabFolder; + +public abstract class TabControl +{ + protected ManagedBean _mbean = null; + protected TabFolder _tabFolder = null; + + public TabControl(TabFolder tabFolder) + { + _tabFolder = tabFolder; + } + + public Control getControl() + { + return null; + } + + public void refresh(ManagedBean mbean) + { + + } + + public void refresh(ManagedBean mbean, OperationData opData) + { + + } + + public void setFocus() + { + + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TreeObject.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TreeObject.java new file mode 100644 index 0000000000..36dc753a1e --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/TreeObject.java @@ -0,0 +1,125 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.qpid.management.ui.Constants; +import org.apache.qpid.management.ui.ManagedBean; +import org.apache.qpid.management.ui.ManagedObject; + +public class TreeObject +{ + private String _name; + private String _type; + private String _url; + private TreeObject _parent; + private List<TreeObject> _children = new ArrayList<TreeObject>(); + private ManagedObject _object; + + public TreeObject(String name, String type) + { + this._name = name; + this._type = type; + } + + public TreeObject(ManagedObject obj) + { + _name = obj.getName(); + if (_name == null && (obj instanceof ManagedBean)) + { + _name = ((ManagedBean)obj).getType(); + } + this._type = Constants.MBEAN; + this._object = obj; + } + + public void addChild(TreeObject child) + { + _children.add(child); + } + + public void addChildren(List<TreeObject> subList) + { + _children.addAll(subList); + } + + public List<TreeObject> getChildren() + { + return _children; + } + + public void setChildren(List<TreeObject> children) + { + this._children = children; + } + + public void setName(String value) + { + _name = value; + } + + public String getName() + { + return _name; + } + public String getType() + { + return _type; + } + + public String getUrl() + { + return _url; + } + + public void setUrl(String url) + { + this._url = url; + } + + public ManagedObject getManagedObject() + { + return _object; + } + + public void setManagedObject(ManagedObject obj) + { + this._object = obj; + } + + public TreeObject getParent() + { + return _parent; + } + + public void setParent(TreeObject parent) + { + this._parent = parent; + + if (parent != null) + { + this._url = parent.getUrl(); + parent.addChild(this); + } + } +} diff --git a/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/ViewUtility.java b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/ViewUtility.java new file mode 100644 index 0000000000..995206f248 --- /dev/null +++ b/java/management/eclipse-plugin/src/main/java/org/apache/qpid/management/ui/views/ViewUtility.java @@ -0,0 +1,512 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.ui.views; + +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.management.openmbean.ArrayType; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.TabularDataSupport; +import javax.management.openmbean.TabularType; + +import org.apache.qpid.management.ui.ApplicationWorkbenchAdvisor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class ViewUtility +{ + public static final String OP_NAME = "operation_name"; + public static final String OP_PARAMS = "parameters"; + public static final String PARAMS_TEXT = "text"; + + public static final String FIRST = "First"; + public static final String LAST = "Last"; + public static final String NEXT = "Next"; + public static final String PREV = "Previous"; + public static final String INDEX = "Index"; + + private static List<String> SUPPORTED_ARRAY_DATATYPES = new ArrayList<String>(); + static + { + SUPPORTED_ARRAY_DATATYPES.add("java.lang.String"); + SUPPORTED_ARRAY_DATATYPES.add("java.lang.Boolean"); + SUPPORTED_ARRAY_DATATYPES.add("java.lang.Character"); + SUPPORTED_ARRAY_DATATYPES.add("java.lang.Integer"); + SUPPORTED_ARRAY_DATATYPES.add("java.lang.Long"); + SUPPORTED_ARRAY_DATATYPES.add("java.lang.Double"); + SUPPORTED_ARRAY_DATATYPES.add("java.util.Date"); + } + + @SuppressWarnings("unchecked") + public static void createTabularDataHolder(Composite parent, TabularDataSupport tabularData) + { + Composite composite = new Composite(parent, SWT.BORDER); + //composite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + //composite.setBackground(parent.getBackground()); + GridLayout layout = new GridLayout(4, true); + layout.horizontalSpacing = 0; + layout.marginWidth = 0; + layout.marginHeight = 10; + layout.verticalSpacing = 10; + composite.setLayout(layout); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + Set entrySet = tabularData.entrySet(); + ArrayList<Map.Entry> list = new ArrayList<Map.Entry>(entrySet); + if (list.size() == 0) + { + Text text = new Text(composite, SWT.CENTER | SWT.SINGLE | SWT.READ_ONLY); + text.setText(" No records "); + //text.setBackground(parent.getBackground()); + GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1); + text.setLayoutData(layoutData); + return; + } + // Attach the tabular record to be retrieve and shown + composite.setData(list); + + // Create button and the composite for CompositeData + Composite compositeDataHolder = createCompositeDataHolder(composite, + tabularData.getTabularType().getRowType()); + + // display the first record + CompositeData data = (CompositeData)(list.get(0)).getValue(); + composite.setData(INDEX, 0); + populateCompositeDataHolder(compositeDataHolder, data); + enableOrDisableTraversalButtons(composite); + } + + public static void enableOrDisableTraversalButtons(Composite composite) + { + int index = (Integer)composite.getData(INDEX); + int size = ((List)composite.getData()).size(); + + ((Button)composite.getData(FIRST)).setEnabled(true); + ((Button)composite.getData(PREV)).setEnabled(true); + ((Button)composite.getData(NEXT)).setEnabled(true); + ((Button)composite.getData(LAST)).setEnabled(true); + + if (index == 0) + { + ((Button)composite.getData(FIRST)).setEnabled(false); + ((Button)composite.getData(PREV)).setEnabled(false); + } + if (index == size -1) + { + ((Button)composite.getData(NEXT)).setEnabled(false); + ((Button)composite.getData(LAST)).setEnabled(false); + } + } + + public static Composite createCompositeDataHolder(final Composite dataHolder, CompositeType compositeType) + { + Label description = new Label(dataHolder, SWT.CENTER); + description.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false, 4, 1)); + String desc = compositeType.getDescription(); + // TODO nameLabel.setFont(font); + description.setText(desc); + + // Add traversal buttons + final Button firstRecordButton = new Button(dataHolder, SWT.PUSH); + firstRecordButton.setText(FIRST); + GridData layoutData = new GridData (GridData.HORIZONTAL_ALIGN_END); + layoutData.widthHint = 80; + firstRecordButton.setLayoutData(layoutData); + + final Button nextRecordButton = new Button(dataHolder, SWT.PUSH); + nextRecordButton.setText(NEXT); + layoutData = new GridData (GridData.HORIZONTAL_ALIGN_END); + layoutData.widthHint = 80; + nextRecordButton.setLayoutData(layoutData); + + final Button previousRecordButton = new Button(dataHolder, SWT.PUSH); + previousRecordButton.setText(PREV); + layoutData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING); + layoutData.widthHint = 80; + previousRecordButton.setLayoutData(layoutData); + + final Button lastRecordButton = new Button(dataHolder, SWT.PUSH); + lastRecordButton.setText(LAST); + layoutData = new GridData (GridData.HORIZONTAL_ALIGN_BEGINNING); + layoutData.widthHint = 80; + lastRecordButton.setLayoutData(layoutData); + + final Composite composite = new Composite(dataHolder, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.horizontalSpacing = layout.verticalSpacing = 0; + layout.marginHeight = layout.marginWidth = 0; + composite.setLayout(layout); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1)); + + // Add button references. These references will be used when buttons + // are to enabled or disabled based of record index. e.g. for first record + // First and Previous buttons will be disabled. + dataHolder.setData(FIRST, firstRecordButton); + dataHolder.setData(NEXT, nextRecordButton); + dataHolder.setData(PREV, previousRecordButton); + dataHolder.setData(LAST, lastRecordButton); + + // Listener for the traversal buttons + SelectionListener listener = new SelectionAdapter() + { + public void widgetSelected(SelectionEvent e) + { + if (!(e.widget instanceof Button)) + return; + + Button traverseButton =(Button)e.widget; + CompositeData data = getCompositeData(dataHolder, traverseButton.getText()); + populateCompositeDataHolder(composite, data); + enableOrDisableTraversalButtons(dataHolder); + } + }; + + firstRecordButton.addSelectionListener(listener); + nextRecordButton.addSelectionListener(listener); + previousRecordButton.addSelectionListener(listener); + lastRecordButton.addSelectionListener(listener); + + return composite; + } + + private static CompositeData getCompositeData(Composite compositeHolder, String dataIndex) + { + List objectData = (List)compositeHolder.getData(); + if (objectData == null || objectData.isEmpty()) + { + // TODO + } + + // Get the index of record to be shown. + int index = 0; + if (compositeHolder.getData(INDEX) != null) + { + index = (Integer)compositeHolder.getData(INDEX); + } + + if (FIRST.equals(dataIndex)) + { + index = 0; + } + else if (NEXT.equals(dataIndex)) + { + index = index + 1; + } + else if (PREV.equals(dataIndex)) + { + index = (index != 0) ? (index = index - 1) : index; + } + else if (LAST.equals(dataIndex)) + { + index = objectData.size() -1; + } + + // Set the index being shown. + compositeHolder.setData(INDEX, index); + System.out.println("index :" + index); + + return (CompositeData)((Map.Entry)objectData.get(index)).getValue(); + } + + @SuppressWarnings("unchecked") + public static void populateCompositeDataHolder(Composite parent, CompositeData data/*String dataIndex*/) + { + Control[] oldControls = parent.getChildren(); + for (int i = 0; i < oldControls.length; i++) + { + oldControls[i].dispose(); + } + + Composite compositeHolder = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(4, false); + layout.horizontalSpacing = 10; + compositeHolder.setLayout(layout); + compositeHolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + + // ItemNames in composite data + List<String> itemNames = new ArrayList<String>(data.getCompositeType().keySet()); + + for (String itemName : itemNames) + { + OpenType itemType = data.getCompositeType().getType(itemName); + if (compositeHolder.getData(itemName) == null) + { + Label keyLabel = new Label(compositeHolder, SWT.TRAIL); + keyLabel.setText(itemName); + GridData layoutData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); + layoutData.minimumWidth = 70; + keyLabel.setLayoutData(layoutData); + System.out.println(itemType); + + if (itemType.isArray()) + { + OpenType type = ((ArrayType)itemType).getElementOpenType(); + System.out.println("Array Element type = " + type.getClassName()); + // If Byte array and mimetype is text, convert to text string + if (type.getClassName().equals(Byte.class.getName())) + { + String mimeType = null; + String encoding = null; + if (data.containsKey("MimeType")) + { + mimeType = (String)data.get("MimeType"); + encoding = (String)data.get("Encoding"); + if (encoding == null || encoding.length() == 0) + { + encoding = Charset.defaultCharset().name(); + } + + if (mimeType.equals("text/plain")) + { + displayByteArray(compositeHolder, data, itemName, encoding); + } + } + else + { + displayNotSupportedDataType(compositeHolder); + } + } + // If array of any other supported type, show as a list of String array + else if (SUPPORTED_ARRAY_DATATYPES.contains(type.getClassName())) + { + displayArrayItem(compositeHolder, data, itemName); + } + else + { + displayNotSupportedDataType(compositeHolder); + } + } + else if (itemType instanceof TabularType) + { + Composite composite = new Composite(compositeHolder, SWT.NONE); + composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1)); + layout = new GridLayout(); + layout.marginHeight = 0; + layout.marginWidth = 0; + composite.setLayout(layout); + createTabularDataHolder(composite, (TabularDataSupport)data.get(itemName)); + } + else + { + Text valueText = new Text(compositeHolder, SWT.READ_ONLY | SWT.BORDER); + valueText.setText(String.valueOf(data.get(itemName))); + valueText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1)); + } + } + } + + // layout the composite after creating new widgets. + parent.layout(); + } //end of method + + + private static void displayByteArray(Composite compositeHolder, CompositeData data, String itemName, String encoding) + { + Byte[] arrayItems = (Byte[])data.get(itemName); + byte[] byteArray = new byte[arrayItems.length]; + + for (int i = 0; i < arrayItems.length; i++) + { + byteArray[i] = arrayItems[i]; + } + try + { + String textMessage = new String(byteArray, encoding); + System.out.println("\nMessage : \n" + textMessage + "\n"); + + Text valueText = new Text(compositeHolder, SWT.READ_ONLY | SWT.BORDER | + SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); + valueText.setText(textMessage); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1); + gridData.heightHint = 300; + valueText.setLayoutData(gridData); + } + catch(Exception ex) + { + ex.printStackTrace(); + } + } + + public static int popupInfoMessage(String title, String message) + { + MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), + SWT.ICON_INFORMATION | SWT.OK); + messageBox.setMessage(message); + messageBox.setText(title); + int response = messageBox.open(); + + return response; + } + + public static int popupErrorMessage(String title, String message) + { + MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), + SWT.ICON_ERROR | SWT.OK); + messageBox.setMessage(message); + messageBox.setText(title); + int response = messageBox.open(); + + return response; + } + + public static int popupConfirmationMessage(String title, String message) + { + MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), + SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL); + messageBox.setMessage(message); + messageBox.setText(title); + int response = messageBox.open(); + + return response; + } + + public static void popupError(String title, String message, Exception ex) + { + IStatus status = new Status(IStatus.ERROR, ApplicationWorkbenchAdvisor.PERSPECTIVE_ID, + IStatus.ERROR, ex.getMessage(), ex); + ErrorDialog.openError(Display.getCurrent().getActiveShell(), title, message, status); + + } + + public static void popupError(String errorMsg) + { + Display display = Display.getCurrent(); + Shell shell = new Shell(display, SWT.BORDER | SWT.CLOSE | SWT.MIN | SWT.MAX); + shell.setText("Attribute"); + shell.setLayout(new GridLayout()); + int x = display.getBounds().width; + int y = display.getBounds().height; + int width = 500; + int height = 250; + shell.setBounds(x/4, y/4, width, height); + + Label label = new Label(shell, SWT.NONE); + label.setText(errorMsg); + label.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false)); + + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + shell.dispose(); + } + + public static Shell createPopupShell(String title, int width, int height) + { + Display display = Display.getCurrent(); + Shell shell = new Shell(display, SWT.BORDER | SWT.CLOSE | SWT.MIN |SWT.MAX); + shell.setText(title); + shell.setLayout(new GridLayout()); + int x = display.getBounds().width; + int y = display.getBounds().height; + shell.setBounds(x/4, y/4, width, height); + + return shell; + } + + private static void displayArrayItem(Composite compositeHolder, CompositeData data, String itemName) + { + Object[] arrayItems = (Object[])data.get(itemName); + String[] items = new String[arrayItems.length]; + for (int i = 0; i < arrayItems.length; i++) + { + items[i] = String.valueOf(arrayItems[i]); + } + org.eclipse.swt.widgets.List list = new org.eclipse.swt.widgets.List(compositeHolder, + SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY); + list.setItems(items); + list.setBackground(compositeHolder.getBackground()); + list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); + } + + private static void displayNotSupportedDataType(Composite compositeHolder) + { + Text valueText = new Text(compositeHolder, SWT.READ_ONLY); + valueText.setText("Format is not supported to be displayed"); + valueText.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1)); + } + + /** + * Converts the input string to displayable format by converting some character case or inserting space + * @param input + * @return + */ + public static String getDisplayText(String input) + { + StringBuffer result = new StringBuffer(input); + if (Character.isLowerCase(result.charAt(0))) + { + result.setCharAt(0, Character.toUpperCase(result.charAt(0))); + } + for (int i = 1; i < input.length(); i++) + { + if (Character.isUpperCase(result.charAt(i)) && !Character.isWhitespace(result.charAt(i - 1)) + && Character.isLowerCase(result.charAt(i - 1))) + { + result.insert(i, " "); + i++; + } + else if (Character.isLowerCase(result.charAt(i)) && Character.isWhitespace(result.charAt(i - 1))) + { + result.setCharAt(i, Character.toUpperCase(result.charAt(i))); + } + + } + + return result.toString(); + } + + public static void disposeChildren(Composite parent) + { + if (parent == null || parent.isDisposed()) + return; + + Control[] oldControls = parent.getChildren(); + for (int i = 0; i < oldControls.length; i++) + { + oldControls[i].dispose(); + } + } +} diff --git a/java/management/eclipse-plugin/startup.jar b/java/management/eclipse-plugin/startup.jar Binary files differnew file mode 100644 index 0000000000..2f26eceece --- /dev/null +++ b/java/management/eclipse-plugin/startup.jar |