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 "OSEE/Developers Guide"

(What is an HRID and how is it used?)
(Setting Up Clients and Servers to work together)
(126 intermediate revisions by 8 users not shown)
Line 1: Line 1:
== Architecture ==
+
== Architecture ==
=== Client Architecture ===
+
  
The central feature of OSEE is an extensible framework called the OSEE Application Framework. Default applications distributed with the OSEE framework are OSEE Define (for requirements management) and OSEE ATS (the Action Tracking System, for configuration management).
+
=== Client Architecture ===
+
[[Image:OSEEArchitecture.gif|OSEE Architecture]]The Application Framework provides all the necessary services to allow the applications to persist and share data in a common, version controlled object database. Just as Eclipse provides the ability to add a plugin to the existing Eclipse environment, so OSEE allows other applications to add plugins and share the common data store.
+
+
And just like Eclipse RCP allows an application to be built and deployed using the Eclipse framework but not include all the standard applications like JDT, OSEE allows an application to be built and deployed using the OSEE Application Framework without including such applications as OSEE Define and OSEE ATS.
+
  
=== Client/Server Architecture ===
+
The central feature of OSEE is an extensible framework called the OSEE Application Framework. Default applications distributed with the OSEE framework are OSEE Define (for requirements management) and OSEE ATS (the Action Tracking System, for configuration management).
 +
 
 +
[[Image:OSEEArchitecture.gif|OSEE Architecture]]The Application Framework provides all the necessary services to allow the applications to persist and share data in a common, version controlled object database. Just as Eclipse provides the ability to add a plugin to the existing Eclipse environment, so OSEE allows other applications to add plugins and share the common data store.
 +
 
 +
And just like Eclipse RCP allows an application to be built and deployed using the Eclipse framework but not include all the standard applications like JDT, OSEE allows an application to be built and deployed using the OSEE Application Framework without including such applications as OSEE Define and OSEE ATS.
 +
 
 +
=== Client/Server Architecture ===
  
 
In order to attain a greater degree of scalability, the Open System Engineering Environment (OSEE) has been slowly migrating into a distributed architecture where clients interact with an application server, which is in charge of managing access to an OSEE data store.  
 
In order to attain a greater degree of scalability, the Open System Engineering Environment (OSEE) has been slowly migrating into a distributed architecture where clients interact with an application server, which is in charge of managing access to an OSEE data store.  
  
Additionally, in an effort to provide load balancing, failure recovery, and code compatibility, clients consult an arbitration server before connecting to an application server. The arbitration server's responsibility is to keep track of all the application servers interacting with a common data store and direct clients to a healthy application server compatible with the client's OSEE code version. In this arrangement, arbitration servers act as the initial access points into the OSEE server cloud where a collection of application servers manage client requests to access and operate on a common OSEE data store. Figure 1 shows an example of the OSEE Client/Server network.
+
Additionally, in an effort to provide load balancing, failure recovery, and code compatibility, clients consult an arbitration server before connecting to an application server. The arbitration server's responsibility is to keep track of all the application servers interacting with a common data store and direct clients to a healthy application server compatible with the client's OSEE code version. In this arrangement, arbitration servers act as the initial access points into the OSEE server cloud where a collection of application servers manage client requests to access and operate on a common OSEE data store. Figure 1 shows an example of the OSEE Client/Server network.  
  
[[Image:Client_server_view.png|Figure 1]]
+
[[Image:Client server view.png|Figure 1]]  
  
 +
<br> In Figure 1, three application servers interact with a single OSEE data store. The data store is comprised of a relational database and a remote file system used to store binary data. It is not necessary for the database and the binary data to exist on the same machine; the only requirement is that the application servers have access to both resources. Upon start-up, each application server registers himself on the data store's server lookup table by entering its host address, port, supported code versions, and its unique id. When the arbitration server receives a request to find an application server to support a client connection, the arbitration server reads the data store's server lookup table and selects the best match for the client. The client requests this information from the arbitration server upon start-up or whenever it can't communicate with an application server. It is important to note that the arbitration server does not have to be a different server than an application server. All application servers are able to act as an arbitration server. An application server is referred to as an arbitration server when clients interact with it in this context. Figure 2 depicts the sequence of events involved in the arbitration process.
  
In Figure 1, three application servers interact with a single OSEE data store. The data store is comprised
+
[[Image:Arbitration sequence.png|Figure 2]]
of a relational database and a remote file system used to store binary data.  It is not necessary for the database and the binary data to exist on the same machine; the only requirement is that the application servers have access to both resources.  Upon start-up, each application server registers himself on the data store's server lookup table by entering its host address, port, supported code versions, and its unique id.  When the arbitration server receives a request to find an application server to support a client connection, the arbitration server reads the data store's server lookup table and selects the best match for the client.  The client requests this information from the arbitration server upon start-up or whenever it can't communicate with an application server.  It is important to note that the arbitration server does not have to be a different server than an application server. All application servers are able to act as an arbitration server.  An application server is referred to as an arbitration server when clients interact with it in this context.  Figure 2 depicts the sequence of events involved in the arbitration process.
+
  
[[Image:Arbitration_sequence.png|Figure 2]]
+
Once a client receives an application server's address and port information, the client must authenticate with the application server before it can gain access to the OSEE data store. During the authentication process, a client submits to the application server the current user's credential information and the authentication protocol id to use during the process. The application server verifies the user via the selected protocol and grants access to the data store by creating a session for the user. From this point forward, the application server will be responsible for managing access to the data store by identifying the user via the session id. Whenever a client wants to interact with the application server, it will need to submit its session id in order to gain access to the OSEE data store. Figure 3 shows the sequence of events involved in the authentication process.
  
Once a client receives an application server's address and port information, the client must authenticate with the
+
[[Image:Authentication sequence.png|Figure 3]]
application server before it can gain access to the OSEE data store. During the authentication process, a client
+
submits to the application server the current user's credential information and the authentication protocol id to use during the process. The application server verifies the user via the selected protocol and grants access to the data store by creating a session for the user. From this point forward, the application server will be responsible for managing access to the data store by identifying the user via the session id. Whenever a client wants to interact
+
with the application server, it will need to submit its session id in order to gain access to the OSEE data store.  Figure 3 shows the sequence of events involved in the authentication process.
+
  
[[Image:Authentication_sequence.png|Figure 3]]
+
=== Data Model  ===
  
=== Data Model ===
+
The OSEE framework is built around a user configurable and extensible data model consisting of attributes, artifacts, and relations. An '''attribute''' is a key-value pair representing a single data element such as a description, a date, a number, or a file. These basic data elements are grouped into artifacts. '''Artifacts''' can be configured to have any number of attributes. By default, an artifact will always have an attribute of type <tt>name</tt>. In addition, artifacts can be related to one another via '''relations'''. By default, an artifact will always have a default hierarchy relation type. This allows artifacts to be connected together in a tree. In the example below, two instances of the basic artifact type are shown. Artifact 1 has an attribute of type <tt>name</tt> set to string data <tt>"X"</tt>. Artifact 2 has an attribute of type <tt>name</tt> set to string data <tt>"Y"</tt>. These two artifact instances are related via the default hierarchy relation type. Artifact 1 is Artifact 2's parent artifact.
  
The OSEE framework is built around a user configurable and extensible data model consisting of attributes, artifacts, and relations.  An '''attribute''' is a key-value pair representing a single data element such as a description, a date, a number, or a file.  These basic data elements are grouped into artifacts. '''Artifacts''' can be configured to have any number of attributes. By default, an artifact will always have an attribute of type <tt>name</tt>. In addition, artifacts can be related to one another via '''relations'''. By default, an artifact will always have a default hierarchy relation type. This allows artifacts to be connected together in a tree. In the example below, two instances of the basic artifact type are shown. Artifact 1 has an attribute of type <tt>name</tt> set to string data <tt>"X"</tt>. Artifact 2 has an attribute of type <tt>name</tt> set to string data <tt>"Y"</tt>. These two artifact instances are related via the default hierarchy relation type. Artifact 1 is Artifact 2's parent artifact.   
+
[[Image:Basic artifact.png]]  
+
[[Image:Basic_artifact.png]]
+
  
 
Now that we have a basic understanding of the model, lets take a closer look at attributes and how they are defined.  
 
Now that we have a basic understanding of the model, lets take a closer look at attributes and how they are defined.  
Line 41: Line 37:
 
By default, data contained in the attribute can be represented through OSEE's basic data types:  
 
By default, data contained in the attribute can be represented through OSEE's basic data types:  
  
*String Attribute
+
*String Attribute  
*Boolean Attribute
+
*Boolean Attribute  
*Integer Attribute
+
*Integer Attribute  
*Floating Point Attribute
+
*Floating Point Attribute  
*Date Attribute
+
*Date Attribute  
 
*Enumerated Attribute
 
*Enumerated Attribute
  
[[Image:AttributeType.png]]
+
[[Image:AttributeType.png]]  
  
 
OSEE provides three attribute data providers: the default attribute data provider, URI attribute data provider, and the Clob attribute data provider.  
 
OSEE provides three attribute data providers: the default attribute data provider, URI attribute data provider, and the Clob attribute data provider.  
Line 56: Line 52:
 
*The '''Clob attribute data provider''' is a hybrid provider using both the OSEE relational database and the application server to retrieve and store data. When the data contained by the attribute has less than 4000 characters, the provider uses the relational database. If the data exceeds the 4000 character limit, then the application server is used.
 
*The '''Clob attribute data provider''' is a hybrid provider using both the OSEE relational database and the application server to retrieve and store data. When the data contained by the attribute has less than 4000 characters, the provider uses the relational database. If the data exceeds the 4000 character limit, then the application server is used.
  
== Configuration Properties ==
+
== Configuration Properties ==
  
OSEE can be configured by setting certain Java system properties when launching Eclipse and by setting various attribute values on the Global Preferences artifact in the datastore. Java system properties are key/value pairs and can be passed as launch arguments in the form of <tt>-D&lt;key&gt;=&lt;value&gt;</tt> (''i.e. <tt>-Dosee.authentication.protocol=trustAll</tt>''). These <tt>-D</tt> options can be specified directly in the command to launch Eclipse or in the corresponding .ini file for the eclipse executable used.
+
OSEE can be configured by setting certain Java system properties when launching Eclipse and by setting various attribute values on the Global Preferences artifact in the datastore. Java system properties are key/value pairs and can be passed as launch arguments in the form of <tt>-D&lt;key&gt;=&lt;value&gt;</tt> (''i.e. <tt>-Dosee.authentication.protocol=trustAll</tt>''). These <tt>-D</tt> options can be specified directly in the command to launch Eclipse or in the corresponding .ini file for the eclipse executable used.  
  
=== Datastore Preferences (via Global Preferences artifact) ===
+
=== Datastore Preferences (via Global Preferences artifact) ===
  
Do a Quick Search on the Common branch for "Global Preferences" and open the resulting artifact in the artifact editor. The available attribute types for this artifact define what can be configured. Each attribute is self-documenting, because the attribute tip text documents how to use each one.
+
Do a Quick Search on the Common branch for "Global Preferences" and open the resulting artifact in the artifact editor. The available attribute types for this artifact define what can be configured. Each attribute is self-documenting, because the attribute tip text documents how to use each one.  
  
=== Common Java System Properties ===
+
=== Common Java System Properties ===
{| class="wikitable" style="border:1"
+
 
 +
{| style="border:1" class="wikitable"
 
|- style="background:#CCCCCC"
 
|- style="background:#CCCCCC"
! System Property Name
+
! System Property Name  
! Values
+
! Values  
! Default
+
! Default  
 
! Description
 
! Description
 
|-
 
|-
|osee.connection.info.uri
+
| osee.connection.info.uri  
|<code>&#91;FILE SYSTEM PATH&#93;</code>
+
| <code>[FILE SYSTEM PATH]</code>  
|
+
|  
|File system path or uri containing custom database connection information.
+
| File system path or uri containing custom database connection information.
 
|-
 
|-
|osee.db.connection.id
+
| osee.db.connection.id  
|<code>&lt;db identifier&gt;</code>
+
| <code>&lt;db identifier&gt;</code>  
|Default from db.connection file
+
| Default from db.connection file  
|Specifies which database OSEE should connect to. This id references connection information specified in the ...db.connection.xml file. Refer to the [[#Database Connection Information|Database Connection Information]] section for more information.
+
| Specifies which database OSEE should connect to. This id references connection information specified in the ...db.connection.xml file. Refer to the [[#Database_Connection_Information|Database Connection Information]] section for more information.
 
|-
 
|-
|osee.jini.forced.reggie.search
+
| osee.jini.forced.reggie.search  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>false</code>
+
| <code>false</code>  
|If true, adds the lookupList to the global lookup list such that a refresh will try to locate the service again
+
| If true, adds the lookupList to the global lookup list such that a refresh will try to locate the service again
 
|-
 
|-
|osee.jini.lookup.groups
+
| osee.jini.lookup.groups  
|user defined group name
+
| user defined group name  
|
+
|  
|the Jini Group that all OSEE provided Jini services will register with
+
| the Jini Group that all OSEE provided Jini services will register with
 
|-
 
|-
|osee.log.default
+
| osee.log.default  
|<code>FINE, INFO, WARNING, SEVERE</code>
+
| <code>FINE, INFO, WARNING, SEVERE</code>  
|<code>WARNING</code>
+
| <code>WARNING</code>  
|the default logging level for all loggers
+
| the default logging level for all loggers
 
|-
 
|-
|osee.port.scanner.start.port
+
| osee.port.scanner.start.port  
|<code>1 - 65535</code>
+
| <code>1 - 65535</code>  
|<code>18000</code>
+
| <code>18000</code>  
|the first port number to test for availability when a new port is needed
+
| the first port number to test for availability when a new port is needed
 
|}
 
|}
  
=== Application Server Java System Properties ===
+
=== Application Server Java System Properties ===
{| class="wikitable" style="border:1"
+
 
 +
{| style="border:1" class="wikitable"
 
|- style="background:#CCCCCC"
 
|- style="background:#CCCCCC"
! System Property Name
+
! System Property Name  
! Values
+
! Values  
! Default
+
! Default  
 
! Description
 
! Description
 
|-
 
|-
| org.osgi.service.http.port
+
| org.osgi.service.http.port  
|<code>1 - 65535</code>
+
| <code>1 - 65535</code>  
|<code>-1</code>
+
| <code>-1</code>  
|Port the client will use to communicate with the OSEE Application Server
+
| Port the client will use to communicate with the OSEE Application Server
 
|-
 
|-
|osee.application.server.data
+
| osee.application.server.data  
|<code>&#91;FILE SYSTEM PATH&#93;</code>
+
| <code>[FILE SYSTEM PATH]</code>  
|User Home
+
| User Home  
|A directory on the file system to be used by the application server to store and serve artifact binary data.
+
| A directory on the file system to be used by the application server to store and serve artifact binary data.
 
|-
 
|-
|osee.derby.server
+
| osee.db.embedded.server  
|<code>&#91;&lt;address&gt;:&lt;port&gt;&#93;</code>
+
| <code>[&lt;address&gt;:&lt;port&gt;]</code>  
|
+
|  
|When specified, this system property sets the URL used to launch a derby database server.
+
| When specified, this system property sets the URL used to launch an embedded database server.
 
|-
 
|-
|osee.application.server.data
+
| osee.version  
|<code>&#91;FILE SYSTEM PATH&#93;</code>
+
| <code>[&lt;"version 1"&gt;;&lt;"version 2"&gt;]</code>  
|User Home
+
|  
|A directory on the file system to be used by the application server to store and serve artifact binary data.
+
| When specified, this system property sets the application server's supported client versions. NOTE: version string can use regular expressions
|-
+
|osee.version
+
|<code>&#91;&lt;"version 1"&gt;;&lt;"version 2"&gt;&#93;</code>
+
|
+
|When specified, this system property sets the application server's supported client versions. NOTE: version string can use regular expressions
+
|-
+
|osee.check.tag.queue.on.startup
+
|<code>true, false</code>
+
|false
+
|When specified, this system property allows the application server to check the tag queue and begin tagging and pending tag jobs.
+
 
|-
 
|-
 +
| osee.check.tag.queue.on.startup
 +
| <code>true, false</code>
 +
| false
 +
| When specified, this system property allows the application server to check the tag queue and begin tagging and pending tag jobs.
 
|}
 
|}
  
=== Client Java System Properties ===
+
=== Client Java System Properties ===
{| class="wikitable" style="border:1"
+
 
 +
{| style="border:1" class="wikitable"
 
|- style="background:#CCCCCC"
 
|- style="background:#CCCCCC"
! System Property Name
+
! System Property Name  
! Values
+
! Values  
! Default
+
! Default  
 
! Description
 
! Description
 
|-
 
|-
|osee.application.server
+
| osee.application.server  
|<code>&#91;http&#58;//&#60;address&gt;:&#60;port&#62;&#93;</code>
+
| <code>[http://&lt;address&gt;:&lt;port&gt;]</code>  
|
+
|  
|When specified, this system property sets the URL used to reference the application server and arbitration is bypassed.
+
| When specified, this system property sets the URL used to reference the application server and arbitration is bypassed.
 
|-
 
|-
|osee.arbitration.server
+
| osee.arbitration.server  
|<code>&#91;http&#58;//&lt;address&gt;:&lt;port&#62;&#93;</code>
+
| <code>[http://&lt;address&gt;:&lt;port&gt;]</code>  
|
+
|  
|The arbitration server address and port to use. This system property must be specified for the system to gain access to OSEE data. If the application server property is set then that address takes precedence and arbitration is bypassed.
+
| The arbitration server address and port to use. This system property must be specified for the system to gain access to OSEE data. If the application server property is set then that address takes precedence and arbitration is bypassed.
 
|-
 
|-
|osee.authentication.protocol
+
| osee.authentication.protocol  
|protocol name
+
| protocol name  
|
+
|  
|protocol to be used by the client to authenticate with the server
+
| protocol to be used by the client to authenticate with the server
 
|-
 
|-
|osee.choice.on.db.init
+
| osee.choice.on.db.init  
|choice name
+
| choice name  
|
+
|  
|the predefined database initialization choice
+
| the predefined database initialization choice
 
|-
 
|-
|osee.file.specified.schema.names.on.db.init
+
| osee.file.specified.schema.names.on.db.init  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>false</code>
+
| <code>false</code>  
|Specifies whether OSEE database initialization should use the schema names specified in the schema.xml files instead of using the connection schema. Using the connection specified schema is the default behavior.
+
| Specifies whether OSEE database initialization should use the schema names specified in the schema.xml files instead of using the connection schema. Using the connection specified schema is the default behavior.
 
|-
 
|-
|osee.import.from.connection.id.on.db.init
+
| osee.import.from.connection.id.on.db.init  
|<code>&#91;FILE SYSTEM PATH&#93;</code>
+
| <code>[FILE SYSTEM PATH]</code>  
|
+
|  
|Specifies where table data should be imported from during OSEE database initialization. The default is to use the database connection id specified in the schema.xml files.
+
| Specifies where table data should be imported from during OSEE database initialization. The default is to use the database connection id specified in the schema.xml files.
 
|-
 
|-
|osee.import.on.db.init
+
| osee.import.on.db.init  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>false</code>
+
| <code>false</code>  
|Specifies whether OSEE database initialization should import database data as part of its tasks.
+
| Specifies whether OSEE database initialization should import database data as part of its tasks.
 
|-
 
|-
|osee.local.application.server
+
| osee.local.application.server  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>false</code>
+
| <code>false</code>  
|When set to '''true''' launches an application server upon start up. ''Uses '''org.osgi.service.http.port''' arg to determine port to use.''
+
| When set to '''true''' launches an application server upon start up. ''Uses '''org.osgi.service.http.port''' arg to determine port to use.''
 
|-
 
|-
|osee.local.http.worker.port
+
| osee.local.http.worker.port  
|<code>&lt;port&gt;</code>
+
| <code>&lt;port&gt;</code>  
|<code>Port Scan starting from 18000</code>
+
| <code>Port Scan starting from 18000</code>  
|Port to use for local worker server.
+
| Port to use for local worker server.
 
|-
 
|-
|osee.prompt.on.db.init
+
| osee.prompt.on.db.init  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>true</code>
+
| <code>true</code>  
|Specifies whether to interactively prompt the user during database initialization for init choice
+
| Specifies whether to interactively prompt the user during database initialization for init choice
 
|-
 
|-
|osee.record.activity
+
| osee.record.activity  
|<code>true, false</code>
+
| <code>true, false</code>  
|<code>true</code>
+
| <code>true</code>  
|Specifies whether user activity should be logged
+
| Specifies whether user activity should be logged
 
|-
 
|-
|osee.ote.benchmark
+
| osee.ote.benchmark  
|<code>true, false</code>
+
| <code>true, false</code>  
|
+
|  
|
+
|  
 
|-
 
|-
|osee.ote.cmd.console
+
| osee.ote.cmd.console  
|<code>true, false</code>
+
| <code>true, false</code>  
|
+
|  
|Specifies whether to enable the OTE command console
+
| Specifies whether to enable the OTE command console
 
|-
 
|-
|osee.ote.server.title
+
| osee.ote.server.title  
|free text name
+
| free text name  
|
+
|  
|name given to the OTE server which is displayed in the test manager
+
| name given to the OTE server which is displayed in the test manager
 
|-
 
|-
|osee.ote.timing.log.path
+
| osee.ote.timing.log.path  
|
+
|  
|
+
|  
 
|-
 
|-
|osee.ats.ignore.config.upgrades
+
| osee.ats.ignore.config.upgrades  
|<code>true, false</code>
+
| <code>true, false</code>  
|
+
|  
|
+
|  
 
|}
 
|}
 +
=== Setting Up Clients and Multiple Servers to work together  ===
  
== Database Connection Information ==
+
As described in the Architecture Section [http://wiki.eclipse.org/OSEE/Developers_Guide#Client.2FServer_Architecture], the Clients can be configured to choose a particular server or group of servers. By specifying a server version, the arbitration server will pick only the application servers that are configured to work with the client. For instance, the configuration would make it possible to choose only servers in the same location as the clients.<br>
  
To define a custom database connection for the application server, a path to an xml with the following format is required when launching the application server. This path will need to be specified using the <tt>osee.connection.info.uri</tt> and <tt>osee.db.connection.id</tt> JVM arguments on launch.
+
Steps: <br>1. Configure each application server on the local server machine(s) to support the local clients.<br>&nbsp;&nbsp;&nbsp; a) Set the osee.version system property to a string that will provide a common property to use with the OSEE Client. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example: In the VM Arguments for the server startup, add: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; –Dosee.version=”localSiteName”<br>&nbsp;&nbsp;&nbsp; b) Set the osee.application.server.data to a location on the server for the local copy of the application data <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example: -Dosee.application.server.data=”path/to/local/data”<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Note: this local path could be rsync’d to another site to improve local data performance<br>&nbsp;&nbsp;&nbsp; c) Set the http port to the port number for the client to access the server on<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example: -Dorg.osgi.service.http.port=8092<br>2. Configure the OSEE Client to connect to the one of the servers as an arbitration server<br>&nbsp;&nbsp;&nbsp; a) Set the osee.arbitration.server system property to the URL for one of the application servers configured in step 1.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example: -Dosee.arbitrations.server=http://your.server.com:8092<br>&nbsp;&nbsp;&nbsp; b) Set the osee.version system property to match the application server(s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Example: –Dosee.version=”localSiteName”<br><br>
  
 +
===Developer Workspace Configuration===
 +
====Import Java Code Auto Formatting Preferences====
 +
# Start OSEE
 +
# '''File-->Import...'''
 +
# Select '''General/Preferences'''
 +
# Click '''Next >'''
 +
# Click '''Browse''' and navigate to (and select) the file ''[workspace_root]\org.eclipse.osee\plugins\org.eclipse.osee.support.config\osee_team_preferences.epf''
 +
# Click '''Open'''
 +
# Check '''Import all'''
 +
# Click '''Finish'''
  
  <?xml version="1.0" encoding="UTF-8" ?>
+
====Configure New Code Template Preferences====
  <DbConnection>
+
*Window--&gt;Preferences
 +
*Java/Code Style/Code Templates
 +
*Code/New Java Files
 +
*Click Edit...
 +
*Paste the following (or some variant).&nbsp; Be careful not to modify the template variables, i.e.: "${package_declaration}":
 +
<pre>/*******************************************************************************
 +
  * Copyright (c) 2012 Boeing.
 +
* All rights reserved. This program and the accompanying materials
 +
* are made available under the terms of the Eclipse Public License v1.0
 +
* which accompanies this distribution, and is available at
 +
* http://www.eclipse.org/legal/epl-v10.html
 +
*
 +
* Contributors:
 +
*    Boeing - initial API and implementation
 +
*******************************************************************************/
 +
${package_declaration}
 +
/**
 +
* @author Joe P. Schmoe
 +
*/
 +
${typecomment}
 +
${type_declaration}
 +
</pre>
 +
*Code/Catch block body
 +
*Click Edit...
 +
*Paste the following (or some variant):<br>
 +
<pre>OseeLog.log(Activator.class, Level.SEVERE, ${exception_var});
 +
</pre>
 +
<br>
 +
 
 +
== Database Connection Information  ==
 +
 
 +
To define a custom database connection for the application server, a path to an xml with the following format is required when launching the application server. This path will need to be specified using the <tt>osee.connection.info.uri</tt> and <tt>osee.db.connection.id</tt> JVM arguments on launch.
 +
 
 +
<br>
 +
 
 +
&lt;?xml version="1.0" encoding="UTF-8"&nbsp;?&gt;
 +
  &lt;DbConnection&gt;
 
   
 
   
  <DatabaseInfo id="postgresqlInfo" >
+
  &lt;DatabaseInfo id="postgresqlInfo" &gt;
    <DatabaseHome key="#DBHOME#" value="DATABASE HOME LOCATION" />
+
  &lt;DatabaseHome key="#DBHOME#" value="DATABASE HOME LOCATION" /&gt;
    <DatabaseName key="#DBNAME#" value="DATABASE NAME" />
+
  &lt;DatabaseName key="#DBNAME#" value="DATABASE NAME" /&gt;
    <DatabaseType key="#TYPE#" value="postgresql" />
+
  &lt;DatabaseType key="#TYPE#" value="postgresql" /&gt;
    <Prefix key="#PREFIX#" value="jdbc:postgresql" />
+
  &lt;Prefix key="#PREFIX#" value="jdbc:postgresql" /&gt;
    <UserName key="#USERNAME#" value="DATABASE USERNAME" />
+
  &lt;UserName key="#USERNAME#" value="DATABASE USERNAME" /&gt;
    <Password key="#PASSWORD#" value="DATABASE PASSWORD" />
+
  &lt;Password key="#PASSWORD#" value="DATABASE PASSWORD" /&gt;
    <Host key="#HOST#" value="@AvailableDbServices.hostAddress" />
+
  &lt;Host key="#HOST#" value="@AvailableDbServices.hostAddress" /&gt;
    <Port key="#PORT#" value="@AvailableDbServices.port" />
+
  &lt;Port key="#PORT#" value="@AvailableDbServices.port" /&gt;
  </DatabaseInfo>
+
  &lt;/DatabaseInfo&gt;
 
   
 
   
  <ConnectionDescription id="postgresql" >
+
  &lt;ConnectionDescription id="postgresql" &gt;
    <Driver>org.postgresql.Driver</Driver>
+
  &lt;Driver&gt;org.postgresql.Driver&lt;/Driver&gt;
    <Url>#PREFIX#://#HOST#:#PORT#/#DBHOME##DBNAME#</Url>
+
  &lt;Url&gt;#PREFIX#://#HOST#:#PORT#/#DBHOME##DBNAME#&lt;/Url&gt;
  </ConnectionDescription>
+
  &lt;/ConnectionDescription&gt;
 
   
 
   
  <AvailableDbServices>
+
  &lt;AvailableDbServices&gt;
    <Server id="ANY NAME" dbInfo="postgresqlInfo"  
+
  &lt;Server id="ANY NAME" dbInfo="postgresqlInfo"  
            hostAddress="DATABASE IP ADDRESS" port="DATABASE PORT"  
+
          hostAddress="DATABASE IP ADDRESS" port="DATABASE PORT"  
            connectsWith="postgresql" isProduction="false" />
+
          connectsWith="postgresql" isProduction="false" /&gt;
  </AvailableDbServices>
+
  &lt;/AvailableDbServices&gt;
  </DbConnection>
+
  &lt;/DbConnection&gt;
  
 +
<br>
  
 +
The sample file above defines '''PostgreSql''' connections but it can be changed easily to define oracle or H2 connections.
  
The sample file above defines '''PostgreSql''' connections but it can be changed easily to define oracle or derby connections.
+
The file is divided as follows:
  
The file is divided as follows:
+
*'''Database Info:''' This entry describes the database to connect to by defining the database name, database home location and user name (or schema) and password to use during connection. When using the OSEE PostgreSql installation instructions, the fields should be set to the following:  
* '''Database Info:''' This entry describes the database to connect to by defining the database name, database home location and user name (or schema) and password to use during connection. When using the OSEE PostgreSql installation instructions, the fields should be set to the following:
+
**'''DATABASE HOME LOCATION:''' not used therefore remove the value field from this attribute  
** '''DATABASE HOME LOCATION:''' not used therefore remove the value field from this attribute
+
**'''DATABASE NAME:''' OSEE  
** '''DATABASE NAME:''' OSEE
+
**'''DATABASE USERNAME:''' osee  
** '''DATABASE USERNAME:''' osee
+
**'''DATABASE PASSWORD:''' osee  
** '''DATABASE PASSWORD:''' osee
+
*'''Connection Description:''' This entry describes how the database connection url should be assembled. At connection time, the fields enclosed in ## are substituted with the information defined in the database info section. There shouldn't be a need to change this unless you want to connect to a database other than PostgreSQL.  
* '''Connection Description:''' This entry describes how the database connection url should be assembled. At connection time, the fields enclosed in ## are substituted with the information defined in the database info section. There shouldn't be a need to change this unless you want to connect to a database other than PostgreSQL.  
+
*'''Available Database Services:''' This section contains entries for each database server and connection option needed at launch time. An entry is referenced at launch time by calling out the entry id in the '''osee.db.connection.id''' argument. When using a local OSEE PostgreSql install, the attributes on a server entry should be set to the following:  
* '''Available Database Services:''' This section contains entries for each database server and connection option needed at launch time. An entry is referenced at launch time by calling out the entry id in the '''osee.db.connection.id''' argument. When using a local OSEE PostgreSql install, the attributes on a server entry should be set to the following:
+
**'''id:''' any meaningful name to identify this entry  
** '''id:''' any meaningful name to identify this entry
+
**'''hostAddress:''' localhost  
** '''hostAddress:''' localhost
+
**'''port:''' 5432 (the default PostgreSql port)  
** '''port:''' 5432 (the default PostgreSql port)
+
**'''isProduction:''' false unless you want to prevent clients from initializing the database
** '''isProduction:''' false unless you want to prevent clients from initializing the database
+
  
== Custom Data Model ==
+
== Custom Data Model ==
  
The data model in OSEE is extensible and user configurable. Users can define new artifact, attribute, and relation types and their constraints such as multiplicity and applicability. Type inheritance allows similar types to be defined and modified without tedious redundancy because similar types inherit what is common from their super type.
+
The data model in OSEE is extensible and user configurable. Users can define new artifact, attribute, and relation types and their constraints such as multiplicity and applicability. Type inheritance allows similar types to be defined and modified without tedious redundancy because similar types inherit what is common from their super type.  
  
The OSEE data model is defined using a tabular format involving 5 tables. See the following xml spreadsheet [https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.framework.skynet.core/support/ProgramAndCommon.xml ProgramAndCommon.xml] for an example.
+
The OSEE data model is defined using a tabular format involving 5 tables. See the following [http://git.eclipse.org/c/osee/org.eclipse.osee.git/tree/plugins/org.eclipse.osee.framework.skynet.core/support link] for an example.  
  
The full data model can be defined using a single spreadsheet or be divided among multiple spreadsheets that can reference types defined in any spreadsheet.
+
The full data model can be defined using a single spreadsheet or be divided among multiple spreadsheets that can reference types defined in any spreadsheet.  
  
=== Artifact Type Table ===
+
=== Artifact Type Table ===
  
{| class="wikitable" border="1"
+
{| border="1" class="wikitable"
 
|-
 
|-
!Column Name
+
! Column Name  
!Description
+
! Description
 
|-
 
|-
|Artifact Type Name
+
| Artifact Type Name  
|any valid UTF-8 characters with a max length of 75 bytes
+
| any valid UTF-8 characters with a max length of 75 bytes
 
|-
 
|-
|Super Type Name
+
| Super Type Name  
|The super artifact type from which this type will inherit associated attributes and relations. Another concrete artifact type or an abstract one that exists only in data model definition.
+
| The super artifact type from which this type will inherit associated attributes and relations. Another concrete artifact type or an abstract one that exists only in data model definition.
 
|}
 
|}
  
=== Artifact Factory ===
+
=== Artifact Factory ===
  
When defining new artifact types, by default, the Java class used to create the artifact at runtime is <code>org.eclipse.osee.framework.skynet.core.artifact.Artifact</code>. When a specialized subtype of Artifact is desired, the extension point <code>org.eclipse.osee.framework.skynet.core.ArtifactFactory</code> can be used to contribute an artifact factory that extends the class <code>org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory</code>. The factory's <code>isResponsibleFor(String artifactTypeName)</code> method determines if a particular factory will be used to construct an artifact of a given artifact type. Thus the artifact factory extension point can be used to case user defined artifact types to be constructed at runtime using a custom Java class that extends Artifact.
+
When defining new artifact types, by default, the Java class used to create the artifact at runtime is <code>org.eclipse.osee.framework.skynet.core.artifact.Artifact</code>. When a specialized subtype of Artifact is desired, the extension point <code>org.eclipse.osee.framework.skynet.core.ArtifactFactory</code> can be used to contribute an artifact factory that extends the class <code>org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory</code>. The factory's <code>isResponsibleFor(String artifactTypeName)</code> method determines if a particular factory will be used to construct an artifact of a given artifact type. Thus the artifact factory extension point can be used to case user defined artifact types to be constructed at runtime using a custom Java class that extends Artifact.  
  
=== Attribute Type Table ===
+
=== Attribute Type Table ===
  
{| class="wikitable" border="1"
+
{| border="1" class="wikitable"
 
|-
 
|-
!Column Name
+
! Column Name  
!Description
+
! Description
 
|-
 
|-
|Attribute Base Type
+
| Attribute Base Type  
|
+
|  
Fully qualified java class name of a class that extends <code>org.eclipse.osee.framework.skynet.core.attribute</code>.
+
Fully qualified java class name of a class that extends <code>org.eclipse.osee.framework.skynet.core.attribute</code>. The typical and simplest case is to specify one of the built-in types:  
The typical and simplest case is to specify one of the built-in types:
+
 
*<code>org.eclipse.osee.framework.skynet.core.BooleanAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.BooleanAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.CompressedContentAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.CompressedContentAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.JavaObjectAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.JavaObjectAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.DateAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.DateAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.FloatingPointAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.IntegerAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.IntegerAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.StringAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.StringAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</code>  
*<code>org.eclipse.osee.framework.skynet.core.WordTemplateAttribute</code>
+
*<code>org.eclipse.osee.framework.skynet.core.WordTemplateAttribute</code>  
 
*<code>org.eclipse.osee.framework.skynet.core.WordWholeDocumentAttribute</code>
 
*<code>org.eclipse.osee.framework.skynet.core.WordWholeDocumentAttribute</code>
If a custom java type that extends <code>Attribute</code> is needed, then that type should be specified here.
+
 
 +
If a custom java type that extends <code>Attribute</code> is needed, then that type should be specified here.  
 +
 
 
|-
 
|-
|Attribute Data Provider
+
| Attribute Data Provider  
|The attribute data provider is responsible for storing and retrieving attribute data. Fully qualified java class name of a class that implements <code>org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider</code>. <code>org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</code> may be used when the data to be stored does not exceeded 4000 bytes, otherwise <code>org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</code> may be used.
+
| The attribute data provider is responsible for storing and retrieving attribute data. Fully qualified java class name of a class that implements <code>org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider</code>. <code>org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider</code> may be used when the data to be stored does not exceeded 4000 bytes, otherwise <code>org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</code> may be used.
 
|-
 
|-
|Attribute Type Name
+
| Attribute Type Name  
|Any valid UTF-8 characters with a max length of 500 bytes
+
| Any valid UTF-8 characters with a max length of 500 bytes
 
|-
 
|-
|File Extension
+
| File Extension  
|Any valid UTF-8 characters with a max length of 50 bytes; only applies when using the <code>org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</code>
+
| Any valid UTF-8 characters with a max length of 50 bytes; only applies when using the <code>org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider</code>
 
|-
 
|-
|Tagger ID
+
| Tagger ID  
|If the attrbiute&#146;s content is to be included in the search index for the quick search, use <code>DefaultAttributeTaggerProvider</code>, otherwise leave blank.
+
| If the attrbiute’s content is to be included in the search index for the quick search, use <code>DefaultAttributeTaggerProvider</code>, otherwise leave blank.
 
|-
 
|-
|Default Value
+
| Default Value  
|The initial value given an attribute upon initialization, this may be left blank
+
| The initial value given an attribute upon initialization, this may be left blank
 
|-
 
|-
|Validity Xml
+
| Validity Xml  
|For the attribute base type <code>org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</code>, specifies the valid enumerations. For example, &lt;Page_Type&gt;&lt;Enum&gt;Portrait&lt;/Enum&gt;&lt;Enum&gt;Landscape&lt;/Enum&gt;&lt;/Page_Type&gt;
+
| For the attribute base type <code>org.eclipse.osee.framework.skynet.core.EnumeratedAttribute</code>, specifies the valid enumerations. For example, &lt;Page_Type&gt;&lt;Enum&gt;Portrait&lt;/Enum&gt;&lt;Enum&gt;Landscape&lt;/Enum&gt;&lt;/Page_Type&gt;
 
|-
 
|-
|Min Occurrence
+
| Min Occurrence  
|The framework with prevent having lest than this number of this attribute type on a single artifact
+
| The framework with prevent having lest than this number of this attribute type on a single artifact
 
|-
 
|-
|Max Occurrence
+
| Max Occurrence  
|The framework with prevent adding more than this number of this attribute type to a single artifact
+
| The framework with prevent adding more than this number of this attribute type to a single artifact
 
|-
 
|-
|Tip Text
+
| Tip Text  
|Text to describe an attribute. Any valid UTF-8 characters with a max length of 4000 bytes
+
| Text to describe an attribute. Any valid UTF-8 characters with a max length of 4000 bytes
 
|}
 
|}
  
=== Artifact Type / Attribute Type Mapping Table ===
+
=== Artifact Type / Attribute Type Mapping Table ===
  
{| class="wikitable" border="1"
+
{| border="1" class="wikitable"
 
|-
 
|-
!Column Name
+
! Column Name  
!Description
+
! Description
 
|-
 
|-
|Artifact Type Name
+
| Artifact Type Name  
|Exact name of an artifact type defined above (or previously)
+
| Exact name of an artifact type defined above (or previously)
 
|-
 
|-
|Attribute Type Name
+
| Attribute Type Name  
|Exact name of an attribute type defined above (or previously) to be associated with the corresponding artifact type
+
| Exact name of an attribute type defined above (or previously) to be associated with the corresponding artifact type
 
|}
 
|}
  
=== Relation Type Table ===
+
=== Relation Type Table ===
  
{| class="wikitable" border="1"
+
{| border="1" class="wikitable"
 
|-
 
|-
!Column Name
+
! Column Name  
!Description
+
! Description
 
|-
 
|-
|Relation Type Name
+
| Relation Type Name  
|Any valid UTF-8 characters with a max length of 50 bytes
+
| Any valid UTF-8 characters with a max length of 50 bytes
 
|-
 
|-
|Side A Name
+
| Side A Name  
|Descriptive name for the A side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
+
| Descriptive name for the A side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
 
|-
 
|-
|A to B Phrase
+
| A to B Phrase  
|An optional phrase that describe the relation between the artifacts from the side A perspective. Any valid UTF-8 characters with a max length of 50 bytes
+
| An optional phrase that describe the relation between the artifacts from the side A perspective. Any valid UTF-8 characters with a max length of 50 bytes
 
|-
 
|-
|Side B Name
+
| Side B Name  
|Descriptive name for the B side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
+
| Descriptive name for the B side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
 
|-
 
|-
|B to A Phrase
+
| B to A Phrase  
|An optional phrase that describe the relation between the artifacts from the side B perspective. Any valid UTF-8 characters with a max length of 50 bytes
+
| An optional phrase that describe the relation between the artifacts from the side B perspective. Any valid UTF-8 characters with a max length of 50 bytes
 
|-
 
|-
|Short Name
+
| Short Name  
|Five or less characters is typical. This abbreviated name is used in the user interface when space is at a premium
+
| Five or less characters is typical. This abbreviated name is used in the user interface when space is at a premium
 
|-
 
|-
|Ordered
+
| Ordered  
|<code>Yes</code> to have artifacts on the same side of this relation type use a user defined ordered, otherwise <code>No</code>
+
| <code>Yes</code> to have artifacts on the same side of this relation type use a user defined ordered, otherwise <code>No</code>
 
|}
 
|}
  
=== Artifact Type / Relation Type Mapping Table ===
+
=== Artifact Type / Relation Type Mapping Table ===
  
{| class="wikitable" border="1"
+
{| border="1" class="wikitable"
 
|-
 
|-
!Column Name
+
! Column Name  
!Description
+
! Description
 
|-
 
|-
|Artifact Type
+
| Artifact Type  
|Exact name of an artifact type defined above (or previously)
+
| Exact name of an artifact type defined above (or previously)
 
|-
 
|-
|Relation Type
+
| Relation Type  
|Exact name of an relation type defined above (or previously)
+
| Exact name of an relation type defined above (or previously)
 
|-
 
|-
|Side A Max
+
| Side A Max  
|An artifact of type &quot;Artifact Type&quot; can be on side &quot;A&quot;, &quot;Side A Max&quot; number of times for relation links of type &quot;Relation Type&quot;
+
| An artifact of type "Artifact Type" can be on side "A", "Side A Max" number of times for relation links of type "Relation Type"
 
|-
 
|-
|Side B Max
+
| Side B Max  
|An artifact of type &quot;Artifact Type&quot; can be on side &quot;B&quot;, &quot;Side B Max&quot; number of times for relation links of type &quot;Relation Type&quot;
+
| An artifact of type "Artifact Type" can be on side "B", "Side B Max" number of times for relation links of type "Relation Type"
 
|}
 
|}
  
== Importing an OSEE Data Model ==
+
== Importing an OSEE Data Model ==
 +
 
 
To import changes to the data model for an existing OSEE database:  
 
To import changes to the data model for an existing OSEE database:  
<ol>
 
<li>Navigate to the Project Explorer (Resource Perspective) or the Package Explorer (Java Perspective)</li>
 
<li>Select a file or folder containing the OSEE data model</li>
 
<li>Right click and select <code>Import...</code></li>
 
<li>Under the <code>OSEE</code> category, select <code>OSEE Types</code></li>
 
</ol>
 
To automatically import the data model during database initialization use the extension point <code>org.eclipse.osee.framework.skynet.core.OseeTypes</code>
 
  
 +
#In Package Explorer, Select a file(s) containing the OSEE data model to import. If there are any enum overrides, you must select them either explicitly or by import statement (hierarchically).
 +
#Right click and select <code>Import...</code>
 +
#Under the <code>OSEE</code> category, select <code>OSEE Types</code>
 +
#Ensure that all types files are included in <code>Resolved dependencies</code> and <code>Report Changes</code> is checked. Select Finish.
 +
#Review all tabs to ensure that all changes are expected.
 +
##<code>Osee Default Enum</code> will always show up on <code>OseeEnum Types</code> tab
 +
##Ensure each column's data is correct. All "true" values are what is being changed.
 +
#When ready to persist changes, you must restart the client (Still Necessary??) and only run import once with <code>Persist Changes</code> checked
  
== Configuring ATS for Change Tracking ==
+
To automatically import the data model during database initialization use the extension point <code>org.eclipse.osee.framework.skynet.core.OseeTypes</code>
  
[[OSEE/ATS/Users_Guide/Usage#Configure_ATS_for_Change_Tracking|Configuring ATS for Change Tracking]]
+
== OSEE Branches  ==
  
== Custom OSEE Operations using BLAM ==
+
[http://wiki.eclipse.org/OSEE/Branches OSEE Branches]
the extension point <code>org.eclipse.osee.framework.ui.skynet.BlamOperation</code> can be used to contribute a custom OSEE operation that provides the developer a very quick way to define the graphical interface that supplies the operation with the user specified parameters.  <code>org.eclipse.osee.framework.ui.skynet.blam.operation.ChangeArtifactTypeBlam</code> provides a simple example.
+
  
== Building OSEE using PDE Build ==
+
== Workspace Setup  ==
  
=== Non-Eclipse System Requirements ===
+
[http://wiki.eclipse.org/OSEE/Workspace_Setup Workspace Setup]
* System with at least 1GB of RAM
+
* Java Runtime Environment (JRE) 1.6 or higher
+
* Relational database such as PostgreSQL, MySQL, Oracle, or Derby. See instructions for installing 'Supported Databases' to complete this step.
+
  
=== Install Eclipse ===
+
== Downloading and Configuring Eclipse ==
  
Download and install the Eclipse Classic Download available at the bottom of [http://www.eclipse.org/downloads/ this page]. Do this even if you already have an install of Eclipse or OSEE, in order to avoid mysterious build problems later on.
+
[http://wiki.eclipse.org/OSEE/Workspace_Setup#Downloading_and_Configuring_Eclipse Downloading and Configuring Eclipse]  
  
=== Install Plug-ins ===
+
== Working with GIT  ==
  
Open the Install utility ('''Help &gt; Install New Software...''').
+
[http://wiki.eclipse.org/OSEE/Workspace_Setup#Working_with_Git Working with Git]
  
* SVN Connectors:
+
== Testing  ==
** '''Work with:''' http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
+
** Leave the filter blank.
+
** Select <tt>SVNKit 1.3.0 Implementation (Optional)</tt>.
+
** Install and restart.
+
* SVN PDE Build:
+
** '''Work with:''' http://download.eclipse.org/technology/subversive/0.7/pde-update-site/
+
** Select the <tt>SVN PDE Build Extension</tt> feature. Install and restart.
+
* Install BIRT:
+
** Go to http://download.eclipse.org/birt/downloads/ and click the yellow "Framework" button to download a .zip file containing the BIRT update site.
+
** Extract the zip file to a temporary directory.
+
** From Eclipse's software installation utility,
+
*** Select '''Add...''', and then '''Local...'''
+
*** Find the temporary directory containing the contents of the .zip file and select the <tt>eclipse</tt> directory it contains.
+
** Uncheck '''Group items by category'''.
+
** Select the feature <tt>BIRT Chart Framework</tt>.
+
** Install and restart.
+
** The .zip archive and temporary directory can now be deleted.
+
* Install GEF:
+
** Go to http://www.eclipse.org/gef/downloads/ and download the '''All-In-One Update Site'''.
+
** In Eclipse, go to '''Help &gt; Install New Software... &gt; Add...'''
+
*** Click '''Archive...''' and select the .zip file retrieved from the GEF download page.
+
*** Select:
+
**** <tt>Graphical Editing Framework Draw2d SDK</tt>
+
**** <tt>Graphical Editing Framework GEF SDK</tt>
+
**** <tt>Graphical Editing Framework GEF Zest Visualization Toolkit</tt>
+
*** Install and restart.
+
* Install XText:
+
** '''Work with:''' http://download.itemis.com/updates/milestones
+
** Check '''Group items by category'''
+
** Select all of the following features:
+
*** <tt>EMFT COMPARE SDK (Incubation) 1.0.0RC5b</tt>
+
*** <tt>EMFT MWE SDK (Incubation) 0.7.2RC1</tt>
+
*** <tt>M2T XPAND SDK (Incubation) 0.7.2RC1</tt>
+
*** <tt>Xtext Antlr Support 0.7.2RC1</tt>
+
** Install and restart.
+
* Install EMF:
+
** '''Work with:''' Galileo - http://download.eclipse.org/releases/galileo
+
** Select the following plugins from the <tt>Modeling</tt> feature:
+
*** <tt>EMF - Eclipse Modeling Framework SDK</tt>
+
*** <tt>Xtext SDK</tt>
+
** Install and restart.
+
* Install Mylyn Wikitext support:
+
** Download http://www.eclipse.org/downloads/download.php?file=/tools/mylyn/update-archive/3.2.2/v20090912-0400/mylyn-3.2.2.v20090912-0400-e3.4.zip and use it as an archive site.
+
** Under <tt>Mylyn Integration</tt>, select <tt>Mylyn WikiText</tt>.
+
** Install and restart.
+
  
=== If Using Windows ===
+
JUnit Method Rules:  
* Get the Subversion Binaries: http://subversion.tigris.org/getting.html
+
* Put SVN in the path:
+
** On Windows:
+
*** Go to '''Control Panel &gt; System &gt; Advanced &gt; Environment Variables''' and scroll down to '''Path''' in the second combo box.
+
*** Click '''Edit'''.
+
*** Add the path to the SVN <tt>bin</tt> directory. Paths are semicolon-delimited.
+
* Configure SVN's proxy settings:
+
** In Explorer, open the %APPDATA%\Subversion folder.
+
** Edit the <code>servers</code> file in Wordpad.
+
** At the bottom, under &#91;global&#93;, enter your proxy host and port.  For example:
+
[global]
+
http-proxy-host = www-my-proxy.mydomain.com
+
http-proxy-port = 99999
+
  
=== SVN Checkout ===
+
{| border="1" cellpadding="1" width="95%"
 +
|-
 +
! Rule class !! Description !! Example
 +
|-
 +
| '''OseeHousekeepingRule'''
 +
| Checks if the Artifact Cache is clean
 +
|
 +
  public class MyTest {
 +
  @Rule
 +
  public MethodRule oseeHousekeepingRule = new OseeHousekeepingRule();
 +
<br/>
 +
  @Test
 +
  public void testArtifactChangeName() throws Exception {
 +
      //Arifact change name code
 +
  }
 +
}
 +
|-
 +
|}
 +
<br/>
  
In Eclipse, open the '''SVN Repository''' perspective and check out the following SVN project:
+
== Location of OSEE Bundles  ==
  
* https://dev.eclipse.org/svnroot/technology/org.eclipse.osee/trunk/org.eclipse.osee.support.build
+
[http://wiki.eclipse.org/OSEE/Workspace_Setup#Locations_of_all_OSEE_bundles Location of OSEE Bundles]
  
=== Build ===
+
== Migrating Branches to Another OSEE Database (including from previous OSEE version)  ==
  
Execute the following from the command line to build:
+
#From the source application server's osgi console: export_branch myExportFolder
 +
#The results will be placed in &lt;user home&gt;\Exchange\myExportFolder
 +
#Zip the resulting folder and save it for possible reuse
 +
#Run database initialization on destination database
  
;Windows
+
{| width="80%" cellspacing="0" cellpadding="20px" style="background:rgb(230,230,230);color:black; border:1px solid gray; font-family: fixedsys;text-align: left"
:<tt>eclipsec -nosplash -application org.eclipse.ant.core.antRunner -buildfile &lt;workspace path&gt;\org.eclipse.osee.support.build\support\osee_client_build.xml -DdownloadOrbitPlugins=true</tt>
+
|-
;Linux
+
|
:<tt>eclipse -console -nosplash -application org.eclipse.ant.core.antRunner -buildfile &lt;workspace path&gt;/org.eclipse.osee.support.build/support/osee_client_build.xml -DdownloadOrbitPlugins=true</tt>
+
<nowiki>
 +
eclipsec -application org.eclipse.osee.framework.database.init.configClient -vmargs -Xmx512m -Dosee.log.default=INFO -Dosee.application.server=http://localhost:8089 -Dosee.authentication.protocol=trustAll -Dosee.prompt.on.db.init=false -Dosee.choice.on.db.init="Base - for importing branches"
 +
</nowiki>  
  
== Helpful links ==
+
|}
* http://rcpquickstart.com/2007/06/20/unit-testing-plug-ins-with-fragments/
+
* http://junit.sourceforge.net/
+
* http://junit.sourceforge.net/doc/cookbook/cookbook.htm
+
* [http://www.eclipse.org/articles/Article-PDE-Automation/automation.html Build and Test Automation for plug-ins and features]
+
* [http://www.eclipse.org/documentation/ Eclipse Documentation Online]
+
* [http://www-128.ibm.com/developerworks/library/os-ecgui3/ Using the Eclipse GUI outside the Eclipse Workbench]
+
* [http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html Understanding Layouts in SWT]
+
  
== Design Questions ==
+
#Import any custom types into the destination database
 +
#From the destination application server's osgi console: import_branch &lt;user home&gt;\Exchange\myExportFolder
 +
#From the application server run <code>tag_all</code>
 +
#Restart destination application server
 +
#Start corresponding OSEE client
 +
 
 +
== Configuring ATS for Change Tracking  ==
 +
 
 +
[[OSEE/ATS/Users Guide/Usage#Configure_ATS_for_Change_Tracking|Configuring ATS for Change Tracking]]
 +
 
 +
== Custom OSEE Operations using BLAM  ==
 +
 
 +
the extension point <code>org.eclipse.osee.framework.ui.skynet.BlamOperation</code> can be used to contribute a custom OSEE operation that provides the developer a very quick way to define the graphical interface that supplies the operation with the user specified parameters. <code>org.eclipse.osee.framework.ui.skynet.blam.operation.ChangeArtifactTypeBlam</code> provides a simple example.
 +
 
 +
== Event Handling  ==
 +
 
 +
=== General Design Considerations  ===
 +
 
 +
*Event Handlers should run VERY quickly
 +
*A private implementation is more secure
 +
*Separate classes == maintainable but potentially costly
 +
*Ensure each listener is safeguarded from other listeners (wrap in event handling)
 +
 
 +
=== Requirements  ===
 +
 
 +
*Need local client events and remote events to other clients
 +
**Local event model should be abstracted from remote model so app code doesn't change
 +
**Remote events should be versioned so event service can know how to handle
 +
*Need to handle events where artifact or relation is not in client's cache, but event may still matter
 +
**Client can't load every artifact to determine if it's desired
 +
**Registration needs to be at base level guid,artTypeId,branchId so these can be filtered out without loading all artifact data.
 +
*Need to provide lowest level registration (branch, artType and possibly even attrType) so event msgs reduced
 +
*Need to support versions of remote events so remote event model can change without causing exceptions
 +
*MUST have regression tests that are light-weight and easy to run so event service doesn't break
 +
*Since Artifact, Relation, Attribute types are dynamic, can't create static message model/brokers
 +
*Since artifact/relation/branch caches must be updated PRIOR to events propagate to GUI
 +
**Need priority listeners for caches to update prior to UI updates
 +
*Applications should be able to define their own higher level events while still listening to lower level events
 +
 
 +
=== Event Handling Revelations  ===
 +
 
 +
*Reduce the necessity of events as much as possible - Restful
 +
*Data injection to keep caches up-to-date a complex/impossible solution for enterprise, multi-client, multi-server operations
 +
*All clients MUST be connected to event service if connected to database/app service
 +
*Applications shouldn't have to know what events to handle, but instead presented all the events to handle
 +
**Don't have separate purge, modified, change type events, but instead Artifact listener that has change types of purge, modified, deleted, change type, etc
 +
*Since artifacts/relations are cached, application to application events are prone to errors if cache not updated yet
 +
 
 +
=== Event Handling Ideas / Goals  ===
 +
 
 +
*How could we have a version for each artifact so clients could know if they are up-to-date or missed an update and reload-all. This would allow for self-healing.
 +
*Reduce the items in the cache by improving our use of weak references. Anything not in the cache, doesn't have to get updated
 +
*Move configurations that have to be loaded by all clients to the server. Branch and type caches already there. Users and ATS Config could go there.
 +
*Is there a way to have events go straight to UIs (Editors, Views) to see if anyone cares that the cache is updated before updating the cache?
 +
 
 +
=== OSEE Event Handling - Current  ===
 +
 
 +
*Design Issues
 +
**Communication mechanism - Jini
 +
***Clients are not connecting
 +
***Clients not staying connected
 +
**Event System
 +
***Events are at the data level; applications are required to turn high level operations (eg: save, transition) into low level data events (30 attributes modified, 10 relations added, 5 deleted) which are sent across the wire to another client to re-assemble into a high level operation.
 +
***Registration is for too high a level, each editor,view has to process through all events to find ones they care about
 +
***Have to filter between loaded and unloaded artifacts and handle them differently so as not to accidentally load everything
 +
***Have to register/handle separately for deleted versus purged
 +
***Two levels of registration for artifacts/attributes/relations, by transaction and by dirty. By dirty is too much information, but necessary sometimes. By transaction is ok, but have to filter through all un-necessary stuff to find what want. Dangerous and costly.
 +
***Access control is not handled in events
 +
***Not extensible, so applications can't create/propagate their own events
 +
*Registration
 +
**ArtifactPurgedEvent
 +
**FrameworkTransactionEvent
 +
**RelationModifiedEvent
 +
**BranchEvent
 +
 
 +
=== OSEE Event Handling - New  ===
 +
 
 +
*Registration - Need lower level registration of framework events
 +
**By Artifact (branch, guid)
 +
**By Object Type (artifact, attribute, relation) - include inheritance
 +
**By Mod Type (added, modified, deleted, purged)
 +
**By Transaction (persist to DB of group of changes)
 +
**By Combinations (Artifact type and relation type or Artifact type and attribute type)
 +
*ArtifactEventManager
 +
**Sends BasicGuidArtifact for each mod type
 +
**Modification Types: Purged, Added, Modified, Deleted, Change Type, Access Control
 +
**Allow registration with filters
 +
***ArtifactGuidFilter - only sends event if artifact is affected
 +
***BranchGuidFilter - only send event if artifact on this branch is affected
 +
***ArtifactTypeGuidFilter - only sends event if artifact of one of these types is affected
 +
*BranchEventManager
 +
**Modification Types: Added, Deleted, Purged, Access Control, Renamed
 +
**Allow registration with same filters as Artifact
 +
*Remote events are different and versioned classes so abstract from framework events
 +
*Created via jaxb
 +
 
 +
=== Event Model  ===
 +
 
 +
==== Remote Events  ====
 +
 
 +
#Remote events classes are auto-generated via jaxb which keeps toXml, fromXml implementation hidden and thus requires less junit tests for base clasess.
 +
#Each class is versioned by name (1, 2, 3). When RemoteBranchEvent1 changes, will create RemoteBranchEvent2 so there is no conflicts and implement backward compatibility that will
 +
##Create RemoteBranchEvent2 events when RemoteBranchEvent1 are received - for old clients
 +
##Create RemoteBranchEvent1 events when RemoteBranchEvent2 are received - for new clients
 +
#Current classes:
 +
##RemoteAccessControlArtifactsEvent1.java
 +
##RemoteAttributeChange1.java
 +
##RemoteBasicGuidArtifact1.java
 +
##RemoteBasicModifiedGuidArtifact1.java
 +
##RemoteBranchEvent1.java
 +
##RemoteBranchRenameEvent1.java
 +
##RemoteBroadcastEvent1.java
 +
##RemoteChangeTypeArtifactsEvent1.java
 +
##RemoteNetworkSender1.java
 +
##RemotePurgedArtifactsEvent1.java
 +
##RemoteTransactionDeletedEvent1.java
 +
##RemoteTransactionEvent1.java
 +
 
 +
==== Framework Events / Listeners  ====
 +
 
 +
*ArtifactEvent
 +
*BranchEvent
 +
*BroadcastEvent
 +
*AccessControl?? - Potentially roll into ArtifactEvent
 +
*TransactionDeleted?? - Potentially roll into ArtifactEvent
 +
 
 +
== Use Cases  ==
 +
 
 +
*Artifact Editor
 +
**Current Design
 +
***Registration = All Branches, Mod Types, Object Types
 +
***Handling
 +
****If not branch, throw away
 +
****If unloaded, ignore
 +
****If loaded refresh/update all
 +
****If relation, refresh relation tree
 +
****If attribute, refresh attribute tab
 +
**New Design
 +
***Registration = One guid and relations for that guid
 +
***Handling
 +
****If relation, refresh relation tree
 +
****If attribute, refresh attribute tab
 +
*Artifact Explorer
 +
**Current Design
 +
***Registration = All Branches, Mod Types, Object Types
 +
***Handling
 +
****If not branch, throw away
 +
****If unloaded, ignore
 +
****If loaded refresh/update all
 +
****If relation, get parent and call tree.refresh()
 +
****If attribute (name only), call tree.update(element)
 +
**New Design
 +
***Registration = One branch, One relation type, All Object Types
 +
***Handling = About the same, but don't have to filter through un-necessary stuff
 +
*SMA Editor - Edits single team workflow, but watches related tasks, reviews, user assignments, etc
 +
**Current Design
 +
***Registration = purged, relation modified, framework transaction, branch event. NOTE: Should register by branchId (Common), guids of workflows, artifact types (eg. don't care about general document artifact type changes on common)
 +
***Handling
 +
****If not Common branch or in transition, ignore all artifact/relation/attribute changes
 +
****If is purged/deleted, close editor
 +
****If is modified, deleted, relChanged, relDeleted, relAdded of main artifact, redraw pages
 +
****If related review is any of above, redraw pages
 +
****If relation modified, dirty editor
 +
****If branch event and working branch added, deleted, purged, committed, redraw pages
 +
**New Design
 +
***Registration - One branch, 12 artifact types
 +
***Handling = About the same, but don't have to filter through un-necessary stuff
 +
 
 +
References
 +
 
 +
*http://java.sun.com/docs/books/tutorial/uiswing/events/generalrules.html
 +
 
 +
== Building OSEE using Tycho/Maven  ==
 +
 
 +
===Build Requirements===
 +
*Java Runtime Environment (JRE) 1.6 or higher
 +
*Maven 3.0 or higher
 +
 
 +
===Build Steps===
 +
 
 +
#Download and install Maven. See [http://maven.apache.org http://maven.apache.org] for installation details.
 +
#Download the OSEE source code from [http://git.eclipse.org/c/osee/org.eclipse.osee.git Git Web Client] (see clone section for more information] or [https://github.com/eclipse/osee https://github.com/eclipse/osee]
 +
#:'''Note:''' ''Tycho/Maven build support available for source code versions 0.9.9_SR6 and higher.''
 +
#Download and unzip 3rd party dependency P2 archived site: [http://code.google.com/p/osee-external/downloads/detail?name=org.eclipse.ip.p2_1.0.0.v201203200040-DEV.zip&can=2&q= http://code.google.com/p/osee-external/downloads/detail?name=org.eclipse.ip.p2_1.0.0.v201203200040-DEV.zip&can=2&q=]
 +
#Build commands:
 +
##'''cd org.eclipse.osee/plugins/org.eclipse.osee.parent'''
 +
##'''mvn clean verify -Declipse-ip-site="file:<PATH TO 3rd PARTY P2 SITE>"'''
 +
##If you run into any problems (to display debug and stack trace info)
 +
##:'''mvn -e -X verify -Declipse-ip-site="file:<PATH TO 3rd PARTY P2 SITE>"'''
 +
Assuming the following layout:<br/>/UserData/org.eclipse.osee<br/>/UserData/org.eclipse.ip.p2_1.0.0.v201203200040-DEV<br/><br/>machine@user /UserData/org.eclipse.osee/plugins/org.eclipse.osee.parent:<br/>$mvn clean verify -Declipse-ip-site="file:../../../org.eclipse.ip.p2_1.0.0.v201203200040-DEV"
 +
 
 +
===Interactive Build===
 +
 
 +
&#9758; '''Depends on org.eclipse.osee.ip.p2'''
 +
 
 +
:To build all org.eclipse.osee artifacts
 +
:#cd org.eclipse.osee/plugins/org.eclipse.osee.support.maven
 +
:#Issue maven build command: '''mvn compile'''
 +
:#Select build options when prompted
 +
 
 +
===Build Module Hierarchy (from highest to lowest)===
 +
 
 +
#org.eclipse.osee.parent
 +
##org.eclipse.osee.ide.parent
 +
###org.eclipse.osee.client.all.parent
 +
###org.eclipse.osee.client.parent
 +
###org.eclipse.osee.ote.parent
 +
###org.eclipse.osee.runtime.parent
 +
##org.eclipse.osee.x.parent
 +
###org.eclipse.osee.x.server.parent
 +
###org.eclipse.osee.orcs.parent
 +
###org.eclipse.osee.x.core.parent
 +
 
 +
===Build Artifacts===
 +
 
 +
{| border="1" cellpadding="1"
 +
|-
 +
! Path !!  Artifact !! Description
 +
|-
 +
| rowspan="2" | plugins/org.eclipse.osee.client.all.p2/target/ || repository/ || OSEE IDE Client P2 Site
 +
|-
 +
| org.eclipse.osee.client.all.p2.zip || OSEE IDE Client P2 Archived Update Site
 +
|-
 +
| rowspan="5" | plugins/org.eclipse.osee.client.all.product/target/products/ || build_label.txt || OSEE Build Information
 +
|-
 +
| org.eclipse.osee.ide.id-linux.gtk.x86.tar.gz || OSEE Client IDE All-In-One Linux x86
 +
|-
 +
| org.eclipse.osee.ide.id-linux.gtk.x86_64.tar.gz || OSEE Client IDE All-In-One Linux x86 64-bit
 +
|-
 +
| org.eclipse.osee.ide.id-win32.win32.x86.zip || OSEE Client IDE All-In-One Win32 x86
 +
|-
 +
| org.eclipse.osee.ide.id-win32.win32.x86_64.zip || OSEE Client IDE All-In-One Win32 x86 64-bit
 +
|-
 +
| rowspan="4" | plugins/org.eclipse.osee.x.server.p2/target || repository/ || OSEE Application Server P2 Site
 +
|-
 +
| server/ || OSEE Application Server
 +
|-
 +
| org.eclipse.osee.x.server.p2.zip || OSEE Application Server Archived Update Site
 +
|-
 +
| org.eclipse.osee.x.server.runtime.zip || OSEE Application Server Zipped Runtime
 +
|-
 +
|}<br/>
 +
====OSEE System Requirements====
 +
*System with at least 1GB of RAM
 +
*Relational database. H2 is included by default. If you wish to use something else such as PostgreSQL or Oracle, please see instructions for installing [[OSEE/Users Guide/Getting Started#Supported_Databases|Supported Databases]] to complete this step.
 +
 
 +
== Database Schema  ==
 +
 
 +
TODO: add html generated from SKYNET_VERSIONING.xml file.
 +
 
 +
== How to Define Classes for Coverage Importing  ==
 +
 
 +
The following steps walk a developer through defining the classes necessary to begin importing coverage data into the OSEE application.&nbsp; Please keep in mind that these are meant to be simplified examples and developers are encouraged to 'get creative' when adapting these examples to their own particular context.<br>
 +
[[Image:TestWorkflow.png]]
 +
 
 +
'''1. Write a class that extends AbstractCoverageBlam'''<br>
 +
<pre>public class MyCoverageImportBlam extends AbstractCoverageBlam {
 +
  public static String COVERAGE_IMPORT_DIR = "Coverage Import Directory";
 +
  public static String NAMESPACE = "Code Namespace";
 +
 
 +
  @Override
 +
  public String getName() {
 +
      return "My Coverage Import";
 +
  }
 +
 
 +
  @Override
 +
  public Collection&lt;String&gt; getCategories() {
 +
      return Arrays.asList("Blams");
 +
  }
 +
 
 +
  @Override
 +
  public String getDescriptionUsage() {
 +
      return "Import coverage from coverage directory.";
 +
  }
 +
 
 +
  @Override
 +
  public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws Exception {
 +
      try {
 +
        final String coverageInputDir = variableMap.getString(COVERAGE_IMPORT_DIR);
 +
        if (!Strings.isValid(coverageInputDir)) {
 +
            throw new OseeArgumentException("Must enter valid filename.");
 +
        }
 +
        final String namespace = variableMap.getString(NAMESPACE);
 +
        if (!Strings.isValid(namespace)) {
 +
            throw new OseeArgumentException("Must enter valid namespace.");
 +
        }
 +
 
 +
        File file = new File(coverageInputDir);
 +
        if (!file.exists()) {
 +
            throw new OseeArgumentException("Invalid filename.");
 +
        }
 +
 
 +
        MyCoverageImporter myCoverageImporter = new MyCoverageImporter(coverageInputDir, namespace);
 +
        CoverageImport coverageImport = myCoverageImporter.run(monitor);
 +
        setCoverageImport(coverageImport);
 +
      } catch (Exception ex) {
 +
        OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
 +
      }
 +
  }
 +
 
 +
  @Override
 +
  public String getXWidgetsXml() {
 +
      StringBuffer buffer = new StringBuffer("&lt;xWidgets&gt;");
 +
      buffer.append("&lt;XWidget xwidgetType=\"XDirectorySelectionDialog\" " + getDefaultDirectory() + " displayName=\"" + COVERAGE_IMPORT_DIR + "\" /&gt;");
 +
      buffer.append("&lt;XWidget xwidgetType=\"XText\" displayName=\"" + NAMESPACE + "\" /&gt;");
 +
      buffer.append("&lt;/xWidgets&gt;");
 +
      return buffer.toString();
 +
  }
 +
 
 +
  private String getDefaultDirectory() {
 +
      if (CoverageUtil.isAdmin()) {
 +
        return " defaultValue=\"C:\\UserData\" ";
 +
      }
 +
      return "";
 +
  }
 +
 
 +
}
 +
 
 +
</pre>
 +
'''2. Define a class that implements ICoverageImporter'''
 +
<pre>public class MyCoverageImporter implements ICoverageImporter {
 +
  private final String coverageInputDir;
 +
  private final String namespace;
 +
  private final CoverageImport coverageImport = new CoverageImport("My Coverage Import");
 +
 
 +
  public MyCoverageImporter(String coverageInputDir, String namespace) {
 +
      this.coverageInputDir = coverageInputDir;
 +
      this.namespace = namespace;
 +
  }
 +
 
 +
  @Override
 +
  public String getName() {
 +
      return "My Coverage Importer";
 +
  }
 +
 
 +
  @Override
 +
  public CoverageImport run(IProgressMonitor progressMonitor) throws OseeCoreException {
 +
      /*
 +
      * Use any member variables to populate coverageImport
 +
      */
 +
      return coverageImport;
 +
  }
 +
 
 +
}
 +
 
 +
</pre>
 +
'''3. Add extension point declaration to package's plugin.xml'''<br>
 +
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
 +
&lt;?eclipse version="3.4"?&gt;
 +
&lt;plugin&gt;
 +
  &lt;extension
 +
        point="org.eclipse.osee.framework.ui.skynet.BlamOperation"&gt;
 +
      &lt;Operation
 +
            className="com.my.coverage.MyCoverageImportBlam"&gt;
 +
      &lt;/Operation&gt;
 +
  &lt;/extension&gt;
 +
&lt;/plugin&gt;
 +
</pre>
 +
<br>
 +
 
 +
== Helpful links  ==
 +
 
 +
*http://rcpquickstart.com/2007/06/20/unit-testing-plug-ins-with-fragments/
 +
*http://junit.sourceforge.net/
 +
*http://junit.sourceforge.net/doc/cookbook/cookbook.htm
 +
*[http://www.eclipse.org/articles/Article-PDE-Automation/automation.html Build and Test Automation for plug-ins and features]
 +
*[http://www.eclipse.org/documentation/ Eclipse Documentation Online]
 +
*[http://www-128.ibm.com/developerworks/library/os-ecgui3/ Using the Eclipse GUI outside the Eclipse Workbench]
 +
*[http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html Understanding Layouts in SWT]
 +
*[http://www.eclipsezone.com/articles/eclipse-vms Eclipse - a tale of two VMs (and many classloaders)]
 +
*[http://www.osgi.org/blog/2006/04/strong-lesson-about-modularity.html Strong Lesson About OSGI Modularity]
 +
 
 +
== Design Questions ==
 +
 
 +
=== I have strange eclipse/osee issues can I delete stuff from my '''''configuration''''' folder? ===
 +
 
 +
yes. Everything '''except''':
  
===I have strange eclipse/osee issues can I delete stuff from my '''''configuration''''' folder?===
 
yes.  Everything '''except''':
 
 
   config.ini
 
   config.ini
  org.eclipse.equinox.simpleconfigurator
+
  org.eclipse.equinox.simpleconfigurator
 +
 
 +
=== Is OSEE an application framework or an application?  ===
 +
 
 +
The simple answer is BOTH. OSEE Application Framework is created to allow applications to be built on top and share the common data model. This can be used independently of any OSEE applications. In addition, there are applications that are delivered with and use the OSEE Application Framework. This includes a full featured Requirements and Document Management System (OSEE Define), a powerful change tracking and configuration management application (OSEE ATS - Action Tracking System), a fully customizable peer-review module and other project, reporting and metrics tools. These application can be used out-of-the-box and new applications can be created or integrated on the framework to share and contribute to the same data.
 +
 
 +
=== Other products sound similar. Why OSEE?  ===
 +
 
 +
*Open Source Extensible Platform
 +
*Open Eclipse Project w/ Collaboration
 +
*Tight Integration Around A Common Data Model
 +
*Full Lifecycle Engineering Environment
 +
 
 +
=== Is OSEE only for Avionics Engineering?  ===
 +
 
 +
No. OSEE's was created by The Boeing Company in support of the Apache AH-64 Attack Helicopter flight control software. Although it was created to handle the complexity of a large US Department of Defense program, it was architected to support any systems engineering project from a simple application built for a single customer to a large complex application like the Apache flight controls. In addition, since OSEE is an independent application, the OSEE development team uses OSEE to develop, deploy and maintain OSEE.
 +
 
 +
=== What is Skynet?  ===
 +
 
 +
Skynet is a legacy term for the persistence portion of the OSEE Application Framework.
 +
 
 +
=== What are Artifact Framework types?  ===
 +
 
 +
OSEE provides Artifacts, Attributes and Relations that are strongly typed. This means that the user can create their own artifact type, for example a "Software Requirement" to represent the requirements at a software level and their own attribute types, for example a "Qualification" attribute or a "Safety Criticality" attribute and event their own relations, for example a "Software Requirement to Allocation" relation. These types are defined in the Artifact Framework and can be created dynamically in the system during database creation or while running. This allows the end user to expand the data that is being stored in OSEE without providing a new release.
 +
 
 +
=== What is the Action Tracking System (ATS)?  ===
 +
 
 +
The Action Tracking System is the tightly integrated configuration management system built in OSEE and very tightly integrated with the OSEE Application Framework. It uses a powerful workflow engine to provides a fully customizeable workflow to track improvements, problems and support for any number of teams/tools/programs simultaneously. This gives the user a single point view into all the work that they are required to do.
 +
 
 +
=== Why build yet another bug tracking tool like the Action Tracking System (ATS)?  ===
  
=== Is OSEE an application framework or an application? ===
+
Although there are a number of open source and commercial bug tracking systems available, OSEE's goal to integrate workflow management and provide a tight integration with the Application Framework, and the applications built on top, required us to develop ATS. ATS is meant to be more than simple bug tracking since it can be used to manage multiple teams working on multiple products or support simultaneously. This means that you can create a single "Action" to "Fix the XYZ capability" that will create the necessary workflows for all the teams that need to perform work. For example, a workflow may be created for not only the Software Development team, but also the test team, documentation team, integration team and even facilities like labs or conference rooms. Each team then moves independently through its workflow to perform the work necessary for the common "Action". In addition, ATS enables complete customization of different workflows for each configured team. This means that the documentation team can follow their own "process" which may contain 5 different states while the application developers can follow their own more complex "process" which may contain 30 different states.  
The simple answer is BOTH.  OSEE Application Framework is created to allow applications to be built on top and share the common data model. This can be used independently of any OSEE applications. In addition, there are applications that are delivered with and use the OSEE Application Framework. This includes a full featured Requirements and Document Management System (OSEE Define), a powerful change tracking and configuration management application (OSEE ATS - Action Tracking System), a fully customizable peer-review module and other project, reporting and metrics tools. These application can be used out-of-the-box and new applications can be created or integrated on the framework to share and contribute to the same data.
+
  
=== Other products sound similar.  Why OSEE? ===
+
=== How does OSEE handle traceability? ===
* Open Source Extensible Platform
+
* Open Eclipse Project w/ Collaboration
+
* Tight Integration Around A Common Data Model
+
* Full Lifecycle Engineering Environment
+
  
=== Is OSEE only for Avionics Engineering? ===
+
[http://en.wikipedia.org/wiki/Requirements_Traceability Traceability] is handled in OSEE through the use of Relations. These relations can be defined in OSEE according to their need and the users can then add and remove these relations throughout the lifecycle of the requirements or other artifacts. Deliverable documents or any report generation would also use this traceability.  
No. OSEE's was created by The Boeing Company in support of the Apache AH-64 Attack Helicopter flight control software. Although it was created to handle the complexity of a large US Department of Defense program, it was architected to support any systems engineering project from a simple application built for a single customer to a large complex application like the Apache flight controls. In addition, since OSEE is an independent application, the OSEE development team uses OSEE to develop, deploy and maintain OSEE.
+
  
=== What is Skynet? ===
+
=== What is Define? ===
Skynet is a legacy term for the persistence portion of the OSEE Application Framework.
+
  
=== What are Artifact Framework types? ===
+
OSEE Define is OSEE's advanced Requirements and Document Management System. OSEE Define can be used to track a simple application's requirements, code and test or configured to support a large program doing concurrent development with multiple parallel builds and manage requirements for multiple product lines simultaneously. Although any application file (document) can be stored and managed, OSEE Define is tightly integrated with Microsoft Word(c) to store and manage individual requirement objects (stored in XML) and provide advanced features like index based searching and showing differences between historical changes. Integrated tightly with the Action Tracking System, OSEE Define can be configured to provide advanced configuration management for any set of requirements object.  
OSEE provides Artifacts, Attributes and Relations that are strongly
+
typed. This means that the user can create their own artifact type, for example a "Software Requirement" to represent the requirements at a software level and their own attribute types, for example a "Qualification" attribute or a "Safety Criticality" attribute and event their own relations, for example a "Software Requirement to Allocation" relation. These types are defined in the Artifact Framework and can be created dynamically in the system during database creation or while running.  This allows the end user to expand the data that is being stored in OSEE without providing a new release.
+
  
=== What is the Action Tracking System (ATS)? ===
+
== What is an HRID and how is it used? ==
The Action Tracking System is the tightly integrated configuration management system built in OSEE and very tightly integrated with the OSEE Application Framework.  It uses a powerful workflow engine to provides a fully customizeable workflow to track improvements, problems and support for any number of teams/tools/programs simultaneously.  This gives the user a single point view into all the work that they are required to do.
+
  
=== Why build yet another bug tracking tool like the Action Tracking System (ATS)? ===
+
The HRID creation, storage and use are currently under re-design. Below are the notes.  
Although there are a number of open source and commercial bug tracking systems available, OSEE's goal to integrate workflow management and provide a tight integration with the Application Framework, and the applications built on top, required us to develop ATS. ATS is meant to be more than simple bug tracking since it can be used to manage multiple teams working on multiple products or support simultaneously. This means that you can create a single "Action" to "Fix the XYZ capability" that will create the necessary workflows for all the teams that need to perform work.  For example, a workflow may be created for not only the Software Development team, but also the test team, documentation team, integration team and even facilities like labs or conference rooms.  Each team then moves independently through its workflow to perform the work necessary for the common "Action".  In addition, ATS enables complete customization of different workflows for each configured team.  This means that the documentation team can follow their own "process" which may contain 5 different states while the application developers can follow their own more complex "process" which may contain 30 different states.
+
  
=== How does OSEE handle traceability? ===
+
*HRID = Human Readable ID
[http://en.wikipedia.org/wiki/Requirements_Traceability Traceability] is handled in OSEE through the use of Relations.  These relations can be defined in OSEE according to their need and the users can then add and remove these relations throughout the lifecycle of the requirements or other artifacts.  Deliverable
+
*HRID Provider = provides the HRID when the artifact is constructed
documents or any report generation would also use this traceability.
+
  
=== What is Define? ===
+
=== Purpose  ===
OSEE Define is OSEE's advanced Requirements and Document Management System.  OSEE Define can be used to track a simple application's requirements, code and test or configured to support a large program doing concurrent development with multiple parallel builds and manage requirements for multiple product lines simultaneously.  Although any application file (document) can be stored and managed, OSEE Define is tightly integrated with Microsoft Word(c) to store and manage individual requirement objects (stored in XML) and provide advanced features like index based searching and showing differences between historical changes.  Integrated tightly with the Action Tracking System, OSEE Define can be configured to provide advanced configuration management for any set of requirements object.
+
  
== What is an HRID and how is it used? ==
+
To have a unique, short, constant, communicatable and customizable number that artifacts in the system can be referenced by. By definition, this number is database dependent which means it may occur in another database.
  
The HRID creation, storage and use are currently under re-design. Below are the notes.
+
Note: All artifacts currently have a GUID. This number id long, constant, un-consomizeable, un-communicatable, database independent number and thus could not work as the HRID.  
  
* HRID = Human Readable ID
+
=== Format  ===
* HRID Provider = provides the HRID when the artifact is constructed
+
  
=== Purpose ===
+
&lt;character sequence&gt;&lt;numeric sequence&gt;
To have a unique, short, constant, communicatable and customizable number that artifacts in the system can be referenced by.  By definition, this number is database dependent which means it may occur in another database.
+
  
Note: All artifacts currently have a GUID.  This number id long, constant, un-consomizeable, un-communicatable, database independent number and thus could not work as the HRID.
+
where '''TBD''' &lt;character squence&gt; - Alpha numeric, All caps, &gt; 1 and &lt; 6 characters &lt;numeric sequence&gt; - blank or unique numeric number, not zero padded '''TBD''' by default, the framework will provide a unique 6 character Alpha-numeric number
  
=== Format ===
+
=== Design  ===
  
<character sequence><numeric sequence>
+
ATS is one of the main consumers of this number and is thus an important portion of the design considerations.
  
where
+
*Each provider will have a unique sequence number available
'''TDB''' <character squence> - Alpha numeric, All caps, > 1 and < 6 characters
+
*One HRID Provider can be used by multiple ATS Team Definitions
<numeric sequence> - blank or unique numeric number, not zero padded
+
*Each Artifact will have at least '''TBD''' 0,1 HRID
'''TDB''' by default, the framework will provide a unique 6 character Alpha-numeric number
+
**Question still remains as to whether every artifact should have at least one HRID.
 +
**Reasons for always having
 +
***Users will always be able to reference HRID instead of switching between GUID and HRID
 +
***Code won't have to check if HRID is null if trying to get an ID for display
 +
***UI's don't have to show both GUID and HRID
 +
**Reasons against
 +
***Users don't often reference non-ats artifacts by HRID
 +
*ATS Action will have it's own provider and provide something like ACT1234. Team Workflows will provide their own sequence related to their team like CODE9233, TEST2345, REQ3243.
 +
*ATS will automatically designate the first workflow as the "driving workflow". The displayed action number will be &lt;action hrid&gt;-&lt;driving workflow hrid&gt;. Example: ACT123-REQ1134
 +
*HRID will be stored in database. '''TBD''' either in current HRID column in artifact table or as attribute on artifact
 +
**Reasons for attribute
 +
***No special queries to get at HRID
 +
***Tagging framework already works for attributes
 +
**Reasons for hrid column
 +
***Minimal framework/query changes
 +
***Searching by HRID is faster than by attribute value
 +
***Would need to limit users/API/UI from changing that special attribute
 +
***Migration of HRIDs to existing artifacts would require pushing HRID to parent branch and migrating it down to all children
 +
***Attribute value would be branched and add addressing information to all database and all branches
 +
***Attributes are for data that can be changed by user. HRID can't
  
=== Design ===
+
=== Implementation  ===
ATS is one of the main consumers of this number and is thus an important portion of the design considerations.
+
  
* Each provider will have a unique sequence number available
+
*Need tagging rules to enable numbers to be split apart and searched by either number alone or character sequence number. Example REQ3243 and 3243 should both work. Keep in mind that 3243 may return 2 objects cause prefix is what makes it unique.
* One HRID Provider can be used by multiple ATS Team Definitions
+
*ATS, and other places, will need specialized sorter to make sure REQ31 comes after REQ4
* Each Artifact will have at least '''TDB''' 0,1 HRID
+
*ATS will need to programatically set first workflow to "driving workflow" and allow user to change.  
** Question still remains as to whether every artifact should have at least one HRID.
+
*UI to configure for ATS and framework
** Reasons for always having
+
*** Users will always be able to reference HRID instead of switching between GUID and HRID
+
*** Code won't have to check if HRID is null if trying to get an ID for display
+
*** UI's don't have to show both GUID and HRID
+
** Reasons against
+
*** Users don't often reference non-ats artifacts by HRID
+
* ATS Action will have it's own provider and provide something like ACT1234.  Team Workflows will provide their own sequence related to their team like CODE9233, TEST2345, REQ3243.
+
* ATS will automatically designate the first workflow as the "driving workflow". The displayed action number will be <action hrid>-<driving workflow hrid>.  Example: ACT123-REQ1134
+
* HRID will be stored in database.  '''TBD''' either in current HRID column in artifact table or as attribute on artifact
+
** Reasons for attribute
+
*** No special queries to get at HRID
+
*** Tagging framework already works for attributes
+
** Reasons for hrid column
+
*** Minimal framework/query changes
+
*** Searching by HRID is faster than by attribute value
+
*** Would need to limit users/API/UI from changing that special attribute
+
*** Migration of HRIDs to existing artifacts would require pushing HRID to parent branch and migrating it down to all children
+
*** Attribute value would be branched and add addressing information to all database and all branches
+
*** Attributes are for data that can be changed by user.  HRID can't
+
  
=== Implementation ===
+
=== Migration  ===
* Need tagging rules to enable numbers to be split apart and searched by either number alone or character sequence number.  Example REQ3243 and 3243 should both work.  Keep in mind that 3243 may return 2 objects cause prefix is what makes it unique.
+
* ATS, and other places, will need specialized sorter to make sure REQ31 comes after REQ4
+
* ATS will need to programatically set first workflow to "driving workflow" and allow user to change.
+
* UI to configure for ATS and framework
+
  
=== Migration ===
+
*'''TBD''' keep same HRID for existing and start with new now or save HRID in ATS actions / static ids and change all historical ids using new sequence  
* '''TBD''' keep same HRID for existing and start with new now or save HRID in ATS actions / static ids and change all historical ids using new sequence
+
*
*  
+
  
 +
=== OSEE Framework Patterns ===
 +
(Work in progress)
 +
* Working with transactions
 
[[Category:OSEE]]
 
[[Category:OSEE]]

Revision as of 17:03, 14 May 2013

Contents

Architecture

Client Architecture

The central feature of OSEE is an extensible framework called the OSEE Application Framework. Default applications distributed with the OSEE framework are OSEE Define (for requirements management) and OSEE ATS (the Action Tracking System, for configuration management).

OSEE ArchitectureThe Application Framework provides all the necessary services to allow the applications to persist and share data in a common, version controlled object database. Just as Eclipse provides the ability to add a plugin to the existing Eclipse environment, so OSEE allows other applications to add plugins and share the common data store.

And just like Eclipse RCP allows an application to be built and deployed using the Eclipse framework but not include all the standard applications like JDT, OSEE allows an application to be built and deployed using the OSEE Application Framework without including such applications as OSEE Define and OSEE ATS.

Client/Server Architecture

In order to attain a greater degree of scalability, the Open System Engineering Environment (OSEE) has been slowly migrating into a distributed architecture where clients interact with an application server, which is in charge of managing access to an OSEE data store.

Additionally, in an effort to provide load balancing, failure recovery, and code compatibility, clients consult an arbitration server before connecting to an application server. The arbitration server's responsibility is to keep track of all the application servers interacting with a common data store and direct clients to a healthy application server compatible with the client's OSEE code version. In this arrangement, arbitration servers act as the initial access points into the OSEE server cloud where a collection of application servers manage client requests to access and operate on a common OSEE data store. Figure 1 shows an example of the OSEE Client/Server network.

Figure 1


In Figure 1, three application servers interact with a single OSEE data store. The data store is comprised of a relational database and a remote file system used to store binary data. It is not necessary for the database and the binary data to exist on the same machine; the only requirement is that the application servers have access to both resources. Upon start-up, each application server registers himself on the data store's server lookup table by entering its host address, port, supported code versions, and its unique id. When the arbitration server receives a request to find an application server to support a client connection, the arbitration server reads the data store's server lookup table and selects the best match for the client. The client requests this information from the arbitration server upon start-up or whenever it can't communicate with an application server. It is important to note that the arbitration server does not have to be a different server than an application server. All application servers are able to act as an arbitration server. An application server is referred to as an arbitration server when clients interact with it in this context. Figure 2 depicts the sequence of events involved in the arbitration process.

Figure 2

Once a client receives an application server's address and port information, the client must authenticate with the application server before it can gain access to the OSEE data store. During the authentication process, a client submits to the application server the current user's credential information and the authentication protocol id to use during the process. The application server verifies the user via the selected protocol and grants access to the data store by creating a session for the user. From this point forward, the application server will be responsible for managing access to the data store by identifying the user via the session id. Whenever a client wants to interact with the application server, it will need to submit its session id in order to gain access to the OSEE data store. Figure 3 shows the sequence of events involved in the authentication process.

Figure 3

Data Model

The OSEE framework is built around a user configurable and extensible data model consisting of attributes, artifacts, and relations. An attribute is a key-value pair representing a single data element such as a description, a date, a number, or a file. These basic data elements are grouped into artifacts. Artifacts can be configured to have any number of attributes. By default, an artifact will always have an attribute of type name. In addition, artifacts can be related to one another via relations. By default, an artifact will always have a default hierarchy relation type. This allows artifacts to be connected together in a tree. In the example below, two instances of the basic artifact type are shown. Artifact 1 has an attribute of type name set to string data "X". Artifact 2 has an attribute of type name set to string data "Y". These two artifact instances are related via the default hierarchy relation type. Artifact 1 is Artifact 2's parent artifact.

Basic artifact.png

Now that we have a basic understanding of the model, lets take a closer look at attributes and how they are defined.

An attribute is defined through its attribute type. The attribute type is a blue print for constructing attribute instances. It defines the type of data the will be held by the attribute, the data source or who provides it, how many instances can be created, default value to use during creation, whether the attribute can be tagged for word searches, and if the attribute holds file data, its file extension.

By default, data contained in the attribute can be represented through OSEE's basic data types:

  • String Attribute
  • Boolean Attribute
  • Integer Attribute
  • Floating Point Attribute
  • Date Attribute
  • Enumerated Attribute

AttributeType.png

OSEE provides three attribute data providers: the default attribute data provider, URI attribute data provider, and the Clob attribute data provider.

  • The default attribute data provider is used for data containing less than 4000 characters in length. Data is stored and retrieved from the OSEE relational database. Most attribute types will use this data provider to handle its data content.
  • The URI attribute data provider is used for large data. The provider communicates to the OSEE application server to store and retrieve data.
  • The Clob attribute data provider is a hybrid provider using both the OSEE relational database and the application server to retrieve and store data. When the data contained by the attribute has less than 4000 characters, the provider uses the relational database. If the data exceeds the 4000 character limit, then the application server is used.

Configuration Properties

OSEE can be configured by setting certain Java system properties when launching Eclipse and by setting various attribute values on the Global Preferences artifact in the datastore. Java system properties are key/value pairs and can be passed as launch arguments in the form of -D<key>=<value> (i.e. -Dosee.authentication.protocol=trustAll). These -D options can be specified directly in the command to launch Eclipse or in the corresponding .ini file for the eclipse executable used.

Datastore Preferences (via Global Preferences artifact)

Do a Quick Search on the Common branch for "Global Preferences" and open the resulting artifact in the artifact editor. The available attribute types for this artifact define what can be configured. Each attribute is self-documenting, because the attribute tip text documents how to use each one.

Common Java System Properties

System Property Name Values Default Description
osee.connection.info.uri [FILE SYSTEM PATH] File system path or uri containing custom database connection information.
osee.db.connection.id <db identifier> Default from db.connection file Specifies which database OSEE should connect to. This id references connection information specified in the ...db.connection.xml file. Refer to the Database Connection Information section for more information.
osee.jini.forced.reggie.search true, false false If true, adds the lookupList to the global lookup list such that a refresh will try to locate the service again
osee.jini.lookup.groups user defined group name the Jini Group that all OSEE provided Jini services will register with
osee.log.default FINE, INFO, WARNING, SEVERE WARNING the default logging level for all loggers
osee.port.scanner.start.port 1 - 65535 18000 the first port number to test for availability when a new port is needed

Application Server Java System Properties

System Property Name Values Default Description
org.osgi.service.http.port 1 - 65535 -1 Port the client will use to communicate with the OSEE Application Server
osee.application.server.data [FILE SYSTEM PATH] User Home A directory on the file system to be used by the application server to store and serve artifact binary data.
osee.db.embedded.server [<address>:<port>] When specified, this system property sets the URL used to launch an embedded database server.
osee.version [<"version 1">;<"version 2">] When specified, this system property sets the application server's supported client versions. NOTE: version string can use regular expressions
osee.check.tag.queue.on.startup true, false false When specified, this system property allows the application server to check the tag queue and begin tagging and pending tag jobs.

Client Java System Properties

System Property Name Values Default Description
osee.application.server <address>:<port> When specified, this system property sets the URL used to reference the application server and arbitration is bypassed.
osee.arbitration.server <address>:<port> The arbitration server address and port to use. This system property must be specified for the system to gain access to OSEE data. If the application server property is set then that address takes precedence and arbitration is bypassed.
osee.authentication.protocol protocol name protocol to be used by the client to authenticate with the server
osee.choice.on.db.init choice name the predefined database initialization choice
osee.file.specified.schema.names.on.db.init true, false false Specifies whether OSEE database initialization should use the schema names specified in the schema.xml files instead of using the connection schema. Using the connection specified schema is the default behavior.
osee.import.from.connection.id.on.db.init [FILE SYSTEM PATH] Specifies where table data should be imported from during OSEE database initialization. The default is to use the database connection id specified in the schema.xml files.
osee.import.on.db.init true, false false Specifies whether OSEE database initialization should import database data as part of its tasks.
osee.local.application.server true, false false When set to true launches an application server upon start up. Uses org.osgi.service.http.port arg to determine port to use.
osee.local.http.worker.port <port> Port Scan starting from 18000 Port to use for local worker server.
osee.prompt.on.db.init true, false true Specifies whether to interactively prompt the user during database initialization for init choice
osee.record.activity true, false true Specifies whether user activity should be logged
osee.ote.benchmark true, false
osee.ote.cmd.console true, false Specifies whether to enable the OTE command console
osee.ote.server.title free text name name given to the OTE server which is displayed in the test manager
osee.ote.timing.log.path
osee.ats.ignore.config.upgrades true, false

Setting Up Clients and Multiple Servers to work together

As described in the Architecture Section [1], the Clients can be configured to choose a particular server or group of servers. By specifying a server version, the arbitration server will pick only the application servers that are configured to work with the client. For instance, the configuration would make it possible to choose only servers in the same location as the clients.

Steps:
1. Configure each application server on the local server machine(s) to support the local clients.
    a) Set the osee.version system property to a string that will provide a common property to use with the OSEE Client.
        Example: In the VM Arguments for the server startup, add:
        –Dosee.version=”localSiteName”
    b) Set the osee.application.server.data to a location on the server for the local copy of the application data
        Example: -Dosee.application.server.data=”path/to/local/data”
        Note: this local path could be rsync’d to another site to improve local data performance
    c) Set the http port to the port number for the client to access the server on
        Example: -Dorg.osgi.service.http.port=8092
2. Configure the OSEE Client to connect to the one of the servers as an arbitration server
    a) Set the osee.arbitration.server system property to the URL for one of the application servers configured in step 1.
        Example: -Dosee.arbitrations.server=http://your.server.com:8092
    b) Set the osee.version system property to match the application server(s)
        Example: –Dosee.version=”localSiteName”

Developer Workspace Configuration

Import Java Code Auto Formatting Preferences

  1. Start OSEE
  2. File-->Import...
  3. Select General/Preferences
  4. Click Next >
  5. Click Browse and navigate to (and select) the file [workspace_root]\org.eclipse.osee\plugins\org.eclipse.osee.support.config\osee_team_preferences.epf
  6. Click Open
  7. Check Import all
  8. Click Finish

Configure New Code Template Preferences

  • Window-->Preferences
  • Java/Code Style/Code Templates
  • Code/New Java Files
  • Click Edit...
  • Paste the following (or some variant).  Be careful not to modify the template variables, i.e.: "${package_declaration}":
/*******************************************************************************
 * Copyright (c) 2012 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
${package_declaration}
/**
 * @author Joe P. Schmoe
 */
${typecomment}
${type_declaration}
  • Code/Catch block body
  • Click Edit...
  • Paste the following (or some variant):
OseeLog.log(Activator.class, Level.SEVERE, ${exception_var});


Database Connection Information

To define a custom database connection for the application server, a path to an xml with the following format is required when launching the application server. This path will need to be specified using the osee.connection.info.uri and osee.db.connection.id JVM arguments on launch.


<?xml version="1.0" encoding="UTF-8" ?>
<DbConnection>

<DatabaseInfo id="postgresqlInfo" >
  <DatabaseHome key="#DBHOME#" value="DATABASE HOME LOCATION" />
  <DatabaseName key="#DBNAME#" value="DATABASE NAME" />
  <DatabaseType key="#TYPE#" value="postgresql" />
  <Prefix key="#PREFIX#" value="jdbc:postgresql" />
  <UserName key="#USERNAME#" value="DATABASE USERNAME" />
  <Password key="#PASSWORD#" value="DATABASE PASSWORD" />
  <Host key="#HOST#" value="@AvailableDbServices.hostAddress" />
  <Port key="#PORT#" value="@AvailableDbServices.port" />
</DatabaseInfo>

<ConnectionDescription id="postgresql" >
  <Driver>org.postgresql.Driver</Driver>
  <Url>#PREFIX#://#HOST#:#PORT#/#DBHOME##DBNAME#</Url>
</ConnectionDescription>

<AvailableDbServices>
  <Server id="ANY NAME" dbInfo="postgresqlInfo" 
          hostAddress="DATABASE IP ADDRESS" port="DATABASE PORT" 
          connectsWith="postgresql" isProduction="false" />
</AvailableDbServices>
</DbConnection>


The sample file above defines PostgreSql connections but it can be changed easily to define oracle or H2 connections.

The file is divided as follows:

  • Database Info: This entry describes the database to connect to by defining the database name, database home location and user name (or schema) and password to use during connection. When using the OSEE PostgreSql installation instructions, the fields should be set to the following:
    • DATABASE HOME LOCATION: not used therefore remove the value field from this attribute
    • DATABASE NAME: OSEE
    • DATABASE USERNAME: osee
    • DATABASE PASSWORD: osee
  • Connection Description: This entry describes how the database connection url should be assembled. At connection time, the fields enclosed in ## are substituted with the information defined in the database info section. There shouldn't be a need to change this unless you want to connect to a database other than PostgreSQL.
  • Available Database Services: This section contains entries for each database server and connection option needed at launch time. An entry is referenced at launch time by calling out the entry id in the osee.db.connection.id argument. When using a local OSEE PostgreSql install, the attributes on a server entry should be set to the following:
    • id: any meaningful name to identify this entry
    • hostAddress: localhost
    • port: 5432 (the default PostgreSql port)
    • isProduction: false unless you want to prevent clients from initializing the database

Custom Data Model

The data model in OSEE is extensible and user configurable. Users can define new artifact, attribute, and relation types and their constraints such as multiplicity and applicability. Type inheritance allows similar types to be defined and modified without tedious redundancy because similar types inherit what is common from their super type.

The OSEE data model is defined using a tabular format involving 5 tables. See the following link for an example.

The full data model can be defined using a single spreadsheet or be divided among multiple spreadsheets that can reference types defined in any spreadsheet.

Artifact Type Table

Column Name Description
Artifact Type Name any valid UTF-8 characters with a max length of 75 bytes
Super Type Name The super artifact type from which this type will inherit associated attributes and relations. Another concrete artifact type or an abstract one that exists only in data model definition.

Artifact Factory

When defining new artifact types, by default, the Java class used to create the artifact at runtime is org.eclipse.osee.framework.skynet.core.artifact.Artifact. When a specialized subtype of Artifact is desired, the extension point org.eclipse.osee.framework.skynet.core.ArtifactFactory can be used to contribute an artifact factory that extends the class org.eclipse.osee.framework.skynet.core.artifact.ArtifactFactory. The factory's isResponsibleFor(String artifactTypeName) method determines if a particular factory will be used to construct an artifact of a given artifact type. Thus the artifact factory extension point can be used to case user defined artifact types to be constructed at runtime using a custom Java class that extends Artifact.

Attribute Type Table

Column Name Description
Attribute Base Type

Fully qualified java class name of a class that extends org.eclipse.osee.framework.skynet.core.attribute. The typical and simplest case is to specify one of the built-in types:

  • org.eclipse.osee.framework.skynet.core.BooleanAttribute
  • org.eclipse.osee.framework.skynet.core.CompressedContentAttribute
  • org.eclipse.osee.framework.skynet.core.JavaObjectAttribute
  • org.eclipse.osee.framework.skynet.core.DateAttribute
  • org.eclipse.osee.framework.skynet.core.FloatingPointAttribute
  • org.eclipse.osee.framework.skynet.core.IntegerAttribute
  • org.eclipse.osee.framework.skynet.core.StringAttribute
  • org.eclipse.osee.framework.skynet.core.EnumeratedAttribute
  • org.eclipse.osee.framework.skynet.core.WordTemplateAttribute
  • org.eclipse.osee.framework.skynet.core.WordWholeDocumentAttribute

If a custom java type that extends Attribute is needed, then that type should be specified here.

Attribute Data Provider The attribute data provider is responsible for storing and retrieving attribute data. Fully qualified java class name of a class that implements org.eclipse.osee.framework.skynet.core.attribute.providers.IAttributeDataProvider. org.eclipse.osee.framework.skynet.core.DefaultAttributeDataProvider may be used when the data to be stored does not exceeded 4000 bytes, otherwise org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider may be used.
Attribute Type Name Any valid UTF-8 characters with a max length of 500 bytes
File Extension Any valid UTF-8 characters with a max length of 50 bytes; only applies when using the org.eclipse.osee.framework.skynet.core.UriAttributeDataProvider
Tagger ID If the attrbiute’s content is to be included in the search index for the quick search, use DefaultAttributeTaggerProvider, otherwise leave blank.
Default Value The initial value given an attribute upon initialization, this may be left blank
Validity Xml For the attribute base type org.eclipse.osee.framework.skynet.core.EnumeratedAttribute, specifies the valid enumerations. For example, <Page_Type><Enum>Portrait</Enum><Enum>Landscape</Enum></Page_Type>
Min Occurrence The framework with prevent having lest than this number of this attribute type on a single artifact
Max Occurrence The framework with prevent adding more than this number of this attribute type to a single artifact
Tip Text Text to describe an attribute. Any valid UTF-8 characters with a max length of 4000 bytes

Artifact Type / Attribute Type Mapping Table

Column Name Description
Artifact Type Name Exact name of an artifact type defined above (or previously)
Attribute Type Name Exact name of an attribute type defined above (or previously) to be associated with the corresponding artifact type

Relation Type Table

Column Name Description
Relation Type Name Any valid UTF-8 characters with a max length of 50 bytes
Side A Name Descriptive name for the A side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
A to B Phrase An optional phrase that describe the relation between the artifacts from the side A perspective. Any valid UTF-8 characters with a max length of 50 bytes
Side B Name Descriptive name for the B side of the relation. Any valid UTF-8 characters with a max length of 50 bytes
B to A Phrase An optional phrase that describe the relation between the artifacts from the side B perspective. Any valid UTF-8 characters with a max length of 50 bytes
Short Name Five or less characters is typical. This abbreviated name is used in the user interface when space is at a premium
Ordered Yes to have artifacts on the same side of this relation type use a user defined ordered, otherwise No

Artifact Type / Relation Type Mapping Table

Column Name Description
Artifact Type Exact name of an artifact type defined above (or previously)
Relation Type Exact name of an relation type defined above (or previously)
Side A Max An artifact of type "Artifact Type" can be on side "A", "Side A Max" number of times for relation links of type "Relation Type"
Side B Max An artifact of type "Artifact Type" can be on side "B", "Side B Max" number of times for relation links of type "Relation Type"

Importing an OSEE Data Model

To import changes to the data model for an existing OSEE database:

  1. In Package Explorer, Select a file(s) containing the OSEE data model to import. If there are any enum overrides, you must select them either explicitly or by import statement (hierarchically).
  2. Right click and select Import...
  3. Under the OSEE category, select OSEE Types
  4. Ensure that all types files are included in Resolved dependencies and Report Changes is checked. Select Finish.
  5. Review all tabs to ensure that all changes are expected.
    1. Osee Default Enum will always show up on OseeEnum Types tab
    2. Ensure each column's data is correct. All "true" values are what is being changed.
  6. When ready to persist changes, you must restart the client (Still Necessary??) and only run import once with Persist Changes checked

To automatically import the data model during database initialization use the extension point org.eclipse.osee.framework.skynet.core.OseeTypes

OSEE Branches

OSEE Branches

Workspace Setup

Workspace Setup

Downloading and Configuring Eclipse

Downloading and Configuring Eclipse

Working with GIT

Working with Git

Testing

JUnit Method Rules:

Rule class Description Example
OseeHousekeepingRule Checks if the Artifact Cache is clean
 public class MyTest {
  @Rule
  public MethodRule oseeHousekeepingRule = new OseeHousekeepingRule();

@Test public void testArtifactChangeName() throws Exception { //Arifact change name code } }


Location of OSEE Bundles

Location of OSEE Bundles

Migrating Branches to Another OSEE Database (including from previous OSEE version)

  1. From the source application server's osgi console: export_branch myExportFolder
  2. The results will be placed in <user home>\Exchange\myExportFolder
  3. Zip the resulting folder and save it for possible reuse
  4. Run database initialization on destination database

eclipsec -application org.eclipse.osee.framework.database.init.configClient -vmargs -Xmx512m -Dosee.log.default=INFO -Dosee.application.server=http://localhost:8089 -Dosee.authentication.protocol=trustAll -Dosee.prompt.on.db.init=false -Dosee.choice.on.db.init="Base - for importing branches"

  1. Import any custom types into the destination database
  2. From the destination application server's osgi console: import_branch <user home>\Exchange\myExportFolder
  3. From the application server run tag_all
  4. Restart destination application server
  5. Start corresponding OSEE client

Configuring ATS for Change Tracking

Configuring ATS for Change Tracking

Custom OSEE Operations using BLAM

the extension point org.eclipse.osee.framework.ui.skynet.BlamOperation can be used to contribute a custom OSEE operation that provides the developer a very quick way to define the graphical interface that supplies the operation with the user specified parameters. org.eclipse.osee.framework.ui.skynet.blam.operation.ChangeArtifactTypeBlam provides a simple example.

Event Handling

General Design Considerations

  • Event Handlers should run VERY quickly
  • A private implementation is more secure
  • Separate classes == maintainable but potentially costly
  • Ensure each listener is safeguarded from other listeners (wrap in event handling)

Requirements

  • Need local client events and remote events to other clients
    • Local event model should be abstracted from remote model so app code doesn't change
    • Remote events should be versioned so event service can know how to handle
  • Need to handle events where artifact or relation is not in client's cache, but event may still matter
    • Client can't load every artifact to determine if it's desired
    • Registration needs to be at base level guid,artTypeId,branchId so these can be filtered out without loading all artifact data.
  • Need to provide lowest level registration (branch, artType and possibly even attrType) so event msgs reduced
  • Need to support versions of remote events so remote event model can change without causing exceptions
  • MUST have regression tests that are light-weight and easy to run so event service doesn't break
  • Since Artifact, Relation, Attribute types are dynamic, can't create static message model/brokers
  • Since artifact/relation/branch caches must be updated PRIOR to events propagate to GUI
    • Need priority listeners for caches to update prior to UI updates
  • Applications should be able to define their own higher level events while still listening to lower level events

Event Handling Revelations

  • Reduce the necessity of events as much as possible - Restful
  • Data injection to keep caches up-to-date a complex/impossible solution for enterprise, multi-client, multi-server operations
  • All clients MUST be connected to event service if connected to database/app service
  • Applications shouldn't have to know what events to handle, but instead presented all the events to handle
    • Don't have separate purge, modified, change type events, but instead Artifact listener that has change types of purge, modified, deleted, change type, etc
  • Since artifacts/relations are cached, application to application events are prone to errors if cache not updated yet

Event Handling Ideas / Goals

  • How could we have a version for each artifact so clients could know if they are up-to-date or missed an update and reload-all. This would allow for self-healing.
  • Reduce the items in the cache by improving our use of weak references. Anything not in the cache, doesn't have to get updated
  • Move configurations that have to be loaded by all clients to the server. Branch and type caches already there. Users and ATS Config could go there.
  • Is there a way to have events go straight to UIs (Editors, Views) to see if anyone cares that the cache is updated before updating the cache?

OSEE Event Handling - Current

  • Design Issues
    • Communication mechanism - Jini
      • Clients are not connecting
      • Clients not staying connected
    • Event System
      • Events are at the data level; applications are required to turn high level operations (eg: save, transition) into low level data events (30 attributes modified, 10 relations added, 5 deleted) which are sent across the wire to another client to re-assemble into a high level operation.
      • Registration is for too high a level, each editor,view has to process through all events to find ones they care about
      • Have to filter between loaded and unloaded artifacts and handle them differently so as not to accidentally load everything
      • Have to register/handle separately for deleted versus purged
      • Two levels of registration for artifacts/attributes/relations, by transaction and by dirty. By dirty is too much information, but necessary sometimes. By transaction is ok, but have to filter through all un-necessary stuff to find what want. Dangerous and costly.
      • Access control is not handled in events
      • Not extensible, so applications can't create/propagate their own events
  • Registration
    • ArtifactPurgedEvent
    • FrameworkTransactionEvent
    • RelationModifiedEvent
    • BranchEvent

OSEE Event Handling - New

  • Registration - Need lower level registration of framework events
    • By Artifact (branch, guid)
    • By Object Type (artifact, attribute, relation) - include inheritance
    • By Mod Type (added, modified, deleted, purged)
    • By Transaction (persist to DB of group of changes)
    • By Combinations (Artifact type and relation type or Artifact type and attribute type)
  • ArtifactEventManager
    • Sends BasicGuidArtifact for each mod type
    • Modification Types: Purged, Added, Modified, Deleted, Change Type, Access Control
    • Allow registration with filters
      • ArtifactGuidFilter - only sends event if artifact is affected
      • BranchGuidFilter - only send event if artifact on this branch is affected
      • ArtifactTypeGuidFilter - only sends event if artifact of one of these types is affected
  • BranchEventManager
    • Modification Types: Added, Deleted, Purged, Access Control, Renamed
    • Allow registration with same filters as Artifact
  • Remote events are different and versioned classes so abstract from framework events
  • Created via jaxb

Event Model

Remote Events

  1. Remote events classes are auto-generated via jaxb which keeps toXml, fromXml implementation hidden and thus requires less junit tests for base clasess.
  2. Each class is versioned by name (1, 2, 3). When RemoteBranchEvent1 changes, will create RemoteBranchEvent2 so there is no conflicts and implement backward compatibility that will
    1. Create RemoteBranchEvent2 events when RemoteBranchEvent1 are received - for old clients
    2. Create RemoteBranchEvent1 events when RemoteBranchEvent2 are received - for new clients
  3. Current classes:
    1. RemoteAccessControlArtifactsEvent1.java
    2. RemoteAttributeChange1.java
    3. RemoteBasicGuidArtifact1.java
    4. RemoteBasicModifiedGuidArtifact1.java
    5. RemoteBranchEvent1.java
    6. RemoteBranchRenameEvent1.java
    7. RemoteBroadcastEvent1.java
    8. RemoteChangeTypeArtifactsEvent1.java
    9. RemoteNetworkSender1.java
    10. RemotePurgedArtifactsEvent1.java
    11. RemoteTransactionDeletedEvent1.java
    12. RemoteTransactionEvent1.java

Framework Events / Listeners

  • ArtifactEvent
  • BranchEvent
  • BroadcastEvent
  • AccessControl?? - Potentially roll into ArtifactEvent
  • TransactionDeleted?? - Potentially roll into ArtifactEvent

Use Cases

  • Artifact Editor
    • Current Design
      • Registration = All Branches, Mod Types, Object Types
      • Handling
        • If not branch, throw away
        • If unloaded, ignore
        • If loaded refresh/update all
        • If relation, refresh relation tree
        • If attribute, refresh attribute tab
    • New Design
      • Registration = One guid and relations for that guid
      • Handling
        • If relation, refresh relation tree
        • If attribute, refresh attribute tab
  • Artifact Explorer
    • Current Design
      • Registration = All Branches, Mod Types, Object Types
      • Handling
        • If not branch, throw away
        • If unloaded, ignore
        • If loaded refresh/update all
        • If relation, get parent and call tree.refresh()
        • If attribute (name only), call tree.update(element)
    • New Design
      • Registration = One branch, One relation type, All Object Types
      • Handling = About the same, but don't have to filter through un-necessary stuff
  • SMA Editor - Edits single team workflow, but watches related tasks, reviews, user assignments, etc
    • Current Design
      • Registration = purged, relation modified, framework transaction, branch event. NOTE: Should register by branchId (Common), guids of workflows, artifact types (eg. don't care about general document artifact type changes on common)
      • Handling
        • If not Common branch or in transition, ignore all artifact/relation/attribute changes
        • If is purged/deleted, close editor
        • If is modified, deleted, relChanged, relDeleted, relAdded of main artifact, redraw pages
        • If related review is any of above, redraw pages
        • If relation modified, dirty editor
        • If branch event and working branch added, deleted, purged, committed, redraw pages
    • New Design
      • Registration - One branch, 12 artifact types
      • Handling = About the same, but don't have to filter through un-necessary stuff

References

Building OSEE using Tycho/Maven

Build Requirements

  • Java Runtime Environment (JRE) 1.6 or higher
  • Maven 3.0 or higher

Build Steps

  1. Download and install Maven. See http://maven.apache.org for installation details.
  2. Download the OSEE source code from Git Web Client (see clone section for more information] or https://github.com/eclipse/osee
    Note: Tycho/Maven build support available for source code versions 0.9.9_SR6 and higher.
  3. Download and unzip 3rd party dependency P2 archived site: http://code.google.com/p/osee-external/downloads/detail?name=org.eclipse.ip.p2_1.0.0.v201203200040-DEV.zip&can=2&q=
  4. Build commands:
    1. cd org.eclipse.osee/plugins/org.eclipse.osee.parent
    2. mvn clean verify -Declipse-ip-site="file:<PATH TO 3rd PARTY P2 SITE>"
    3. If you run into any problems (to display debug and stack trace info)
      mvn -e -X verify -Declipse-ip-site="file:<PATH TO 3rd PARTY P2 SITE>"
Assuming the following layout:
/UserData/org.eclipse.osee
/UserData/org.eclipse.ip.p2_1.0.0.v201203200040-DEV

machine@user /UserData/org.eclipse.osee/plugins/org.eclipse.osee.parent:
$mvn clean verify -Declipse-ip-site="file:../../../org.eclipse.ip.p2_1.0.0.v201203200040-DEV"

Interactive Build

Depends on org.eclipse.osee.ip.p2
To build all org.eclipse.osee artifacts
  1. cd org.eclipse.osee/plugins/org.eclipse.osee.support.maven
  2. Issue maven build command: mvn compile
  3. Select build options when prompted

Build Module Hierarchy (from highest to lowest)

  1. org.eclipse.osee.parent
    1. org.eclipse.osee.ide.parent
      1. org.eclipse.osee.client.all.parent
      2. org.eclipse.osee.client.parent
      3. org.eclipse.osee.ote.parent
      4. org.eclipse.osee.runtime.parent
    2. org.eclipse.osee.x.parent
      1. org.eclipse.osee.x.server.parent
      2. org.eclipse.osee.orcs.parent
      3. org.eclipse.osee.x.core.parent

Build Artifacts

Path Artifact Description
plugins/org.eclipse.osee.client.all.p2/target/ repository/ OSEE IDE Client P2 Site
org.eclipse.osee.client.all.p2.zip OSEE IDE Client P2 Archived Update Site
plugins/org.eclipse.osee.client.all.product/target/products/ build_label.txt OSEE Build Information
org.eclipse.osee.ide.id-linux.gtk.x86.tar.gz OSEE Client IDE All-In-One Linux x86
org.eclipse.osee.ide.id-linux.gtk.x86_64.tar.gz OSEE Client IDE All-In-One Linux x86 64-bit
org.eclipse.osee.ide.id-win32.win32.x86.zip OSEE Client IDE All-In-One Win32 x86
org.eclipse.osee.ide.id-win32.win32.x86_64.zip OSEE Client IDE All-In-One Win32 x86 64-bit
plugins/org.eclipse.osee.x.server.p2/target repository/ OSEE Application Server P2 Site
server/ OSEE Application Server
org.eclipse.osee.x.server.p2.zip OSEE Application Server Archived Update Site
org.eclipse.osee.x.server.runtime.zip OSEE Application Server Zipped Runtime

OSEE System Requirements

  • System with at least 1GB of RAM
  • Relational database. H2 is included by default. If you wish to use something else such as PostgreSQL or Oracle, please see instructions for installing Supported Databases to complete this step.

Database Schema

TODO: add html generated from SKYNET_VERSIONING.xml file.

How to Define Classes for Coverage Importing

The following steps walk a developer through defining the classes necessary to begin importing coverage data into the OSEE application.  Please keep in mind that these are meant to be simplified examples and developers are encouraged to 'get creative' when adapting these examples to their own particular context.
TestWorkflow.png

1. Write a class that extends AbstractCoverageBlam

public class MyCoverageImportBlam extends AbstractCoverageBlam {
   public static String COVERAGE_IMPORT_DIR = "Coverage Import Directory";
   public static String NAMESPACE = "Code Namespace";

   @Override
   public String getName() {
      return "My Coverage Import";
   }

   @Override
   public Collection<String> getCategories() {
      return Arrays.asList("Blams");
   }

   @Override
   public String getDescriptionUsage() {
      return "Import coverage from coverage directory.";
   }

   @Override
   public void runOperation(final VariableMap variableMap, IProgressMonitor monitor) throws Exception {
      try {
         final String coverageInputDir = variableMap.getString(COVERAGE_IMPORT_DIR);
         if (!Strings.isValid(coverageInputDir)) {
            throw new OseeArgumentException("Must enter valid filename.");
         }
         final String namespace = variableMap.getString(NAMESPACE);
         if (!Strings.isValid(namespace)) {
            throw new OseeArgumentException("Must enter valid namespace.");
         }

         File file = new File(coverageInputDir);
         if (!file.exists()) {
            throw new OseeArgumentException("Invalid filename.");
         }

         MyCoverageImporter myCoverageImporter = new MyCoverageImporter(coverageInputDir, namespace);
         CoverageImport coverageImport = myCoverageImporter.run(monitor);
         setCoverageImport(coverageImport);
      } catch (Exception ex) {
         OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
      }
   }

   @Override
   public String getXWidgetsXml() {
      StringBuffer buffer = new StringBuffer("<xWidgets>");
      buffer.append("<XWidget xwidgetType=\"XDirectorySelectionDialog\" " + getDefaultDirectory() + " displayName=\"" + COVERAGE_IMPORT_DIR + "\" />");
      buffer.append("<XWidget xwidgetType=\"XText\" displayName=\"" + NAMESPACE + "\" />");
      buffer.append("</xWidgets>");
      return buffer.toString();
   }

   private String getDefaultDirectory() {
      if (CoverageUtil.isAdmin()) {
         return " defaultValue=\"C:\\UserData\" ";
      }
      return "";
   }

}

2. Define a class that implements ICoverageImporter

public class MyCoverageImporter implements ICoverageImporter {
   private final String coverageInputDir;
   private final String namespace;
   private final CoverageImport coverageImport = new CoverageImport("My Coverage Import");

   public MyCoverageImporter(String coverageInputDir, String namespace) {
      this.coverageInputDir = coverageInputDir;
      this.namespace = namespace;
   }

   @Override
   public String getName() {
      return "My Coverage Importer";
   }

   @Override
   public CoverageImport run(IProgressMonitor progressMonitor) throws OseeCoreException {
      /*
       * Use any member variables to populate coverageImport
       */
      return coverageImport;
   }

}

3. Add extension point declaration to package's plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.osee.framework.ui.skynet.BlamOperation">
      <Operation
            className="com.my.coverage.MyCoverageImportBlam">
      </Operation>
   </extension>
</plugin>


Helpful links

Design Questions

I have strange eclipse/osee issues can I delete stuff from my configuration folder?

yes. Everything except:

  config.ini
 org.eclipse.equinox.simpleconfigurator

Is OSEE an application framework or an application?

The simple answer is BOTH. OSEE Application Framework is created to allow applications to be built on top and share the common data model. This can be used independently of any OSEE applications. In addition, there are applications that are delivered with and use the OSEE Application Framework. This includes a full featured Requirements and Document Management System (OSEE Define), a powerful change tracking and configuration management application (OSEE ATS - Action Tracking System), a fully customizable peer-review module and other project, reporting and metrics tools. These application can be used out-of-the-box and new applications can be created or integrated on the framework to share and contribute to the same data.

Other products sound similar. Why OSEE?

  • Open Source Extensible Platform
  • Open Eclipse Project w/ Collaboration
  • Tight Integration Around A Common Data Model
  • Full Lifecycle Engineering Environment

Is OSEE only for Avionics Engineering?

No. OSEE's was created by The Boeing Company in support of the Apache AH-64 Attack Helicopter flight control software. Although it was created to handle the complexity of a large US Department of Defense program, it was architected to support any systems engineering project from a simple application built for a single customer to a large complex application like the Apache flight controls. In addition, since OSEE is an independent application, the OSEE development team uses OSEE to develop, deploy and maintain OSEE.

What is Skynet?

Skynet is a legacy term for the persistence portion of the OSEE Application Framework.

What are Artifact Framework types?

OSEE provides Artifacts, Attributes and Relations that are strongly typed. This means that the user can create their own artifact type, for example a "Software Requirement" to represent the requirements at a software level and their own attribute types, for example a "Qualification" attribute or a "Safety Criticality" attribute and event their own relations, for example a "Software Requirement to Allocation" relation. These types are defined in the Artifact Framework and can be created dynamically in the system during database creation or while running. This allows the end user to expand the data that is being stored in OSEE without providing a new release.

What is the Action Tracking System (ATS)?

The Action Tracking System is the tightly integrated configuration management system built in OSEE and very tightly integrated with the OSEE Application Framework. It uses a powerful workflow engine to provides a fully customizeable workflow to track improvements, problems and support for any number of teams/tools/programs simultaneously. This gives the user a single point view into all the work that they are required to do.

Why build yet another bug tracking tool like the Action Tracking System (ATS)?

Although there are a number of open source and commercial bug tracking systems available, OSEE's goal to integrate workflow management and provide a tight integration with the Application Framework, and the applications built on top, required us to develop ATS. ATS is meant to be more than simple bug tracking since it can be used to manage multiple teams working on multiple products or support simultaneously. This means that you can create a single "Action" to "Fix the XYZ capability" that will create the necessary workflows for all the teams that need to perform work. For example, a workflow may be created for not only the Software Development team, but also the test team, documentation team, integration team and even facilities like labs or conference rooms. Each team then moves independently through its workflow to perform the work necessary for the common "Action". In addition, ATS enables complete customization of different workflows for each configured team. This means that the documentation team can follow their own "process" which may contain 5 different states while the application developers can follow their own more complex "process" which may contain 30 different states.

How does OSEE handle traceability?

Traceability is handled in OSEE through the use of Relations. These relations can be defined in OSEE according to their need and the users can then add and remove these relations throughout the lifecycle of the requirements or other artifacts. Deliverable documents or any report generation would also use this traceability.

What is Define?

OSEE Define is OSEE's advanced Requirements and Document Management System. OSEE Define can be used to track a simple application's requirements, code and test or configured to support a large program doing concurrent development with multiple parallel builds and manage requirements for multiple product lines simultaneously. Although any application file (document) can be stored and managed, OSEE Define is tightly integrated with Microsoft Word(c) to store and manage individual requirement objects (stored in XML) and provide advanced features like index based searching and showing differences between historical changes. Integrated tightly with the Action Tracking System, OSEE Define can be configured to provide advanced configuration management for any set of requirements object.

What is an HRID and how is it used?

The HRID creation, storage and use are currently under re-design. Below are the notes.

  • HRID = Human Readable ID
  • HRID Provider = provides the HRID when the artifact is constructed

Purpose

To have a unique, short, constant, communicatable and customizable number that artifacts in the system can be referenced by. By definition, this number is database dependent which means it may occur in another database.

Note: All artifacts currently have a GUID. This number id long, constant, un-consomizeable, un-communicatable, database independent number and thus could not work as the HRID.

Format

<character sequence><numeric sequence>

where TBD <character squence> - Alpha numeric, All caps, > 1 and < 6 characters <numeric sequence> - blank or unique numeric number, not zero padded TBD by default, the framework will provide a unique 6 character Alpha-numeric number

Design

ATS is one of the main consumers of this number and is thus an important portion of the design considerations.

  • Each provider will have a unique sequence number available
  • One HRID Provider can be used by multiple ATS Team Definitions
  • Each Artifact will have at least TBD 0,1 HRID
    • Question still remains as to whether every artifact should have at least one HRID.
    • Reasons for always having
      • Users will always be able to reference HRID instead of switching between GUID and HRID
      • Code won't have to check if HRID is null if trying to get an ID for display
      • UI's don't have to show both GUID and HRID
    • Reasons against
      • Users don't often reference non-ats artifacts by HRID
  • ATS Action will have it's own provider and provide something like ACT1234. Team Workflows will provide their own sequence related to their team like CODE9233, TEST2345, REQ3243.
  • ATS will automatically designate the first workflow as the "driving workflow". The displayed action number will be <action hrid>-<driving workflow hrid>. Example: ACT123-REQ1134
  • HRID will be stored in database. TBD either in current HRID column in artifact table or as attribute on artifact
    • Reasons for attribute
      • No special queries to get at HRID
      • Tagging framework already works for attributes
    • Reasons for hrid column
      • Minimal framework/query changes
      • Searching by HRID is faster than by attribute value
      • Would need to limit users/API/UI from changing that special attribute
      • Migration of HRIDs to existing artifacts would require pushing HRID to parent branch and migrating it down to all children
      • Attribute value would be branched and add addressing information to all database and all branches
      • Attributes are for data that can be changed by user. HRID can't

Implementation

  • Need tagging rules to enable numbers to be split apart and searched by either number alone or character sequence number. Example REQ3243 and 3243 should both work. Keep in mind that 3243 may return 2 objects cause prefix is what makes it unique.
  • ATS, and other places, will need specialized sorter to make sure REQ31 comes after REQ4
  • ATS will need to programatically set first workflow to "driving workflow" and allow user to change.
  • UI to configure for ATS and framework

Migration

  • TBD keep same HRID for existing and start with new now or save HRID in ATS actions / static ids and change all historical ids using new sequence

OSEE Framework Patterns

(Work in progress)

  • Working with transactions

Back to the top