<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.c2b2.columbia.edu/workbench/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zji</id>
		<title>geWorkbench - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.c2b2.columbia.edu/workbench/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zji"/>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php/Special:Contributions/Zji"/>
		<updated>2026-04-30T14:23:49Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.7</generator>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=File:ExampleComponent.gif&amp;diff=11569</id>
		<title>File:ExampleComponent.gif</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=File:ExampleComponent.gif&amp;diff=11569"/>
				<updated>2013-11-13T16:56:56Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: uploaded a new version of &amp;amp;quot;File:ExampleComponent.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of the example component.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=File:ProjectArea.png&amp;diff=11568</id>
		<title>File:ProjectArea.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=File:ProjectArea.png&amp;diff=11568"/>
				<updated>2013-11-13T16:54:09Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: uploaded a new version of &amp;amp;quot;File:ProjectArea.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Project Panel.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=11567</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=11567"/>
				<updated>2013-11-13T16:21:30Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development &lt;br /&gt;
is hosted on GitHub&lt;br /&gt;
https://github.com/geworkbench-group. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 lines:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 7 groups of packages:&lt;br /&gt;
# ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc)&lt;br /&gt;
# ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
# ''builtin'', supporting the internal execution and coordination of the core process, especially the project panel&lt;br /&gt;
# ''parsers'', parsing supports for input data format&lt;br /&gt;
# ''events'', event classes used by communication between all components and the core&lt;br /&gt;
# ''util'', all the utility libraries&lt;br /&gt;
# ''analysis'', a small number of classes providing abstract for analyses and savable parameter settings. This group used to be called &amp;quot;others&amp;quot; to include miscellaneous; ''analysis'' is the only one left now. This probably will be re-organized in the future.&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugin components'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]])&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Download_and_Installation&amp;diff=11157</id>
		<title>Download and Installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Download_and_Installation&amp;diff=11157"/>
				<updated>2013-10-03T14:55:14Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench 2.4.1 (released October 26th, 2012) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DownloadTopNav}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This section contains instructions for '''downloading''' and '''installing''' geWorkbench.&lt;br /&gt;
&lt;br /&gt;
=Notice - Downloads from NCI not usable=&lt;br /&gt;
October 1st, 2013 - Downloads of geWorkbench from the NCI GForge site are not usable due to a server error.  The files appear to download correctly but have a server-side error message prepended to them, making them unusable.  Because of the government shutdown, it may be some time before this download site is again usable. &lt;br /&gt;
&lt;br /&gt;
You can now download geWorkbench instead directly from our own site, using the links in the section below.&lt;br /&gt;
&lt;br /&gt;
=Downloads=&lt;br /&gt;
&lt;br /&gt;
You can now download geWorkbench directly from our server.  Choose the appropriate version below.&lt;br /&gt;
&lt;br /&gt;
==geWorkbench 2.5.0==&lt;br /&gt;
&lt;br /&gt;
geWorkbench 2.5.0 is scheduled for release on October 4th, 2013.  It adds a number of new features, and restores geWorkbench compatibility with external BLAST and gene annotation services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==geWorkbench 2.4.1 (released October 26th, 2012)==&lt;br /&gt;
&lt;br /&gt;
[[Media:GeWorkbench_v2.4.1.md5.txt | geWorkbench 2.4.1 MD5 Sums file]]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench geWorkbench_v2.4.1_Generic.zip]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=Linux geWorkbench_v2.4.1_Linux_installer_noJRE.bin]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=Linux_with_JRE geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=MacOSX geWorkbench_v2.4.1_MacOSX_installer.zip]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=Windows geWorkbench_v2.4.1_Windows_installer_noJRE.exe]    &lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=Windows_with_JRE geWorkbench_v2.4.1_Windows_installer_with_JRE6.exe]&lt;br /&gt;
&lt;br /&gt;
=geWorkbench 2.4.1 - System Requirements=&lt;br /&gt;
==Java==    &lt;br /&gt;
* The Java 6 Runtime Environment (JRE6) is required.  geWorkbench will run using Java 7, but has not been tested extensively in that environment.  Several incompatibilities have already been seen under Java 7 (see [[Known_Issues|Known Issues]] for details).&lt;br /&gt;
* For Windows and Linux, geWorkbench is distributed in two installer forms, one with and one without the JRE6 included.  To install a version of geWorkbench that does not include the JRE, the JRE6 must be installed separately on the machine. &lt;br /&gt;
* On MacOSX, the Java 6 JRE is included with MacOSX versions 10.5 and higher with the latest updates (Intel platforms only).  Java 6 is not available for the PowerPC platform.&lt;br /&gt;
* The &amp;quot;Generic&amp;quot; distribution of geWorkbench does not include the JRE6.  It must be installed separately.&lt;br /&gt;
* geWorkbench can run on both 32-bit and 64-bit versions of Java on appropriate OS platforms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How to choose===&lt;br /&gt;
* Using an installer version of geWorkbench that inludes the JRE6 allows you to be sure that you are running geWorkbench with the correct version of the JRE. &lt;br /&gt;
* You may wish to install a &amp;quot;no JRE&amp;quot; version of geWorkbench if you want to choose between 32 and 64 bit JREs, to keep up with the latest updates to the JRE, or to experiment with Java 7.&lt;br /&gt;
&lt;br /&gt;
===Obtaining the Java 6 JRE===&lt;br /&gt;
* The JRE6 can be downloaded from http://www.oracle.com/technetwork/java/javase/downloads&lt;br /&gt;
* Note: Java 6 is also referred to as Java 1.6.&lt;br /&gt;
&lt;br /&gt;
==Display Driver==&lt;br /&gt;
* This requirement pertains only to using the PCA component 3D graph viewer.&lt;br /&gt;
* When using a 64-bit JVM, the Java 3D library requires that OpenGL version 1.2 or higher be supported by your display driver.&lt;br /&gt;
&lt;br /&gt;
==Memory==  &lt;br /&gt;
At least 2 GB is recommended.  geWorkbench 2.4.1 by default will request up to 1 GB of memory for the Java VM.&lt;br /&gt;
&lt;br /&gt;
==Operating System==&lt;br /&gt;
* '''Windows XP/Vista/Windows 7 (32 or 64-bit)''': no special requirements.&lt;br /&gt;
                 &lt;br /&gt;
* '''MacOSX''':  Version 10.5 with latest updates, or any higher version (10.6, 10.7 +) is required to provide the Java 6 JRE (Intel platform only).&lt;br /&gt;
                &lt;br /&gt;
* '''Linux''': A version of Java must already be installed on the machine in order to run the geWorkbench installer.&lt;br /&gt;
&lt;br /&gt;
geWorkbench, unless otherwise noted for particular components, can be run on both 32 and 64-bit operating systems and JREs.&lt;br /&gt;
&lt;br /&gt;
==Graphics Driver==&lt;br /&gt;
At least one component, the PCA viewer, uses a Java 3D library.  When using a 64-bit JVM, the Java 3D library requires OpenGL version 1.2 or higher to be supported by the graphics display adapter in your computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==R server==&lt;br /&gt;
The SAM analysis component can use a local installation of R on your desktop computer.&lt;br /&gt;
&lt;br /&gt;
This has been tested with R version 2.15.0.&lt;br /&gt;
&lt;br /&gt;
At least for Windows 7 installations, it may be necessary to have R installed in a user directory rather than in a system directory, e.g. to &amp;quot;c:\users\username\R-2.15.0&amp;quot;, where &amp;quot;username&amp;quot; is your own account name.&lt;br /&gt;
&lt;br /&gt;
=IMPORTANT NOTICE ABOUT THE LICENSE=&lt;br /&gt;
Use of geWorkbench is governed by the rules specified in the [[geWorkbench License | software license]]. Please make sure to read the license and understand your obligations before proceeding to download the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation Instructions=&lt;br /&gt;
&lt;br /&gt;
All three platform-specific versions of geWorkbench (Windows, Linux, and Macintosh) provide an installation wizard (generated using InstallAnywhere).&lt;br /&gt;
&lt;br /&gt;
* Using an installer version of geWorkbench that inludes the JRE6 allows you to be sure that you are running geWorkbench with the correct version of the JRE.  &lt;br /&gt;
* You may wish to install a &amp;quot;no JRE&amp;quot; version of geWorkbench if you want to choose yourself between 32 and 64 bit JREs, or to keep up with the latest updates to the JRE.&lt;br /&gt;
* On Windows and Linux, geWorkbench was tested using installer versions which included the JRE6.  The included JREs are 32-bit versions.&lt;br /&gt;
    &lt;br /&gt;
A generic version of geWorkbench, which does not use any installer, is also available, and should run on any machine which supports Java 6.&lt;br /&gt;
&lt;br /&gt;
Further information about the [http://www.flexerasoftware.com/products/installanywhere/requirements.htm InstallAnywhere requirements] are found at the Flexera website.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Windows (XP/Vista/Windows 7)==&lt;br /&gt;
    &lt;br /&gt;
===Special note for Vista/Windows 7===&lt;br /&gt;
If you run the installer on Vista or Windows 7, the installer will prompt you to install geWorkbench to your user home directory, e.g. '''C:\Users\''username''\geWorkbench_2.4.1''', where ''username'' is your Windows login name.&lt;br /&gt;
&lt;br /&gt;
===Installer with JRE6===&lt;br /&gt;
* File: geWorkbench_v2.4.1_Windows_installer_with_JRE6.exe&lt;br /&gt;
* Includes the 32-bit Sun Java 6 JRE.&lt;br /&gt;
&lt;br /&gt;
Download and double-click the installer file to begin installation.&lt;br /&gt;
 &lt;br /&gt;
===Installer without JRE6===            &lt;br /&gt;
* File: geWorkbench_v2.4.1_Windows_installer_noJRE.exe&lt;br /&gt;
* No JRE is included, you must make sure that an appropriate Java 6 JRE is installed on your system before installing geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Download and double-click the installer file to begin installation.&lt;br /&gt;
&lt;br /&gt;
==MacOSX==&lt;br /&gt;
&lt;br /&gt;
* File: geWorkbench_v2.4.1_MacOSX_installer.zip.&lt;br /&gt;
* This version uses the Java 6 JRE included with recent updates to the MacOSX operating system. (Intel platforms only).&lt;br /&gt;
&lt;br /&gt;
Double-click geWorkbench_v2.4.1_MacOSX_installer.zip to begin installation.  This will extract a file called &amp;quot;install&amp;quot;.  Double-click on this file to install geWorkbench.&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
* Requires Mac OS X 10.5 with recent updates, or 10.6 or 10.7+.&lt;br /&gt;
* As Java 6 is not available for the PowerPC platform, regardless of OS X version, geworkbench will not run on the PowerPC platform under any version of OS X.&lt;br /&gt;
* The compressed installer should be expanded automatically by the system.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Installer with JRE6=== &lt;br /&gt;
* File: geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin.&lt;br /&gt;
* Includes the 32-bit Sun Java 6 JRE.&lt;br /&gt;
&lt;br /&gt;
===Installer without JRE6=== &lt;br /&gt;
* File: geWorkbench_v2.4.1_Linux_installer_noJRE.bin.&lt;br /&gt;
* No JRE is included, you must make sure that an appropriate Java 6 JRE is installed on your system before installing geWorkbench.&lt;br /&gt;
* You may need to configure the JRE.  See section below, &amp;quot;Java Environment Configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
You must already have installed a version of Java 1.6 or later on your Linux machine in order to run the geWorkbench installer.&lt;br /&gt;
&lt;br /&gt;
The Linux version of geWorkbench relies on X-Windows being installed and running. If you are running Linux on a server and e.g. you wish to view the application on a Windows desktop, you will also need to run an X-windows server on your desktop machine.  See X-Windows configuration instructions below.&lt;br /&gt;
&lt;br /&gt;
After downloading, cd (if needed) to the directory to which you downloaded the installer.&lt;br /&gt;
&lt;br /&gt;
To begin the installation, type the command for the particular version, e.g. for the installer with JRE: &lt;br /&gt;
&lt;br /&gt;
&amp;quot;sh ./geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This will extract geWorkbench into a new directory called geWorkbench_2.4.1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you requested that a desktop link be created, it will be called rungeWorkbench_2.4.1.&lt;br /&gt;
  &lt;br /&gt;
Note - if you made changes to the default installation directory name, the shortcut link may just be called &amp;quot;geWorkbench_2.4.1&amp;quot; rather than &amp;quot;rungeWorkbench_2.4.1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Running geWorkbench (Linux)===&lt;br /&gt;
To run geWorkbench, and assuming you are using the Linux bash shell, and that you created a shortcut link during installation, issue one of the following commands from your home directory:  &lt;br /&gt;
          &lt;br /&gt;
    ./rungeWorkbench_2.4.1 &lt;br /&gt;
    or&lt;br /&gt;
    sh rungeWorkbench_2.4.1.&lt;br /&gt;
    or&lt;br /&gt;
    sh geWorkbench_2.4.1 if the link received the alternative name (see above).&lt;br /&gt;
          &lt;br /&gt;
Alternatively, in the directory in which geWorkbench was installed, you can start geWorkbench with the command:&lt;br /&gt;
          &lt;br /&gt;
    sh launch_geWorkbench.sh&lt;br /&gt;
&lt;br /&gt;
==Generic==&lt;br /&gt;
A non-installer-based version of geWorkbench is supplied in a Zip file which should work on any platform.&lt;br /&gt;
&lt;br /&gt;
File: geWorkbench_v2.4.1_Generic.zip&lt;br /&gt;
&lt;br /&gt;
===Installation=== &lt;br /&gt;
    &lt;br /&gt;
Unzip the file.  It will create a directory geWorkbench_2.4.1.&lt;br /&gt;
          &lt;br /&gt;
&lt;br /&gt;
===Running geWorkbench (generic)===&lt;br /&gt;
&lt;br /&gt;
You must have the Java 6 JRE installed and the JRE must be in the path for geWorkbench (see Java Environment Configuration below).&lt;br /&gt;
&lt;br /&gt;
Windows: you can double click on the file &amp;quot;launch_geWorkbench.bat&amp;quot; to launch geWorkbench, or run it from a command window.&lt;br /&gt;
            &lt;br /&gt;
Linux/Unix:   Execute the script &amp;quot;launch_geworkbench.sh&amp;quot;.&lt;br /&gt;
      &lt;br /&gt;
Any: Alternatively, if you have Apache Ant installed, you can type &amp;quot;ant run&amp;quot; in the geWorkbench directory.&lt;br /&gt;
&lt;br /&gt;
=Java Environment Configuration=&lt;br /&gt;
&lt;br /&gt;
To run a version of geWorkbench that does not include the Java 6 Runtime Environment (JRE6), the JRE6 must be installed and, depending on the platform configured separately.&lt;br /&gt;
&lt;br /&gt;
Two environment variables may need to be properly configured. These are the JAVA_HOME and the PATH variables.  They should be configured to point to your own installation of the JRE6. &lt;br /&gt;
&lt;br /&gt;
Here is an example of setting the two environment variables for a JRE installed in the directory /opt:&lt;br /&gt;
&lt;br /&gt;
JAVA_HOME=/opt/jre1.6.0_31&lt;br /&gt;
&lt;br /&gt;
PATH=/opt/jre1.6.0_31/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
=Typical steps in running X-windows=&lt;br /&gt;
Here are some typical steps to configure a remote Linux host and a local desktop X-server.  Under Windows, a local X-server can be provided for example by the Cygwin package.&lt;br /&gt;
&lt;br /&gt;
On the remote Linux host (assuming you are using the bash shell), issue the command&lt;br /&gt;
*  &amp;quot;export DISPLAY=(your IP):0&amp;quot;&lt;br /&gt;
where (your IP) should be substituted with the IP address of your local desktop machine.&lt;br /&gt;
&lt;br /&gt;
On your local desktop machine, you may need to&lt;br /&gt;
# start the X-windows server with a command such as &amp;quot;startx&amp;quot;.  You may need to cd to the X11 bin directory to find this command.&lt;br /&gt;
# allow remote connections with a command such as &amp;quot;xhost +&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Quick Start=&lt;br /&gt;
A [[QuickStart| Quick Start]] guide to geWorkbench is being developed.&lt;br /&gt;
&lt;br /&gt;
=Community Support Forums=&lt;br /&gt;
geWorkbench community forums are operated by the caBIG Molecular Analysis Tools Knowledge Center.  There are separate user and developer forums.  Anyone can browse through existing postings, but to start a new topic one must first register.&lt;br /&gt;
&lt;br /&gt;
The forums can be viewed at https://cabig-kc.nci.nih.gov/Molecular/forums/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tutorial data=&lt;br /&gt;
&lt;br /&gt;
[[Media:tutorial_data.zip|tutorial_data.zip]] (3.586 MB) - data files in several different formats useful for the tutorials or just trying out geWorkbench.&lt;br /&gt;
&lt;br /&gt;
[[Media:Bcell-100.zip|Bcell-100.zip]] (5.256 MB) - A large (100 array) microarray dataset in the geWorkbench matrix format.  Data is from the lab of Riccardo Dalla-Favera, Columbia University, and is provided only for use in learning and testing geWorkbench.  It was obtained from experiments using Affymetrix HG-U95Av2 chips.  This file contains the same data as the previously used file &amp;quot;webmatrix&amp;quot;, but with the array subsets given more descriptive names.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Training Slides=&lt;br /&gt;
A set of PowerPoint training slides for an earlier version of geWorkbench is still available, but is of historical interest only.  The PowerPoint file is available from the [[Project Documentation]] section of this site.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Download_and_Installation&amp;diff=11156</id>
		<title>Download and Installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Download_and_Installation&amp;diff=11156"/>
				<updated>2013-10-03T14:52:25Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench 2.4.1 (released October 26th, 2012) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DownloadTopNav}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This section contains instructions for '''downloading''' and '''installing''' geWorkbench.&lt;br /&gt;
&lt;br /&gt;
=Notice - Downloads from NCI not usable=&lt;br /&gt;
October 1st, 2013 - Downloads of geWorkbench from the NCI GForge site are not usable due to a server error.  The files appear to download correctly but have a server-side error message prepended to them, making them unusable.  Because of the government shutdown, it may be some time before this download site is again usable. &lt;br /&gt;
&lt;br /&gt;
You can now download geWorkbench instead directly from our own site, using the links in the section below.&lt;br /&gt;
&lt;br /&gt;
=Downloads=&lt;br /&gt;
&lt;br /&gt;
You can now download geWorkbench directly from our server.  Choose the appropriate version below.&lt;br /&gt;
&lt;br /&gt;
==geWorkbench 2.5.0==&lt;br /&gt;
&lt;br /&gt;
geWorkbench 2.5.0 is scheduled for release on October 4th, 2013.  It adds a number of new features, and restores geWorkbench compatibility with external BLAST and gene annotation services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==geWorkbench 2.4.1 (released October 26th, 2012)==&lt;br /&gt;
&lt;br /&gt;
[[Media:GeWorkbench_v2.4.1.md5.txt | geWorkbench 2.4.1 MD5 Sums file]]&lt;br /&gt;
&lt;br /&gt;
[{{SERVER}}/workbench/data/geWorkbench_v2.4.1_Generic.zip geWorkbench_v2.4.1_Generic.zip]&lt;br /&gt;
&lt;br /&gt;
[{{SERVER}}/workbench/data/geWorkbench_v2.4.1_Linux_installer_noJRE.bin  geWorkbench_v2.4.1_Linux_installer_noJRE.bin]&lt;br /&gt;
&lt;br /&gt;
[{{SERVER}}/workbench/data/geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin  geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin]&lt;br /&gt;
&lt;br /&gt;
[{{SERVER}}/workbench/data/geWorkbench_v2.4.1_MacOSX_installer.zip  geWorkbench_v2.4.1_MacOSX_installer.zip]&lt;br /&gt;
&lt;br /&gt;
[http://magnet.c2b2.columbia.edu/?q=node/44&amp;amp;software=geWorkbench&amp;amp;platform=Windows geWorkbench_v2.4.1_Windows_installer_noJRE.exe]    &lt;br /&gt;
&lt;br /&gt;
[{{SERVER}}/workbench/data/geWorkbench_v2.4.1_Windows_installer_with_JRE6.exe  geWorkbench_v2.4.1_Windows_installer_with_JRE6.exe]&lt;br /&gt;
&lt;br /&gt;
=geWorkbench 2.4.1 - System Requirements=&lt;br /&gt;
==Java==    &lt;br /&gt;
* The Java 6 Runtime Environment (JRE6) is required.  geWorkbench will run using Java 7, but has not been tested extensively in that environment.  Several incompatibilities have already been seen under Java 7 (see [[Known_Issues|Known Issues]] for details).&lt;br /&gt;
* For Windows and Linux, geWorkbench is distributed in two installer forms, one with and one without the JRE6 included.  To install a version of geWorkbench that does not include the JRE, the JRE6 must be installed separately on the machine. &lt;br /&gt;
* On MacOSX, the Java 6 JRE is included with MacOSX versions 10.5 and higher with the latest updates (Intel platforms only).  Java 6 is not available for the PowerPC platform.&lt;br /&gt;
* The &amp;quot;Generic&amp;quot; distribution of geWorkbench does not include the JRE6.  It must be installed separately.&lt;br /&gt;
* geWorkbench can run on both 32-bit and 64-bit versions of Java on appropriate OS platforms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How to choose===&lt;br /&gt;
* Using an installer version of geWorkbench that inludes the JRE6 allows you to be sure that you are running geWorkbench with the correct version of the JRE. &lt;br /&gt;
* You may wish to install a &amp;quot;no JRE&amp;quot; version of geWorkbench if you want to choose between 32 and 64 bit JREs, to keep up with the latest updates to the JRE, or to experiment with Java 7.&lt;br /&gt;
&lt;br /&gt;
===Obtaining the Java 6 JRE===&lt;br /&gt;
* The JRE6 can be downloaded from http://www.oracle.com/technetwork/java/javase/downloads&lt;br /&gt;
* Note: Java 6 is also referred to as Java 1.6.&lt;br /&gt;
&lt;br /&gt;
==Display Driver==&lt;br /&gt;
* This requirement pertains only to using the PCA component 3D graph viewer.&lt;br /&gt;
* When using a 64-bit JVM, the Java 3D library requires that OpenGL version 1.2 or higher be supported by your display driver.&lt;br /&gt;
&lt;br /&gt;
==Memory==  &lt;br /&gt;
At least 2 GB is recommended.  geWorkbench 2.4.1 by default will request up to 1 GB of memory for the Java VM.&lt;br /&gt;
&lt;br /&gt;
==Operating System==&lt;br /&gt;
* '''Windows XP/Vista/Windows 7 (32 or 64-bit)''': no special requirements.&lt;br /&gt;
                 &lt;br /&gt;
* '''MacOSX''':  Version 10.5 with latest updates, or any higher version (10.6, 10.7 +) is required to provide the Java 6 JRE (Intel platform only).&lt;br /&gt;
                &lt;br /&gt;
* '''Linux''': A version of Java must already be installed on the machine in order to run the geWorkbench installer.&lt;br /&gt;
&lt;br /&gt;
geWorkbench, unless otherwise noted for particular components, can be run on both 32 and 64-bit operating systems and JREs.&lt;br /&gt;
&lt;br /&gt;
==Graphics Driver==&lt;br /&gt;
At least one component, the PCA viewer, uses a Java 3D library.  When using a 64-bit JVM, the Java 3D library requires OpenGL version 1.2 or higher to be supported by the graphics display adapter in your computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==R server==&lt;br /&gt;
The SAM analysis component can use a local installation of R on your desktop computer.&lt;br /&gt;
&lt;br /&gt;
This has been tested with R version 2.15.0.&lt;br /&gt;
&lt;br /&gt;
At least for Windows 7 installations, it may be necessary to have R installed in a user directory rather than in a system directory, e.g. to &amp;quot;c:\users\username\R-2.15.0&amp;quot;, where &amp;quot;username&amp;quot; is your own account name.&lt;br /&gt;
&lt;br /&gt;
=IMPORTANT NOTICE ABOUT THE LICENSE=&lt;br /&gt;
Use of geWorkbench is governed by the rules specified in the [[geWorkbench License | software license]]. Please make sure to read the license and understand your obligations before proceeding to download the application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation Instructions=&lt;br /&gt;
&lt;br /&gt;
All three platform-specific versions of geWorkbench (Windows, Linux, and Macintosh) provide an installation wizard (generated using InstallAnywhere).&lt;br /&gt;
&lt;br /&gt;
* Using an installer version of geWorkbench that inludes the JRE6 allows you to be sure that you are running geWorkbench with the correct version of the JRE.  &lt;br /&gt;
* You may wish to install a &amp;quot;no JRE&amp;quot; version of geWorkbench if you want to choose yourself between 32 and 64 bit JREs, or to keep up with the latest updates to the JRE.&lt;br /&gt;
* On Windows and Linux, geWorkbench was tested using installer versions which included the JRE6.  The included JREs are 32-bit versions.&lt;br /&gt;
    &lt;br /&gt;
A generic version of geWorkbench, which does not use any installer, is also available, and should run on any machine which supports Java 6.&lt;br /&gt;
&lt;br /&gt;
Further information about the [http://www.flexerasoftware.com/products/installanywhere/requirements.htm InstallAnywhere requirements] are found at the Flexera website.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Windows (XP/Vista/Windows 7)==&lt;br /&gt;
    &lt;br /&gt;
===Special note for Vista/Windows 7===&lt;br /&gt;
If you run the installer on Vista or Windows 7, the installer will prompt you to install geWorkbench to your user home directory, e.g. '''C:\Users\''username''\geWorkbench_2.4.1''', where ''username'' is your Windows login name.&lt;br /&gt;
&lt;br /&gt;
===Installer with JRE6===&lt;br /&gt;
* File: geWorkbench_v2.4.1_Windows_installer_with_JRE6.exe&lt;br /&gt;
* Includes the 32-bit Sun Java 6 JRE.&lt;br /&gt;
&lt;br /&gt;
Download and double-click the installer file to begin installation.&lt;br /&gt;
 &lt;br /&gt;
===Installer without JRE6===            &lt;br /&gt;
* File: geWorkbench_v2.4.1_Windows_installer_noJRE.exe&lt;br /&gt;
* No JRE is included, you must make sure that an appropriate Java 6 JRE is installed on your system before installing geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Download and double-click the installer file to begin installation.&lt;br /&gt;
&lt;br /&gt;
==MacOSX==&lt;br /&gt;
&lt;br /&gt;
* File: geWorkbench_v2.4.1_MacOSX_installer.zip.&lt;br /&gt;
* This version uses the Java 6 JRE included with recent updates to the MacOSX operating system. (Intel platforms only).&lt;br /&gt;
&lt;br /&gt;
Double-click geWorkbench_v2.4.1_MacOSX_installer.zip to begin installation.  This will extract a file called &amp;quot;install&amp;quot;.  Double-click on this file to install geWorkbench.&lt;br /&gt;
&lt;br /&gt;
===Notes===&lt;br /&gt;
* Requires Mac OS X 10.5 with recent updates, or 10.6 or 10.7+.&lt;br /&gt;
* As Java 6 is not available for the PowerPC platform, regardless of OS X version, geworkbench will not run on the PowerPC platform under any version of OS X.&lt;br /&gt;
* The compressed installer should be expanded automatically by the system.&lt;br /&gt;
&lt;br /&gt;
==Linux==&lt;br /&gt;
&lt;br /&gt;
===Installer with JRE6=== &lt;br /&gt;
* File: geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin.&lt;br /&gt;
* Includes the 32-bit Sun Java 6 JRE.&lt;br /&gt;
&lt;br /&gt;
===Installer without JRE6=== &lt;br /&gt;
* File: geWorkbench_v2.4.1_Linux_installer_noJRE.bin.&lt;br /&gt;
* No JRE is included, you must make sure that an appropriate Java 6 JRE is installed on your system before installing geWorkbench.&lt;br /&gt;
* You may need to configure the JRE.  See section below, &amp;quot;Java Environment Configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
You must already have installed a version of Java 1.6 or later on your Linux machine in order to run the geWorkbench installer.&lt;br /&gt;
&lt;br /&gt;
The Linux version of geWorkbench relies on X-Windows being installed and running. If you are running Linux on a server and e.g. you wish to view the application on a Windows desktop, you will also need to run an X-windows server on your desktop machine.  See X-Windows configuration instructions below.&lt;br /&gt;
&lt;br /&gt;
After downloading, cd (if needed) to the directory to which you downloaded the installer.&lt;br /&gt;
&lt;br /&gt;
To begin the installation, type the command for the particular version, e.g. for the installer with JRE: &lt;br /&gt;
&lt;br /&gt;
&amp;quot;sh ./geWorkbench_v2.4.1_Linux_installer_with_JRE6.bin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This will extract geWorkbench into a new directory called geWorkbench_2.4.1.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you requested that a desktop link be created, it will be called rungeWorkbench_2.4.1.&lt;br /&gt;
  &lt;br /&gt;
Note - if you made changes to the default installation directory name, the shortcut link may just be called &amp;quot;geWorkbench_2.4.1&amp;quot; rather than &amp;quot;rungeWorkbench_2.4.1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Running geWorkbench (Linux)===&lt;br /&gt;
To run geWorkbench, and assuming you are using the Linux bash shell, and that you created a shortcut link during installation, issue one of the following commands from your home directory:  &lt;br /&gt;
          &lt;br /&gt;
    ./rungeWorkbench_2.4.1 &lt;br /&gt;
    or&lt;br /&gt;
    sh rungeWorkbench_2.4.1.&lt;br /&gt;
    or&lt;br /&gt;
    sh geWorkbench_2.4.1 if the link received the alternative name (see above).&lt;br /&gt;
          &lt;br /&gt;
Alternatively, in the directory in which geWorkbench was installed, you can start geWorkbench with the command:&lt;br /&gt;
          &lt;br /&gt;
    sh launch_geWorkbench.sh&lt;br /&gt;
&lt;br /&gt;
==Generic==&lt;br /&gt;
A non-installer-based version of geWorkbench is supplied in a Zip file which should work on any platform.&lt;br /&gt;
&lt;br /&gt;
File: geWorkbench_v2.4.1_Generic.zip&lt;br /&gt;
&lt;br /&gt;
===Installation=== &lt;br /&gt;
    &lt;br /&gt;
Unzip the file.  It will create a directory geWorkbench_2.4.1.&lt;br /&gt;
          &lt;br /&gt;
&lt;br /&gt;
===Running geWorkbench (generic)===&lt;br /&gt;
&lt;br /&gt;
You must have the Java 6 JRE installed and the JRE must be in the path for geWorkbench (see Java Environment Configuration below).&lt;br /&gt;
&lt;br /&gt;
Windows: you can double click on the file &amp;quot;launch_geWorkbench.bat&amp;quot; to launch geWorkbench, or run it from a command window.&lt;br /&gt;
            &lt;br /&gt;
Linux/Unix:   Execute the script &amp;quot;launch_geworkbench.sh&amp;quot;.&lt;br /&gt;
      &lt;br /&gt;
Any: Alternatively, if you have Apache Ant installed, you can type &amp;quot;ant run&amp;quot; in the geWorkbench directory.&lt;br /&gt;
&lt;br /&gt;
=Java Environment Configuration=&lt;br /&gt;
&lt;br /&gt;
To run a version of geWorkbench that does not include the Java 6 Runtime Environment (JRE6), the JRE6 must be installed and, depending on the platform configured separately.&lt;br /&gt;
&lt;br /&gt;
Two environment variables may need to be properly configured. These are the JAVA_HOME and the PATH variables.  They should be configured to point to your own installation of the JRE6. &lt;br /&gt;
&lt;br /&gt;
Here is an example of setting the two environment variables for a JRE installed in the directory /opt:&lt;br /&gt;
&lt;br /&gt;
JAVA_HOME=/opt/jre1.6.0_31&lt;br /&gt;
&lt;br /&gt;
PATH=/opt/jre1.6.0_31/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
=Typical steps in running X-windows=&lt;br /&gt;
Here are some typical steps to configure a remote Linux host and a local desktop X-server.  Under Windows, a local X-server can be provided for example by the Cygwin package.&lt;br /&gt;
&lt;br /&gt;
On the remote Linux host (assuming you are using the bash shell), issue the command&lt;br /&gt;
*  &amp;quot;export DISPLAY=(your IP):0&amp;quot;&lt;br /&gt;
where (your IP) should be substituted with the IP address of your local desktop machine.&lt;br /&gt;
&lt;br /&gt;
On your local desktop machine, you may need to&lt;br /&gt;
# start the X-windows server with a command such as &amp;quot;startx&amp;quot;.  You may need to cd to the X11 bin directory to find this command.&lt;br /&gt;
# allow remote connections with a command such as &amp;quot;xhost +&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Quick Start=&lt;br /&gt;
A [[QuickStart| Quick Start]] guide to geWorkbench is being developed.&lt;br /&gt;
&lt;br /&gt;
=Community Support Forums=&lt;br /&gt;
geWorkbench community forums are operated by the caBIG Molecular Analysis Tools Knowledge Center.  There are separate user and developer forums.  Anyone can browse through existing postings, but to start a new topic one must first register.&lt;br /&gt;
&lt;br /&gt;
The forums can be viewed at https://cabig-kc.nci.nih.gov/Molecular/forums/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Tutorial data=&lt;br /&gt;
&lt;br /&gt;
[[Media:tutorial_data.zip|tutorial_data.zip]] (3.586 MB) - data files in several different formats useful for the tutorials or just trying out geWorkbench.&lt;br /&gt;
&lt;br /&gt;
[[Media:Bcell-100.zip|Bcell-100.zip]] (5.256 MB) - A large (100 array) microarray dataset in the geWorkbench matrix format.  Data is from the lab of Riccardo Dalla-Favera, Columbia University, and is provided only for use in learning and testing geWorkbench.  It was obtained from experiments using Affymetrix HG-U95Av2 chips.  This file contains the same data as the previously used file &amp;quot;webmatrix&amp;quot;, but with the array subsets given more descriptive names.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Training Slides=&lt;br /&gt;
A set of PowerPoint training slides for an earlier version of geWorkbench is still available, but is of historical interest only.  The PowerPoint file is available from the [[Project Documentation]] section of this site.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9729</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9729"/>
				<updated>2012-03-01T18:58:19Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
* Clean up and organize imports to avoid unnecessary building dependency and to make dependency more explicit: (ctrl+shift+o in eclipse)&lt;br /&gt;
* Format code (ctrl+shift+o in eclipse, unless it makes it hard to keep track of the changes)&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries.&lt;br /&gt;
&lt;br /&gt;
=== Coding Standards ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are some of rules that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9728</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9728"/>
				<updated>2012-03-01T18:50:28Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
* Clean up and organize imports to avoid unnecessary building dependency and to make dependency more explicit: (ctrl+shift+o in eclipse)&lt;br /&gt;
* Format code (ctrl+shift+o in eclipse, unless it makes it hard to keep track of the changes)&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries.&lt;br /&gt;
&lt;br /&gt;
=== Coding Standards ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are some of rules that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9706</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9706"/>
				<updated>2012-03-01T17:01:56Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Code Organization Standard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries.&lt;br /&gt;
&lt;br /&gt;
=== Coding Standards ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are some of rules that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9705</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9705"/>
				<updated>2012-03-01T16:57:16Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Coding Style */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Coding Standards ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are some of rules that are particularly important to us:&lt;br /&gt;
===== Capitalization =====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9704</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9704"/>
				<updated>2012-03-01T16:54:57Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Code Organization Standard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9703</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9703"/>
				<updated>2012-03-01T16:53:28Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Code Organization Standard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9702</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9702"/>
				<updated>2012-03-01T16:52:47Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Project Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains eclipse project file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file, and the following subdirectories besides other contents:&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - out of date stuff - to be removed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an eclipse project file and its directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9701</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9701"/>
				<updated>2012-03-01T16:41:58Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessary.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9700</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9700"/>
				<updated>2012-03-01T16:41:45Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
* Immutable class is preferred. Particularly, do NOT implement setters for your class if you are not sure why it is necessisary.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=9464</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=9464"/>
				<updated>2012-02-23T17:09:46Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/trunk/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 lines:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 7 groups of packages:&lt;br /&gt;
# ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc)&lt;br /&gt;
# ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
# ''builtin'', supporting the internal execution and coordination of the core process, especially the project panel&lt;br /&gt;
# ''parsers'', parsing supports for input data format&lt;br /&gt;
# ''events'', event classes used by communication between all components and the core&lt;br /&gt;
# ''util'', all the utility libraries&lt;br /&gt;
# ''analysis'', a small number of classes providing abstract for analyses and savable parameter settings. This group used to be called &amp;quot;others&amp;quot; to include miscellaneous; ''analysis'' is the only one left now. This probably will be re-organized in the future.&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]])&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Template:DevelopersTopNav&amp;diff=9459</id>
		<title>Template:DevelopersTopNav</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Template:DevelopersTopNav&amp;diff=9459"/>
				<updated>2012-02-23T16:40:16Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
[[Developers | Developers Home]] |&lt;br /&gt;
[[A Simple Plugin]] | &lt;br /&gt;
[[.GEAR_files | geWorkbench Archive Files]] | &lt;br /&gt;
[[Collaborative Development]] |&lt;br /&gt;
[[Design Documentation]] | &lt;br /&gt;
[{{SERVER}}/workbench/api Javadocs] | &lt;br /&gt;
[http://gforge.nci.nih.gov/projects/geworkbench gForge Page] |&lt;br /&gt;
[[Report Defects]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=9458</id>
		<title>Software Development Kit</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=9458"/>
				<updated>2012-02-23T16:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
* This page is out of date. There is not much value for the developers to have a separate SDK besides the downloadable geWorkbench package and the code base from subversion, which includes an example plug-in. I will remove the link of this page from the Developers section (to avoid confusion) instead of maintainining this page. Feb 23, 2012. - Zhou Ji&lt;br /&gt;
&lt;br /&gt;
The Development Kit is a self-contained package that facilitates the process of developing plugins for geWorkbench. &lt;br /&gt;
&lt;br /&gt;
== Using the Development Kit ==&lt;br /&gt;
&lt;br /&gt;
The Development Kit is available as a .zip file (see [[Download]] page). Unzip this archive, then follow the instructions below to create a geWorkbench plugin.  Prerequisites to using the SDK are installing [http://ant.apache.org/manual/index.html ANT] and a [[Download#Software_Requirements|supported version]] of Java.&lt;br /&gt;
&lt;br /&gt;
The high-level steps for creating, testing and releasing a plugin are as follows:&lt;br /&gt;
&lt;br /&gt;
# From the command line, ''cd'' into the directory created after unpacking the archive.&lt;br /&gt;
# Edit the provided Apache Ant build script to specify the name of your plugin.&lt;br /&gt;
# Add the .java source files for your plugin to the &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Add any .jar libraries that your plugin requires to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;ant&amp;lt;/tt&amp;gt; to build your plugin.&lt;br /&gt;
# Edit the geWorkbench configuration file to add a directive for your new plugin.&lt;br /&gt;
# Run geWorkbench with &amp;lt;tt&amp;gt;ant run&amp;lt;/tt&amp;gt; to test your plugin.&lt;br /&gt;
# Once satisfied with your plugin, use the provided utility to package your plugin in to a single file for distribution.&lt;br /&gt;
&lt;br /&gt;
The next section will illustrate the above steps with an example.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (geworkbench 1.7 or later) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
Create a .cwb.xml file for your plugin and place it under the same directory as the source file.  In this case, create ''test.cwb.xml'' and place it under ''GEWORKBENCHSDK_HOME/src/org/organization/test''.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;component-descriptor  xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:noNamespaceSchemaLocation=&amp;quot;ConfigurationFile Schema.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;component  name=&amp;quot;Test SDK Panel&amp;quot;  &lt;br /&gt;
      class=&amp;quot;org.organization.test.TestComponent&amp;quot; &lt;br /&gt;
      version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
      author=&amp;quot;C2B2&amp;quot;&lt;br /&gt;
      authorURL=&amp;quot;&amp;quot;&lt;br /&gt;
      toolURL=&amp;quot;&amp;quot;&lt;br /&gt;
      description=&amp;quot;test SDK&amp;quot;&lt;br /&gt;
      visualizer=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;license&amp;gt;&lt;br /&gt;
      &amp;lt;![CDATA[&lt;br /&gt;
        &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=Content-Type content=&amp;quot;text/html; charset=windows-1252&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
          &amp;lt;body&amp;gt;----&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
      ]]&amp;gt;&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;TestSDKPanel&amp;quot; name=&amp;quot;Test SDK&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/component-descriptor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugin and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. This gear file is a bundled  plugin that can deployed to a geWorkbench installation by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory, then unzipping it.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (Pre geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
The configuration file for the Development Kit is called &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; and it is in the &amp;lt;tt&amp;gt;conf&amp;lt;/tt&amp;gt; directory. &lt;br /&gt;
&lt;br /&gt;
Add the following to the bottom of &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; (before ''&amp;lt;/geaw-config&amp;gt;''):&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;testPanel&amp;quot; name=&amp;quot;Test Panel&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugn and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. A .gear file is the geWorkbench analogue of a .war file for a web application. Is a bundled  plugin that can deployed to a geWorkbench install by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. A configuration directive (such as the one above) would also need to be added to the configuration file to activate the plugin.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9231</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9231"/>
				<updated>2011-10-28T13:57:21Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is not intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9230</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9230"/>
				<updated>2011-10-27T22:14:50Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Style Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here. Any [mailto:zji@c2b2.columbia.edu comments] are very welcome.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9229</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9229"/>
				<updated>2011-10-27T22:08:41Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Style Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
&lt;br /&gt;
== geWorkbench Code Organization Standard==&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9228</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9228"/>
				<updated>2011-10-27T22:04:03Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* geWorkbench Developer Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here.&lt;br /&gt;
* Remove dead code. This includes: unused local variables, unused private members, unused public members, out-of-date comments, unused classes/files, unless you have specific reason to expect to use it soon or as part of unfinished development.&lt;br /&gt;
* If a local variable is adequate to serve your purpose, do not make it a member variable.&lt;br /&gt;
* If a private member serves your purpose, do not make it public or default or protected.&lt;br /&gt;
* If the class is intended to be extended, declare it as final - unless those require by geWorkbench framework not to be final.&lt;br /&gt;
* If the method parameter is intended to be read only, declare it as final.&lt;br /&gt;
* Name classes, variables, and methods what they really are or really do. If you cannot name your class as a noun, something is wrong with your design; if you cannot name your method as a verb, something is wrong with your design.&lt;br /&gt;
* If one java file is over 1000 lines, the design deserves very careful scrutiny.&lt;br /&gt;
* If class A refers to class B, and at the same time class B refers class A, the design needs scrutiny.&lt;br /&gt;
* Refer to the object by a proper interface instead of implementation class when possible.&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9227</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Style_Guide&amp;diff=9227"/>
				<updated>2011-10-27T18:53:17Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== geWorkbench Developer Guide ==&lt;br /&gt;
This document provides a style guide for developers of geWorkbench. The old content that has not been updated since 2005 may include something useful, so I keep them for now at the end the page, titled &amp;quot;Old Content&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are various good style guides out there on the Internet, this document is meant to focus on the issues that are more relevant to the current code base and development activity of geWorkbench. While it is not practical to enforce the style over the legacy code, new development should follow the guide line described here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Old Content ===&lt;br /&gt;
=== Project Structure ===&lt;br /&gt;
This section describes the directory structure of the project. The root directory structure contains the JBuilder and IDEA project and library files. It also contains this file, the &amp;lt;tt&amp;gt;java.policy&amp;lt;/tt&amp;gt; file, and the &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; ant build file.&lt;br /&gt;
* &amp;lt;tt&amp;gt;_all&amp;lt;/tt&amp;gt; - A folder for a placeholder module required for the IDEA IDE.&lt;br /&gt;
* &amp;lt;tt&amp;gt;annotation&amp;lt;/tt&amp;gt; - Marker annotations for various chip types.&lt;br /&gt;
* &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; - The top-level directory for geWorkbench components.&lt;br /&gt;
* &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; - Sample data files for the project.&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files for core geWorkbench.&lt;br /&gt;
* &amp;lt;tt&amp;gt;plugins&amp;lt;/tt&amp;gt; - Plugins for the Cytoscape package.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for core geWorkbench.&lt;br /&gt;
&lt;br /&gt;
Each component is in a subdirectory of the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. It contains an IDEA &amp;lt;tt&amp;gt;.iml&amp;lt;/tt&amp;gt; module file and it's directory structure is as follows:&lt;br /&gt;
* &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; - Library files depended on by this component.&lt;br /&gt;
* &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; - Source code for the component.&lt;br /&gt;
&lt;br /&gt;
Note that the components can depend on the core classes (those defined in &amp;lt;tt&amp;gt;./src&amp;lt;/tt&amp;gt;) and the core libraries (those defined in &amp;lt;tt&amp;gt;./lib&amp;lt;/tt&amp;gt;). However, components cannot depend on each other, and the core classes cannot depend on components.&lt;br /&gt;
&lt;br /&gt;
=== Creating a New Component ===&lt;br /&gt;
A new component should be added as a new subdirectory of &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt;. The subdirectory should be given a simple, descriptive, lower-case name. It should contain &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directories. Most importantly, the component must not depend on the classes or libraries of any other component, nor should another component depend on it. Also, the core geWorkbench classes should not depend on its classes or libraries. The &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt; will enforce this, as will the IDEA project. However, the JBuilder project currently does not enforce this constraint, so be careful when using JBuilder.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
The [http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html coding standards] outlined by Sun are observed.&lt;br /&gt;
Here are the coding standards that are particularly important to us:&lt;br /&gt;
==== Capitalization ====&lt;br /&gt;
Constants must be in all-capitals, with underscores between words:&lt;br /&gt;
 public static final int MAXIMUM_FILES = 100;&lt;br /&gt;
&amp;lt;b&amp;gt;No&amp;lt;/b&amp;gt; other identifiers may contain underscores but constants.&lt;br /&gt;
Class, interface, enum and annotation names must be capitalized, with all subsequent words also capitalized:&lt;br /&gt;
 public class SampleClass extends AnotherSampleClass {&lt;br /&gt;
Variable and member names must have their first letter lower-case, and subsequent words capitalized:&lt;br /&gt;
 private String fieldName;&lt;br /&gt;
&lt;br /&gt;
 private abstract void processFile(File file);&lt;br /&gt;
Some developers differentiate between method variables and class members by prepending &amp;lt;tt&amp;gt;m_&amp;lt;/tt&amp;gt; or just &amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; to member names.&lt;br /&gt;
This is not a standard practice, so is not observed. Identifiers in property files are all lower-case with periods separating words:&lt;br /&gt;
 maximum.files=100&lt;br /&gt;
Type wildcards in generics must be a single capital letter:&lt;br /&gt;
 public interface Generic&amp;amp;lt;T, S extends Serializable&amp;amp;gt; {&lt;br /&gt;
==== Annotations ====&lt;br /&gt;
Annotations can either appear on the same line as their associated declaration, or on the line before it:&lt;br /&gt;
 @Subscribe public void receive(Integer value) {&lt;br /&gt;
 &lt;br /&gt;
 @Script(dependencies = {STATE_UNINITIALIZED, STATE_COMPLETE}, result = STATE_INITIALIZED)&lt;br /&gt;
 public void initialize() {&lt;br /&gt;
==== Variable Naming ====&lt;br /&gt;
Variables should be given verbose names, even if they are only used in relatively small code blocks. Using the auto-complete functionality of modern IDEs makes compliance with this rule painless. Exceptions are simple index variables, such as those introduced in &amp;lt;code&amp;gt;for(;;)&amp;lt;/code&amp;gt; statements:&lt;br /&gt;
 for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
==== Braces ====&lt;br /&gt;
All &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt; and similar block structures must be surrounded by braces, even if the body of the block consists of only one statement:&lt;br /&gt;
 if (index &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;index= &amp;quot; + index);&lt;br /&gt;
 }&lt;br /&gt;
==== No Shortcuts ====&lt;br /&gt;
Java provides some C-style shortcuts, such as the &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operators. The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; operators can be used by themselves (for example, &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; is often used in a &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; statement) but they should not be included in other statements. The &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt; operator should only be used very sparingly, usually in statements that construct strings. Here is an example of a &amp;lt;b&amp;gt;bad&amp;lt;/b&amp;gt; use of &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
   System.out.println(&amp;quot;i= &amp;quot; + i++);&lt;br /&gt;
 }&lt;br /&gt;
This is preferred:&lt;br /&gt;
 while (i &amp;lt; 100) {&lt;br /&gt;
     System.out.println(&amp;quot;i= &amp;quot; + i);&lt;br /&gt;
     i++;&lt;br /&gt;
 }&lt;br /&gt;
This is an acceptable use of &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;:&lt;br /&gt;
 boolean available;&lt;br /&gt;
 ...&lt;br /&gt;
 System.out.println(&amp;quot;The file is &amp;quot; + (available ? &amp;quot;available&amp;quot; : &amp;quot;unavailable&amp;quot;) + &amp;quot;.&amp;quot;);&lt;br /&gt;
However, it is a safe bet to never use &amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;.&lt;br /&gt;
==== Tabs ====&lt;br /&gt;
A tab-width of 4 should be used.&lt;br /&gt;
&lt;br /&gt;
=== Code Documentation ===&lt;br /&gt;
Code must be documented using the [http://java.sun.com/j2se/javadoc/ Javadoc] standard.&lt;br /&gt;
All classes, interfaces, enums and annotations must have an introductory Javadoc explaining its purpose.&lt;br /&gt;
All public methods must also have explanatory Javadocs.&lt;br /&gt;
Methods that perform non-trivial operations should have normal comments (not Javadoc) that explain the code.&lt;br /&gt;
Such comments should precede the line (or lines) of code that they describe.&lt;br /&gt;
For example:&lt;br /&gt;
 /**&lt;br /&gt;
  * Shuts down the componentRegistry (and terminates any pending aysnchronous dispatches).&lt;br /&gt;
  */&lt;br /&gt;
 public void shutdown() {&lt;br /&gt;
     // Iterate through all active synch models&lt;br /&gt;
     Collection&amp;amp;lt;SynchModel&amp;amp;gt; models = synchModels.values();&lt;br /&gt;
     for (SynchModel synchModel : models) {&lt;br /&gt;
         // Shut down the synch model&lt;br /&gt;
         synchModel.shutdown();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Package names should follow the inverse-domain rule. If the domain of your organization is&lt;br /&gt;
 &amp;lt;code&amp;gt;subdomain.domain.tld&amp;lt;/code&amp;gt;, then the package structure should be rooted at &amp;lt;code&amp;gt;tld.domain.subdomain&amp;lt;/code&amp;gt;.&lt;br /&gt;
Capital letters or underscore characters should never appear in package names.&lt;br /&gt;
&lt;br /&gt;
Otherwise, the organization of packages is left up to the developer.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=7060</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=7060"/>
				<updated>2010-10-23T15:00:00Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/trunk/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 lines:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 7 groups of packages:&lt;br /&gt;
# ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc)&lt;br /&gt;
# ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
# ''builtin'', supporting the internal execution and coordination of the core process, especially the project panel&lt;br /&gt;
# ''parsers'', parsing supports for input data format&lt;br /&gt;
# ''events'', event classes used by communication between all components and the core&lt;br /&gt;
# ''util'', all the utility libraries&lt;br /&gt;
# ''others'', including package &amp;quot;analysis&amp;quot; providing abstract for analyses and package &amp;quot;algorithm&amp;quot; used by some classification algorithm. Both contains a small number of classes.&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]])&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6738</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6738"/>
				<updated>2010-06-29T14:06:28Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/trunk/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 parallel axes:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 7 groups of packages:&lt;br /&gt;
# ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc)&lt;br /&gt;
# ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
# ''analysis'', providing abstract for various analyses and processing&lt;br /&gt;
# ''builtin'', supporting the internal execution and coordination of the core process, especially the project panel&lt;br /&gt;
# ''components'', parsers and supports for input data format&lt;br /&gt;
# ''events'', event classes used by communication between all components and the core&lt;br /&gt;
# ''util'', all the utility libraries&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]])&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Plugins&amp;diff=6319</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Plugins&amp;diff=6319"/>
				<updated>2010-06-10T21:46:44Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
The geWorkbench platform employs a component repository infrastructure to manage a large collection of pluggable components that can be used to customize the application's graphical user interface. This (ever growing) list of plug-in components covers a wide range of fucntionality for a number of different genomic data modalities.&lt;br /&gt;
&lt;br /&gt;
The Status of the pluggable components below is defined as:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Status||Comment&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;120&amp;quot;|(a) Released||This plugin is part of the latest geWorkbench version.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;120&amp;quot;|(b) Development||This plugin is currently actively being developed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Analysis==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ANOVA||Released||Analysis of Variance - detection of significant differences in expression between more than two groups. ([[media:T_ANOVA_ColorMosaic.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Evidence Integration||Development||A sequence and structure-based approach for functional annotation and protein-protein interaction analysis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GSEA||Development||The Gene Set Enrichment Analysis determines whether an a priori defined set of genes shows statistically significant differences between two phenotypes.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Hierarchical Clustering||Released||Clustering of markers and microarrays into hierarchical binary trees. The resulting structures can be visualized in the Dendrogram plugin. ([[media:T_HC_Dendrogram_display.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|KNN||Released||k-Nearest Neighbors analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mark-Us||Released||Assesses the biochemical function for a given protein structure. ([[media:T_MarkUs_Web_result.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MatrixReduce||Released||Transcription Factor binding motifs. ([[media:T_MatrixREDUCE_PSAM_view.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MEDUSA||Development||The Motif Element Detection Using Sequence Agglomeration is an integrative method for learning motif models of transcription factor binding sites by incorporating promoter sequence and gene expression data (Leslie Lab, MSKCC).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MRA||Released||The Master Regulator Analysis combines regulatory information from interaction networks with differential expression analysis. ([[media:MRA_viewer_full.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PCA||Released||Principal Component Analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pudge||Released||Computational protein structure prediction using sequence homology. It integrates tools used at different stages of the structural prediction process. ([[media:T_Pudge_Parameters.png|Screenshot Parameters]], [[media:T_Pudge_Alignment_example.png|Screenshot Result]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyBase||Released||Database of protein structure models produced by SkyLine based on structures solved by the NESG structural genomics consortium.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine||Released||Automated high-throughput pipeline for reverse homology-based comparative protein structure modeling based on the input template structure.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SOM||Released||Clustering of markers using Self Organizing Maps. The resulting clusters can be visualized in the SOM Clusters Viewer plugin. ([[media:T_SOM_result.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SVM 3.0||Released||The Support Vector Machine is a supervised classification method that computes a maximal separating hyperplane between the expression vectors of different classes or phenotypes (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|T-Test||Released||Identification of markers with statistically significant differential expression between sets of microarrays. ([[media:T_t-test_volcano_BCELL_webm_qldm.png|Screenshot Plot]], [[media:T_t-test_colormosaic_BCELL_webm_qldm.png|Screenshot Mosaic]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Weighted Voting||Released||Weighted Voting Analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Annotation==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|caScript||Development||An Editor.&lt;br /&gt;
|-&lt;br /&gt;
|-|width=&amp;quot;150&amp;quot;|Dataset Annotation||Released||Free text format box used to annotate data, images and results. Such annotations persist application invocations and can be used as an online notebook.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Dataset History||Released||Log of data transformations induced by data-modifying operations.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Experiment Information||Released||Microarray machine parameters used in an experiment run. If available, high-level experiment information (e.g., purpose of of experiment) are also displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Gene Ontology Enrichment||Released||Enrichment analysis of selected groups of genes against Gene Ontology (http://www.geneontology.org) annotations. ([[media:T_GO_Terms_TableBrowser_Gene_Detail.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Marker Annotations||Released||Retrieval of gene and pathway information for markers on a microarray (caBIO Pathways/Cancer Gene Index); it includes visualization of BioCarta pathway diagrams. ([[media:GeWB_Marker_Annotations.png|Screenshot Table]], [[media:GeWB_Marker_Annotations_Pathway.png|Screenshot BioCarta]], [[media:GeWB_Marker_Annotations_CGI.png|Screenshot CGI]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Filtering==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affy Detection Call Filter||Released||Filtering of measurements based on the value of their &amp;quot;detection call&amp;quot; attribute ''(Affymetrix data only)'' .&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Deviation Filter||Released||Filtering of markers with low dynamic range.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Threshold Filter||Released||Elimination of measurements that fall outside a range of explression values.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|2-channel Threshold Filter||Released||Same as &amp;quot;Expression Threshold&amp;quot; filter but different threshold ranges can be specified for each channel ''(GenePix data only)''.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Genepix Flag Filter||Released||Filtering of measurements based on the value of their &amp;quot;Flags&amp;quot; attribute ''(GenePix data only)''.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Missing Value Filter||Released||Discards all markers that have missing  measurements in more than a user specified number N of microarrays.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Management==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Arrays/Phenotypes||Released||Definition of data views consisting of microarray subgroups. The views control the amount of data displayed. ([[media:T_t-test_Arrays_case-set_BCELL_webm_qldm.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|caArray||Released||Search and download of gene expression data from instances of caArray (NCI microarray database product). ([[media:T_caArray_A549_arrays.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Markers||Released||Definition of data views consisting of marker subgroups. The views control the amount of data displayed. ([[media:Select_marker_sets.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Project Folders||Released||Manages projects and workspaces of the user. ([[media:T_ANOVA_Saved_Color_Mosaic_View.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==File Import==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix CEL||Released||Loads Affymetrix probe CELl intensity files (&amp;quot;*.cel&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix File Matrix||Released|| Loads Affymetrix EXPperiment files (&amp;quot;*.exp&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix MAS5/GCOS||Released|| Loads output files from the GeneChip Operating Software formerly known as MAS5 Statistical algorithm (several different file extension).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|FASTA Format||Released||Loads files that are in FASTA format (&amp;quot;*.fasta&amp;quot; and &amp;quot;*.txt&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Genepix File Format||Released||Loads files in GenePix Result format (&amp;quot;*.gpr&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PDB Structure Format||Released||Loads files in the Protein Data Base format (&amp;quot;*.pdb&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Tab-delimited (RMA Express Format)||Released||Loads tab-delimited files from the Robust Multichip Analysis (&amp;quot;*.txt&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Menu Tools==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CCM||Released||The Component Configuration Manager allows users to manage plugins dynamically at any given time in the application environment. ([[media:T_Component_Configuration_Manager.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|genSpace||Released||It logs information about the analysis tools used in geWorkbench in order to enable collaboration support for the geWorkbench users.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Online Help||Released||geWorkbench Online Help uses the Java help 2.0 system to provide real-time help on component questions.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Preferences||Released||Allows users to predefine a few basic visual settings and choose a Text Editor.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Version Information||Released||Provides basic information about the currently installed user version of geWorkbench.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Welcome Screen||Released||Introduction to geWorkbench during the initial opening of the application.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network Generation==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ARACNe||Released||The Algorithm for the Reconstruction of Accurate Cellular Networks analyses large amount of microarray data (typically 100-500 microarrays) to reverse engineer underlying gene regulatory networks. ([[media:T_ARACNE_result1.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Cancer GEMS||Development||Interface to the NCI Cancer Genetic Markers of Susceptibility project.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CNKB||Released||The Cellular Networks Knowledge Base queries an in-house repository of locally generated B-cell interaction network data and information from external databases in order to build a network of interactions for selected genes. ([[media:T_CNKB_ProtDNA_confidence75.png|Screenshot Throttle Graph]], [[media:T_CNKB_10at75_Cytoscape.png|Screenshot Network]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Cytoscape||Released||Visualization of gene regulatory network created in Reverse Engineering using [http://www.cytoscape.org/ Cytoscape 1.0]. ([[media:T_ARACNE_result1.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MINDy||Released||The Modulator Inference by Network Dynamics algorithm extends ARACNe to include detecting the influence of modulators of transcription factor activity.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|NetBoost||Development||NetBoost is a network characterization algorithm.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Normalization==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Array-Based Centering||Released||Subtraction of the mean or median measurement of a microarray from every measurement in that microarray.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Housekeeping Normalizer||Released|| Normalization of all measurements in a microarray through division by the average expression value of a (user defined) set of housekeeping genes.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Log2 Normalizer||Released||Applies a log2 transformation to all measurements in a microarray.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Marker-Based Centering||Released||Subtraction of the mean or median measurement of a marker profile from every measurement in the profile.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mean-Variance Normalizer||Released||Transformation of expression measurements to standard units: for every marker, the mean measurement of the marker profile (across all microarrays in an experiment) is subtracted from each measurement in the profile and the resulting value is divided by the standard deviation of the profile.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Missing Value Normalizer||Released||Replacement of missing values with consensus values.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Quantile Normalizer||Released|| Expression measurements in each microarray are adjusted so that  the distribution of values is the same across all microarrays in an experiment.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Threshold Normalizer||Released||Adjustment of values that fall outside a user-specified threshold.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sequence Analysis &amp;amp; Visualization ==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Alignment Results||Released||It parses and displays the results of sequence similarity searches which were run on the NCBI BLAST service. ([[media:T_SequenceAlignment_BLAST_results.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pattern  Discovery||Released|| Discovery of sequence motifs in sets of DNA and protein sequences. ([[media:T_PatternDiscovery_Params_Basic_histone_result_exact_seqs.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Position Histogram ||Released|| Visualization of results from the Pattern Discovery plugin. Motif/pattern support is plotted against relative sequence position of the motif match. ([[media:T_PatternDiscovery_Histones_Result_exact_Position_Histogram.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Promoter Analysis||Released||Identification of putative transcription factor binding sites in DNA sequences. The analysis use the profiles in the [http://jaspar.cgb.ki.se/cgi-bin/jaspar_db.pl JASPAR Transcription Factor Binding Profile Database]. ([[media:T_Promoter_CDH2_AP2_2000updn_setup_logo.png|Screenshot Logo]], [[media:T_Promoter_CDH2_AP2_2000updn_scan.png|Screenshot Sequence 1]], [[media:T_Promoter_CDH2_AP2_2000updn_scan_fullseq.png|Screenshot Sequence 2]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Alignment||Released||Run jobs on the NCBI BLAST servers directly within geWorkbench. &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Panel ||Released|| Visualization of results from the Pattern Discovery plugin, displaying the motif match location over each sequence from the input data set.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Retriever||Released||Retrieve sequences for annotated markers from Santa Cruz (Nucleotides) and EBI (Proteins). ([[media:T_SequenceRetriever_AfterRetrieval.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Visualization==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Analysis Panel||Released||Framework to support numerous, individually loadable analysis methods. &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ANOVA Tabular Viewer||Released||Displays the results of ANOVA analysis of gene expression  data in tabular format. ([[media:T_ANOVA_Tabular_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CEL Image Viewer||Released||Visualization of data in Affymetrix CEL files. ([[media:T_CEL_viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Color Mosaic||Released||Heat maps for microarray expression data, organized by phenotypic or gene groupings. ([[media:GeWB_Color_Mosaic_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Dendrogram||Released||Tree-structured diagrams reflecting the results of hierarchical clustering analysis. ([[media:T_HC_Dendrogram_display.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Evidence Integration Viewer||Development||Displays the results of the Evidence Integration analysis.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Profiles||Released||Line graph of genes expression profiles across several arrays/ hybridizations. ([[media:GeWB_Expression_Profile_2markers.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Value Distribution||Released||Distribution plot of marker expression values across one or more microarrays. ([[media:T_EVD.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GeneWays||Released||An essential component needed to display elements in Cytoscape and ARACNe.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GO Terms Viewer||Released||Displays the results of Gene Ontology Enrichment Analysis. ([[media:T_GO_Terms_TableBrowser_Gene_Detail.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Image Viewer||Released||Visualization of screenshots saved within geWorkbench (e.g. dendrograms).&lt;br /&gt;
|-	&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Jmol||Released|| Visualization of 3D protein structures from PDB files. ([[media:T_JMOL_Viewer.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mark-Us Browser||Released|| Displays the results of a Mark-Us analysis. ([[media:T_MarkUs_Web_result.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MatrixReduce||Released||Visualization of MatrixReduce calculations using logo, chromosomal and tabular displays.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MEDUSA Viewer||Development||Displays the results of a MEDUSA analysis.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Microarray Viewer||Released||Color-gradient representation of gene expression values. ([[media:GeWB_Microarray_Viewer.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MINDy Viewer||Released||The results of a MINDy calculation are presented in several different tabular displays and a heat map.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MRA Viewer||Released||Displays the results of the MRA in tablular and graphical form. ([[media:MRA_viewer_full.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|NetBoost Viewer||Development||Displays a Boosting Iteration Graph, Confusion Matrix and Score Table from NetBoost Analysis.&lt;br /&gt;
|-	&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Normalization Panel||Released||Framework to support numerous, individually loadable normalization components.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PCA Viewer||Released||Displays PCA results.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pudge Browser||Released||Visualization of Pudge results. ([[media:T_Pudge_Parameters.png|Screenshot Parameters]], [[media:T_Pudge_Alignment_example.png|Screenshot Result]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Scatter Plot||Released||Pairwise (array vs. array and marker vs. marker) comparison and plotting of expression values. ([[media:GeWB_Scatter_Plot_array_vs_array.png|Screenshot Array]], [[media:GeWB_Scatter_Plot_marker_vs_marker.png|Screenshot Marker]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyBase Viewer||Released||Displays the results from the SkyBase search.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Output All||Released||Displays all models from the Skyline modeling.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Output Each||Released||Displays each model from the Skyline modeling.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Contour||Development||A 2D dominance-based visualization of query results.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SOM Clusters Viewer||Released||Visualization of gene clusters produced by the self-organizing maps analysis. ([[media:T_SOM_result.png|Screenshot]]) &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SVM Viewer||Released||Visualizes results obtained from classifying samples based on SVMs generated using the Gene Pattern v3 SVM service. &lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Tabular Microarray Viewer||Released||Spreadsheet view of all expression measurement in an experiment, one row per individual marker/probe and one column per microarray. ([[media:GeWB_Tabular_Microarray_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;| Volcano Plot||Released|| Visualize fold-change vs significance (P-value) for t-test results. ([[media:T_t-test_volcano_BCELL_webm_qldm.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Plugins&amp;diff=6317</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Plugins&amp;diff=6317"/>
				<updated>2010-06-10T21:43:44Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
The geWorkbench platform employs a component repository infrastructure to manage a large collection of pluggable components that can be used to customize the application's graphical user interface. This (ever growing) list of plug-in components covers a wide range of fucntionality for a number of different genomic data modalities.&lt;br /&gt;
&lt;br /&gt;
The Status of the pluggable components below is defined as:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Status||Comment&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;120&amp;quot;|(a) Released||This plugin is part of the latest geWorkbench version.&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;120&amp;quot;|(b) Development||This plugin is currently actively being developed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Analysis==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ANOVA||Released||Analysis of Variance - detection of significant differences in expression between more than two groups. ([[media:T_ANOVA_ColorMosaic.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Evidence Integration||Development||A sequence and structure-based approach for functional annotation and protein-protein interaction analysis.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GSEA||Development||The Gene Set Enrichment Analysis determines whether an a priori defined set of genes shows statistically significant differences between two phenotypes.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Hierarchical Clustering||Released||Clustering of markers and microarrays into hierarchical binary trees. The resulting structures can be visualized in the Dendrogram plugin. ([[media:T_HC_Dendrogram_display.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|KNN||Released||k-Nearest Neighbors analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mark-Us||Released||Assesses the biochemical function for a given protein structure. ([[media:T_MarkUs_Web_result.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MatrixReduce||Released||Transcription Factor binding motifs. ([[media:T_MatrixREDUCE_PSAM_view.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MEDUSA||Development||The Motif Element Detection Using Sequence Agglomeration is an integrative method for learning motif models of transcription factor binding sites by incorporating promoter sequence and gene expression data (Leslie Lab, MSKCC).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MRA||Released||The Master Regulator Analysis combines regulatory information from interaction networks with differential expression analysis. ([[media:MRA_viewer_full.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PCA||Released||Principal Component Analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pudge||Released||Computational protein structure prediction using sequence homology. It integrates tools used at different stages of the structural prediction process. ([[media:T_Pudge_Parameters.png|Screenshot Parameters]], [[media:T_Pudge_Alignment_example.png|Screenshot Result]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyBase||Released||Database of protein structure models produced by SkyLine based on structures solved by the NESG structural genomics consortium.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine||Released||Automated high-throughput pipeline for reverse homology-based comparative protein structure modeling based on the input template structure.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SOM||Released||Clustering of markers using Self Organizing Maps. The resulting clusters can be visualized in the SOM Clusters Viewer plugin. ([[media:T_SOM_result.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SVM 3.0||Released||The Support Vector Machine is a supervised classification method that computes a maximal separating hyperplane between the expression vectors of different classes or phenotypes (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|T-Test||Released||Identification of markers with statistically significant differential expression between sets of microarrays. ([[media:T_t-test_volcano_BCELL_webm_qldm.png|Screenshot Plot]], [[media:T_t-test_colormosaic_BCELL_webm_qldm.png|Screenshot Mosaic]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Weighted Voting||Released||Weighted Voting Analysis (a GenePattern component).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Annotation==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|caScript||Development||An Editor.&lt;br /&gt;
|-&lt;br /&gt;
|-|width=&amp;quot;150&amp;quot;|Dataset Annotation||Released||Free text format box used to annotate data, images and results. Such annotations persist application invocations and can be used as an online notebook.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Dataset History||Released||Log of data transformations induced by data-modifying operations.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Experiment Information||Released||Microarray machine parameters used in an experiment run. If available, high-level experiment information (e.g., purpose of of experiment) are also displayed.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Gene Ontology Enrichment||Released||Enrichment analysis of selected groups of genes against Gene Ontology (http://www.geneontology.org) annotations. ([[media:T_GO_Terms_TableBrowser_Gene_Detail.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Marker Annotations||Released||Retrieval of gene and pathway information for markers on a microarray (caBIO Pathways/Cancer Gene Index); it includes visualization of BioCarta pathway diagrams. ([[media:GeWB_Marker_Annotations.png|Screenshot Table]], [[media:GeWB_Marker_Annotations_Pathway.png|Screenshot BioCarta]], [[media:GeWB_Marker_Annotations_CGI.png|Screenshot CGI]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Filtering==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affy Detection Call Filter||Released||Filtering of measurements based on the value of their &amp;quot;detection call&amp;quot; attribute ''(Affymetrix data only)'' .&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Deviation Filter||Released||Filtering of markers with low dynamic range.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Threshold Filter||Released||Elimination of measurements that fall outside a range of explression values.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|2-channel Threshold Filter||Released||Same as &amp;quot;Expression Threshold&amp;quot; filter but different threshold ranges can be specified for each channel ''(GenePix data only)''.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Genepix Flag Filter||Released||Filtering of measurements based on the value of their &amp;quot;Flags&amp;quot; attribute ''(GenePix data only)''.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Missing Value Filter||Released||Discards all markers that have missing  measurements in more than a user specified number N of microarrays.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Data Management==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Arrays/Phenotypes||Released||Definition of data views consisting of microarray subgroups. The views control the amount of data displayed. ([[media:T_t-test_Arrays_case-set_BCELL_webm_qldm.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|caArray||Released||Search and download of gene expression data from instances of caArray (NCI microarray database product). ([[media:T_caArray_A549_arrays.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Markers||Released||Definition of data views consisting of marker subgroups. The views control the amount of data displayed. ([[media:Select_marker_sets.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Project Folders||Released||Manages projects and workspaces of the user. ([[media:T_ANOVA_Saved_Color_Mosaic_View.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==File Import==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix CEL||Released||Loads Affymetrix probe CELl intensity files (&amp;quot;*.cel&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix File Matrix||Released|| Loads Affymetrix EXPperiment files (&amp;quot;*.exp&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Affymetrix MAS5/GCOS||Released|| Loads output files from the GeneChip Operating Software formerly known as MAS5 Statistical algorithm (several different file extension).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|FASTA Format||Released||Loads files that are in FASTA format (&amp;quot;*.fasta&amp;quot; and &amp;quot;*.txt&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Genepix File Format||Released||Loads files in GenePix Result format (&amp;quot;*.gpr&amp;quot;).&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PDB Structure Format||Released||Loads files in the Protein Data Base format (&amp;quot;*.pdb&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Tab-delimited (RMA Express Format)||Released||Loads tab-delimited files from the Robust Multichip Analysis (&amp;quot;*.txt&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Menu Tools==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CCM||Released||The Component Configuration Manager allows users to manage plugins dynamically at any given time in the application environment. ([[media:T_Component_Configuration_Manager.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|genSpace||Released||It logs information about the analysis tools used in geWorkbench in order to enable collaboration support for the geWorkbench users.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Online Help||Released||geWorkbench Online Help uses the Java help 2.0 system to provide real-time help on component questions.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Preferences||Released||Allows users to predefine a few basic visual settings and choose a Text Editor.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Version Information||Released||Provides basic information about the currently installed user version of geWorkbench.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Welcome Screen||Released||Introduction to geWorkbench during the initial opening of the application.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network Generation==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ARACNe||Released||The Algorithm for the Reconstruction of Accurate Cellular Networks analyses large amount of microarray data (typically 100-500 microarrays) to reverse engineer underlying gene regulatory networks. ([[media:T_ARACNE_result1.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Cancer GEMS||Development||Interface to the NCI Cancer Genetic Markers of Susceptibility project.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CNKB||Released||The Cellular Networks Knowledge Base queries an in-house repository of locally generated B-cell interaction network data and information from external databases in order to build a network of interactions for selected genes. ([[media:T_CNKB_ProtDNA_confidence75.png|Screenshot Throttle Graph]], [[media:T_CNKB_10at75_Cytoscape.png|Screenshot Network]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Cytoscape||Released||Visualization of gene regulatory network created in Reverse Engineering using [http://www.cytoscape.org/ Cytoscape 1.0]. ([[media:T_ARACNE_result1.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MINDy||Released||The Modulator Inference by Network Dynamics algorithm extends ARACNe to include detecting the influence of modulators of transcription factor activity.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|NetBoost||Development||NetBoost is a network characterization algorithm.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Normalization==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Array-Based Centering||Released||Subtraction of the mean or median measurement of a microarray from every measurement in that microarray.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Housekeeping Normalizer||Released|| Normalization of all measurements in a microarray through division by the average expression value of a (user defined) set of housekeeping genes.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Log2 Normalizer||Released||Applies a log2 transformation to all measurements in a microarray.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Marker-Based Centering||Released||Subtraction of the mean or median measurement of a marker profile from every measurement in the profile.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mean-Variance Normalizer||Released||Transformation of expression measurements to standard units: for every marker, the mean measurement of the marker profile (across all microarrays in an experiment) is subtracted from each measurement in the profile and the resulting value is divided by the standard deviation of the profile.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Missing Value Normalizer||Released||Replacement of missing values with consensus values.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Quantile Normalizer||Released|| Expression measurements in each microarray are adjusted so that  the distribution of values is the same across all microarrays in an experiment.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Threshold Normalizer||Released||Adjustment of values that fall outside a user-specified threshold.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sequence Analysis &amp;amp; Visualization ==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Alignment Results||Released||It parses and displays the results of sequence similarity searches which were run on the NCBI BLAST service. ([[media:T_SequenceAlignment_BLAST_results.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pattern  Discovery||Released|| Discovery of sequence motifs in sets of DNA and protein sequences. ([[media:T_PatternDiscovery_Params_Basic_histone_result_exact_seqs.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Position Histogram ||Released|| Visualization of results from the Pattern Discovery plugin. Motif/pattern support is plotted against relative sequence position of the motif match. ([[media:T_PatternDiscovery_Histones_Result_exact_Position_Histogram.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Promoter Analysis||Released||Identification of putative transcription factor binding sites in DNA sequences. The analysis use the profiles in the [http://jaspar.cgb.ki.se/cgi-bin/jaspar_db.pl JASPAR Transcription Factor Binding Profile Database]. ([[media:T_Promoter_CDH2_AP2_2000updn_setup_logo.png|Screenshot Logo]], [[media:T_Promoter_CDH2_AP2_2000updn_scan.png|Screenshot Sequence 1]], [[media:T_Promoter_CDH2_AP2_2000updn_scan_fullseq.png|Screenshot Sequence 2]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Alignment||Released||Run jobs on the NCBI BLAST servers directly within geWorkbench. &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Panel ||Released|| Visualization of results from the Pattern Discovery plugin, displaying the motif match location over each sequence from the input data set.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Sequence Retriever||Released||Retrieve sequences for annotated markers from Santa Cruz (Nucleotides) and EBI (Proteins). ([[media:T_SequenceRetriever_AfterRetrieval.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Visualization==&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;border: 1px solid lightGray&amp;quot;&lt;br /&gt;
!Plugin||Status||Description&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Analysis Panel||Released||Framework to support numerous, individually loadable analysis methods. &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|ANOVA Tabular Viewer||Released||Displays the results of ANOVA analysis of gene expression  data in tabular format. ([[media:T_ANOVA_Tabular_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|CEL Image Viewer||Released||Visualization of data in Affymetrix CEL files. ([[media:T_CEL_viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Color Mosaic||Released||Heat maps for microarray expression data, organized by phenotypic or gene groupings. ([[media:GeWB_Color_Mosaic_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Dendrogram||Released||Tree-structured diagrams reflecting the results of hierarchical clustering analysis. ([[media:T_HC_Dendrogram_display.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Evidence Integration Viewer||Development||Displays the results of the Evidence Integration analysis.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Profiles||Released||Line graph of genes expression profiles across several arrays/ hybridizations. ([[media:GeWB_Expression_Profile_2markers.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Expression Value Distribution||Released||Distribution plot of marker expression values across one or more microarrays. ([[media:T_EVD.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GeneWays||Released||An essential component needed to display elements in Cytoscape and ARACNe.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|GO Terms Viewer||Released||Displays the results of Gene Ontology Enrichment Analysis. ([[media:T_GO_Terms_TableBrowser_Gene_Detail.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Image Viewer||Released||Visualization of screenshots saved within geWorkbench (e.g. dendrograms).&lt;br /&gt;
|-	&lt;br /&gt;
|-	&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Jmol||Released|| Visualization of 3D protein structures from PDB files. ([[media:T_JMOL_Viewer.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Mark-Us Browser||Released|| Displays the results of a Mark-Us analysis. ([[media:T_MarkUs_Web_result.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MatrixReduce||Released||Visualization of MatrixReduce calculations using logo, chromosomal and tabular displays.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MEDUSA Viewer||Development||Displays the results of a MEDUSA analysis.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Microarray Viewer||Released||Color-gradient representation of gene expression values. ([[media:GeWB_Microarray_Viewer.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MINDy Viewer||Released||The results of a MINDy calculation are presented in several different tabular displays and a heat map.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|MRA Viewer||Released||Displays the results of the MRA in tablular and graphical form. ([[media:MRA_viewer_full.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|NetBoost Viewer||Development||Displays a Boosting Iteration Graph, Confusion Matrix and Score Table from NetBoost Analysis.&lt;br /&gt;
|-	&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Normalization Panel||Released||Framework to support numerous, individually loadable normalization components.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|PCA Viewer||Released||Displays PCA results.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Pudge Browser||Released||Visualization of Pudge results. ([[media:T_Pudge_Parameters.png|Screenshot Parameters]], [[media:T_Pudge_Alignment_example.png|Screenshot Result]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Scatter Plot||Released||Pairwise (array vs. array and marker vs. marker) comparison and plotting of expression values. ([[media:GeWB_Scatter_Plot_array_vs_array.png|Screenshot Array]], [[media:GeWB_Scatter_Plot_marker_vs_marker.png|Screenshot Marker]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyBase Viewer||Development||Displays the results from the SkyBase search.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Output All||Development||Displays all models from the Skyline modeling.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Output Each||Development||Displays each model from the Skyline modeling.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SkyLine Contour||Development||A 2D dominance-based visualization of query results.&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SOM Clusters Viewer||Released||Visualization of gene clusters produced by the self-organizing maps analysis. ([[media:T_SOM_result.png|Screenshot]]) &lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|SVM Viewer||Released||Visualizes results obtained from classifying samples based on SVMs generated using the Gene Pattern v3 SVM service. &lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|Tabular Microarray Viewer||Released||Spreadsheet view of all expression measurement in an experiment, one row per individual marker/probe and one column per microarray. ([[media:GeWB_Tabular_Microarray_Viewer.png|Screenshot]])&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|width=&amp;quot;150&amp;quot;| Volcano Plot||Released|| Visualize fold-change vs significance (P-value) for t-test results. ([[media:T_t-test_volcano_BCELL_webm_qldm.png|Screenshot]])&lt;br /&gt;
|-	&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Tutorial_-_Getting_Started&amp;diff=6311</id>
		<title>Tutorial - Getting Started</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Tutorial_-_Getting_Started&amp;diff=6311"/>
				<updated>2010-06-10T21:34:08Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Java: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TutorialsTopNav}}&lt;br /&gt;
&lt;br /&gt;
==Versions available:==&lt;br /&gt;
[[Download | Downloads]] are available for current versions of Windows, Linux and Macintosh OS-X.  Our primary development and testing platform is Windows XP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Requirements:==&lt;br /&gt;
&lt;br /&gt;
===Java:===&lt;br /&gt;
geWorkbench requires that a version of the Sun Java Runtime Environment 6.0 or higher be installed on your computer.  (This is also known as JRE version 1.6).  The JRE is available at [http://java.sun.com/javase/downloads/index.jsp java.sun.com].  However, the Windows and Linux versions of geWorkbench include the JRE in their download package, and the Macintosh supplies its own copy of the JRE.&lt;br /&gt;
&lt;br /&gt;
===Memory:===&lt;br /&gt;
Testing of geWorkbench is done on machines with at least 1 GB of memory.  Working with large datasets (100s of arrays) may require additional memory.&lt;br /&gt;
&lt;br /&gt;
==Installation:==&lt;br /&gt;
&lt;br /&gt;
See the [[Download | Download]] menu at left to obtain geWorkbench.  The self-installing file includes all currently available geWorkbench modules as well as several example data files.&lt;br /&gt;
The download package is created using InstallAnywhere from ZeroG Software.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Collaborative_Development&amp;diff=6127</id>
		<title>Collaborative Development</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Collaborative_Development&amp;diff=6127"/>
				<updated>2010-04-26T01:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
We encourage developers of geWorkbench plugins to use our code repository. Our source code tree comprises 2 separate modules under ''geworkbench'', ''src'' for the core and ''components'' for the plugin code portions as outlined in the &amp;quot;[[Developers]]&amp;quot; section. &lt;br /&gt;
&lt;br /&gt;
Collaborative development typically takes place under the components module. The module contains a number of subdirectories, each corresponding to one geWorkbench component package, which can contain one of more related component plugins. Each subdirectory has the same basic structure:&lt;br /&gt;
* A '''src''' directory containing the plugin code.&lt;br /&gt;
* An optional '''lib''' directory containing jar files required by the plugin.&lt;br /&gt;
&lt;br /&gt;
The application ant build script (which is made available to collaborative developers) will also create a '''classes''' directory which will contain the executable code. To create a new plugin called &amp;quot;example&amp;quot; a new directory with the same name will be created under the components directory. &lt;br /&gt;
&lt;br /&gt;
A full development environment can be then obtained by checking out the the project &amp;quot;geWorkbench&amp;quot; and one project for each subdirectory under &amp;quot;components&amp;quot;. In this development space the plugin development team will be able to change the code of their plugin as they please after checking out the code. To commit new code into our code base hosted by NCI's subversion server, you need an NCICB account. Please contact us for more detail.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6126</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6126"/>
				<updated>2010-04-26T00:03:32Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 parallel axes:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 7 groups of packages:&lt;br /&gt;
# ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc)&lt;br /&gt;
# ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
# ''analysis'', providing abstract for various analyses and processing&lt;br /&gt;
# ''builtin'', supporting the internal execution and coordination of the core process, especially the project panel&lt;br /&gt;
# ''components'', parsers and supports for input data format&lt;br /&gt;
# ''events'', event classes used by communication between all components and the core&lt;br /&gt;
# ''util'', all the utility libraries&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]])&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6125</id>
		<title>Software Development Kit</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6125"/>
				<updated>2010-04-25T23:49:51Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* An Example Plugin (geworkbench 1.7) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
The Development Kit is a self-contained package that facilitates the process of developing plugins for geWorkbench. &lt;br /&gt;
&lt;br /&gt;
== Using the Development Kit ==&lt;br /&gt;
&lt;br /&gt;
The Development Kit is available as a .zip file (see [[Download]] page). Unzip this archive, then follow the instructions below to create a geWorkbench plugin.  Prerequisites to using the SDK are installing [http://ant.apache.org/manual/index.html ANT] and a [[Download#Software_Requirements|supported version]] of Java.&lt;br /&gt;
&lt;br /&gt;
The high-level steps for creating, testing and releasing a plugin are as follows:&lt;br /&gt;
&lt;br /&gt;
# From the command line, ''cd'' into the directory created after unpacking the archive.&lt;br /&gt;
# Edit the provided Apache Ant build script to specify the name of your plugin.&lt;br /&gt;
# Add the .java source files for your plugin to the &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Add any .jar libraries that your plugin requires to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;ant&amp;lt;/tt&amp;gt; to build your plugin.&lt;br /&gt;
# Edit the geWorkbench configuration file to add a directive for your new plugin.&lt;br /&gt;
# Run geWorkbench with &amp;lt;tt&amp;gt;ant run&amp;lt;/tt&amp;gt; to test your plugin.&lt;br /&gt;
# Once satisfied with your plugin, use the provided utility to package your plugin in to a single file for distribution.&lt;br /&gt;
&lt;br /&gt;
The next section will illustrate the above steps with an example.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (geworkbench 1.7 or later) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
Create a .cwb.xml file for your plugin and place it under the same directory as the source file.  In this case, create ''test.cwb.xml'' and place it under ''GEWORKBENCHSDK_HOME/src/org/organization/test''.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;component-descriptor  xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:noNamespaceSchemaLocation=&amp;quot;ConfigurationFile Schema.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;component  name=&amp;quot;Test SDK Panel&amp;quot;  &lt;br /&gt;
      class=&amp;quot;org.organization.test.TestComponent&amp;quot; &lt;br /&gt;
      version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
      author=&amp;quot;C2B2&amp;quot;&lt;br /&gt;
      authorURL=&amp;quot;&amp;quot;&lt;br /&gt;
      toolURL=&amp;quot;&amp;quot;&lt;br /&gt;
      description=&amp;quot;test SDK&amp;quot;&lt;br /&gt;
      visualizer=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;license&amp;gt;&lt;br /&gt;
      &amp;lt;![CDATA[&lt;br /&gt;
        &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=Content-Type content=&amp;quot;text/html; charset=windows-1252&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
          &amp;lt;body&amp;gt;----&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
      ]]&amp;gt;&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;TestSDKPanel&amp;quot; name=&amp;quot;Test SDK&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/component-descriptor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugin and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. This gear file is a bundled  plugin that can deployed to a geWorkbench installation by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory, then unzipping it.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (Pre geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
The configuration file for the Development Kit is called &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; and it is in the &amp;lt;tt&amp;gt;conf&amp;lt;/tt&amp;gt; directory. &lt;br /&gt;
&lt;br /&gt;
Add the following to the bottom of &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; (before ''&amp;lt;/geaw-config&amp;gt;''):&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;testPanel&amp;quot; name=&amp;quot;Test Panel&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugn and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. A .gear file is the geWorkbench analogue of a .war file for a web application. Is a bundled  plugin that can deployed to a geWorkbench install by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. A configuration directive (such as the one above) would also need to be added to the configuration file to activate the plugin.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6124</id>
		<title>Software Development Kit</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6124"/>
				<updated>2010-04-25T23:49:15Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Configure Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
The Development Kit is a self-contained package that facilitates the process of developing plugins for geWorkbench. &lt;br /&gt;
&lt;br /&gt;
== Using the Development Kit ==&lt;br /&gt;
&lt;br /&gt;
The Development Kit is available as a .zip file (see [[Download]] page). Unzip this archive, then follow the instructions below to create a geWorkbench plugin.  Prerequisites to using the SDK are installing [http://ant.apache.org/manual/index.html ANT] and a [[Download#Software_Requirements|supported version]] of Java.&lt;br /&gt;
&lt;br /&gt;
The high-level steps for creating, testing and releasing a plugin are as follows:&lt;br /&gt;
&lt;br /&gt;
# From the command line, ''cd'' into the directory created after unpacking the archive.&lt;br /&gt;
# Edit the provided Apache Ant build script to specify the name of your plugin.&lt;br /&gt;
# Add the .java source files for your plugin to the &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Add any .jar libraries that your plugin requires to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;ant&amp;lt;/tt&amp;gt; to build your plugin.&lt;br /&gt;
# Edit the geWorkbench configuration file to add a directive for your new plugin.&lt;br /&gt;
# Run geWorkbench with &amp;lt;tt&amp;gt;ant run&amp;lt;/tt&amp;gt; to test your plugin.&lt;br /&gt;
# Once satisfied with your plugin, use the provided utility to package your plugin in to a single file for distribution.&lt;br /&gt;
&lt;br /&gt;
The next section will illustrate the above steps with an example.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
Create a .cwb.xml file for your plugin and place it under the same directory as the source file.  In this case, create ''test.cwb.xml'' and place it under ''GEWORKBENCHSDK_HOME/src/org/organization/test''.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;component-descriptor  xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:noNamespaceSchemaLocation=&amp;quot;ConfigurationFile Schema.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;component  name=&amp;quot;Test SDK Panel&amp;quot;  &lt;br /&gt;
      class=&amp;quot;org.organization.test.TestComponent&amp;quot; &lt;br /&gt;
      version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
      author=&amp;quot;C2B2&amp;quot;&lt;br /&gt;
      authorURL=&amp;quot;&amp;quot;&lt;br /&gt;
      toolURL=&amp;quot;&amp;quot;&lt;br /&gt;
      description=&amp;quot;test SDK&amp;quot;&lt;br /&gt;
      visualizer=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;license&amp;gt;&lt;br /&gt;
      &amp;lt;![CDATA[&lt;br /&gt;
        &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=Content-Type content=&amp;quot;text/html; charset=windows-1252&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
          &amp;lt;body&amp;gt;----&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
      ]]&amp;gt;&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;TestSDKPanel&amp;quot; name=&amp;quot;Test SDK&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/component-descriptor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugin and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. This gear file is a bundled  plugin that can deployed to a geWorkbench installation by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory, then unzipping it.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (Pre geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
The configuration file for the Development Kit is called &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; and it is in the &amp;lt;tt&amp;gt;conf&amp;lt;/tt&amp;gt; directory. &lt;br /&gt;
&lt;br /&gt;
Add the following to the bottom of &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; (before ''&amp;lt;/geaw-config&amp;gt;''):&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;testPanel&amp;quot; name=&amp;quot;Test Panel&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugn and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. A .gear file is the geWorkbench analogue of a .war file for a web application. Is a bundled  plugin that can deployed to a geWorkbench install by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. A configuration directive (such as the one above) would also need to be added to the configuration file to activate the plugin.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6123</id>
		<title>A Simple Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6123"/>
				<updated>2010-04-25T23:47:32Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
This introduction introduces the basic concepts for geWorkbench developers. It also walks through the creation of a simple component.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
geWorkbench is a component-based application framework. All functionality of the software is provided by components which can be added, removed and configured in a flexible way. All the visual plugins, analysis tools and even file filters are implemented as components.&lt;br /&gt;
&lt;br /&gt;
== Application Layout ==&lt;br /&gt;
&lt;br /&gt;
The application framework allows for a pluggable &amp;quot;skin&amp;quot; that controls how components are displayed to the user. The details of plugging in a new skin are out of the scope of this document. Here, the focus will be on the default skin.&lt;br /&gt;
&lt;br /&gt;
There are four main ''areas'' in geWorkbench:&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualAreas.png]]&lt;br /&gt;
&lt;br /&gt;
=== Project Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:ProjectArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the ''Project Panel''. This is where data files are loaded and the results of analyses are made available. It is the primary way the user interacts with the software. Selecting a data set in the Project Panel affects what is visible in the other areas of the application.&lt;br /&gt;
&lt;br /&gt;
=== Selection Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:SelectionArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the components that allow the searching and selection of data set elements. For example, microarray sets have phenotype and gene (probe) selector panels.&lt;br /&gt;
&lt;br /&gt;
=== Visual Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains visualization components for the data set currently selected. Large, self-contained components will also likely appear in this area.&lt;br /&gt;
&lt;br /&gt;
=== Command Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:CommandArea.png]]&lt;br /&gt;
&lt;br /&gt;
Analysis components and other miscellaneous components are found in the Command Area. Many of these anlyses result in the creation of ancillary data sets which appear in the Project Panel.&lt;br /&gt;
&lt;br /&gt;
== Component Model ==&lt;br /&gt;
&lt;br /&gt;
File filters, anlyses and visual plug-ins are all ''components'' in geWorkbench. This section will cover the basics of the component model by developing a simple example component.&lt;br /&gt;
&lt;br /&gt;
=== Example Component ===&lt;br /&gt;
&lt;br /&gt;
A simple visual component that operates on microarray sets will be developed. A ''microarray set'' is a set of related microarray experiments, each operating on the same chip type and with the same probes. The example component will simply display the number of microarrays in the microarray set as well as the number of markers (probes).&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
=== The Source ===&lt;br /&gt;
&lt;br /&gt;
Here is the source for the example component in its entirety. The code will be examined in detail in the following sections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&lt;br /&gt;
     private DSMicroarraySet microarraySet;&lt;br /&gt;
     private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
     public ExampleComponent() {&lt;br /&gt;
         infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
         add(infoLabel);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         // In this case, this object is also the GUI component.&lt;br /&gt;
         return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     @Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
         DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
         // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
         if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
             microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
             // We just received a new microarray set, &lt;br /&gt;
             // so populate the info label with some basic stats.&lt;br /&gt;
             String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
                     + microarraySet.getMarkers().size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
             infoLabel.setText(htmlText);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Class Declaration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class declaration is prefixed with a Java 1.5 annotation called &amp;lt;code&amp;gt;AcceptTypes&amp;lt;/code&amp;gt;. This annotation indicates what data sets on which this plugin will operate. It takes an array of &amp;lt;code&amp;gt;java.lang.Class&amp;lt;/code&amp;gt; parameters. Each class specified must be assignable to &amp;lt;code&amp;gt;DSDataSet&amp;lt;/code&amp;gt;, the root class of all data sets. Leaving the annotation out completely will result in the component to be present in the interface at all times.&lt;br /&gt;
&lt;br /&gt;
The declaration itself indicates that the components implements &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt;. This interface specifies that the component is visual. Non-visual components such as file filters and analyses do not implement this interface.&lt;br /&gt;
&lt;br /&gt;
=== Fields and Constructor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private DSMicroarraySet microarraySet;&lt;br /&gt;
private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
public ExampleComponent() {&lt;br /&gt;
    infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
    add(infoLabel);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A no-arg constructor is required, as the component will be instantiated by the application engine.&lt;br /&gt;
&lt;br /&gt;
=== VisualPlugin ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public Component getComponent() {&lt;br /&gt;
    // In this case, this object is also the GUI component.&lt;br /&gt;
    return this;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is the realization of the &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt; interface. The application engine calls this to acquire the &amp;lt;code&amp;gt;java.awt.Component&amp;lt;/code&amp;gt;. In this case, the component itself is a &amp;lt;code&amp;gt;JPanel&amp;lt;/code&amp;gt;, so it is simply returned. This method should always return the same object for the lifecycle of the instance.&lt;br /&gt;
&lt;br /&gt;
=== @Subscribe Methods ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; are called by geWorkbench when an object of the appropriate type is published. In this case, the method will be called by the engine when another component publishes an object of type &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt;. The second parameter to the method is the publishing compoent itself, although this should rarely be needed. A method annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; that does not take exactly two parameters will cause an error.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt; is published by the Project Panel. It is published upon the selection of a data set. Almost all components will subscribe to this kind of event.&lt;br /&gt;
&lt;br /&gt;
A project event is handled by introspecting the data set and then acting upon it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, events for data sets other than &amp;lt;code&amp;gt;DSMicroarraySet&amp;lt;/code&amp;gt; are ignored. A subscriber for project events should always check the type of received data sets regardless of what is specified in the &amp;lt;code&amp;gt;@AcceptTypes&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;
&lt;br /&gt;
=== The Details ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        // We just received a new microarray set, &lt;br /&gt;
        // so populate the info label with some basic stats.&lt;br /&gt;
        String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
            + microarraySet.getMarkers().size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
        infoLabel.setText(htmlText);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this code snippet, the number of arrays and markers are extracted and displayed in an HTML label. Note that this is rendered every time a microarray set is selected in the project panel.&lt;br /&gt;
&lt;br /&gt;
Again, the screenshot of the component at work:&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
== Component Resources ==&lt;br /&gt;
&lt;br /&gt;
Once one or more related components are written, they are combined in to ''component resources'' for deployment to geWorkbench. This is just a simple directory structure, similar to WAR files in web applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:ResourceStructure.png]]&lt;br /&gt;
&lt;br /&gt;
A directory is created in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; subdirectory. In this case, it is called &amp;lt;tt&amp;gt;example&amp;lt;/tt&amp;gt;. In this directory is a &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folder, which contains jar files that are needed by the component. Note that jar files that are required by the component but are already present in geWorkbench's main lib directory need not be included here, although it does no harm. Also in this directory is a &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory, which contains the compiled classes for the component as well as any property or resource files required for the component to function.&lt;br /&gt;
&lt;br /&gt;
The geWorkbench engine will instantiate a new classloader for each component. This classloader will resolve classes as follows:&lt;br /&gt;
&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# geWorkbench's classloader.&lt;br /&gt;
&lt;br /&gt;
Component resource files can also be packaged up in to ''GEAR'' files ('''ge'''Workbench '''Ar'''chive) for easy download and deployment. See the section on [[.GEAR files|GEAR files]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration of the application is controlled by XML files, including one configuration xml file and one xml file for each plugin component. The main xml file can be specified as a command-line argument to geWorkbench, or a default XML file will be chosen if none is specified. Each component's configuration file should be in the same directory of the java class and has the name matching the java class except for the extension .cwb.xml. The schema for the main configuration file and the components' configuration files are available. See &amp;lt;tt&amp;gt;geWorkbench/src/org/geworkbench/engine/config&amp;lt;/tt&amp;gt; for some example configuration files.&lt;br /&gt;
&lt;br /&gt;
A typical configuration directive for the above exmaple component is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;plugin id=&amp;quot;Example&amp;quot; name=&amp;quot;Example&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.geworkbench.components.example.ExampleComponent&amp;quot; &lt;br /&gt;
        source=&amp;quot;example&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; attribute is just a unique identifier for the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; attribute is the name that appears in the interface (if visual).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;class&amp;lt;/tt&amp;gt; attribute is the full class name of the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;source&amp;lt;/tt&amp;gt; attribute is the resource directory where the component can be found.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;amp;lt;gui-area&amp;amp;gt;&amp;lt;/tt&amp;gt; element is used to define how the component should be displayed. It is for visual components only. In this case, we put the component in to the main visual area of the application.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6122</id>
		<title>A Simple Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6122"/>
				<updated>2010-04-25T23:46:46Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
This introduction introduces the basic concepts for geWorkbench developers. It also walks through the creation of a simple component.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
geWorkbench is a component-based application framework. All functionality of the software is provided by components which can be added, removed and configured in a flexible way. All the visual plugins, analysis tools and even file filters are implemented as components.&lt;br /&gt;
&lt;br /&gt;
== Application Layout ==&lt;br /&gt;
&lt;br /&gt;
The application framework allows for a pluggable &amp;quot;skin&amp;quot; that controls how components are displayed to the user. The details of plugging in a new skin are out of the scope of this document. Here, the focus will be on the default skin.&lt;br /&gt;
&lt;br /&gt;
There are four main ''areas'' in geWorkbench:&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualAreas.png]]&lt;br /&gt;
&lt;br /&gt;
=== Project Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:ProjectArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the ''Project Panel''. This is where data files are loaded and the results of analyses are made available. It is the primary way the user interacts with the software. Selecting a data set in the Project Panel affects what is visible in the other areas of the application.&lt;br /&gt;
&lt;br /&gt;
=== Selection Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:SelectionArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the components that allow the searching and selection of data set elements. For example, microarray sets have phenotype and gene (probe) selector panels.&lt;br /&gt;
&lt;br /&gt;
=== Visual Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains visualization components for the data set currently selected. Large, self-contained components will also likely appear in this area.&lt;br /&gt;
&lt;br /&gt;
=== Command Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:CommandArea.png]]&lt;br /&gt;
&lt;br /&gt;
Analysis components and other miscellaneous components are found in the Command Area. Many of these anlyses result in the creation of ancillary data sets which appear in the Project Panel.&lt;br /&gt;
&lt;br /&gt;
== Component Model ==&lt;br /&gt;
&lt;br /&gt;
File filters, anlyses and visual plug-ins are all ''components'' in geWorkbench. This section will cover the basics of the component model by developing a simple example component.&lt;br /&gt;
&lt;br /&gt;
=== Example Component ===&lt;br /&gt;
&lt;br /&gt;
A simple visual component that operates on microarray sets will be developed. A ''microarray set'' is a set of related microarray experiments, each operating on the same chip type and with the same probes. The example component will simply display the number of microarrays in the microarray set as well as the number of markers (probes).&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
=== The Source ===&lt;br /&gt;
&lt;br /&gt;
Here is the source for the example component in its entirety. The code will be examined in detail in the following sections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&lt;br /&gt;
     private DSMicroarraySet microarraySet;&lt;br /&gt;
     private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
     public ExampleComponent() {&lt;br /&gt;
         infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
         add(infoLabel);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         // In this case, this object is also the GUI component.&lt;br /&gt;
         return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     @Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
         DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
         // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
         if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
             microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
             // We just received a new microarray set, &lt;br /&gt;
             // so populate the info label with some basic stats.&lt;br /&gt;
             String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
                     + microarraySet.getMarkers().size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
             infoLabel.setText(htmlText);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Class Declaration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class declaration is prefixed with a Java 1.5 annotation called &amp;lt;code&amp;gt;AcceptTypes&amp;lt;/code&amp;gt;. This annotation indicates what data sets on which this plugin will operate. It takes an array of &amp;lt;code&amp;gt;java.lang.Class&amp;lt;/code&amp;gt; parameters. Each class specified must be assignable to &amp;lt;code&amp;gt;DSDataSet&amp;lt;/code&amp;gt;, the root class of all data sets. Leaving the annotation out completely will result in the component to be present in the interface at all times.&lt;br /&gt;
&lt;br /&gt;
The declaration itself indicates that the components implements &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt;. This interface specifies that the component is visual. Non-visual components such as file filters and analyses do not implement this interface.&lt;br /&gt;
&lt;br /&gt;
=== Fields and Constructor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private DSMicroarraySet microarraySet;&lt;br /&gt;
private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
public ExampleComponent() {&lt;br /&gt;
    infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
    add(infoLabel);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A no-arg constructor is required, as the component will be instantiated by the application engine.&lt;br /&gt;
&lt;br /&gt;
=== VisualPlugin ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public Component getComponent() {&lt;br /&gt;
    // In this case, this object is also the GUI component.&lt;br /&gt;
    return this;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is the realization of the &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt; interface. The application engine calls this to acquire the &amp;lt;code&amp;gt;java.awt.Component&amp;lt;/code&amp;gt;. In this case, the component itself is a &amp;lt;code&amp;gt;JPanel&amp;lt;/code&amp;gt;, so it is simply returned. This method should always return the same object for the lifecycle of the instance.&lt;br /&gt;
&lt;br /&gt;
=== @Subscribe Methods ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; are called by geWorkbench when an object of the appropriate type is published. In this case, the method will be called by the engine when another component publishes an object of type &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt;. The second parameter to the method is the publishing compoent itself, although this should rarely be needed. A method annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; that does not take exactly two parameters will cause an error.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt; is published by the Project Panel. It is published upon the selection of a data set. Almost all components will subscribe to this kind of event.&lt;br /&gt;
&lt;br /&gt;
A project event is handled by introspecting the data set and then acting upon it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, events for data sets other than &amp;lt;code&amp;gt;DSMicroarraySet&amp;lt;/code&amp;gt; are ignored. A subscriber for project events should always check the type of received data sets regardless of what is specified in the &amp;lt;code&amp;gt;@AcceptTypes&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;
&lt;br /&gt;
=== The Details ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        // We just received a new microarray set, &lt;br /&gt;
        // so populate the info label with some basic stats.&lt;br /&gt;
        String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
            + microarraySet.getMarkers().size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
        infoLabel.setText(htmlText);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this code snippet, the number of arrays and markers are extracted and displayed in an HTML label. Note that this is rendered every time a microarray set is selected in the project panel.&lt;br /&gt;
&lt;br /&gt;
Again, the screenshot of the component at work:&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
== Component Resources ==&lt;br /&gt;
&lt;br /&gt;
Once one or more related components are written, they are combined in to ''component resources'' for deployment to geWorkbench. This is just a simple directory structure, similar to WAR files in web applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:ResourceStructure.png]]&lt;br /&gt;
&lt;br /&gt;
A directory is created in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; subdirectory. In this case, it is called &amp;lt;tt&amp;gt;example&amp;lt;/tt&amp;gt;. In this directory is a &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folder, which contains jar files that are needed by the component. Note that jar files that are required by the component but are already present in geWorkbench's main lib directory need not be included here, although it does no harm. Also in this directory is a &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory, which contains the compiled classes for the component as well as any property or resource files required for the component to function.&lt;br /&gt;
&lt;br /&gt;
The geWorkbench engine will instantiate a new classloader for each component. This classloader will resolve classes as follows:&lt;br /&gt;
&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# geWorkbench's classloader.&lt;br /&gt;
&lt;br /&gt;
Component resource files can also be packaged up in to ''GEAR'' files ('''ge'''Workbench '''Ar'''chive) for easy download and deployment. See the section on [[.GEAR files|GEAR files]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration of the application is controlled by XML files, including one configuration xml file and one xml file for each plugin component. The main xml file can be specified as a command-line argument to geWorkbench, or a default XML file will be chosen if none is specified. Each component's configuration file should be in the same directory of the java class and has the name matching the java class except for the extension .cwb.xml. The schema for the main configuration file and the components' configuration files are available. See &amp;lt;tt&amp;gt;geWorkbench/src/org/geworkbench/engine/config&amp;lt;/tt&amp;gt; for some example configuration files.&lt;br /&gt;
&lt;br /&gt;
A typical configuration directive for the above exmaple component is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;plugin id=&amp;quot;Example&amp;quot; name=&amp;quot;Example&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.geworkbench.components.example.ExampleComponent&amp;quot; &lt;br /&gt;
        source=&amp;quot;example&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Components are made available to the application via the &amp;lt;tt&amp;gt;&amp;amp;lt;plugin&amp;amp;gt;&amp;lt;/tt&amp;gt; element.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; attribute is just a unique identifier for the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; attribute is the name that appears in the interface (if visual).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;class&amp;lt;/tt&amp;gt; attribute is the full class name of the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;source&amp;lt;/tt&amp;gt; attribute is the resource directory where the component can be found.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;amp;lt;gui-area&amp;amp;gt;&amp;lt;/tt&amp;gt; element is used to define how the component should be displayed. It is for visual components only. In this case, we put the component in to the main visual area of the application.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6121</id>
		<title>A Simple Plugin</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=A_Simple_Plugin&amp;diff=6121"/>
				<updated>2010-04-25T23:42:53Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
This introduction introduces the basic concepts for geWorkbench developers. It also walks through the creation of a simple component.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
geWorkbench is a component-based application framework. All functionality of the software is provided by components which can be added, removed and configured in a flexible way. All the visual plugins, analysis tools and even file filters are implemented as components.&lt;br /&gt;
&lt;br /&gt;
== Application Layout ==&lt;br /&gt;
&lt;br /&gt;
The application framework allows for a pluggable &amp;quot;skin&amp;quot; that controls how components are displayed to the user. The details of plugging in a new skin are out of the scope of this document. Here, the focus will be on the default skin.&lt;br /&gt;
&lt;br /&gt;
There are four main ''areas'' in geWorkbench:&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualAreas.png]]&lt;br /&gt;
&lt;br /&gt;
=== Project Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:ProjectArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the ''Project Panel''. This is where data files are loaded and the results of analyses are made available. It is the primary way the user interacts with the software. Selecting a data set in the Project Panel affects what is visible in the other areas of the application.&lt;br /&gt;
&lt;br /&gt;
=== Selection Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:SelectionArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains the components that allow the searching and selection of data set elements. For example, microarray sets have phenotype and gene (probe) selector panels.&lt;br /&gt;
&lt;br /&gt;
=== Visual Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:VisualArea.png]]&lt;br /&gt;
&lt;br /&gt;
This area contains visualization components for the data set currently selected. Large, self-contained components will also likely appear in this area.&lt;br /&gt;
&lt;br /&gt;
=== Command Area ===&lt;br /&gt;
&lt;br /&gt;
[[Image:CommandArea.png]]&lt;br /&gt;
&lt;br /&gt;
Analysis components and other miscellaneous components are found in the Command Area. Many of these anlyses result in the creation of ancillary data sets which appear in the Project Panel.&lt;br /&gt;
&lt;br /&gt;
== Component Model ==&lt;br /&gt;
&lt;br /&gt;
File filters, anlyses and visual plug-ins are all ''components'' in geWorkbench. This section will cover the basics of the component model by developing a simple example component.&lt;br /&gt;
&lt;br /&gt;
=== Example Component ===&lt;br /&gt;
&lt;br /&gt;
A simple visual component that operates on microarray sets will be developed. A ''microarray set'' is a set of related microarray experiments, each operating on the same chip type and with the same probes. The example component will simply display the number of microarrays in the microarray set as well as the number of markers (probes).&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
=== The Source ===&lt;br /&gt;
&lt;br /&gt;
Here is the source for the example component in its entirety. The code will be examined in detail in the following sections.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&lt;br /&gt;
     private DSMicroarraySet microarraySet;&lt;br /&gt;
     private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
     public ExampleComponent() {&lt;br /&gt;
         infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
         add(infoLabel);&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         // In this case, this object is also the GUI component.&lt;br /&gt;
         return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     @Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
         DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
         // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
         if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
             microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
             // We just received a new microarray set, &lt;br /&gt;
             // so populate the info label with some basic stats.&lt;br /&gt;
             String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
                     + microarraySet.getMarkers().size() &lt;br /&gt;
                     + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
                     + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
             infoLabel.setText(htmlText);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Class Declaration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 @AcceptTypes({DSMicroarraySet.class})&lt;br /&gt;
 public class ExampleComponent extends JPanel implements VisualPlugin {&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The class declaration is prefixed with a Java 1.5 annotation called &amp;lt;code&amp;gt;AcceptTypes&amp;lt;/code&amp;gt;. This annotation indicates what data sets on which this plugin will operate. It takes an array of &amp;lt;code&amp;gt;java.lang.Class&amp;lt;/code&amp;gt; parameters. Each class specified must be assignable to &amp;lt;code&amp;gt;DSDataSet&amp;lt;/code&amp;gt;, the root class of all data sets. Leaving the annotation out completely will result in the component to be present in the interface at all times.&lt;br /&gt;
&lt;br /&gt;
The declaration itself indicates that the components implements &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt;. This interface specifies that the component is visual. Non-visual components such as file filters and analyses do not implement this interface.&lt;br /&gt;
&lt;br /&gt;
=== Fields and Constructor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
private DSMicroarraySet microarraySet;&lt;br /&gt;
private JLabel infoLabel;&lt;br /&gt;
&lt;br /&gt;
public ExampleComponent() {&lt;br /&gt;
    infoLabel = new JLabel(&amp;quot;&amp;quot;);&lt;br /&gt;
    add(infoLabel);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A no-arg constructor is required, as the component will be instantiated by the application engine.&lt;br /&gt;
&lt;br /&gt;
=== VisualPlugin ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public Component getComponent() {&lt;br /&gt;
    // In this case, this object is also the GUI component.&lt;br /&gt;
    return this;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This method is the realization of the &amp;lt;code&amp;gt;VisualPlugin&amp;lt;/code&amp;gt; interface. The application engine calls this to acquire the &amp;lt;code&amp;gt;java.awt.Component&amp;lt;/code&amp;gt;. In this case, the component itself is a &amp;lt;code&amp;gt;JPanel&amp;lt;/code&amp;gt;, so it is simply returned. This method should always return the same object for the lifecycle of the instance.&lt;br /&gt;
&lt;br /&gt;
=== @Subscribe Methods ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; are called by geWorkbench when an object of the appropriate type is published. In this case, the method will be called by the engine when another component publishes an object of type &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt;. The second parameter to the method is the publishing compoent itself, although this should rarely be needed. A method annotated with &amp;lt;code&amp;gt;@Subscribe&amp;lt;/code&amp;gt; that does not take exactly two parameters will cause an error.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;ProjectEvent&amp;lt;/code&amp;gt; is published by the Project Panel. It is published upon the selection of a data set. Almost all components will subscribe to this kind of event.&lt;br /&gt;
&lt;br /&gt;
A project event is handled by introspecting the data set and then acting upon it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above case, events for data sets other than &amp;lt;code&amp;gt;DSMicroarraySet&amp;lt;/code&amp;gt; are ignored. A subscriber for project events should always check the type of received data sets regardless of what is specified in the &amp;lt;code&amp;gt;@AcceptTypes&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;
&lt;br /&gt;
=== The Details ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Subscribe public void receive(ProjectEvent event, Object source) {&lt;br /&gt;
    DSDataSet dataSet = event.getDataSet();&lt;br /&gt;
    // We will act on this object if it is a DSMicroarraySet&lt;br /&gt;
    if (dataSet instanceof DSMicroarraySet) {&lt;br /&gt;
        microarraySet = (DSMicroarraySet) dataSet;&lt;br /&gt;
        // We just received a new microarray set, &lt;br /&gt;
        // so populate the info label with some basic stats.&lt;br /&gt;
        String htmlText = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;h3&amp;gt;&amp;quot; + microarraySet.getLabel() + &amp;quot;&amp;lt;/h3&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Arrays:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot; + microarraySet.size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Markers:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;br /&gt;
            + microarraySet.getMarkers().size() &lt;br /&gt;
            + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;&lt;br /&gt;
            + &amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
        infoLabel.setText(htmlText);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this code snippet, the number of arrays and markers are extracted and displayed in an HTML label. Note that this is rendered every time a microarray set is selected in the project panel.&lt;br /&gt;
&lt;br /&gt;
Again, the screenshot of the component at work:&lt;br /&gt;
&lt;br /&gt;
[[Image:ExampleComponent.gif]]&lt;br /&gt;
&lt;br /&gt;
== Component Resources ==&lt;br /&gt;
&lt;br /&gt;
Once one or more related components are written, they are combined in to ''component resources'' for deployment to geWorkbench. This is just a simple directory structure, similar to WAR files in web applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:ResourceStructure.png]]&lt;br /&gt;
&lt;br /&gt;
A directory is created in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; subdirectory. In this case, it is called &amp;lt;tt&amp;gt;example&amp;lt;/tt&amp;gt;. In this directory is a &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; folder, which contains jar files that are needed by the component. Note that jar files that are required by the component but are already present in geWorkbench's main lib directory need not be included here, although it does no harm. Also in this directory is a &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory, which contains the compiled classes for the component as well as any property or resource files required for the component to function.&lt;br /&gt;
&lt;br /&gt;
The geWorkbench engine will instantiate a new classloader for each component. This classloader will resolve classes as follows:&lt;br /&gt;
&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;classes&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Component's &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# geWorkbench's classloader.&lt;br /&gt;
&lt;br /&gt;
Component resource files can also be packaged up in to ''GEAR'' files ('''ge'''Workbench '''Ar'''chive) for easy download and deployment. See the section on [[.GEAR files|GEAR files]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration of the application is controlled by XML files, including one main xml file and one xml file for each plugin component. The main xml file can be specified as a command-line argument to geWorkbench, or a default XML file will be chosen if none is specified. A schema for this configuration file is available. See &amp;lt;tt&amp;gt;geWorkbench/src/org/geworkbench/engine/config&amp;lt;/tt&amp;gt; for some example configuration files.&lt;br /&gt;
&lt;br /&gt;
A typical configuration directive for the above exmaple component is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;plugin id=&amp;quot;Example&amp;quot; name=&amp;quot;Example&amp;quot; &lt;br /&gt;
        class=&amp;quot;org.geworkbench.components.example.ExampleComponent&amp;quot; &lt;br /&gt;
        source=&amp;quot;example&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/plugin&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Components are made available to the application via the &amp;lt;tt&amp;gt;&amp;amp;lt;plugin&amp;amp;gt;&amp;lt;/tt&amp;gt; element.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; attribute is just a unique identifier for the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; attribute is the name that appears in the interface (if visual).&lt;br /&gt;
* The &amp;lt;tt&amp;gt;class&amp;lt;/tt&amp;gt; attribute is the full class name of the component.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;source&amp;lt;/tt&amp;gt; attribute is the resource directory where the component can be found.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;amp;lt;gui-area&amp;amp;gt;&amp;lt;/tt&amp;gt; element is used to define how the component should be displayed. It is for visual components only. In this case, we put the component in to the main visual area of the application.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Collaborative_Development&amp;diff=6111</id>
		<title>Collaborative Development</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Collaborative_Development&amp;diff=6111"/>
				<updated>2010-03-23T16:16:50Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
We encourage developers of geWorkbench plugins to use our code repository. Our source code tree comprises 2 separate modules under ''geworkbench'', ''src'' for the core and ''components'' for the plugin code portions as outlined in the &amp;quot;[[Developers]]&amp;quot; section. &lt;br /&gt;
&lt;br /&gt;
Collaborative development typically takes place under the components module. The module contains a number of subdirectories, each corresponding to one geWorkbench component package, which can contain one of more related component plugins. Each subdirectory has the same basic structure:&lt;br /&gt;
* A '''src''' directory containing the plugin code.&lt;br /&gt;
* An optional '''lib''' directory containing jar files required by the plugin.&lt;br /&gt;
&lt;br /&gt;
The application ant build script (which is made available to collaborative developers) will also create a '''classes''' directory which will contain the executable code. To create a new plugin called &amp;quot;example&amp;quot; a new directory with the same name will be created under the components module and CVS accounts will be issued to the members of the component development team. All developers in that team will become members of a new Unix group which will own the subdirectory (the rest of the world will have read-only rights). &lt;br /&gt;
&lt;br /&gt;
A full development environment can be then obtained by checking out the the project &amp;quot;geWorkbench&amp;quot; and one project for each subdirectory under &amp;quot;components&amp;quot;. In this development space the plugin development team will be able to change the code of their plugin as they please, check it out of subversion.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=.GEAR_files&amp;diff=6110</id>
		<title>.GEAR files</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=.GEAR_files&amp;diff=6110"/>
				<updated>2010-03-23T16:11:14Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOEDITSECTION__&lt;br /&gt;
{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
.GEAR files are essentially zipped versions of geWorkBench component plugins. They make it easy to distribute reasonably sized upgrades to specific parts of the application. They are the geWorkbench analogue of .WAR files for web applications.&lt;br /&gt;
&lt;br /&gt;
== Creating a .GEAR file ==&lt;br /&gt;
&lt;br /&gt;
There is an ant task that will create a .GEAR file automatically. Run ant with “ant –Dcomponent=NAME” which will create a .gear file from the specified component directory. You can also run the Windows batch file “makeGear NAME” instead. Put the resulting .gear file in the components directory of a geWorkbench installation and it will be loaded by the application.&lt;br /&gt;
&lt;br /&gt;
== Viewing loaded versions of components ==&lt;br /&gt;
&lt;br /&gt;
The menu item &amp;quot;Tools-&amp;gt;Component Configuration&amp;quot; will list all the loaded versions of component plugins. The subdirectories and gear files under the component directory are loaded similarly.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6100</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6100"/>
				<updated>2010-03-22T16:17:42Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 parallel axes:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 2 groups of packages: ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc); and, ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]]).&lt;br /&gt;
&lt;br /&gt;
There are no restrictions on who can develop a new component for geWorkbench. You can work against the development version or a release version of the geWorkbench core. To contribute your component to geWorkbench code, you need write access to the subversion server. Please contact us for the procedure.&lt;br /&gt;
Contributions to the geWorkbench core packages are more controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6099</id>
		<title>Software Development Kit</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Software_Development_Kit&amp;diff=6099"/>
				<updated>2010-03-22T15:57:46Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: /* Configure Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
The Development Kit is a self-contained package that facilitates the process of developing plugins for geWorkbench. &lt;br /&gt;
&lt;br /&gt;
== Using the Development Kit ==&lt;br /&gt;
&lt;br /&gt;
The Development Kit is available as a .zip file (see [[Download]] page). Unzip this archive, then follow the instructions below to create a geWorkbench plugin.  Prerequisites to using the SDK are installing [http://ant.apache.org/manual/index.html ANT] and a [[Download#Software_Requirements|supported version]] of Java.&lt;br /&gt;
&lt;br /&gt;
The high-level steps for creating, testing and releasing a plugin are as follows:&lt;br /&gt;
&lt;br /&gt;
# From the command line, ''cd'' into the directory created after unpacking the archive.&lt;br /&gt;
# Edit the provided Apache Ant build script to specify the name of your plugin.&lt;br /&gt;
# Add the .java source files for your plugin to the &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Add any .jar libraries that your plugin requires to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;ant&amp;lt;/tt&amp;gt; to build your plugin.&lt;br /&gt;
# Edit the geWorkbench configuration file to add a directive for your new plugin.&lt;br /&gt;
# Run geWorkbench with &amp;lt;tt&amp;gt;ant run&amp;lt;/tt&amp;gt; to test your plugin.&lt;br /&gt;
# Once satisfied with your plugin, use the provided utility to package your plugin in to a single file for distribution.&lt;br /&gt;
&lt;br /&gt;
The next section will illustrate the above steps with an example.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
Create a .cwb.xml file for your plugin and place it under the same directory as the source file.  In this case, create ''test.cwb.xml'' and place it under ''GEWORKBENCHSDK_HOME/src/org/organization/test''.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;geaw-config xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:noNamespaceSchemaLocation=&amp;quot;ConfigurationFile Schema.xsd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;component  name=&amp;quot;Test SDK Panel&amp;quot;  &lt;br /&gt;
      class=&amp;quot;org.organization.test.TestComponent&amp;quot; &lt;br /&gt;
      version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
      author=&amp;quot;C2B2&amp;quot;&lt;br /&gt;
      authorURL=&amp;quot;&amp;quot;&lt;br /&gt;
      toolURL=&amp;quot;&amp;quot;&lt;br /&gt;
      description=&amp;quot;test SDK&amp;quot;&lt;br /&gt;
      visualizer=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;license&amp;gt;&lt;br /&gt;
      &amp;lt;![CDATA[&lt;br /&gt;
        &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=Content-Type content=&amp;quot;text/html; charset=windows-1252&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
          &amp;lt;body&amp;gt;----&amp;lt;/body&amp;gt;&lt;br /&gt;
        &amp;lt;/html&amp;gt;&lt;br /&gt;
      ]]&amp;gt;&amp;lt;/license&amp;gt;&lt;br /&gt;
    &amp;lt;/component&amp;gt;&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;TestSDKPanel&amp;quot; name=&amp;quot;Test SDK&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
  &amp;lt;/geaw-config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugin and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. This gear file is a bundled  plugin that can deployed to a geWorkbench installation by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory, then unzipping it.&lt;br /&gt;
&lt;br /&gt;
== An Example Plugin (Pre geworkbench 1.7) ==&lt;br /&gt;
&lt;br /&gt;
We will create an example plugin that is simply called &amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt;. This will be a very simple visualization plugin that just displays a blank blue region.&lt;br /&gt;
&lt;br /&gt;
=== Setting the Plugin Name ===&lt;br /&gt;
&lt;br /&gt;
In the provided &amp;lt;tt&amp;gt;build.xml&amp;lt;/tt&amp;gt;, change this line:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;noname&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;property name=&amp;quot;component&amp;quot; value=&amp;quot;test&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies the name of our component, which is used for all build products.&lt;br /&gt;
&lt;br /&gt;
=== Adding Source ===&lt;br /&gt;
&lt;br /&gt;
Next, create and add a single .java source file to the org.organization.test package. To do this, first, create the file &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; (in your favorite editor) and copy and paste the code below in this file.  Then, create the directories &amp;lt;tt&amp;gt;src/org/organization/test&amp;lt;/tt&amp;gt; in /src and place &amp;lt;tt&amp;gt;TestComponent.java&amp;lt;/tt&amp;gt; file in this directory.&lt;br /&gt;
&lt;br /&gt;
 package org.organization.test;&lt;br /&gt;
 &lt;br /&gt;
 import org.geworkbench.engine.config.VisualPlugin;&lt;br /&gt;
  &lt;br /&gt;
 import javax.swing.*;&lt;br /&gt;
 import java.awt.*;&lt;br /&gt;
  &lt;br /&gt;
 /**&lt;br /&gt;
  * A simple demonstration component.&lt;br /&gt;
  */&lt;br /&gt;
 public class TestComponent implements VisualPlugin {&lt;br /&gt;
  &lt;br /&gt;
     private JPanel panel;&lt;br /&gt;
  &lt;br /&gt;
     public TestComponent() {&lt;br /&gt;
         panel = new JPanel();&lt;br /&gt;
         panel.setBackground(Color.blue);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     public Component getComponent() {&lt;br /&gt;
         return panel;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If the component requires any .jar files, add them to the &amp;lt;tt&amp;gt;lib&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
=== Configure Plugin ===&lt;br /&gt;
&lt;br /&gt;
The configuration file for the Development Kit is called &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; and it is in the &amp;lt;tt&amp;gt;conf&amp;lt;/tt&amp;gt; directory. &lt;br /&gt;
&lt;br /&gt;
Add the following to the bottom of &amp;lt;tt&amp;gt;minimal.xml&amp;lt;/tt&amp;gt; (before ''&amp;lt;/geaw-config&amp;gt;''):&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;plugin id=&amp;quot;testPanel&amp;quot; name=&amp;quot;Test Panel&amp;quot; class=&amp;quot;org.organization.test.TestComponent&amp;quot; source=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gui-area name=&amp;quot;VisualArea&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/plugin&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running the Plugin in geWorkbench ===&lt;br /&gt;
&lt;br /&gt;
To run the plugn and see it appear in geWorkbench (a blue visual), do the following:&lt;br /&gt;
&lt;br /&gt;
 ant run&lt;br /&gt;
&lt;br /&gt;
When geWorkbench appears, right click on the ''Workspace'' and select ''New Project''.  You should see the blue visual plugin.&lt;br /&gt;
&lt;br /&gt;
=== Releasing the Plugin ===&lt;br /&gt;
&lt;br /&gt;
To create a plugin release, type:&lt;br /&gt;
&lt;br /&gt;
 ant gear&lt;br /&gt;
&lt;br /&gt;
This creates the file &amp;lt;tt&amp;gt;test.gear&amp;lt;/tt&amp;gt;. A .gear file is the geWorkbench analogue of a .war file for a web application. Is a bundled  plugin that can deployed to a geWorkbench install by placing the file in the &amp;lt;tt&amp;gt;components&amp;lt;/tt&amp;gt; directory. A configuration directive (such as the one above) would also need to be added to the configuration file to activate the plugin.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	<entry>
		<id>http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6098</id>
		<title>Developers</title>
		<link rel="alternate" type="text/html" href="http://wiki.c2b2.columbia.edu/workbench/index.php?title=Developers&amp;diff=6098"/>
				<updated>2010-03-22T15:53:36Z</updated>
		
		<summary type="html">&lt;p&gt;Zji: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DevelopersTopNav}}&lt;br /&gt;
&lt;br /&gt;
geWorkbench is an open source Java-based platform and contributions by members of the community are welcome and encouraged. The latest code under development can be found at NCI's subversion server, https://ncisvn.nci.nih.gov/svn/geworkbench/. Anonymous read access is supported for all the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Development in geWorkbench takes place along 2 parallel axes:&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench core'''&amp;lt;/u&amp;gt;: this portion of the code includes mainly 2 groups of packages: ''engine'', which implements services related to the geWorkbench component architecture framework (e.g., plugin instantiation and visual layout, message delivery, component registry management, etc); and, ''bison'' ('''B'''iomedical '''I'''nformatics '''S'''tructured '''ON'''tology) which contains the definition of the bioinformatics data types which form the basis of communication between the geWorkbench plugins.&lt;br /&gt;
* &amp;lt;u&amp;gt;'''geWorkbench plugins'''&amp;lt;/u&amp;gt;: this portion of the source tree contains the code for the various application plugin components (sample code for creating a simple plugin can be found [[A_Simple_Plugin |here]]).&lt;br /&gt;
&lt;br /&gt;
Contributing a new geWorkbench component is a straightforward process:  First you would request space in the project's CVS server (using the &amp;quot;Request to join&amp;quot; link from the gForge page).  This allows you to work against the development version of the geWorkbench core. There are no restrictions on who can develop and submit a new component. On the other hand contributions to the geWorkbench core packages are controlled in order to avoid changes that may adversely affect large numbers of plugins.&lt;/div&gt;</summary>
		<author><name>Zji</name></author>	</entry>

	</feed>