## page was renamed from Cytoscape_3.0/Developer/CreateProject
= Create OSGI-Spring Project with Maven =
== Introduction ==
This document is for developers who knows Java, but not familiar with new technologies such as Spring or OSGi.
== Your First Spring-OSGi Project ==
In this section, you will learn how to create simple Spring + OSGi project with Maven.
=== Setup ===
For this tutorial, you need to install the following software:
 * Java 5/6
 * Maven 2.0.9 or later
Installation of Maven is simple.  All you have to do is just download, unzip, and set path to the maven directory.
=== Procedure ===
 * Open the terminal.  Make sure maven is correctly installed on your system.
 {{{
kono$ mvn -version
Maven version: 2.0.9
Java version: 1.5.0_16
OS name: "mac os x" version: "10.4.11" arch: "i386" Family: "unix"
}}}
 * Create new project.
 {{{
mvn org.ops4j:maven-pax-plugin:create-project -DgroupId=org.cytoscape -DartifactId=osgi-sample
}}}
 cd to '''''osgi-sample''''' directory (this is your project name).
 * Add [[http://www.springsource.com/repository/app/|SpringSource Enterprise Bundle Repository]] to your project. 
 {{{
mvn pax:add-repository -DrepositoryId=com.springsource.repository.bundles.external -DrepositoryURL=http://repository.springsource.com/maven/bundles/external
}}}
 This means maven trying to find required bundles in the SpringSource's repository if they does not exist in the central maven repository. 
 * Import '''''infrastructure bundles'''''.  In our case, we need '''Spring Framework''' and '''Spring Dynamic Modules''' to run our bundles.  So we need to import those bundles. 
 {{{
mvn pax:import-bundle -DgroupId=org.springframework.osgi -DartifactId=spring-osgi-extender -Dversion=1.1.2 "-DimportTransitive" "-DwidenScope"
}}}
 * Now create your first bundle.  Last two options creates some templates for developing bundles running with Spring DM and simple tests.
 {{{
mvn pax:create-bundle -Dpackage=org.cytoscape.sample "-Dspring" "-Djunit=4.4"
}}}
 * Compile, test, and run your project.
{{{
mvn clean install pax:provision
}}}
 * Type '''''ps'''''.  Then you can see something like this:
 {{{
-> ps
START LEVEL 6
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle (1.4.1)
[   1] [Active     ] [    5] spring-osgi-extender (1.1.2)
[   2] [Active     ] [    5] spring-osgi-core (1.1.2)
[   3] [Active     ] [    5] SLF4J Jakarta Commons Logging Over SLF4J Binding (1.5.0)
[   4] [Installed  ] [    5] SLF4J API (1.5.0)
[   6] [Active     ] [    5] spring-osgi-io (1.1.2)
[   7] [Active     ] [    5] spring-aop (2.5.5)
[   8] [Active     ] [    5] spring-beans (2.5.5)
[   9] [Active     ] [    5] spring-context (2.5.5)
[  10] [Active     ] [    5] spring-core (2.5.5)
[  11] [Active     ] [    5] spring-test (2.5.5)
[  12] [Active     ] [    5] AOP Alliance API (1.0.0)
[  13] [Active     ] [    5] Backport Util Concurrent (3.1.0)
[  14] [Active     ] [    5] Apache Log4J (1.2.15)
[  15] [Active     ] [    5] Java Messaging System API (1.1.0)
[  16] [Active     ] [    5] Java Transaction API (1.1.0)
[  17] [Active     ] [    5] org.cytoscape.sample (1.0.0.SNAPSHOT)
[  18] [Active     ] [    1] osgi.compendium (4.1.0.build-200702212030)
[  19] [Active     ] [    1] OPS4J Pax Logging - API (1.3.0)
[  20] [Active     ] [    1] OPS4J Pax Logging - Service (1.3.0)
[  21] [Active     ] [    1] Apache Felix Shell Service (1.0.2)
[  22] [Active     ] [    1] Apache Felix Shell TUI (1.0.2)
-> 
}}}
 Bundles are running on Apache Felix.  You can dynamically start/stop these bundles.
 {{{
[  17] [Active     ] [    5] org.cytoscape.sample (1.0.0.SNAPSHOT)
}}}
 This is your bundle.  All other bundles are '''''infrastructure bundles''''' which provides functions like shell, AOP, Spring bean creation, etc.  To stop your bundle, type
 {{{
stop 17
}}}
 where 17 is your bundle ID.  Type '''''ps''''' again.
 {{{
START LEVEL 6
   ID   State         Level  Name
[   0] [Active     ] [    0] System Bundle (1.4.1)
[   1] [Active     ] [    5] spring-osgi-extender (1.1.2)
[   2] [Active     ] [    5] spring-osgi-core (1.1.2)
[   3] [Active     ] [    5] SLF4J Jakarta Commons Logging Over SLF4J Binding (1.5.0)
[   4] [Installed  ] [    5] SLF4J API (1.5.0)
[   6] [Active     ] [    5] spring-osgi-io (1.1.2)
[   7] [Active     ] [    5] spring-aop (2.5.5)
[   8] [Active     ] [    5] spring-beans (2.5.5)
[   9] [Active     ] [    5] spring-context (2.5.5)
[  10] [Active     ] [    5] spring-core (2.5.5)
[  11] [Active     ] [    5] spring-test (2.5.5)
[  12] [Active     ] [    5] AOP Alliance API (1.0.0)
[  13] [Active     ] [    5] Backport Util Concurrent (3.1.0)
[  14] [Active     ] [    5] Apache Log4J (1.2.15)
[  15] [Active     ] [    5] Java Messaging System API (1.1.0)
[  16] [Active     ] [    5] Java Transaction API (1.1.0)
[  17] [Resolved   ] [    5] org.cytoscape.sample (1.0.0.SNAPSHOT)
[  18] [Active     ] [    1] osgi.compendium (4.1.0.build-200702212030)
[  19] [Active     ] [    1] OPS4J Pax Logging - API (1.3.0)
[  20] [Active     ] [    1] OPS4J Pax Logging - Service (1.3.0)
[  21] [Active     ] [    1] Apache Felix Shell Service (1.0.2)
[  22] [Active     ] [    1] Apache Felix Shell TUI (1.0.2)
-> 
}}}
 You can see your bundle is no longer active.  Let's start it again
 {{{
start 17
}}}
 Now you can see lots of log messages.  If you read those messages carefully, you can see some interesting ones:
 {{{
[SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myExampleBean'
[SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'myExampleBean'
[SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'myExampleBean' to allow for resolving potential circular references
[SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'myExampleBean'
}}}
 This is the message from '''''Spring Dynamic Modules infrastructure bundles'''''.  It recognizes your bundle, and read settings, and automatically create ''bean'' named '''''myExampleBean'''''.
==== Inside Your Bundle ====
Let's look into the code.
{{{
kono$ cd org.cytoscape.sample
kono$ ls -l
total 16
-rw-r--r--   1 kono  kono   201 Mar 11 17:36 osgi.bnd
-rw-r--r--   1 kono  kono  2656 Mar 11 17:36 pom.xml
drwxr-xr-x   4 kono  kono   136 Mar 11 17:36 src
drwxr-xr-x   6 kono  kono   204 Mar 11 17:54 target
}}}
This is the basic directory structure of Spring-OSGi project created by maven.  In the following directory, you can see two XML files
{{attachment:directory.png}}
These two XML files defines your '''''beans''''' and '''''OSGi Services'''''.
 * '''~+bundle-context.xml+~''' 
{{{
  
  
}}}
This is the file to define your beans.  In this example, only one bean named '''''myExampleBean''''' is defined.  This entry creates an instance of '''''org.cytoscape.sample.internal.ExampleBeanImpl''''' and that's all Spring does in this example.
 * '''~+bundle-context-osgi.xml+~'''
{{{
}}}
By default, nothing defined in this file.  We can tell Spring DM which beans should be exported as OSGi services by writing settings in this file.
===== Summary So Far =====
 * There are several important setting files.
   * '''pom.xml''' - Setting file for Maven.  Defines name of module, dependency (required bundles we need to run the bundle), and remote repository locations.
   * '''bundle-context.xml''' - Defines Spring beans.  Spring reads this file and create instances of concrete classes automatically.
   * '''bundle-context-osgi.xml''' - Defines OSGi service.  You can import/export Spring beans as OSGi services.
(to be continued...)