<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.transcends.co/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jerrito</id>
		<title>RifidiWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.transcends.co/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jerrito"/>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Special:Contributions/Jerrito"/>
		<updated>2026-04-19T17:02:03Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.1</generator>

	<entry>
		<id>https://wiki.transcends.co/index.php/Rifidi_roadmap</id>
		<title>Rifidi roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Rifidi_roadmap"/>
				<updated>2011-11-06T00:15:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page discusses some long range plans for the Rifidi project.&lt;br /&gt;
&lt;br /&gt;
=Current State=&lt;br /&gt;
&lt;br /&gt;
Currently, the Rifidi products (Tag Streamer, and Emulator) are two &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-adipex.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;adipex&amp;lt;/span&amp;gt;] the service-oriented &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.andrewflusche.com/services/spotsylvania-dui-lawyer/&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Spotsylvania DUI lawyer&amp;lt;/span&amp;gt;] paradigm that osgi provides.  this causes several problems:&lt;br /&gt;
&lt;br /&gt;
*Two Separte Development Cycles for Rifidi Tag Streamer, and Emulator&lt;br /&gt;
** Version Numbers apply only to releases, not to underlying services provided by osgi plugins&lt;br /&gt;
** too much code is copied and not shared&lt;br /&gt;
*There is alot of functionality [http://www.reliancefirstcapital.net/ reliance first capital] that is not [http://www.arcat.com/arcatcos/cos44/arc44722.html rhino deck] separated into plugins&lt;br /&gt;
**Stable code mixed with development code&lt;br /&gt;
**[http://www.beautyschoolsofamerica.biz/ Beauty Schools of America Complaints]&lt;br /&gt;
**If only one small part of a class changes, the whole plugin has to be updated&lt;br /&gt;
*Rifidi is missing an eclipse-like 'update' functionality&lt;br /&gt;
&lt;br /&gt;
As a result, we end up with two separate, but related &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.hmcdisplay.com/staging.html &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Portable Stage&amp;lt;/span&amp;gt;] projects that are loosely-coupled&lt;br /&gt;
&lt;br /&gt;
=Solution through Service Oriented Architecture=&lt;br /&gt;
&lt;br /&gt;
In order to tie the services-oriented design that osgi allows for.  We can achieve this by following the following best practices:&lt;br /&gt;
&lt;br /&gt;
* Functionality needs to be separated into  services (i.e. plugins).&lt;br /&gt;
* osgi plugins should be versioned separately from releases.  We can do this in the manifest file of the plugin&lt;br /&gt;
* Each bundle should have a maintainer.  This can also be specified in the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.bestpills4weightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;best weight loss pills&amp;lt;/span&amp;gt;] plugin's manifest.&lt;br /&gt;
* The most important idea is that Rifidi should be treated as '''one''' application with several possible ways of assembling functionality.&lt;br /&gt;
&lt;br /&gt;
=Rifidi As Single Application=&lt;br /&gt;
If Rifidi is a single application, it gives several benefits:&lt;br /&gt;
*'''Single Installer''' -  There can be a single, small Rifidi Installer that allows &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.bowtrolcoloncleanseblog.com &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;bowtrol&amp;lt;/span&amp;gt;] users to install the Rifidi functionality that they want.  For example, once they have the base application running, they can choose to install the 'emulator' packages or the 'tag streamer' packages.&lt;br /&gt;
*'''Update Functionality''' -  When a user wants the latest version of the code, he can update the application, which will install only the latest osgi plugins instead of having &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] to download the whole rifidi application again.&lt;br /&gt;
*'''Reliability''' - By focusing on the functionality at the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.zetaclearspot.com &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;zetaclear&amp;lt;/span&amp;gt;] package level, we can note when a package changes and update the version number of the package itself.  In addition, plugin dependencies can specify version number that they depend on.  This allows us to know &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://featherranch.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;dog training&amp;lt;/span&amp;gt;] &lt;br /&gt;
&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.uniquepavingmaterials.com&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Cold Mix&amp;lt;/span&amp;gt;] and &lt;br /&gt;
&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.cleaningproductsassociates.com&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Cleaning Supplies&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
which package versions work with the current code ==Related Links==&lt;br /&gt;
&lt;br /&gt;
[http://www.cellulite.co.uk/ '''cellulite'''] in case something breaks. Because each plugin can be tagged in the SVN, a 'release' is simply a collection of plugin version numbers.  &lt;br /&gt;
*'''User Upgrade Path''' - By having an installer with the ability to add new[http://www.busbooking.sg&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;bus service&amp;lt;/span&amp;gt;]  [http://dentaldentistsolutions.blogspot.com/2009/10/process-and-pictures-dental-implants.html &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;dental implants&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/09/top-10-hilarious-quotes.html &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important;background:none!important; text-decoration:none;&amp;quot;&amp;gt;hilarious quotes&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2010/06/twenty-hilarious-funny-quotes.html &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important;background:none!important; text-decoration:none;&amp;quot;&amp;gt;funny quotes&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2011/07/funny-marriage-jokes.html &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;funny jokes&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2011/08/funny-statuses-quotes-for-facebook.html &amp;lt;span style=&amp;quot;color:#000000;font-weight:normal; text-decoration:none!important;background:none!important; text-decoration:none;&amp;quot;&amp;gt;funny status for facebook&amp;lt;/span&amp;gt;] [http://www.propertyprice.com.sg/&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Property Prices&amp;lt;/span&amp;gt;]Rifidi Products, for example:&lt;br /&gt;
&lt;br /&gt;
[[Image:RifidiRoadmap.png]]&lt;br /&gt;
&lt;br /&gt;
=Steps to Complete=&lt;br /&gt;
# Separate functionality into plugins and identify common code that is currently being duplicated.&lt;br /&gt;
&lt;br /&gt;
# Design new packages for the duplicated code.  The new packages should be able to be used by all [http://startutor.sg&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;tuition centre&amp;lt;/span&amp;gt;] products.&lt;br /&gt;
# Develop a 'best practices' guide for how to number osgi packages.  Go through all packages and give them version numbers&lt;br /&gt;
# Create a new svn repository and add all new packages to it [http://www.streetdeal.sg&amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;hotel deals&amp;lt;/span&amp;gt;]&lt;br /&gt;
# Add update functionality within the products&lt;br /&gt;
# Host site for serving package updates&lt;br /&gt;
# Develop common UI framework&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/TagStreamerSpecification</id>
		<title>TagStreamerSpecification</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/TagStreamerSpecification"/>
				<updated>2011-11-06T00:14:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
This document describes a possible use case for TagStreamer 2.0 for the purpose of demonstrating how it would work.  The basic idea is to define a Scenario that describes the flow of input data through processing points and BatchPattern which describe the input data in general. The processing points of the Scenario are called path items.  They consist of either a reader or a GPI Listener and a time to wait before moving on to the next path item.  It is important to note that the scenario and the data are decoupled. The BatchPattern describes the speed which data will put into the Scenario and how many tags will be generated. The Tag Generator uses that information and executes the BatchPattern one activated. &lt;br /&gt;
&lt;br /&gt;
In the below scenario, a batch item – a group of tags – moves into the entry point of the scenario by being processed by reader 1.   Reader 1 adds the tags to its antenna for a variable amount of time, between 4 and 8 seconds.  Then the tags wait for 5 seconds before moving on to the next path item.  &lt;br /&gt;
&lt;br /&gt;
The next path item is a GPI Listener that is tied to Reader 2.  Because this particular Batch Item is set to trigger GPI Listeners, the GPI Listener will toggle one of Reader 2's GPI ports.  The batch item now waits for 5 more seconds.  Now the tags in the batch are seen by reader 2's antenna for 3 seconds and then wait for anywhere between 10 and 20 seconds before moving on to Reader 3.&lt;br /&gt;
&lt;br /&gt;
Once the tags are seen by reader 3, this iteration of the scenario is over.  The TagGenerator can execute a BatchPattern more than once. This will be defined as the iteration of the BatchPattern. &lt;br /&gt;
&lt;br /&gt;
[[Image:TagStreamerSpec.png]]&lt;br /&gt;
&lt;br /&gt;
==Components==&lt;br /&gt;
A TagStreamer usecase consists of two main components -- the Scenario and the Input Data. Both are decoupled so that neither depends on the other part. &lt;br /&gt;
&lt;br /&gt;
# Scenario - The Scenario describes the path through which a tag batch flows.  It is made up of path items.  It also contains a variable that controls how many times the scenario is repeated.  If the variable is 0, the scenario is run infinitely.  If it is positive, it is run n times.&lt;br /&gt;
## PathItem - A path item consists of either a reader or a GPI Listener and a time to wait.&lt;br /&gt;
###Reader - An RFID reader which tags appear on&lt;br /&gt;
###GPI Listener - If a Batch Item which is set to trigger a GPI event passes through a GPI Listener, it will trigger a GPI event on the GPI Listener's reader.&lt;br /&gt;
###Time - A time is used either to describe the amount of time that a batch item should wait on a Path Item, or the amount of time a batch item should wait after being processed by the path item.  For example, in the above use case, if the tag batch moved to reader 1, it is processed by the reader  for 4-8 seconds (i.e. It is added to the reader's antenna for this amount of time).  Then it waits for 5 seconds before it proceeds to the next path item.  It can be a random &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] amount of time with a min value and a max value. If it's not a random value both values should be equal.&lt;br /&gt;
#BatchPattern - A way to describe BathItems generated at the runtime.  Each batch items flows through the Scenario by starting at the entry point and being processed sequentially at each Path Item.&lt;br /&gt;
##BatchItem - A batch item contains a list of tags, a boolean that describes whether or not it should trigger GPI Listeners and a time value that describes the amount of time it should wait before being processed by the first path item.&lt;br /&gt;
### GPI Trigger - A boolean value that defines whether or not the asociated batch item should cause GPI Listerns to fire a GPI event.&lt;br /&gt;
### Tags - A list of RFID tags to be added to readers.  They are defined by &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;diet pills&amp;lt;/span&amp;gt;] an ID, a Generation( Gen1 or Gen2), and type (e.g. DOD-96).&lt;br /&gt;
&lt;br /&gt;
==XML==&lt;br /&gt;
===Scenario.xml===&lt;br /&gt;
This XML describes the PathItems and the way Data moves through the scenario to the various components like RFID Readers &amp;amp; GPI Listeners.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scenario id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;gpiListenerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;gpiListenerID&amp;gt;0&amp;lt;/gpiListenerID&amp;gt;&lt;br /&gt;
        &amp;lt;/gpiListenerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;pathItem id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;readerEntity&amp;gt;&lt;br /&gt;
            &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
                &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
                &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
                &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
            &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;/readerEntity&amp;gt;&lt;br /&gt;
        &amp;lt;timeEntity&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
            &amp;lt;minValue&amp;gt;400&amp;lt;/minValue&amp;gt;&lt;br /&gt;
            &amp;lt;maxValue&amp;gt;500&amp;lt;/maxValue&amp;gt;&lt;br /&gt;
        &amp;lt;/timeEntity&amp;gt;&lt;br /&gt;
    &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Component.xml===&lt;br /&gt;
This XML describes the various components (ie RFID Readers &amp;amp; GPI Listeners) in the scenario&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;componentList id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
         &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10101&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5084&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
            &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10102&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5085&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader2&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;gpiListenerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;0&amp;lt;/port&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;signalValue&amp;gt;true&amp;lt;/signalValue&amp;gt;&lt;br /&gt;
    &amp;lt;/gpiListenerComponents&amp;gt;&lt;br /&gt;
&amp;lt;/componentList&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BatchPattern.xml===&lt;br /&gt;
The BatchPattern describes the input data generated at the runtime by the BatchGenerators. This will create BatchItems wich certain tags and flow through the scenario.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;batchPattern id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;scenario&amp;gt;3&amp;lt;/scenario&amp;gt;	&lt;br /&gt;
	&amp;lt;interation&amp;gt;250&amp;lt;/iteration&amp;gt;&lt;br /&gt;
	&amp;lt;burstNumber&amp;gt;50&amp;lt;/busrtNumber&amp;gt;&lt;br /&gt;
	&amp;lt;burstInterval&amp;gt;4000&amp;lt;/burstInterval&amp;gt;&lt;br /&gt;
        &amp;lt;isGPITrigger&amp;gt;true&amp;lt;/isGPITrigger&amp;gt;&lt;br /&gt;
	&amp;lt;tagPattern count=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;type&amp;gt;Custom&amp;lt;/type&amp;gt;&lt;br /&gt;
		&amp;lt;prefix&amp;gt;eef&amp;lt;/prefix&amp;gt;&lt;br /&gt;
		&amp;lt;gen&amp;gt;2&amp;lt;/gen&amp;gt;	&lt;br /&gt;
	&amp;lt;/tagPattern&amp;gt;&lt;br /&gt;
	&amp;lt;tagPattern count=&amp;quot;90&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;type&amp;gt;DOD&amp;lt;/type&amp;gt;&lt;br /&gt;
		&amp;lt;/prefix&amp;gt;&lt;br /&gt;
		&amp;lt;gen&amp;gt;2&amp;lt;/gen&amp;gt;&lt;br /&gt;
	&amp;lt;/tagPattern&amp;gt;&lt;br /&gt;
&amp;lt;/batchPattern&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/How_to_create_a_sensor_plugin</id>
		<title>How to create a sensor plugin</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/How_to_create_a_sensor_plugin"/>
				<updated>2011-11-06T00:10:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to develop a plugin using the Rifidi Edge Server Sensor API that connects to a sensor and collects information from it. For a more detailed description of the architecture of the sensor API, see [[Sensor Plugin API|this page]]. This HOWTO assumes that you know java, are relatively familiar with eclipse (or an equivalent IDE such as netbeans). It does not require that you know OSGi or Spring dependency injection, but knowledge in these areas will help you understand why the steps are being taken and will help debugging.&lt;br /&gt;
&lt;br /&gt;
= Steps to create a sensor plugin project =&lt;br /&gt;
{| cellspacing=&amp;quot;5&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;margin: 1em auto 1em auto;background-color:rgb(240, 247, 255); width=100px;border:1px dashed; margin-left:10px; margin-top:10px; margin-bottom:10px&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; width=&amp;quot;350px&amp;quot;| '''Naming your project'''&lt;br /&gt;
|- &lt;br /&gt;
| width=&amp;quot;350px&amp;quot;|We recommend a name such as the following: &amp;lt;tt&amp;gt; com.yourcompany.org.rifidi.edge.sensorplugin.yourreadertype&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;yourcompany&amp;lt;/tt&amp;gt; is the name of your company, and &amp;lt;tt&amp;gt;yourreadertype&amp;lt;/tt&amp;gt; is the brand or model of the sensor you are making the plugin for. &lt;br /&gt;
|}&lt;br /&gt;
# Follow the [[Edge_Server_Development_Environment|instructions]] on how to set up a Rifidi Edge Server development environment.&lt;br /&gt;
# Use the Plug-in Project wizard in eclipse to create a new plugin-project.  Make sure that the target platform is set to run with a standard OSGi framework. In the second page, uncheck the option to automatically generate an Activator. In the third page, do not use a template.&lt;br /&gt;
#Open up the Manifest.MF file. Click on the dependencies &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-adipex.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;adipex&amp;lt;/span&amp;gt;] tab. Add the following Plug-in dependencies:&lt;br /&gt;
#:org.rifidi.edge.core&lt;br /&gt;
#:org.rifidi.edge.core.services&lt;br /&gt;
#:org.rifidi.edge.api&lt;br /&gt;
#Add 'Import package' dependencies to the following pacakges:&lt;br /&gt;
#:javax.jms&lt;br /&gt;
#:org.apache.activemq.command&lt;br /&gt;
#:org.apache.commons.logging&lt;br /&gt;
#:org.osgi.framework&lt;br /&gt;
#:org.springframework.core&lt;br /&gt;
#:org.springframework.jms.core&lt;br /&gt;
#:org.springframework.osgi.service.importer&lt;br /&gt;
#Add a new folder called 'spring' into the META-INF folder&lt;br /&gt;
#Add a new file called spring.xml in the spring folder&lt;br /&gt;
#Add a new file called osgi.xml in the spring folder&lt;br /&gt;
#Add a new package. Typically the package has the same name as your project (for example, if the project is called com.yourcompany.org.rifidi.edge.sensorplugin.yourreadertype, that is also the name of the top level package.&lt;br /&gt;
&lt;br /&gt;
= Overview of the steps to implement the sensor plugin =&lt;br /&gt;
{| cellspacing=&amp;quot;5&amp;quot; align=&amp;quot;right&amp;quot; style=&amp;quot;margin: 1em auto 1em auto;background-color:rgb(240, 247, 255); width=100px;border:1px dashed; margin-left:10px; margin-top:10px; margin-bottom:10px&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; width=&amp;quot;350px&amp;quot;| '''Viewing Source of Other Sensor Plugins'''&lt;br /&gt;
|- &lt;br /&gt;
| width=&amp;quot;350px&amp;quot;|This HOWTO references existing plugins. One of the best ways to learn how to make your own sensor plugin is by looking at the soruce code of other plugins. To view the source code of the plugins &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss supplements&amp;lt;/span&amp;gt;], open up the plugin view, find the plugin (such as the org.rifidi.edge.readerplugin.alien plugin) right-click on it and select import as-&amp;gt;source project. &lt;br /&gt;
|}&lt;br /&gt;
Before going through the detailed process of creating the sensor classes lets give look at this high level overview. You should look at the source for other reader plugins and read the explanations in this document to get a better idea about how to create them.&lt;br /&gt;
# Create a Session that extends AbstractPollIPSensorSession (if your sensor uses TCP/IP) or AbstractSensorSession if it does not. &lt;br /&gt;
# Create a Sensor that extends AbstractSensor. It should produce sessions of the type created in the previous step.&lt;br /&gt;
# Create a SensorFactory that extends AbstractSensorFactory. It should produce sensors of the type created in the previous step.&lt;br /&gt;
# Configure the osgi.xml and spring.xml files so that the AbstractSensorFactory is created and registered in the OSGi registry&lt;br /&gt;
# If your session is not TCP/IP based, write the connection logic&lt;br /&gt;
# If you session is TCP/IP based, write the onConnect method and create a MessageParsingStrategy.&lt;br /&gt;
# Add the necessary getter/setter properties to the Sensor. TCP/IP based readers normally have the following properties:&lt;br /&gt;
#:IP:String&lt;br /&gt;
#:Port:Integer&lt;br /&gt;
#:Reconnect Interval: Integer&lt;br /&gt;
#:Reconnection Attempts: Integer&lt;br /&gt;
# Add the @Property annotations over the getter methods&lt;br /&gt;
# Create a new package which will contain commands&lt;br /&gt;
# Create a Command class that extends Command&lt;br /&gt;
# Create a CommandConfiguration class that extends AbstractCommandConfiguration. It should produce commands of the type created in the previous step.&lt;br /&gt;
# Create a CommandConfiguraitonFactory class that extends AbstractCommandConfigurationFactory. It should produce command configurations of the type created in the previous step.&lt;br /&gt;
# Configure the osgi.xml and spring.xml to create and register the CommandConfigurationFactory.&lt;br /&gt;
# Add the required functionality in the run method of the command&lt;br /&gt;
# Add getter and setter properties (if necessary) to the CommandConfiguration.&lt;br /&gt;
# Add @Property methods over the getter methods in the Commandconfiguration&lt;br /&gt;
# Add in notifier service calls when one of the notifier service's events happens (such as a session being created, started, or stopped).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creating the Classes=&lt;br /&gt;
The Sensor API provides several base classes for you to extend when creating a new sensor plugin. Because the Sensor and SensorFactory classes use generics when referring to the classes that they can create, it is easiest to create the Session first, then the Sensor, the the SensorFactory.&lt;br /&gt;
&lt;br /&gt;
==Session API==&lt;br /&gt;
&lt;br /&gt;
:As stated above, the session has two main functions: 1) to connect to a sensor and read data from it, and 2) To handle the submission and execution of commands. Every session must extend the SensorSession abstract class at some level. However, most SensorSession implementations won't extend the SensorSession abstract class directly and will instead take advantage of one of the other abstract classes that provide some basic functionality.&lt;br /&gt;
&lt;br /&gt;
===Active vs Passive Sessions===&lt;br /&gt;
:The first thing to figure out when creating the session class is whether the session is active or passive. &lt;br /&gt;
;Active Sessions&lt;br /&gt;
: An active session is one in which it is possible to send commands to the sensor. For example, the AlienSession is active because it is possible to send a command such as 'get taglist'. An LLRPSession is active because it can send GET_ROSPEC messages. A database session would probably be active since you would probably want to submit SQL queries to it. In fact, most sessions will probably be active ones.&lt;br /&gt;
;Passive Sessions&lt;br /&gt;
: Passive session simply listen for the sensors to push tag reads to them. They cannot send commands to the sensor. The only example of this kind of session at the moment is the AlienAutonomousSession. It simply opens up a port and listens for tag reads to be pushed to it by an Alien Reader operating in autonomous mode.&lt;br /&gt;
&lt;br /&gt;
Please note that this active/passive terminology has nothing to do with active and passive RFID tag technology.&lt;br /&gt;
&lt;br /&gt;
===Communication Channel===&lt;br /&gt;
&lt;br /&gt;
:The next thing to figure out about the sensor you are connecting to is the medium of communication. Many sensors are networked and use TCP/IP. However, the Sensor API is channel-agnostic, and it is possible to connect to sensors that use USB or serial, for example. Currently, the Sensor API only has base classes that handle the work of connecting to TCP/IP sensors. If the sensor is USB or serial, you will need to write this functionality yourself.&lt;br /&gt;
&lt;br /&gt;
===Tag Request Model===&lt;br /&gt;
&lt;br /&gt;
:Active SensorSession normally operate in one of two ways when receiving tag data from a sensor&lt;br /&gt;
;Poll&lt;br /&gt;
: In this case the SensorSession will request that the Sensor send back its tag data immediately. An example of this is the Alien's 'get taglist' command.&lt;br /&gt;
;Push&lt;br /&gt;
:In this case, the SensorSession will configure the Sensor to send back tag data continuously until some stop trigger happens (e.g. sending a stop command)&lt;br /&gt;
&lt;br /&gt;
===Java API Availability===&lt;br /&gt;
&lt;br /&gt;
:Sometimes the manufacturer of the sensor provides a java API that handles the connection to the sensor. If so, you can use this API. You will need to turn the supplied jar into an OSGi bundle if it is not one already. This can be accomplished by using the &amp;quot;new plug-in project from existing jar&amp;quot; wizard from eclipse.&lt;br /&gt;
&lt;br /&gt;
===SensorSession Hierarchy ===&lt;br /&gt;
&lt;br /&gt;
:There are several base classes you can extend in the Sensor API that provide useful SensorSession functionality.&lt;br /&gt;
*SensorSession - This is the class at the root of the hierarchy. It has many abstract methods for concrete classes implement.&lt;br /&gt;
**AbstractSensorSession - This is an abstract class that extends SensorSession by adding functionality for submitting and killing commands. All concrete SensorSessions will probably at least want to extend this class. If your sensor has an API that manages the communication channel for you, or if your sensor does not use TCP/IP you will want to extend this class directly. For an example of a SensorSession that extends this class directly see the LLRPSession&lt;br /&gt;
***AbstractIPSensorSession - This is a base class for a SensorSession that uses TCP/IP. It handles socket I/O and threads. This class will not normally be extended directly by concrete implementations. Instead, concrete implementations should extend one of the following two classes:&lt;br /&gt;
****AbstractPollIPSensorSession - This class should be extended by sensor sessions that use TCP/IP communication and operate by periodically polling the sensor for tag data. See AlienSensorSession for an example&lt;br /&gt;
****AbstractPubSubIPSensorSession - This class should be extended by sensor sessions that use TCP/IP communication and operate by configuring the sensors to push data back to them. See the AwidSensorSession as an example.&lt;br /&gt;
***AbstractServerSocketSensorSession - This class should be used by passive sessions that use TCP/IP communication. See AlienAutonomousSensorSession for an example.&lt;br /&gt;
&lt;br /&gt;
===Creating Session Objects===&lt;br /&gt;
&lt;br /&gt;
:The SensorSession has two main functions: 1) To connect to a sensor (over a network, serial, usb, etc) and to read data from it, and 2) To manage [[#Short Introduction to the Command Framework | commands]] that have been submitted. Many sensors offer a networked TCP/IP interface. The Rifidi Sensor API offers abstract classes that other classes can extend which will take care of the TCP sockets and threads. If the manufacturer of the sensor makes a java API available to connect to the sensor, the Rifidi Sensor API allows you to use that instead.&lt;br /&gt;
&lt;br /&gt;
[[Image:Sensorapi.png|none|location=center|thumb|600px| This image shows the relationship between the three main classes needed to create a plugin for the Rifidi Sensor Abstraction Layer. Only a few important methods are shown in each class, just to give the reader an idea about what the class does]]&lt;br /&gt;
&lt;br /&gt;
:The sensor object's most important functionality is to create sessions. Most sensors will only have one session active at a time, however the API is designed to allow sensors to have multiple sessions. There are two methods for creating sensor sessions. The one that takes a SessionDTO is used to recreate persisted sessions.&lt;br /&gt;
&lt;br /&gt;
==Sensor API==&lt;br /&gt;
&lt;br /&gt;
:After creating your Session class, its time to create the sensor classes. It is composed by sensor, sensor factory and sensor session. The sensor class should extend the AbstractSensor class. There are two important pieces to the Sensor class.&lt;br /&gt;
&lt;br /&gt;
=== Creating the Command Classes ===&lt;br /&gt;
&lt;br /&gt;
:The Sensor object's main duty is to create SensorSession objects. There is normally one Sensor object for each physical sensor in the RFID system. For example, if your system has one Alien reader at a Dock Door and one at a weigh station, then there would be two instances of the AlienSensor object. Sensors also normally have getter-setter methods for setting properties of that sensor. For example, it is common for sensors to have methods to get and set the IP and port of the sensor to connect to. These properties are then used when creating new sessions. It is possible for a sensor to have more than one session (certain sensors (such as a database plugin) may support parallel sessions), but it is common for the sensor to allow only one session at a time. &lt;br /&gt;
&lt;br /&gt;
====Property Getters and Setters====&lt;br /&gt;
&lt;br /&gt;
:The sensors expose getter and setters methods to allow users to configure the sensor. These getter and setter methods are also used to recreate sensors from persistence. Each getter and setter method pair has an @Property annotation over the getter method. This exposes the property to workbench via Mbeans objects.&lt;br /&gt;
&lt;br /&gt;
:One important thing to understand is that sessions are immutable; Once they are created, users cannot adjust properties on them. For example, suppose a sensor exposes a port property. A user can adjust this property using the getter/setter methods. Once the session is created however, changing the port property has no effect on the created session. To modify the port on the session, the user must destroy the session and create a new one.&lt;br /&gt;
&lt;br /&gt;
====SensorFactory====&lt;br /&gt;
&lt;br /&gt;
:The sensor factory creates new Sensors when the createInstance method is called. There is one instance of SensorFactory per sensor type. For example, in a running instance of the Edge Server, there is only one instance of an AlienSensorFactory which can create multiple instances of AlienSensor objects. The SensorFactory is normally created in the spring.xml of a sensor plugin and registered in the OSGi service registry in the osgi.xml.&lt;br /&gt;
&lt;br /&gt;
:All concrete implementations should extend the AbstractSensorFactory class. Most AbstractSensor factories will need to have two object injected by Spring: &lt;br /&gt;
;NotifierService&lt;br /&gt;
: This service allows the sensor and sensorSession to notify clients (such as workbench) when an important event happens such as a session being created. For more information on this service see [[Edge_Server_Architecture#Notification_Service | this page]].&lt;br /&gt;
;JMSTemplate&lt;br /&gt;
: Tag events need to be placed on the internal JMS queue. The template is a helper object from Spring that makes it easy to send JMS notification messages. For more information about JMS in the Edge Server see [[EdgeServerJMS | this page]].&lt;br /&gt;
&lt;br /&gt;
== Command API ==&lt;br /&gt;
&lt;br /&gt;
:Although command and sensor classes can exist in the same bundle, it is encouraged to separate out these into separate bundles. This allows commands to be updated at runtime without bringing down a whole sensor bundle.&lt;br /&gt;
&lt;br /&gt;
:The SensorSession objects execute commands from the Command framework.  The command framework enables commands to be created and configured. There are three main components to the command framwork:&lt;br /&gt;
&lt;br /&gt;
;CommandConfigurationFactory&lt;br /&gt;
:A CommandConfigurationFactory produces CommandConfiguration objects. There is one instance of a CommandConfigurationFactory for every command type. For example, the Alien sensor plugin has three command types available to it: Alien-Poll, Alien-Push-Start, and Alien-Push-Stop. That means there are three factories instantiated when the plugin starts. The factories are created in the spring.xml and registered in the OSGi registry in the osgi.xml.&lt;br /&gt;
&lt;br /&gt;
;CommandConfiguration&lt;br /&gt;
: A CommandConfiguration produces commands. Users can modify parameters of a Command by using the properties exposed through the @Property annotations and getter/setter methods.&lt;br /&gt;
&lt;br /&gt;
;Command&lt;br /&gt;
&lt;br /&gt;
: A command is a runnable that wraps some logical piece of communication with a sensor. For example, the LLRPConfigure command configures the LLRP command to send back tag reads. To do this, it sends several LLRP messages. Some commands should be scheduled for repeated execution, while others should only execute once. Regardless, the run() method inside a command should execute quickly (i.e. there should be no loops that wait on I/O or sleep).&lt;br /&gt;
&lt;br /&gt;
===Creating the Command Classes===&lt;br /&gt;
&lt;br /&gt;
:For each kind of command that you have, you need to implement three classes:&lt;br /&gt;
&lt;br /&gt;
# A Command class that extends the Command abstract class.  The run method is where the functionality goes. You can call super.sensorSession to get a hold of the session which can be used to send or receive data.&lt;br /&gt;
# A CommandConfiguration class that extends AbstractCommandConfiguration. This class should produce commands. Like the Sensor class, it can have getter/setter methods which allow users to change property values of the CommandConfiguration. Again, once a command has been created, the properties on it cannot change.&lt;br /&gt;
# A CommandConfigurationFactory class that extends AbstractCommandConfigurationFactory.&lt;br /&gt;
&lt;br /&gt;
=Creating Factories and registering them with OSGi Service Registry=&lt;br /&gt;
All factories (both SensorFactories and CommandConfigurationFactories) must be created and registered using Spring. &lt;br /&gt;
&lt;br /&gt;
==Sensor Factories==&lt;br /&gt;
The following is an example of a SensorFactory being created in the spring.xml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
	xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;br /&gt;
	xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans &lt;br /&gt;
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!--  Create Reader Configuration Factory --&amp;gt;&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;factory&amp;quot;&lt;br /&gt;
		class=&amp;quot;org.rifidi.edge.readerplugin.thingmagic.ThingmagicReaderFactory&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;context&amp;quot; ref=&amp;quot;bundleContext&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;template&amp;quot; ref=&amp;quot;internalMB&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;notifierService&amp;quot; ref=&amp;quot;JMSNotifierService&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;commandConfigurations&amp;quot; ref=&amp;quot;thingmagicCommands&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This code below belongs to the osgi.xml. It shows 1) How to register a sensor factory in the OSGi registry and 2) How to get references to the notifier service and the JMS template so that they can be injected into the factory in the above XML.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
	xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:osgi=&amp;quot;http://www.springframework.org/schema/osgi&amp;quot;&lt;br /&gt;
	xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans &lt;br /&gt;
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;
    http://www.springframework.org/schema/osgi &lt;br /&gt;
    http://www.springframework.org/schema/osgi/spring-osgi.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Put reader configuration service in OSGi Registry --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:service id=&amp;quot;thingmagicConfigurationFactoryService&amp;quot; ref=&amp;quot;factory&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;osgi:interfaces&amp;gt;&lt;br /&gt;
			&amp;lt;value&amp;gt;org.rifidi.edge.core.configuration.ServiceFactory&amp;lt;/value&amp;gt;&lt;br /&gt;
			&amp;lt;value&amp;gt;org.rifidi.edge.core.sensors.base.AbstractSensorFactory&amp;lt;/value&amp;gt;&lt;br /&gt;
		&amp;lt;/osgi:interfaces&amp;gt;&lt;br /&gt;
	&amp;lt;/osgi:service&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- Create a set that listens for ThingMagic command configurations --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:set id=&amp;quot;thingmagicCommands&amp;quot; interface=&amp;quot;org.rifidi.edge.core.sensors.commands.AbstractCommandConfiguration&amp;quot;&lt;br /&gt;
		cardinality=&amp;quot;0..N&amp;quot; filter=&amp;quot;(reader=ThingMagic)&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;osgi:listener ref=&amp;quot;thingmagicConfigurationFactory&amp;quot; bind-method=&amp;quot;bindCommandConfiguration&amp;quot; unbind-method=&amp;quot;unbindCommandConfiguration&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/osgi:set&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	&amp;lt;!-- Get a reference to the NotifierService --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:reference id=&amp;quot;JMSNotifierService&amp;quot;&lt;br /&gt;
		interface=&amp;quot;org.rifidi.edge.core.services.notification.NotifierService&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Get a reference to the JMS Queue --&amp;gt;&lt;br /&gt;
	&amp;lt;osgi:reference id=&amp;quot;internalMB&amp;quot;&lt;br /&gt;
		interface=&amp;quot;org.springframework.jms.core.JmsTemplate&amp;quot; bean-name=&amp;quot;internalJMSTemplate&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice how these work together: each ref attribute references the ID attribute of another bean. For example, in the spring.xml a bean is created with an id of &amp;quot;factory&amp;quot;. The &amp;lt;tt&amp;gt;osgi:service&amp;lt;/tt&amp;gt; tag references this ID in the osgi.xml.&lt;br /&gt;
&lt;br /&gt;
It is also important that the filter value in the osgi:set is set to the ID of the sensor factory.&lt;br /&gt;
&lt;br /&gt;
==Command Factories==&lt;br /&gt;
The following show the CommandFactories being created for the Alien Sensor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;br /&gt;
	xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:osgi=&amp;quot;http://www.springframework.org/schema/osgi&amp;quot;&lt;br /&gt;
	xsi:schemaLocation=&amp;quot;http://www.springframework.org/schema/beans &lt;br /&gt;
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;
    http://www.springframework.org/schema/osgi &lt;br /&gt;
    http://www.springframework.org/schema/osgi/spring-osgi.xsd&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;alienGetTagListCommandConfigurationFactory&amp;quot;&lt;br /&gt;
		class=&amp;quot;org.rifidi.edge.readerplugin.alien.commands.AlienGetTagListCommandConfigurationFactory&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;context&amp;quot; ref=&amp;quot;bundleContext&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/bean&amp;gt;&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;alienAutonomousModeCommandConfigurationFactory&amp;quot;&lt;br /&gt;
		class=&amp;quot;org.rifidi.edge.readerplugin.alien.commands.AlienAutonomousModeCommandConfigurationFactory&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;context&amp;quot; ref=&amp;quot;bundleContext&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/bean&amp;gt;&lt;br /&gt;
	&amp;lt;bean id=&amp;quot;alienAutonomousModeStopCommandConfigurationFactory&amp;quot;&lt;br /&gt;
		class=&amp;quot;org.rifidi.edge.readerplugin.alien.commands.AlienAutonomousModeStopCommandConfigurationFactory&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;property name=&amp;quot;context&amp;quot; ref=&amp;quot;bundleContext&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/bean&amp;gt;	&lt;br /&gt;
&amp;lt;/beans&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Using @Property annotations=&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Engine_RMI_Interface</id>
		<title>Engine RMI Interface</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Engine_RMI_Interface"/>
				<updated>2011-11-06T00:09:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]] [[category:EmulatorDoc]] [[category:EngineImplementation]]&lt;br /&gt;
RMI (Remote Method Invocation) is an architecture that allows clients to invoke methods on remote machines.  Rifidi uses this architecture to allow the IDE (and the Tag Streamer) to communicate with the reader.  It uses the [https://cajo.dev.java.net/ cajo] library to provide the RMI functionality.&lt;br /&gt;
=Purpose of RMI Architecture=&lt;br /&gt;
The basic goal of implementing RMI in Rifidi is so that one client (i.e. the IDE or Tag Streamer) can transparently control multiple readers on different machines, if need be.  This enables a distributed architecture that will allow rifidi to drive performance testing of edge servers, because multiple machines can run rifidi readers, thus distributing the load across a network of computer.  At the same time, however, it should be easy to start up one or two readers on a local machine for compatibility testing or to simply experiment with a reader.&lt;br /&gt;
==Architecture Diagram== &lt;br /&gt;
[[Image:RMI_Architecture.png|thumb|800px|none|A figure depicting the purpose of RMI in Rifidi]]&lt;br /&gt;
==Architecture Components==&lt;br /&gt;
;Client&lt;br /&gt;
:The client (such as the IDE, Tag Streamer, or Designer) runs on a local machine.  Its purpose is to allow the user to manipulate readers (i.e. start, stop, add tags, etc).&lt;br /&gt;
;Reader Server&lt;br /&gt;
:The Reader Server manages one or more readers on a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] particular machine by creating and destroying readers.  There is one instance of a reader manager per machine.&lt;br /&gt;
;Reader&lt;br /&gt;
:A reader is the program that emulates a particular reader, such as an LLRP Reader.  There can be multiple instances of a reader on a single machine.&lt;br /&gt;
&lt;br /&gt;
One important aspect of this architecture is that The client doesn't care if a Reader Server is local or remote.  That fact is transparent to the client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Introduction to Cajo and RMI=&lt;br /&gt;
Cajo is &amp;quot;a small, free library, enabling powerful dynamic multi-machine cooperation; both within and between, both free and proprietary Java applications. It provides a surprisingly easy to use, yet completely understandable framework to dramatically simplify the use of RMI; whilst at the same time harnessing its full potential.&amp;quot; (https://cajo.dev.java.net/).  If you are not familiar with cajo and/or RMI, you should read through the examples on cajo's website and wiki.&lt;br /&gt;
==Typical Usage==&lt;br /&gt;
[[Image:Cajo_architecture.png|thumb|800px|none|A block diagram explaining the basics of the cajo server]]&lt;br /&gt;
&lt;br /&gt;
The above diagram shows how the cajo server typically works.  The cajo process is started as a process on a particular port (normally 1198) on a server.  Now java objects can bind themselves to the cajo server.  This means that the cajo server enters a name-value pair in a table (called the registry).  The name is a unique string used to &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] locate the reference to the object.  The client can then use this name to get a copy of the object using the getItem() method.&lt;br /&gt;
&lt;br /&gt;
==Remote Interfaces==&lt;br /&gt;
One of the advantages of cajo is that it allows an object to easily expose functionality through an interface that another object can get and use.  The advantage to using an interface as opposed to invoking calls using text is that typechecking can be done at compile time.&lt;br /&gt;
&lt;br /&gt;
For example, suppose Object_A looked like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Object_A implements Serializable{&lt;br /&gt;
	&lt;br /&gt;
	private static final long serialVersionUID = 1L;&lt;br /&gt;
	&lt;br /&gt;
	private int value=0;&lt;br /&gt;
	&lt;br /&gt;
	public void incrementValue(){&lt;br /&gt;
		value ++;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public String getValue(){&lt;br /&gt;
		return &amp;quot;object A's value is: &amp;quot; +Integer.toString( value);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple way that a client could access Object_A's functionality is like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object object = Remote.getItem(&amp;quot;//serverHost:1198/obj_a&amp;quot;);&lt;br /&gt;
Remote.invoke(object, &amp;quot;incrementValue&amp;quot;, null);&lt;br /&gt;
String s = (String)Remote.invoke(object, &amp;quot;getValue&amp;quot;, null);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, another way that the client could access Object_A's functionality is if Object_A implemented an interface that exposed its methods that are available via RMI.  For example, suppose there was an interface that looked like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public interface Object_A_Interface {&lt;br /&gt;
&lt;br /&gt;
	public abstract void incrementValue();&lt;br /&gt;
&lt;br /&gt;
	public abstract String getValue();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now Object_A looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public class Object_A implements Serializable, Object_A_Interface{&lt;br /&gt;
	&lt;br /&gt;
	private static final long serialVersionUID = 1L;&lt;br /&gt;
	&lt;br /&gt;
	private int value=0;&lt;br /&gt;
	&lt;br /&gt;
	/* (non-Javadoc)&lt;br /&gt;
	 * @see org.rifidi.sandbox.cajo.test.Object_A_Interface#incrementValue()&lt;br /&gt;
	 */&lt;br /&gt;
	public void incrementValue(){&lt;br /&gt;
		value ++;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* (non-Javadoc)&lt;br /&gt;
	 * @see org.rifidi.sandbox.cajo.test.Object_A_Interface#getValue()&lt;br /&gt;
	 */&lt;br /&gt;
	public String getValue(){&lt;br /&gt;
		return &amp;quot;object A's value is: &amp;quot; +Integer.toString( value);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A client can now access Object_A's functionality by getting an interface and calling the methods.  This enables the compiler to throw errors if something is wrong.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Object_A_Interface obja = (Object_A_Interface) TransparentItemProxy.getItem(&lt;br /&gt;
                                               &amp;quot;//serverHost:1198/obj_a&amp;quot;,&lt;br /&gt;
                                               new Class[] { Object_A_Interface.class });&lt;br /&gt;
obja.incrementValue()&lt;br /&gt;
String s = obja.getValue();&lt;br /&gt;
System.out.println(s);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Callbacks==&lt;br /&gt;
Another advantage of using RMI and cajo is that it allows for callbacks.  This means that a client can call methods on a server using the method above, and the server can also  invoke methods on the client using a similar method.  This is important for Rifidi in situations with the GUI needs to be updated based on changes in the reader, such as when a TagID changes or when a GPO line goes high.&lt;br /&gt;
&lt;br /&gt;
=Rifidi RMI Implementation=&lt;br /&gt;
This section describes how RMI is implemented in Rifidi.&lt;br /&gt;
==RMI Class Diagram==&lt;br /&gt;
[[Image:RMI_Class_Diagram.png|thumb|800px|none|A UML Class Diagram depicting the components of the RMI Architecture in Rifidi]]&lt;br /&gt;
==RMI Class Diagram Components==&lt;br /&gt;
&lt;br /&gt;
===Client Components===&lt;br /&gt;
;RifidiClient&lt;br /&gt;
:The client is the program that the user controls the reader with (such as the IDE, Tag Streamer, or Designer).&lt;br /&gt;
;ClientCallbackManager&lt;br /&gt;
:The callback manager is the object that handles callbacks from the readers.  Callbacks happen when something on the reader changes that the IDE needs to know about to update a GUI component, such as a Tag ID changing or a GPO line toggle. There is one callback manager per reader in the IDE.&lt;br /&gt;
;RifidiClientInterface&lt;br /&gt;
:The client Interface is the set of method calls that the client callback manager exposes to the readers.&lt;br /&gt;
===Reader Server Components===&lt;br /&gt;
;RifidiManager&lt;br /&gt;
:The rifidiManager is the object that manages readers on a specific machine.  There is exactly one RifidiManager per machine.  It is in charge of keeping track of the readers (i.e. creating and destroying).  There are two distinct ways to start the manager, depending on how it is to be used.&lt;br /&gt;
# '''Remotely''' If you wish to start the server on a remote machine, you must use the RifidiManager's main method to start it running.  The client will now need to know the RifidiManager's IP and port (normally the port is cajo's default port of 1198).&lt;br /&gt;
# '''Locally''' If the RifidiManger is to be started locally, a method is provided so that the client can do it programmaticly.  This method is provided for convenience, so that  It is simpler for the user when he just wants to start up the IDE and play around with a reader.&lt;br /&gt;
;RifidiManagerInterface&lt;br /&gt;
:The RifidiManagerInterface is the set of method calls that the RifidiManager exposes to the client.&lt;br /&gt;
&lt;br /&gt;
===Reader Components===&lt;br /&gt;
;ReaderModuleManager&lt;br /&gt;
:The ReaderModuleManager is the wrapper around a reader on a machine.  There is one ReaderModuleManager per instantiated reader.&lt;br /&gt;
;ReaderModuleInterface&lt;br /&gt;
:The ReaderModuleInterface represents the methods that a reader exposes to the client.&lt;br /&gt;
&lt;br /&gt;
==RMI in action: An example==&lt;br /&gt;
This example consists of a timing diagram that goes through a typical usage of the RMI implementation in Rifidi.  In this example, The client (IDE) and the server (RifidiManager) are on a local machine.  This is typical of how the IDE is used, because a user norally just wants to start playing around with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.mmesquire.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;accident attorney Visalia&amp;lt;/span&amp;gt;] readers and does not care if the server is on a separate computer.  After the client creates and starts the reader, it add tags to it.  Then the client program to the reader will change the ID of a tag, which requires that the reader inform the IDE through an RMI callback.&lt;br /&gt;
===Timing Diagram===&lt;br /&gt;
[[Image:RMI_Timing_Diagram.png|thumb|1000px|none|A UML Class Diagram depicting the components of the RMI Architecture in Rifidi]]&lt;br /&gt;
===Explanation of Diagram===&lt;br /&gt;
# Because this RifidiManager is being run locally to the IDE, the IDE can start the RifidiManager itself.  In this way, the user does not have to start the RifidiManager using its main method.&lt;br /&gt;
## Once the RifidiManager is start, it must register itself on the cajo RMI server so that the IDE can get it.&lt;br /&gt;
# Now that the RifidiManager is started the client needs to get the RifidiManagerInterface from the cajo RMI server so that it can call methods.  If the RifidiManager were to be started on a remote machine, step one would not be needed (because the user would start up the server using the main method), and instead, this would be the first step. See [[Engine_RMI_Interface#Remote Interfaces | How to use Remote Interfaces]]&lt;br /&gt;
# The client now needs to tell the RifidiManger to create a reader.  It does this by calling the createReader() method and passing in the GeneralReaderPropertyHolder which is an object that contains all the necessary information about how to start up a reader (reader class name, number of antennas, etc.)&lt;br /&gt;
## The RifidiManager will create the reader using the ReaderModuleFactory and pass the module to the ReaderModuleManager, which is an object that wraps a reader in order to expose an API to the client.&lt;br /&gt;
## Now that the reader module is created and wrapped by a ReaderModuleManager, the RifidiManager binds the ReaderModuleManager to the cajo server so that it is accessible to the client.&lt;br /&gt;
#The client creates a clientCallbackManager that will correspond to the reader that was just created.  The reader will use this object when it needs to make a callback&lt;br /&gt;
#The reader gets the ReaderModule's interface from the cajo server&lt;br /&gt;
#The client calls the getClientProxy() method on the reader.  This will create a proxy on the reader that it will use for the callback manager.&lt;br /&gt;
#The client binds this clientProxy object to the callback manager object that it has created.  Now the reader can access the callback manager correctly.&lt;br /&gt;
#The client calls the reader's turnOn() method in order to (surprise!) turn on the reader.&lt;br /&gt;
## The turnOn() method call triggers the readerModuleManager to turn on the module which it wraps.&lt;br /&gt;
#Now the client wants to add tags to the reader, so it calls the reader module manager's addTags methods&lt;br /&gt;
## Again, the readerModuleManager acts as a wrapper and calls the module's addTagsMethod.&lt;br /&gt;
#At this point the reader's client (The program that controlls the reader, such as an edgeserver) changes the EPC ID of a tag&lt;br /&gt;
##This change requires the reader to notify the IDE through the use of the callback manager, so the reader uses the tagIDChanged() method in the callback manager.&lt;br /&gt;
###The callbackManager calls the necessary methods in the IDE to &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.andrewflusche.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;Fredericksburg DUI Lawyer&amp;lt;/span&amp;gt;] reflect the change.&lt;br /&gt;
&lt;br /&gt;
=Reference Client=&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/TagStreamerArchitecture</id>
		<title>TagStreamerArchitecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/TagStreamerArchitecture"/>
				<updated>2011-11-06T00:08:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: /* The PathItem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tag Streamer 2.0 =&lt;br /&gt;
&lt;br /&gt;
As we talk about Tag Streamer 2.0 we talk about a new Software. The software comes along with Objects and object orientated programming. One of the modern software development concepts is the &amp;quot;Model Viewer Controller&amp;quot; principle. It defines 3 main parts of a program.&lt;br /&gt;
&lt;br /&gt;
* the Viewer&lt;br /&gt;
* the Model&lt;br /&gt;
* the Controller&lt;br /&gt;
&lt;br /&gt;
== The Viewer ==&lt;br /&gt;
The Viewer will be defined in a later phase of the implementation because the main task of Tag Streamer will be the execution of predefined XML files.&lt;br /&gt;
&lt;br /&gt;
== The Model ==&lt;br /&gt;
The Model represents the input data. In Tag Streamer we can identify 4 parts.&lt;br /&gt;
&lt;br /&gt;
* the Batch&lt;br /&gt;
* the Scenario&lt;br /&gt;
* the Components&lt;br /&gt;
* the LoadTestSuite &lt;br /&gt;
&lt;br /&gt;
=== The Batch ===&lt;br /&gt;
Describes what should be done on the PathItems along the Scenario.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;batch id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;waitAction&amp;gt;&lt;br /&gt;
        &amp;lt;waitTime&amp;gt;100&amp;lt;/waitTime&amp;gt;&lt;br /&gt;
    &amp;lt;/waitAction&amp;gt;&lt;br /&gt;
    &amp;lt;tagAction&amp;gt;&lt;br /&gt;
        &amp;lt;execDuration&amp;gt;200&amp;lt;/execDuration&amp;gt;&lt;br /&gt;
        &amp;lt;number&amp;gt;20&amp;lt;/number&amp;gt;&lt;br /&gt;
        &amp;lt;prefix&amp;gt;eef&amp;lt;/prefix&amp;gt;&lt;br /&gt;
        &amp;lt;tagGen&amp;gt;GEN2&amp;lt;/tagGen&amp;gt;&lt;br /&gt;
        &amp;lt;tagType&amp;gt;CustomEPC96&amp;lt;/tagType&amp;gt;&lt;br /&gt;
    &amp;lt;/tagAction&amp;gt;&lt;br /&gt;
    &amp;lt;waitAction&amp;gt;&lt;br /&gt;
        &amp;lt;waitTime&amp;gt;100&amp;lt;/waitTime&amp;gt;&lt;br /&gt;
    &amp;lt;/waitAction&amp;gt;&lt;br /&gt;
    &amp;lt;gpiAction&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;0&amp;lt;/port&amp;gt;&lt;br /&gt;
        &amp;lt;signal&amp;gt;true&amp;lt;/signal&amp;gt;&lt;br /&gt;
    &amp;lt;/gpiAction&amp;gt;&lt;br /&gt;
&amp;lt;/batch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Scenario ===&lt;br /&gt;
Describes how the PathItems are connected to each other &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;best weight loss&amp;lt;/span&amp;gt;] to simulate a assembly line in a factory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scenario&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Components ===&lt;br /&gt;
Describes the affected devices in the PathItems. That can be RFID readers and in the future some more devices along a assembly line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;componentList id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
         &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10101&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5084&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
            &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10102&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5085&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader2&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
&amp;lt;/componentList&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The LoadTestSuite ===&lt;br /&gt;
Describes how many Scenarios are executed and how are the Batches are connected to the scenarios, the speed new batches are created and how long the wait time will be until it's executed again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;loadTestSuite&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;scenario.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;SCENARIO&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;scenario2.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;SCENARIO&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;batch.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;BATCH&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;2&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;2&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
&amp;lt;/loadTestSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Controller ==&lt;br /&gt;
The Controller specifies how the input data will be processed. A example &amp;quot;use case&amp;quot; is provided here:  [[TagStreamerSpecification]].&lt;br /&gt;
&lt;br /&gt;
As parts of the controller we can identify the following components:&lt;br /&gt;
&lt;br /&gt;
* the BatchGenerator&lt;br /&gt;
* the PathItem&lt;br /&gt;
* the LoadTestProcessor&lt;br /&gt;
&lt;br /&gt;
=== The BatchGenerator ===&lt;br /&gt;
It uses the Batch as input data and creates the BatchItems which are floating through the Scenario.&lt;br /&gt;
&lt;br /&gt;
=== The PathItem ===&lt;br /&gt;
A thread which will take a Batch as input and execute the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/t-dietpillsonline.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;diet pills&amp;lt;/span&amp;gt;] the defined operations in it.&lt;br /&gt;
&lt;br /&gt;
=== The LoadTestProcessor ===&lt;br /&gt;
A Thread which takes the LoadTestSuite as input and creates all the necessary objects to operate.&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/TagStreamerArchitecture</id>
		<title>TagStreamerArchitecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/TagStreamerArchitecture"/>
				<updated>2011-11-06T00:08:19Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tag Streamer 2.0 =&lt;br /&gt;
&lt;br /&gt;
As we talk about Tag Streamer 2.0 we talk about a new Software. The software comes along with Objects and object orientated programming. One of the modern software development concepts is the &amp;quot;Model Viewer Controller&amp;quot; principle. It defines 3 main parts of a program.&lt;br /&gt;
&lt;br /&gt;
* the Viewer&lt;br /&gt;
* the Model&lt;br /&gt;
* the Controller&lt;br /&gt;
&lt;br /&gt;
== The Viewer ==&lt;br /&gt;
The Viewer will be defined in a later phase of the implementation because the main task of Tag Streamer will be the execution of predefined XML files.&lt;br /&gt;
&lt;br /&gt;
== The Model ==&lt;br /&gt;
The Model represents the input data. In Tag Streamer we can identify 4 parts.&lt;br /&gt;
&lt;br /&gt;
* the Batch&lt;br /&gt;
* the Scenario&lt;br /&gt;
* the Components&lt;br /&gt;
* the LoadTestSuite &lt;br /&gt;
&lt;br /&gt;
=== The Batch ===&lt;br /&gt;
Describes what should be done on the PathItems along the Scenario.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;batch id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;waitAction&amp;gt;&lt;br /&gt;
        &amp;lt;waitTime&amp;gt;100&amp;lt;/waitTime&amp;gt;&lt;br /&gt;
    &amp;lt;/waitAction&amp;gt;&lt;br /&gt;
    &amp;lt;tagAction&amp;gt;&lt;br /&gt;
        &amp;lt;execDuration&amp;gt;200&amp;lt;/execDuration&amp;gt;&lt;br /&gt;
        &amp;lt;number&amp;gt;20&amp;lt;/number&amp;gt;&lt;br /&gt;
        &amp;lt;prefix&amp;gt;eef&amp;lt;/prefix&amp;gt;&lt;br /&gt;
        &amp;lt;tagGen&amp;gt;GEN2&amp;lt;/tagGen&amp;gt;&lt;br /&gt;
        &amp;lt;tagType&amp;gt;CustomEPC96&amp;lt;/tagType&amp;gt;&lt;br /&gt;
    &amp;lt;/tagAction&amp;gt;&lt;br /&gt;
    &amp;lt;waitAction&amp;gt;&lt;br /&gt;
        &amp;lt;waitTime&amp;gt;100&amp;lt;/waitTime&amp;gt;&lt;br /&gt;
    &amp;lt;/waitAction&amp;gt;&lt;br /&gt;
    &amp;lt;gpiAction&amp;gt;&lt;br /&gt;
        &amp;lt;port&amp;gt;0&amp;lt;/port&amp;gt;&lt;br /&gt;
        &amp;lt;signal&amp;gt;true&amp;lt;/signal&amp;gt;&lt;br /&gt;
    &amp;lt;/gpiAction&amp;gt;&lt;br /&gt;
&amp;lt;/batch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Scenario ===&lt;br /&gt;
Describes how the PathItems are connected to each other &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;best weight loss&amp;lt;/span&amp;gt;] to simulate a assembly line in a factory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scenario&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
    &amp;lt;pathUnit&amp;gt;&lt;br /&gt;
        &amp;lt;readerID&amp;gt;0&amp;lt;/readerID&amp;gt;&lt;br /&gt;
        &amp;lt;travelTime&amp;gt;400&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
    &amp;lt;/pathUnit&amp;gt;&lt;br /&gt;
&amp;lt;/scenario&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Components ===&lt;br /&gt;
Describes the affected devices in the PathItems. That can be RFID readers and in the future some more devices along a assembly line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;componentList id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
         &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10101&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5084&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
    &amp;lt;readerComponents id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;reader&amp;gt;&lt;br /&gt;
            &amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
        &amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
        &amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
        &amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:10102&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1:5085&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
        &amp;lt;readerClassName&amp;gt;org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
        &amp;lt;readerName&amp;gt;LLRPreader2&amp;lt;/readerName&amp;gt;&lt;br /&gt;
        &amp;lt;readerType&amp;gt;LLRPReader&amp;lt;/readerType&amp;gt;&lt;br /&gt;
        &amp;lt;/reader&amp;gt;&lt;br /&gt;
    &amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
&amp;lt;/componentList&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The LoadTestSuite ===&lt;br /&gt;
Describes how many Scenarios are executed and how are the Batches are connected to the scenarios, the speed new batches are created and how long the wait time will be until it's executed again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;loadTestSuite&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;scenario.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;SCENARIO&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;scenario2.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;SCENARIO&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnits&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;batch.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;BATCH&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnits&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;2&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit&amp;gt;&lt;br /&gt;
        &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
        &amp;lt;rampTime&amp;gt;4000&amp;lt;/rampTime&amp;gt;&lt;br /&gt;
        &amp;lt;scenarios&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
            &amp;lt;id&amp;gt;2&amp;lt;/id&amp;gt;&lt;br /&gt;
        &amp;lt;/scenarios&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
&amp;lt;/loadTestSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Controller ==&lt;br /&gt;
The Controller specifies how the input data will be processed. A example &amp;quot;use case&amp;quot; is provided here:  [[TagStreamerSpecification]].&lt;br /&gt;
&lt;br /&gt;
As parts of the controller we can identify the following components:&lt;br /&gt;
&lt;br /&gt;
* the BatchGenerator&lt;br /&gt;
* the PathItem&lt;br /&gt;
* the LoadTestProcessor&lt;br /&gt;
&lt;br /&gt;
=== The BatchGenerator ===&lt;br /&gt;
It uses the Batch as input data and creates the BatchItems which are floating through the Scenario.&lt;br /&gt;
&lt;br /&gt;
=== The PathItem ===&lt;br /&gt;
A thread which will take a Batch as input and execute the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[SITE!!!!!!!!!!!!!!!!!!!!!!!!!! &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;TITLE!!!!!!!!!!!!!!!&amp;lt;/span&amp;gt;] the defined operations in it.&lt;br /&gt;
&lt;br /&gt;
=== The LoadTestProcessor ===&lt;br /&gt;
A Thread which takes the LoadTestSuite as input and creates all the necessary objects to operate.&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Development_and_Release_Process</id>
		<title>Development and Release Process</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Development_and_Release_Process"/>
				<updated>2011-11-06T00:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document describes the development and release processes for the products in the Rifidi Suite as well as various conventions that developers should be following.  This document is intended for developers who are fairly familiar with the Rifidi code base, especially with eclipse and OSGi concepts.&lt;br /&gt;
=Goals=&lt;br /&gt;
# Standardize the development and release processes for Rifidi Developers&lt;br /&gt;
# Enable a relatively lightweight release process that is able to be extended later by a fully automatic build tool like maven&lt;br /&gt;
# Define a common set of conventions to use when checking in, checking out, and tagging code.&lt;br /&gt;
&lt;br /&gt;
This document is not intended to be a &amp;quot;how to&amp;quot; guide for eclipse, but rather to define some common operating procedures around how code is developed and released in the Rifidi project&lt;br /&gt;
&lt;br /&gt;
=Concepts=&lt;br /&gt;
==Target Platforms==&lt;br /&gt;
===About Target Platforms===&lt;br /&gt;
A target platform is the set of base plugins that your application depends on.  Normally when you build a project in eclipse that uses eclipse functionality (SWT, JFace, etc), eclipse gets that functionality from the plugins and features folder located in you eclipse installation.  Therefore it is using your eclipse base installation as your target platform.  However, it is possible to define your own target platform for the application you are building rather than relying on the default one.  Doing this is useful for several reasons&lt;br /&gt;
# It creates a separation between the plugins you use in your developing environment and the plugins used by your application.  This means that you can, for example, upgrade the eclipse you use as your IDE without upgrading the plugins used by your application.  Also, you can add plugins to your application without using them in your IDE.  For example suppose you want to use the GEF bundles in your application, but you don't want them inside your eclipse development environment.&lt;br /&gt;
# A closely related advantage is that you can limit the plugins that are available to your application.  If you use the base eclipse installation as your target platform, all of the plugins are available to your application.  This makes it easy for application developers to simply add dependencies as they like.  However, because an added dependency often means changes to other things, such as build processes, adding bundle dependencies should require some deliberation.  Having a target platform simply makes bundle dependencies more explicit.&lt;br /&gt;
# It is possible to place more than just eclipse base plugins in the custom target platform.  You can put bundles in there that you have built that are required for you application.  This means that you could put, for example, tagged, stable versions of all of the plugins in your application in your target platform.  Then when you need to modify a plugin, you can check out the source code from svn.  Because eclipse will look in your workspace before it looks in your target platform &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-dietpills.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;diet pills&amp;lt;/span&amp;gt;], it will find that plugin first.  This means developers only have to check out code for bundles that they want to modify, which forces him to think about the code that he wants to write.  It also means that, because the code in the target platform is tagged and stable, that if one developer checks in code with a change in it that breaks another plugin, that other developers can continue developing with the stable bundles in the target platform.&lt;br /&gt;
===Target Platforms in Rifidi===&lt;br /&gt;
Each major Rifidi project in the Rifidi suite should have its own target platform.  For example, there is a target platform called &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  There should be a directory in the target platform called &amp;lt;code&amp;gt;rifidi&amp;lt;/code&amp;gt; where all the bundle binaries that are required for that particular project. In addition there are various target platforms used for deploying products, such as &amp;lt;code&amp;gt;org.rifidi.rcp.target&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Bundle Versioning==&lt;br /&gt;
All bundles in OSGi have version numbers, with the following form 1.2.3, where 1 is the major version, 2 is the minor version, and 3 is the point version.  The Rifidi project uses the following conventions:&lt;br /&gt;
# The '''major''' version should be increased only if there is a major API change for the bundle.  A major version change usually involve a change that would break another plugin, for example, changing a method signature. A good rule of thumb is that if bundle X depends on bundle Y and bundle X was modified as a result of the changes to bundle Y, then bundle Y had a major API change.  For example, suppose bundle Y has a method called &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt;.  Suppose bundle X, for some reason, needs to pass in a string to &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt;.  So you modify &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt; to become &amp;lt;code&amp;gt;foo(String string)&amp;lt;/code&amp;gt;.  This was a major change in bundle Y.&lt;br /&gt;
# The '''minor''' version should be increased if there is a minor API change.  A minor API change is something that would not break existing compatibility with dependent bundles.  For example, adding a method signature to a class, or adding more functionality to the bundle in the form of classes is a minor API change.  The key difference between a minor and a major API change is that a minor API change will not cause other bundles that depend on it to break.&lt;br /&gt;
# The '''point''' version should be increased for small internal changes and bug fixes.  These changes do not involve the bundle's API.&lt;br /&gt;
&lt;br /&gt;
Note that it is not necessary to change the version numbers any time you submit.  It is only necessary to modify the version numbers if the changes are relatively well tested and stable.  For example, you might want to make some changes then submit the changes back to the trunk for another developer to look at, test, or modify. ''If you don't expect &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss supplements&amp;lt;/span&amp;gt;] to make any further changes to the code, then you should modify then version number''&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
In OSGi there are two ways of specifying dependencies.  &lt;br /&gt;
#'''Require-Bundle''' should be used for dependencies to bundles that contain code which is written for the Rifidi project. Usually, this is anything that begins with &amp;lt;code&amp;gt;org.rifidi.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
#'''Import-Package''' should be used for for dependencies to bundles that do not contain code that is maintained by the Rifidi project, for example, to third party libraries such as log4j, cajo, or eclipse base plugins such as SWT or GEF.  It is also possible to find certain third party libraries that have already been made into a plugin at the eclipse [http://www.eclipse.org/orbit/overview.php eclipse orbit project].  &lt;br /&gt;
&lt;br /&gt;
The advantage to using Import-Package over Require-Bundle is that Import-Package is more flexible.  The plugin is more flexible because it could use any loaded OSGi bundle that exposes that particular plugin with the given version constraints.  In addition, because importing packages is more granular than requiring bundles, it makes the developer think a little more about the dependencies his is using.&lt;br /&gt;
&lt;br /&gt;
In both Require-Bundle and Import-Package dependencies, the minimum version ''must'' be specified.  It is also recommended that the maximum version be specified as well.  This is because it is possible for more than one bundle with the same name but different versions to be loaded by OSGi during runtime.  So if an incorrect version of a bundle is already loaded, but the bundle that requires that bundle does not specify the version it needs, bad things might happen.  &lt;br /&gt;
&lt;br /&gt;
A good way to specify versions is to have the minimum version be inclusive and the maximum version be exclusive.  For example, if the minimum version is set to 2.2.0 inclusive and the maximum version is 2.3.0 exclusive, then any version starting with 2.2 is acceptable.  This makes sense, because we have adopted a versioning scheme where the minor version number signifies a minor API change.&lt;br /&gt;
&lt;br /&gt;
==SVN Structure==&lt;br /&gt;
There are four repositories used in Rifidi:&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; - main repository for Rifidi development&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-internal&amp;lt;/code&amp;gt; - repository to hold code that is necessary, but that should not be released&lt;br /&gt;
* &amp;lt;code&amp;gt;rep-edge&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt; - repository to hold projects for playing around with&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rep-edge&amp;lt;/code&amp;gt; are the main repositories for Rifidi development. They have the following structure:&lt;br /&gt;
&lt;br /&gt;
*'''org.rifidi.binary'''&lt;br /&gt;
*: A project containing all the bundles as binaries for rifidi.  It is used so that you don't have to check out the code when developing or releasing&lt;br /&gt;
* '''readme''' &lt;br /&gt;
*:a project that contains a text file that describes what all the bundles in trunk are used for&lt;br /&gt;
* '''rifidi'''&lt;br /&gt;
*: The code for the Rifidi project&lt;br /&gt;
** '''branches'''&lt;br /&gt;
*: If a developer want to add a major feature that requires alot of time, and he wants to check the code into the svn before he is ready to integrate the code back into the trunk, he can check the code into the branches directory&lt;br /&gt;
** '''tags'''&lt;br /&gt;
**: When a stable version of a bundle is reached, the code should be placed in a sub directory that has the name of the bundle's version.  See [[Development and Release Process#Tags| Tags]] for a description of when to create a new tag&lt;br /&gt;
*** '''org.rifidi.bundle.a'''&lt;br /&gt;
**** 1.0.0 - contains eclipse project&lt;br /&gt;
**** 1.1.0 - contains eclipse project&lt;br /&gt;
**** 2.0.0 - contains eclipse project&lt;br /&gt;
*** '''org.rifidi.bundle.b'''&lt;br /&gt;
**** 1.0.0 - contains eclipse project&lt;br /&gt;
** '''trunk'''&lt;br /&gt;
**: The trunk contains the latest code for each bundle.  It might be unstable.  All changes to code should be made to the bundles located in the trunk&lt;br /&gt;
*** org.rifidi.bundle.a - contains eclipse project&lt;br /&gt;
*** org.rifidi.bundle.b - contains eclipse project&lt;br /&gt;
&lt;br /&gt;
==Tags==&lt;br /&gt;
The purpose of tagging a bundle is to save the code at a stable point so that future changes can be reversed if they introduce a bug that older versions did not have.  A new tag ''must'' be created in svn when either the major or the minor version number of the plugin is incremented.  It is not required to create a new tag when the point version number is incremented, but it is ok to do so.&lt;br /&gt;
&lt;br /&gt;
==Product File==&lt;br /&gt;
A product file defines the required plugins for a particular project.  It is used to build the project.  It is important to keep this file updated as new plugins are added or old ones are removed.&lt;br /&gt;
&lt;br /&gt;
=Processes=&lt;br /&gt;
This section defines a few procedures that should be followed when developing code for the Rifidi project&lt;br /&gt;
==Setting up a development environment==&lt;br /&gt;
# Download the target platform for the project you are working with.  For example, if you are developing a plugin for emulator, you would download the target platform for emulator&lt;br /&gt;
# Download &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
# Download any bundles that you need to modify.  For example, if you are making changes to the alien reader, download &amp;lt;code&amp;gt;org.rifidi.emulator.reader.alien&amp;lt;/code&amp;gt;&lt;br /&gt;
# Set the target platform as the target platform for the workspace&lt;br /&gt;
# Clean the workspace&lt;br /&gt;
&lt;br /&gt;
==Modifying an Existing Bundle==&lt;br /&gt;
Suppose you have modified an existing bundle and the changes are relatively stable and tested, and you are ready to integrate them back in with the rest of the project.&lt;br /&gt;
&lt;br /&gt;
# If the changes you have made require a version change make sure that is done&lt;br /&gt;
# If you had to change the major or the minor version number, create a new svn tag for the plugin.&lt;br /&gt;
# Export the bundle as a binary bundle using the export wizard on the Manifest.MF file for the plugin&lt;br /&gt;
# Add the bundle to &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
# Submit bundle changes and target platform changes back to trunk.&lt;br /&gt;
&lt;br /&gt;
If you have made changes to a bundle but are not ready to integrate them back with the rest of the project, you can do one of two things:&lt;br /&gt;
# Submit them back to the trunk, but don't change the version numbers.  This is ok to do because everyone else should be using tagged stable bundles in the target platform.&lt;br /&gt;
# Create a folder in the branches directory and put it there.  Only do this if multiple developers are modifying the same plugin at the same time.&lt;br /&gt;
&lt;br /&gt;
==Creating a new Bundle==&lt;br /&gt;
To create a new bundle called &amp;lt;code&amp;gt;org.rifidi.xyz&amp;lt;/code&amp;gt;:&lt;br /&gt;
# Create a new plugin project with the name &amp;lt;code&amp;gt;org.rifidi.xyz&amp;lt;/code&amp;gt;&lt;br /&gt;
# In the Manifest.MF file&lt;br /&gt;
## Add 'Pramari, LLC' as the provider&lt;br /&gt;
## Give the bundle a name such as 'Rifidi xyz'.  It is important that the first word is 'Rifidi' so that all bundles created as a part of the Rifidi project are easy to locate when there are alot of bundles installed as part of an eclipse installation.&lt;br /&gt;
# Write the code for the plugin&lt;br /&gt;
# Follow the steps for [[Development and Release Process#Modifying and Existing Bundle| Modifying and Existing Bundle]]&lt;br /&gt;
# If you tagged the bundle and added it to the target platform, then make sure you add the new bundle and its dependencies to the product file&lt;br /&gt;
# Add an entry to the readme project at the top level of the svn&lt;br /&gt;
&lt;br /&gt;
==Releasing a Product==&lt;br /&gt;
# Download the rifidi build target platform and set it as the target platform for your workspace&lt;br /&gt;
# Download the project that contains the product file for the project you are trying to build&lt;br /&gt;
# Export the project using the export wizard&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/TagStreamerUseCaseScenarios</id>
		<title>TagStreamerUseCaseScenarios</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/TagStreamerUseCaseScenarios"/>
				<updated>2011-11-06T00:06:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jerrito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Starting up Tag Streamer alpha 2.0=&lt;br /&gt;
# Follow the [[Rifidi:Source_Code|instructions]] to download Rifidi Tag Streamer from source&lt;br /&gt;
## Download the following [[Tag_Streamer_Packages|packages]]&lt;br /&gt;
# Open up the Lauch Configuration wizard by going to run-&amp;gt;Open Run Dialog... [[Image:Streamer-setup-osgi.png|thumb|800px|none]]&lt;br /&gt;
#Create a new OSGI Framwork launch configuration [[Image:Streamer-setup-plugins.png|thumb|800px|none]]&lt;br /&gt;
##Click 'Deselect All'&lt;br /&gt;
##Click the box next to org.rifidi.streamer&lt;br /&gt;
##Click 'Add Required Bundles'&lt;br /&gt;
##Click the boxes next to all the reader bundles (i.e. org.rifidi.emulator.reader.llrp, org.rifidi.emulator.reader.alien, etc)&lt;br /&gt;
##Click 'Apply'&lt;br /&gt;
##Click 'Run'&lt;br /&gt;
#The application should now fail with a FileNotFound Exception.  You need to place the four XML files (loadTestSuite.xml, scenario.xml, components.xml, and batch.xml) into this directory&lt;br /&gt;
&lt;br /&gt;
= Use Case: Bursts of tags =&lt;br /&gt;
This use case simulates scenarios when you have short bursts of tags on many readers, such as several dock doors.  We define a scenario suite with five scenarios, each having one reader.  You can think of this as having five dock doors.  Then we define the actual readers in the components.xml.  This defines what kind of reader will be used in the scenarios as well as some additional information about the readers, such as their IP address and how many GPIO ports they have.  The batchSuite defines the patterns of tags that will be seen by the readers.  The first thing that this batch does is wait for a random amount of time so that all batches do not start at the same time. We also define a pattern of 20 tags (number) that represent a burst.  Finally a LoadTestSuite is defined that defines a)The path to the xml files that are used (scenario, components, and batch), and b) the execution structure.  The execution structure has a number of times to run, a time to wait between loops, and a mapping between scenarios and batches.  These mappings, called batchActions, define which batches each scenario should run.  All of the batchActions happen in parallel &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.supplementstoweightloss.com/t-adipex.aspx &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;adipex&amp;lt;/span&amp;gt;] (that is why we put a random wait time at the beginning of the batch -- so that &lt;br /&gt;
== Scenarios ==&lt;br /&gt;
The following scenario describes how the readers are located. In this special case all scenarios &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.shoppharmacycounter.com/ &amp;lt;span style=&amp;quot;color:black;font-weight:normal; text-decoration:none!important; background:none!important; text-decoration:none;&amp;quot;&amp;gt;weight loss pills&amp;lt;/span&amp;gt;] consist of only one reader. Because none of these readers have following readers the traveltime is 0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scenarioSuite&amp;gt;&lt;br /&gt;
    &amp;lt;scenario id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;pathItem&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;1&amp;lt;/readerID&amp;gt;&lt;br /&gt;
            &amp;lt;travelTime&amp;gt;0&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
        &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;/scenario&amp;gt;&lt;br /&gt;
    &amp;lt;scenario id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;pathItem&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;2&amp;lt;/readerID&amp;gt;&lt;br /&gt;
            &amp;lt;travelTime&amp;gt;0&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
        &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;/scenario&amp;gt;&lt;br /&gt;
     &amp;lt;scenario id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;pathItem&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;3&amp;lt;/readerID&amp;gt;&lt;br /&gt;
            &amp;lt;travelTime&amp;gt;0&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
        &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;/scenario&amp;gt;&lt;br /&gt;
     &amp;lt;scenario id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;pathItem&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;4&amp;lt;/readerID&amp;gt;&lt;br /&gt;
            &amp;lt;travelTime&amp;gt;0&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
        &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;/scenario&amp;gt;&lt;br /&gt;
     &amp;lt;scenario id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;pathItem&amp;gt;&lt;br /&gt;
            &amp;lt;readerID&amp;gt;5&amp;lt;/readerID&amp;gt;&lt;br /&gt;
            &amp;lt;travelTime&amp;gt;0&amp;lt;/travelTime&amp;gt;&lt;br /&gt;
        &amp;lt;/pathItem&amp;gt;&lt;br /&gt;
    &amp;lt;/scenario&amp;gt;&lt;br /&gt;
&amp;lt;/scenarioSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
This file describes all the components the streamer should load. In this case we describe 5 LLRP Readers. Wich will be emulated by RifidiEmulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;componentSuite&amp;gt;&lt;br /&gt;
	&amp;lt;readerComponents id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;reader&amp;gt;&lt;br /&gt;
			&amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
			&amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
			&amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
			&amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:5084&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:10101&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
			&amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
			&amp;lt;readerClassName&amp;gt;&lt;br /&gt;
				org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&lt;br /&gt;
			&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
			&amp;lt;readerName&amp;gt;LLRPReader1&amp;lt;/readerName&amp;gt;&lt;br /&gt;
		&amp;lt;/reader&amp;gt;&lt;br /&gt;
	&amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
	&amp;lt;readerComponents id=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;reader&amp;gt;&lt;br /&gt;
			&amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
			&amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
			&amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
			&amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:5085&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:10102&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
			&amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
			&amp;lt;readerClassName&amp;gt;&lt;br /&gt;
				org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&lt;br /&gt;
			&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
			&amp;lt;readerName&amp;gt;LLRPReader2&amp;lt;/readerName&amp;gt;&lt;br /&gt;
		&amp;lt;/reader&amp;gt;&lt;br /&gt;
	&amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
	&amp;lt;readerComponents id=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;reader&amp;gt;&lt;br /&gt;
			&amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
			&amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
			&amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
			&amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:5086&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:10103&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
			&amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
			&amp;lt;readerClassName&amp;gt;&lt;br /&gt;
				org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&lt;br /&gt;
			&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
			&amp;lt;readerName&amp;gt;LLRPReader3&amp;lt;/readerName&amp;gt;&lt;br /&gt;
		&amp;lt;/reader&amp;gt;&lt;br /&gt;
	&amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
	&amp;lt;readerComponents id=&amp;quot;4&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;reader&amp;gt;&lt;br /&gt;
			&amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
			&amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
			&amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
			&amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:5087&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:10104&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
			&amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
			&amp;lt;readerClassName&amp;gt;&lt;br /&gt;
				org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&lt;br /&gt;
			&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
			&amp;lt;readerName&amp;gt;LLRPReader4&amp;lt;/readerName&amp;gt;&lt;br /&gt;
		&amp;lt;/reader&amp;gt;&lt;br /&gt;
	&amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
	&amp;lt;readerComponents id=&amp;quot;5&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;reader&amp;gt;&lt;br /&gt;
			&amp;lt;numAntennas&amp;gt;1&amp;lt;/numAntennas&amp;gt;&lt;br /&gt;
			&amp;lt;numGPIs&amp;gt;4&amp;lt;/numGPIs&amp;gt;&lt;br /&gt;
			&amp;lt;numGPOs&amp;gt;4&amp;lt;/numGPOs&amp;gt;&lt;br /&gt;
			&amp;lt;propertiesMap&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;llrp_inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:5088&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;inet_address&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;127.0.0.1:10104&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
				&amp;lt;entry&amp;gt;&lt;br /&gt;
					&amp;lt;key&amp;gt;servermode&amp;lt;/key&amp;gt;&lt;br /&gt;
					&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
				&amp;lt;/entry&amp;gt;&lt;br /&gt;
			&amp;lt;/propertiesMap&amp;gt;&lt;br /&gt;
			&amp;lt;readerClassName&amp;gt;&lt;br /&gt;
				org.rifidi.emulator.reader.llrp.module.LLRPReaderModule&lt;br /&gt;
			&amp;lt;/readerClassName&amp;gt;&lt;br /&gt;
			&amp;lt;readerName&amp;gt;LLRPReader5&amp;lt;/readerName&amp;gt;&lt;br /&gt;
		&amp;lt;/reader&amp;gt;&lt;br /&gt;
	&amp;lt;/readerComponents&amp;gt;&lt;br /&gt;
&amp;lt;/componentSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Batch ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;batchSuite&amp;gt;&lt;br /&gt;
	&amp;lt;batch id=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;waitAction&amp;gt;&lt;br /&gt;
			&amp;lt;maxWaitTime&amp;gt;100&amp;lt;/maxWaitTime&amp;gt;&lt;br /&gt;
			&amp;lt;minWaitTime&amp;gt;200&amp;lt;/minWaitTime&amp;gt;&lt;br /&gt;
			&amp;lt;random&amp;gt;true&amp;lt;/random&amp;gt;&lt;br /&gt;
		&amp;lt;/waitAction&amp;gt;&lt;br /&gt;
		&amp;lt;tagAction&amp;gt;&lt;br /&gt;
			&amp;lt;execDuration&amp;gt;200&amp;lt;/execDuration&amp;gt;&lt;br /&gt;
			&amp;lt;number&amp;gt;20&amp;lt;/number&amp;gt;&lt;br /&gt;
			&amp;lt;prefix&amp;gt;eef&amp;lt;/prefix&amp;gt;&lt;br /&gt;
			&amp;lt;regenerate&amp;gt;true&amp;lt;/regenerate&amp;gt;&lt;br /&gt;
			&amp;lt;tagGen&amp;gt;GEN2&amp;lt;/tagGen&amp;gt;&lt;br /&gt;
			&amp;lt;tagType&amp;gt;CustomEPC96&amp;lt;/tagType&amp;gt;&lt;br /&gt;
		&amp;lt;/tagAction&amp;gt;&lt;br /&gt;
	&amp;lt;/batch&amp;gt;&lt;br /&gt;
&amp;lt;/batchSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LoadTestSuite == &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;loadTestSuite&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnit&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;components.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;COMPONENT&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnit&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnit&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;batches.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;BATCH&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnit&amp;gt;&lt;br /&gt;
    &amp;lt;fileUnit&amp;gt;&lt;br /&gt;
        &amp;lt;fileName&amp;gt;scenario.xml&amp;lt;/fileName&amp;gt;&lt;br /&gt;
        &amp;lt;fileType&amp;gt;SCENARIO&amp;lt;/fileType&amp;gt;&lt;br /&gt;
    &amp;lt;/fileUnit&amp;gt;&lt;br /&gt;
    &amp;lt;testUnit iterations=&amp;quot;5000&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;waitAction&amp;gt;&lt;br /&gt;
            &amp;lt;maxWaitTime&amp;gt;1000&amp;lt;/maxWaitTime&amp;gt;&lt;br /&gt;
            &amp;lt;minWaitTime&amp;gt;0000&amp;lt;/minWaitTime&amp;gt;&lt;br /&gt;
            &amp;lt;random&amp;gt;false&amp;lt;/random&amp;gt;&lt;br /&gt;
        &amp;lt;/waitAction&amp;gt;&lt;br /&gt;
        &amp;lt;batchAction&amp;gt;&lt;br /&gt;
            &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
            &amp;lt;scenarioID&amp;gt;1&amp;lt;/scenarioID&amp;gt;&lt;br /&gt;
        &amp;lt;/batchAction&amp;gt;&lt;br /&gt;
        &amp;lt;batchAction&amp;gt;&lt;br /&gt;
            &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
            &amp;lt;scenarioID&amp;gt;2&amp;lt;/scenarioID&amp;gt;&lt;br /&gt;
        &amp;lt;/batchAction&amp;gt;&lt;br /&gt;
        &amp;lt;batchAction&amp;gt;&lt;br /&gt;
            &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
            &amp;lt;scenarioID&amp;gt;3&amp;lt;/scenarioID&amp;gt;&lt;br /&gt;
        &amp;lt;/batchAction&amp;gt;&lt;br /&gt;
        &amp;lt;batchAction&amp;gt;&lt;br /&gt;
            &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
            &amp;lt;scenarioID&amp;gt;4&amp;lt;/scenarioID&amp;gt;&lt;br /&gt;
        &amp;lt;/batchAction&amp;gt;&lt;br /&gt;
        &amp;lt;batchAction&amp;gt;&lt;br /&gt;
            &amp;lt;batchID&amp;gt;1&amp;lt;/batchID&amp;gt;&lt;br /&gt;
            &amp;lt;scenarioID&amp;gt;5&amp;lt;/scenarioID&amp;gt;&lt;br /&gt;
        &amp;lt;/batchAction&amp;gt;&lt;br /&gt;
    &amp;lt;/testUnit&amp;gt;&lt;br /&gt;
&amp;lt;/loadTestSuite&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jerrito</name></author>	</entry>

	</feed>