Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "SMILA/Development Guidelines"

m
(Continuous integration)
 
(57 intermediate revisions by 14 users not shown)
Line 1: Line 1:
== Development requirements ==
+
This page covers a collection of development guidelines whose compliance should ensure that SMILA appears as a unified product rather than as a loose collection of parts worked on by a variety of individuals each with their own styles and ways of working. Furthermore it contains information on the used software components and requirements and provides descriptions (how-tos) of common tasks (e.g. setting up the development environment).
  
=== Checkstyle ===
+
== How-to manuals ==
 +
Find a list of How-To manuals at [[SMILA/HowTo|SMILA How-to manuals]].
  
Each Eclipse project (Bundles) should follow the Brox Coding Conventions.
+
== Development requirements ==
  
File containing checkstyle rules is avaliable in trunk at EILF.builder/checkstyle/brox_checks.xml
+
=== Java ===
  
'''Eclipse checkstyle plugin.'''
+
The officially Java version needed for this project is Java 1.7.
  
The eclipse-cs Checkstyle plugin integrates the source code analyzer Checkstyle into Eclipse IDE.
+
=== Eclipse ===
With the Checkstyle Eclipse plugin your code is constantly inspected for problems. Within the Eclipse workbench you are notified of problems via the Eclipse Problems View and source code annotations just as you would see with compiler errors or warnings.
+
The Checkstyle Eclipse plugin can be obtained from the update site: http://eclipse-cs.sourceforge.net/update/
+
Instructions about how to set up the Checkstyle plugin for your project can be obtained from http://eclipse-cs.sourceforge.net/basic_setup_project.html
+
To use plugin for all projects, select Window > Preferences menu in Eclipse, select Checkstyle preference page and. Click on the New button, select External Configuration File as Type and point to the location of the file brox_checks.xml
+
  
Checkstyle Configuration Profile should be named (while importing): "Brox Coding Conventions 1.06"
+
The official version is Eclipse 4.2, but you can also use Eclipse 3.7 or later.
  
The complete manual and other information about the plugin may be obtained from http://eclipse-cs.sourceforge.net/
+
== Development conventions ==
  
=== Eclipse code formatter profile. ===
+
=== Description of make.xml ===
 +
For a description of the build file <tt>make.xml</tt> refer to [[SMILA/Development_Guidelines/Introduction to make.xml|Introduction to make.xml]].
  
Eclipse code formatter file is available in trunk at EILF.builder/eclipse-formatter/Eclipse-formatter-Brox-3.2-3.3.xml
+
=== Continuous integration ===
 +
Each developer should check his code before committing it to the repository regarding:
 +
* Compilation errors
 +
* Checkstyle (see [[#Checkstyle|Checkstyle]])
 +
* Build process: Check if your bundles and your test bundles are fully integrated in the whole build process
 +
*:(see [[SMILA/Development_Guidelines/How to integrate new bundle into build process|How to integrate new bundle into build process]] and [[SMILA/Development_Guidelines/How to integrate test bundle into build process|How to integrate test bundle into build process]])
 +
* Tests: Run a local build with the <tt>build.xml</tt> to test all existing JUnit tests.
 +
*:(see [[SMILA/Development_Guidelines/Howto_build_a_SMILA-Distribution|How to build a SMILA distribution]] for the setup)
 +
*: Be aware that running tests in Eclipse doesn't mean that they also run successful with the pde-build.
  
To import Eclipse code formatter profile, download profile configuration file, select Window > Preferences in Eclipse and select Java > Code Style > Formatter preference page.
+
The failed JUnit tests are reported at the end of the build output.
Click on Import button and select formatter file.
+
  
=== Official JVM ===
+
Furthermore the full JUnit reports are generate under <tt>eclipse.build/reports/junit/</tt> and the
Official JVM for this project is Java5.
+
error messages from the JUnit reports are stored under <tt>eclipse.build/reports_errors_txt/</tt>.
  
=== OSGi ===
+
Everyone should monitor the trunk at the build server and if there is a "red" build everyone should look if he has committed the error.
the OSGi impl. of Equinox of eclipse 3.3 or later and the corresponding OSGi Spec(s)
+
  
=== Version number ===
+
If the error could not be solved within the next build, the developer should inform the developer team that there is a problem with the build and that he is working on the solution.
until further notice all own created bundles are V0.5
+
  
=== Project Setup ===
+
=== File header & copyright notice ===
The project folder setup is defined for this project at
+
For guidelines on file header and copyright notices see [[SMILA/Project Guidelines|Project Guidelines]].
[[SMILA/Development_Guidelines/Brox Java Project Setup|Brox Java Project Setup]]
+
  
=== Creation of Bundles ===
+
=== Eclipse code formatter profile ===
Description at [[SMILA/Development_Guidelines/Create a bundle (plug-in)|Create a bundle (plug-in)]]
+
  
How to integrate new bundle into build process see: [[SMILA/Development_Guidelines/How to integrate new bundle into build process|How to integrate new bundle into build process]]
+
The Eclipse code formatter file is available in trunk at <tt>SMILA.builder/eclipse-formatter/Eclipse-formatter-Brox-3.2-3.3.xml</tt>.
  
How to integrate test bundle into build process see: [[SMILA/Development_Guidelines/How to integrate test bundle into build process|How to integrate test bundle into build process]]
+
To import the Eclipse code formatter profile:
 +
# Select ''Window > Preferences'' in Eclipse and switch to the ''Java > Code Style > Formatter'' preferences page.
 +
# Click the ''Import'' button and select the downloaded formatter file.
  
=== Introduction to make.xml ===
+
{{Note|formatter vs. save actions|most source files have been edited with the save action turned on: "remove trailing white spaces on all lines". If you dont have this set then formatting the whole file will result in a lot white space of changes, which is cumbersome as is clutters diffs and poses problems to patches. So please turn this feature on.}}
see: [[SMILA/Development_Guidelines/Introduction to make.xml|Introduction to make.xml]]
+
  
=== Continuous Integration ===
+
=== Checkstyle ===
  
Everyone should be aware of the following workflow with bamboo.
+
Each Eclipse project (bundles) should follow the SMILA Coding Conventions.  
  
Bamboo should improve the source code quality but it should not be used as a (junit)-test-server.
+
We use different checkstyle rules for "normal" bundles and test bundles. So there are two files containing the Checkstyle configurations in the trunk that you have to import (see below).
Therefore each developer should check his code before committing it to subversion regarding:
+
*  Compilation Errors
+
* Checkstyle (see Brox Coding Conventions)
+
* Tests: Run a local build with the build.xml to test all existing junit-tests.
+
*:(see [[SMILA/Development_Guidelines|Development Guidelines]] for the setup)
+
*:Be aware that running tests in eclipse doesn't mean that they run with the pdebbuild.
+
* Build-Process: Check if your Bundles and your Test-Bundle is fully integrated in the whole Build-Process
+
*:(see [[SMILA/Development_Guidelines/How to integrate new bundle into build process|How to integrate new bundle into build process]] and [[SMILA/Development_Guidelines/How to integrate test bundle into build process|How to integrate test bundle into build process]])
+
  
We have added a feature to the build.xml: The failed junit-tests are reported at the end of the build output.
+
'''Eclipse checkstyle plugin'''
  
Furthermore the full junit-reports are generate under eclipse.build/reports/junit/ and the
+
The eclipse-cs Checkstyle plugin integrates the source code analyzer Checkstyle into Eclipse IDE. By using this plugin your code is constantly inspected for problems. Within the Eclipse workbench you are notified of problems via the Eclipse ''Problems'' View and source code annotations just as you would see with compiler errors or warnings. The Checkstyle Eclipse plugin can be obtained from the update site: [http://eclipse-cs.sourceforge.net/update/ http://eclipse-cs.sourceforge.net/update/]. Instructions about how to set up the Checkstyle plugin for your project can be obtained from [http://eclipse-cs.sourceforge.net/basic_setup_project.html here].  
error messages from the junit-reports are stored under eclipse.build/reports_errors_txt/.
+
  
Everyone should monitor the trunk at the build-server and if there is a "red"-build everyone should look if he has committed the error.
+
'''Setup checkstyle configuration'''
  
If the error could not be solved within the next build the developer should inform the developer-team that there is a problem with the build and that he is working on the solution.
+
# Click ''Window > Preferences'' in Eclipse.
 +
# Select the ''Checkstyle'' preference page and click the ''New'' button.
 +
# Select ''External Configuration File'' as ''Type'' and point to the location of the file
 +
#: ''(if using checkstyle 4.x)''  <tt>SMILA.Builder/checkstyle/smila_checkstyle.xml</tt>.
 +
#: ''(if using checkstyle 5.x - recommended)''  <tt>SMILA.Builder/checkstyle/smila_checkstyle-5.xml</tt>.
 +
# This Checkstyle configuration profile should be named (while importing): <strong>"SMILA Checkstyle"</strong> and it should be set as ''default''.
 +
# Select ''External Configuration File'' as ''Type'' and point to the location of the file
 +
#: ''(if using checkstyle 4.x)''  <tt>SMILA.Builder/checkstyle/smila-test_checkstyle.xml</tt>.
 +
#: ''(if using checkstyle 5.x - recommended)'' <tt>SMILA.Builder/checkstyle/smila-test_checkstyle-5.xml</tt>.
 +
# This Checkstyle configuration profile should be named (while importing): <strong>"SMILA Test Checkstyle"</strong>.
  
=== File Header & Copyright Notice ===
+
'''Warnings'''
see [[SMILA/Project Guidelines|Project Guidelines]]
+
  
=== Launch configurations for OSGi wih SCA ===
+
Most checkstyle warnings will be self-explaining. But there are two metrics considering method complexity that should be pointed to here explicitly, in case you got appropriate warnings:  
[[dstucky]]: I had some trouble selecting the right Bundles that were required to execute my sample application (org.eclipse.eilf.framework.test). Don't use the "Add required Bundles" button in the launch configuration dialog. It adds additional bundles that are not needed and starts all bundles with the same start level. I selected the required bundles manually (through try and error) and assigned the following start levels:
+
:* [http://checkstyle.sourceforge.net/config_metrics.html  CyclomaticComplexity]
# all org.eclipse bundles (except for the eilf bundles)
+
:* [http://checkstyle.sourceforge.net/config_metrics.html  NPathComplexity ]
# all org.apache.tuscany bundles
+
# all other third party bundles
+
# (default) all org.eclipse.eilf bundles
+
# the bundle with the test application (org.eclipse.eilf.framework.test)
+
  
I don't know if all these start levels are required, at least I got it working with these settings. Setting all to default does NOT work !!!
+
=== Reduce javadoc overhead ===
  
=== How to run/manage connectivity framework ===
+
Instead of writing member variable comments as
From this moment there is an ability to start EILF/SMILA as separate application:
+
<source lang="java">
# Update from SVN and refresh
+
/**
# execute build and unzip eclipse.build/Application/ EILF-win32.win32.x86.zip to any folder
+
* switch to true to add newlines for better readability, but poorer performance.  
# Create folder "c:\data" and place some txt/htm files (for filesystem crawler)
+
*/
# launch application by eclipse.exe -console or launch.cmd
+
private final boolean _printPretty;
# Run jconsole, and connect to local
+
</source>
# Open EILF/org.eclipse.econnectivity... branch in the jconsole
+
# Open MBeans/Operations tab
+
# Start FileSystem crawler by "startCrawl()" operation with passing "file" parameter
+
# Start Web crawler by "startCrawl()" operation with passing "web" parameter.
+
# Look at the Eclipse console log and enjoy ;)
+
  
=== XML Schemas, Namespace Convention and Versioning ===
+
it's more readable and clearer to write such javadoc comments as one line:
This subject is still very open to discussion right now, but i suggest to do the following:
+
<source lang="java">
# when defining a schema a name space must be defined also
+
/** switch to true to add newlines for better readability, but poorer performance. */
## the URL of the namespace shall be like so: <nowiki>http://org.eclipse.eilf/<rest of bundle as path>/<version>##- <rest of bundle as path></nowiki> means that the '.' are converted to '/'. In case the bundle defines more than one schema then use the either packages or other properly identifying names (plz discuss this) to further qualify the name space.
+
private final boolean _printPretty;
* <version>
+
</source>
*:As we continue to develop the application, schemas will change over time. there are basically two options here: either encode the version in the *:name space or have an extra well defined attribute that needs to be added to the XML messages to tell which schema version it conforms to. Doing *:this with an attribute seem to be much more error prone (likely to be forgotten) and less xml-natural. (subject needs further discussion).
+
*:Further it is not clear how and when we will version a particular schema as those under development might be still very volatile. So the current *:idea is to version a schema on a milestone and releases.
+
*:Another idea is to integrate versioning in the daily build process where the version number may be constructed from
+
**date / time stamp
+
**build number
+
**revision number
+
  
Example: <nowiki>http://org.eclipse.eilf/processing/bpel/xml/Record/0.7</nowiki>
+
=== Creation of bundles ===
 +
For information on creating and integrating bundles refer to the following pages:
  
=== Launch Files Naming Convention (.launch) ===
+
* [[SMILA/Development_Guidelines/Create a bundle (plug-in)|Create a bundle (plug-in)]]
 +
* [[SMILA/Development_Guidelines/How to integrate new bundle into build process|How to integrate a new bundle into the build process]]
 +
* [[SMILA/Development_Guidelines/How to integrate test bundle into build process|How to integrate a test bundle into the build process]]
 +
* [[SMILA/Development_Guidelines/3rd party bundle|How to add 3rd party bundle]]
  
It is a good thing to share your launches and many do so already which helps greatly to run tests quickly from within Eclipse. However, in order that at least I don't get confused, we need to define a naming scheme for the .launches!
+
=== Naming conventions for launch files (.launch) ===
  
''' Preliminary Convention: ''' <bundle name>[_config name].launch
+
It is a good thing to share your launches and many do so already which helps greatly to run tests quickly from within Eclipse. However, in order that at least I don't get confused, we need to define a naming scheme for the <tt>.launch</tt> files!
  
The  [config name] part is optional and needed when several .launches exist for the same bundle with diff. settings.
+
''' Preliminary convention: ''' <tt><bundle name>[_config name].launch</tt>
  
=== Generated Source Code goes into code/gen source folder (like Jaxb) ===
+
The <tt>[config name]</tt> part is optional and needed when several <tt>.launch</tt> files exist for the same bundle but with different settings.
  
All generated source code (eg. JAXB) goes into the distinct source code folder code/gen.
+
=== Generated source code goes into code/gen source folder (like Jaxb) ===
 +
 
 +
All generated source code (eg. JAXB) goes into the distinct source code folder code/gen.
 
Where possible all generated classes should also have their own package.
 
Where possible all generated classes should also have their own package.
 
Reasons:
 
Reasons:
* separate generated source code from handwritten
+
* Separate generated source code from handwritten code
* easier filtering for checkstyle
+
* Easier filtering for Checkstyle
(see previous Description in [[SMILA/Documentation/How_to_implement_a_Crawler|How to implement a Crawler]])
+
(see [[SMILA/Development_Guidelines/Setup for JAXB code generation|Setup for JAXB code generation]] for details specific to creating crawler configurations.)
 +
 
 +
=== Logging guidelines ===
 +
 
 +
In SMILA apache commons logging is used with log4j. The log4j.properties are located in SMILA.application. Here are some guidelines how and when logging should be used:
 +
* use local Log instances in each class where you want to log:
 +
<source lang="Java">
 +
private final Log _log = LogFactory.getLog(MyClass.class);
 +
</source>
 +
* always check log level before logging 'debug' and 'info', e.g.
 +
<source lang="Java">
 +
if (_log.isDebugEnabled()) {
 +
    _log.debug("Your debug message", e);
 +
}
 +
</source>
 +
For 'warn' and 'error' messages the log level check can be omitted.
 +
 
 +
* do '''not''' log exceptions before throwing new exceptions, e.g.
 +
<source lang="Java">
 +
...
 +
if( paramXY == null ) {
 +
    if (_log.isErrorEnabled()) {
 +
        _log.error("paramXY is not set");
 +
    }
 +
    throw new NullPointerException("paramXY is not set");
 +
}
 +
</source>
 +
 
 +
'''When to use what log level and what information to provide?'''
 +
 
 +
{| class="wikitable"
 +
|-
 +
! FATAL
 +
| designates very severe error events that will presumably lead the application to abort.
 +
|-
 +
! ERROR
 +
| designates error events that might still allow the application to continue running.
 +
|-
 +
! WARN
 +
| designates potentially harmful situations.
 +
|-
 +
! INFO
 +
| for the "high level" information. For example - interesting runtime events (startup/shutdown).
 +
|-
 +
! DEBUG
 +
| only for the software developer interesting messages (detailed information on the flow through the system).
 +
|-
 +
|}
 +
 
 +
A good resource on how to use the levels in regard to the ''Enterprise'' context offers [http://commons.apache.org/logging/guide.html#JCL%20Best%20Practices JCL Best Practices].
  
 +
== Used technologies ==
  
 
=== OSGi related information ===
 
=== OSGi related information ===
  
* [[SMILA/Development Guidelines/Declarative Services|Declarative Services]]
+
* [[SMILA/Development Guidelines/Declarative Services|Declarative services]]
  
 
[[Category:SMILA]]
 
[[Category:SMILA]]

Latest revision as of 05:18, 19 December 2014

This page covers a collection of development guidelines whose compliance should ensure that SMILA appears as a unified product rather than as a loose collection of parts worked on by a variety of individuals each with their own styles and ways of working. Furthermore it contains information on the used software components and requirements and provides descriptions (how-tos) of common tasks (e.g. setting up the development environment).

How-to manuals

Find a list of How-To manuals at SMILA How-to manuals.

Development requirements

Java

The officially Java version needed for this project is Java 1.7.

Eclipse

The official version is Eclipse 4.2, but you can also use Eclipse 3.7 or later.

Development conventions

Description of make.xml

For a description of the build file make.xml refer to Introduction to make.xml.

Continuous integration

Each developer should check his code before committing it to the repository regarding:

The failed JUnit tests are reported at the end of the build output.

Furthermore the full JUnit reports are generate under eclipse.build/reports/junit/ and the error messages from the JUnit reports are stored under eclipse.build/reports_errors_txt/.

Everyone should monitor the trunk at the build server and if there is a "red" build everyone should look if he has committed the error.

If the error could not be solved within the next build, the developer should inform the developer team that there is a problem with the build and that he is working on the solution.

File header & copyright notice

For guidelines on file header and copyright notices see Project Guidelines.

Eclipse code formatter profile

The Eclipse code formatter file is available in trunk at SMILA.builder/eclipse-formatter/Eclipse-formatter-Brox-3.2-3.3.xml.

To import the Eclipse code formatter profile:

  1. Select Window > Preferences in Eclipse and switch to the Java > Code Style > Formatter preferences page.
  2. Click the Import button and select the downloaded formatter file.
Note.png
formatter vs. save actions
most source files have been edited with the save action turned on: "remove trailing white spaces on all lines". If you dont have this set then formatting the whole file will result in a lot white space of changes, which is cumbersome as is clutters diffs and poses problems to patches. So please turn this feature on.


Checkstyle

Each Eclipse project (bundles) should follow the SMILA Coding Conventions.

We use different checkstyle rules for "normal" bundles and test bundles. So there are two files containing the Checkstyle configurations in the trunk that you have to import (see below).

Eclipse checkstyle plugin

The eclipse-cs Checkstyle plugin integrates the source code analyzer Checkstyle into Eclipse IDE. By using this plugin your code is constantly inspected for problems. Within the Eclipse workbench you are notified of problems via the Eclipse Problems View and source code annotations just as you would see with compiler errors or warnings. The Checkstyle Eclipse plugin can be obtained from the update site: http://eclipse-cs.sourceforge.net/update/. Instructions about how to set up the Checkstyle plugin for your project can be obtained from here.

Setup checkstyle configuration

  1. Click Window > Preferences in Eclipse.
  2. Select the Checkstyle preference page and click the New button.
  3. Select External Configuration File as Type and point to the location of the file
    (if using checkstyle 4.x) SMILA.Builder/checkstyle/smila_checkstyle.xml.
    (if using checkstyle 5.x - recommended) SMILA.Builder/checkstyle/smila_checkstyle-5.xml.
  4. This Checkstyle configuration profile should be named (while importing): "SMILA Checkstyle" and it should be set as default.
  5. Select External Configuration File as Type and point to the location of the file
    (if using checkstyle 4.x) SMILA.Builder/checkstyle/smila-test_checkstyle.xml.
    (if using checkstyle 5.x - recommended) SMILA.Builder/checkstyle/smila-test_checkstyle-5.xml.
  6. This Checkstyle configuration profile should be named (while importing): "SMILA Test Checkstyle".

Warnings

Most checkstyle warnings will be self-explaining. But there are two metrics considering method complexity that should be pointed to here explicitly, in case you got appropriate warnings:

Reduce javadoc overhead

Instead of writing member variable comments as

 /** 
 * switch to true to add newlines for better readability, but poorer performance. 
 */
 private final boolean _printPretty;

it's more readable and clearer to write such javadoc comments as one line:

 /** switch to true to add newlines for better readability, but poorer performance. */
 private final boolean _printPretty;

Creation of bundles

For information on creating and integrating bundles refer to the following pages:

Naming conventions for launch files (.launch)

It is a good thing to share your launches and many do so already which helps greatly to run tests quickly from within Eclipse. However, in order that at least I don't get confused, we need to define a naming scheme for the .launch files!

Preliminary convention: <bundle name>[_config name].launch

The [config name] part is optional and needed when several .launch files exist for the same bundle but with different settings.

Generated source code goes into code/gen source folder (like Jaxb)

All generated source code (eg. JAXB) goes into the distinct source code folder code/gen. Where possible all generated classes should also have their own package. Reasons:

  • Separate generated source code from handwritten code
  • Easier filtering for Checkstyle

(see Setup for JAXB code generation for details specific to creating crawler configurations.)

Logging guidelines

In SMILA apache commons logging is used with log4j. The log4j.properties are located in SMILA.application. Here are some guidelines how and when logging should be used:

  • use local Log instances in each class where you want to log:
private final Log _log = LogFactory.getLog(MyClass.class);
  • always check log level before logging 'debug' and 'info', e.g.
if (_log.isDebugEnabled()) {
    _log.debug("Your debug message", e);
}

For 'warn' and 'error' messages the log level check can be omitted.

  • do not log exceptions before throwing new exceptions, e.g.
...
if( paramXY == null ) {
    if (_log.isErrorEnabled()) {
        _log.error("paramXY is not set");
    }
    throw new NullPointerException("paramXY is not set");
}

When to use what log level and what information to provide?

FATAL designates very severe error events that will presumably lead the application to abort.
ERROR designates error events that might still allow the application to continue running.
WARN designates potentially harmful situations.
INFO for the "high level" information. For example - interesting runtime events (startup/shutdown).
DEBUG only for the software developer interesting messages (detailed information on the flow through the system).

A good resource on how to use the levels in regard to the Enterprise context offers JCL Best Practices.

Used technologies

OSGi related information

Back to the top