<?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=Seoagent</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=Seoagent"/>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Special:Contributions/Seoagent"/>
		<updated>2026-04-19T15:48:33Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.1</generator>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Configuration</id>
		<title>Edge Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Configuration"/>
				<updated>2011-11-01T04:57:32Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Loading a configuration file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains the various configuration options of the Rifidi Edge Server&lt;br /&gt;
=RifidiEdgeServer.ini=&lt;br /&gt;
The RifidiEdgeServer.ini is a property file that contains options for various options when the edge server starts up.  &lt;br /&gt;
==rifidiserver.ini file==&lt;br /&gt;
As of release 1.2.0, the default rifidiserver.ini file looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-os&lt;br /&gt;
${target.os}&lt;br /&gt;
-ws&lt;br /&gt;
${target.ws}&lt;br /&gt;
-arch&lt;br /&gt;
${target.arch}&lt;br /&gt;
-nl&lt;br /&gt;
${target.nl}&lt;br /&gt;
-vmargs&lt;br /&gt;
-Declipse.ignoreApp=true&lt;br /&gt;
-Dosgi.console&lt;br /&gt;
-Dosgi.noShutdown=true&lt;br /&gt;
-Dorg.rifidi.edge.configuration=config/rifidi.xml&lt;br /&gt;
-Dosgi.clean=true&lt;br /&gt;
-Dorg.osgi.framework.bootdelegation=javax.xml.ws&lt;br /&gt;
-Dcom.sun.management.jmxremote.port=2021&lt;br /&gt;
-Dcom.sun.management.jmxremote.authenticate=false&lt;br /&gt;
-Dcom.sun.management.jmxremote.ssl=false&lt;br /&gt;
-Djava.rmi.server.hostname=127.0.0.1&lt;br /&gt;
-Dorg.rifidi.edge.core.rmi.port=1101&lt;br /&gt;
-Dorg.rifidi.edge.ale.port=8081&lt;br /&gt;
-Dorg.rifidi.edge.ale.host=127.0.0.1&lt;br /&gt;
-Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook&lt;br /&gt;
-Dorg.aspectj.osgi.verbose=true&lt;br /&gt;
-Dorg.rifidi.edge.autostart=true&lt;br /&gt;
-Dorg.rifidi.edge.logging=config/logging.properties&lt;br /&gt;
-Dorg.rifidi.ui.notify=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Console==&lt;br /&gt;
;-console&lt;br /&gt;
:This starts up the OSGi console so that you can interact with the edge server from the command line.  For a list of commands that are available see [[Edge Server Commands]].  If you would like the console to be available over the network, supply a port after the -console (e.g. -console 2020). Now it is possible to telnet into the server at the given port.  It is recommended that you use ssh tunneling for security reasons (i.e. first ssh to the machine that is running the edge server, then telnet to the console). One thing to note is that after you telnet to the OSGi console, you cannot use &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://vihan.vn&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; thiet ke web&amp;lt;/span&amp;gt;] the &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; command as you normally would to close the telnet session.  This is because &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; will be caught by the OSGi console and will perform a System.exit().  Instead, to exit the telnet session &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;] while keeping the server running, just close the telnet window.&lt;br /&gt;
&lt;br /&gt;
==VMArgs==&lt;br /&gt;
VMArgs must follow the &amp;lt;tt&amp;gt;-vmargs&amp;lt;/tt&amp;gt; flag in the .ini file.  They must start with &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;.  Default values can be found in the &amp;lt;tt&amp;gt;bundle.properties&amp;lt;/tt&amp;gt; file in the spring directory for the appropriate option. Important VM args:&lt;br /&gt;
;-Dorg.rifidi.edge.configuration&lt;br /&gt;
:This is the path to the persistence file. See [[#rifidi.xml]].&lt;br /&gt;
;-Dcom.sun.management.jmxremote.port&lt;br /&gt;
:The port to open up JMX on.  This is important if you are using a program like VisualVM to profile the server&lt;br /&gt;
;-Djava.rmi.server.hostname&lt;br /&gt;
:The hostname to open up the RMI registry at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.core.rmi.port&lt;br /&gt;
:The port of the RMI registry Default is &amp;lt;tt&amp;gt;1101&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.host&lt;br /&gt;
:The hostname to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.port&lt;br /&gt;
:The port to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;8081&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.read&lt;br /&gt;
:The service name of the ALE reading service.  Default is &amp;lt;tt&amp;gt;ALEService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.logicalreader&lt;br /&gt;
:The service name of the ALE logical reader service. Default is &amp;lt;tt&amp;gt;ALELRService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.home&lt;br /&gt;
:The Rifidi directory. If not set, it defaults to ${user.dir}&lt;br /&gt;
;-Dorg.rifidi.ui.notify&lt;br /&gt;
:If set to true, reader adapters will send tag notifications to workbench. Default is true&lt;br /&gt;
&lt;br /&gt;
=rifidi.xml=&lt;br /&gt;
The rifidi.xml file is the persistence file for the Rifidi Edge Server.  The two important services that are saved are Reader Configurations and Command Configurations.&lt;br /&gt;
&lt;br /&gt;
==Loading a configuration file==&lt;br /&gt;
Whenever the edge server starts up, it looks for the file that is specified in the &amp;lt;tt&amp;gt;org.rifidi.configuration&amp;lt;/tt&amp;gt; vm flag. After the configuration file is read, the server will attempt to recreate all services specified in the file.  If a needed factory is not available, the service will be skipped and &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.seoagency.com.vn/seo.php&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; dich vu seo&amp;lt;/span&amp;gt;] recreated when the factory becomes available.  For example, suppose the configuration file has an Alien Reader Configuration and an &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.seoagency.com.vn&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; cong ty seo&amp;lt;/span&amp;gt;] LLRP Reader Configuration.  Suppose that when  the server starts up, only the Alien plugin is available (so the Alien Reader Factory is available, but the LLRP Reader Factory is not).  At this point the Alien Reader is recreated.  If later the LLRP plugin is installed, then the LLRP reader will be recreated.&lt;br /&gt;
&lt;br /&gt;
==File Structure==&lt;br /&gt;
The edge server uses JAXB to persist a configuration file &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;].  Each service will have a serviceID and a factoryID.  The serviceID is the unique name of the service, and is used when using the service (such as starting a session on a reader).  The factoryID is the ID of the factory that can create a service.   The following is an example of file that has one Alien Reader saved.&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;configurationStore&amp;gt;&lt;br /&gt;
    &amp;lt;services&amp;gt;&lt;br /&gt;
        &amp;lt;attributes&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ReconnectionInterval&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;500&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;Port&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;20000&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;InvertExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;PersistTime&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;-1&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;Username&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;alien&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;Password&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;password&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;InvertExternalInput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ReaderNumber&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;IpAddress&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1&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;MaxNumConnectionAttempts&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;10&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;RFAttenuation&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/attributes&amp;gt;&lt;br /&gt;
        &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
        &amp;lt;serviceID&amp;gt;Alien_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
    &amp;lt;/services&amp;gt;&lt;br /&gt;
&amp;lt;/configurationStore&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Configuration</id>
		<title>Edge Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Configuration"/>
				<updated>2011-11-01T04:57:16Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Loading a configuration file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains the various configuration options of the Rifidi Edge Server&lt;br /&gt;
=RifidiEdgeServer.ini=&lt;br /&gt;
The RifidiEdgeServer.ini is a property file that contains options for various options when the edge server starts up.  &lt;br /&gt;
==rifidiserver.ini file==&lt;br /&gt;
As of release 1.2.0, the default rifidiserver.ini file looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-os&lt;br /&gt;
${target.os}&lt;br /&gt;
-ws&lt;br /&gt;
${target.ws}&lt;br /&gt;
-arch&lt;br /&gt;
${target.arch}&lt;br /&gt;
-nl&lt;br /&gt;
${target.nl}&lt;br /&gt;
-vmargs&lt;br /&gt;
-Declipse.ignoreApp=true&lt;br /&gt;
-Dosgi.console&lt;br /&gt;
-Dosgi.noShutdown=true&lt;br /&gt;
-Dorg.rifidi.edge.configuration=config/rifidi.xml&lt;br /&gt;
-Dosgi.clean=true&lt;br /&gt;
-Dorg.osgi.framework.bootdelegation=javax.xml.ws&lt;br /&gt;
-Dcom.sun.management.jmxremote.port=2021&lt;br /&gt;
-Dcom.sun.management.jmxremote.authenticate=false&lt;br /&gt;
-Dcom.sun.management.jmxremote.ssl=false&lt;br /&gt;
-Djava.rmi.server.hostname=127.0.0.1&lt;br /&gt;
-Dorg.rifidi.edge.core.rmi.port=1101&lt;br /&gt;
-Dorg.rifidi.edge.ale.port=8081&lt;br /&gt;
-Dorg.rifidi.edge.ale.host=127.0.0.1&lt;br /&gt;
-Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook&lt;br /&gt;
-Dorg.aspectj.osgi.verbose=true&lt;br /&gt;
-Dorg.rifidi.edge.autostart=true&lt;br /&gt;
-Dorg.rifidi.edge.logging=config/logging.properties&lt;br /&gt;
-Dorg.rifidi.ui.notify=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Console==&lt;br /&gt;
;-console&lt;br /&gt;
:This starts up the OSGi console so that you can interact with the edge server from the command line.  For a list of commands that are available see [[Edge Server Commands]].  If you would like the console to be available over the network, supply a port after the -console (e.g. -console 2020). Now it is possible to telnet into the server at the given port.  It is recommended that you use ssh tunneling for security reasons (i.e. first ssh to the machine that is running the edge server, then telnet to the console). One thing to note is that after you telnet to the OSGi console, you cannot use &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://vihan.vn&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; thiet ke web&amp;lt;/span&amp;gt;] the &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; command as you normally would to close the telnet session.  This is because &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; will be caught by the OSGi console and will perform a System.exit().  Instead, to exit the telnet session &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;] while keeping the server running, just close the telnet window.&lt;br /&gt;
&lt;br /&gt;
==VMArgs==&lt;br /&gt;
VMArgs must follow the &amp;lt;tt&amp;gt;-vmargs&amp;lt;/tt&amp;gt; flag in the .ini file.  They must start with &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;.  Default values can be found in the &amp;lt;tt&amp;gt;bundle.properties&amp;lt;/tt&amp;gt; file in the spring directory for the appropriate option. Important VM args:&lt;br /&gt;
;-Dorg.rifidi.edge.configuration&lt;br /&gt;
:This is the path to the persistence file. See [[#rifidi.xml]].&lt;br /&gt;
;-Dcom.sun.management.jmxremote.port&lt;br /&gt;
:The port to open up JMX on.  This is important if you are using a program like VisualVM to profile the server&lt;br /&gt;
;-Djava.rmi.server.hostname&lt;br /&gt;
:The hostname to open up the RMI registry at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.core.rmi.port&lt;br /&gt;
:The port of the RMI registry Default is &amp;lt;tt&amp;gt;1101&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.host&lt;br /&gt;
:The hostname to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.port&lt;br /&gt;
:The port to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;8081&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.read&lt;br /&gt;
:The service name of the ALE reading service.  Default is &amp;lt;tt&amp;gt;ALEService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.logicalreader&lt;br /&gt;
:The service name of the ALE logical reader service. Default is &amp;lt;tt&amp;gt;ALELRService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.home&lt;br /&gt;
:The Rifidi directory. If not set, it defaults to ${user.dir}&lt;br /&gt;
;-Dorg.rifidi.ui.notify&lt;br /&gt;
:If set to true, reader adapters will send tag notifications to workbench. Default is true&lt;br /&gt;
&lt;br /&gt;
=rifidi.xml=&lt;br /&gt;
The rifidi.xml file is the persistence file for the Rifidi Edge Server.  The two important services that are saved are Reader Configurations and Command Configurations.&lt;br /&gt;
&lt;br /&gt;
==Loading a configuration file==&lt;br /&gt;
Whenever the edge server starts up, it looks for the file that is specified in the &amp;lt;tt&amp;gt;org.rifidi.configuration&amp;lt;/tt&amp;gt; vm flag. After the configuration file is read, the server will attempt to recreate all services specified in the file.  If a needed factory is not available, the service will be skipped and &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.seoagency.com.vn/seo.php&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; dich vu seo&amp;lt;/span&amp;gt;] recreated when the factory becomes available.  For example, suppose the configuration file has an Alien Reader Configuration and an LLRP Reader Configuration.  Suppose that when  the server starts up, only the Alien plugin is available (so the Alien Reader Factory is available, but the LLRP Reader Factory is not).  At this point the Alien Reader is recreated.  If later the LLRP plugin is installed, then the LLRP reader will be recreated.&lt;br /&gt;
&lt;br /&gt;
==File Structure==&lt;br /&gt;
The edge server uses JAXB to persist a configuration file &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;].  Each service will have a serviceID and a factoryID.  The serviceID is the unique name of the service, and is used when using the service (such as starting a session on a reader).  The factoryID is the ID of the factory that can create a service.   The following is an example of file that has one Alien Reader saved.&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;configurationStore&amp;gt;&lt;br /&gt;
    &amp;lt;services&amp;gt;&lt;br /&gt;
        &amp;lt;attributes&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ReconnectionInterval&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;500&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;Port&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;20000&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;InvertExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;PersistTime&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;-1&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;Username&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;alien&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;Password&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;password&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;InvertExternalInput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ReaderNumber&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;IpAddress&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1&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;MaxNumConnectionAttempts&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;10&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;RFAttenuation&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/attributes&amp;gt;&lt;br /&gt;
        &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
        &amp;lt;serviceID&amp;gt;Alien_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
    &amp;lt;/services&amp;gt;&lt;br /&gt;
&amp;lt;/configurationStore&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Configuration</id>
		<title>Edge Server Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Configuration"/>
				<updated>2011-11-01T04:56:58Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Console */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains the various configuration options of the Rifidi Edge Server&lt;br /&gt;
=RifidiEdgeServer.ini=&lt;br /&gt;
The RifidiEdgeServer.ini is a property file that contains options for various options when the edge server starts up.  &lt;br /&gt;
==rifidiserver.ini file==&lt;br /&gt;
As of release 1.2.0, the default rifidiserver.ini file looks like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-os&lt;br /&gt;
${target.os}&lt;br /&gt;
-ws&lt;br /&gt;
${target.ws}&lt;br /&gt;
-arch&lt;br /&gt;
${target.arch}&lt;br /&gt;
-nl&lt;br /&gt;
${target.nl}&lt;br /&gt;
-vmargs&lt;br /&gt;
-Declipse.ignoreApp=true&lt;br /&gt;
-Dosgi.console&lt;br /&gt;
-Dosgi.noShutdown=true&lt;br /&gt;
-Dorg.rifidi.edge.configuration=config/rifidi.xml&lt;br /&gt;
-Dosgi.clean=true&lt;br /&gt;
-Dorg.osgi.framework.bootdelegation=javax.xml.ws&lt;br /&gt;
-Dcom.sun.management.jmxremote.port=2021&lt;br /&gt;
-Dcom.sun.management.jmxremote.authenticate=false&lt;br /&gt;
-Dcom.sun.management.jmxremote.ssl=false&lt;br /&gt;
-Djava.rmi.server.hostname=127.0.0.1&lt;br /&gt;
-Dorg.rifidi.edge.core.rmi.port=1101&lt;br /&gt;
-Dorg.rifidi.edge.ale.port=8081&lt;br /&gt;
-Dorg.rifidi.edge.ale.host=127.0.0.1&lt;br /&gt;
-Dosgi.framework.extensions=org.eclipse.equinox.weaving.hook&lt;br /&gt;
-Dorg.aspectj.osgi.verbose=true&lt;br /&gt;
-Dorg.rifidi.edge.autostart=true&lt;br /&gt;
-Dorg.rifidi.edge.logging=config/logging.properties&lt;br /&gt;
-Dorg.rifidi.ui.notify=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Console==&lt;br /&gt;
;-console&lt;br /&gt;
:This starts up the OSGi console so that you can interact with the edge server from the command line.  For a list of commands that are available see [[Edge Server Commands]].  If you would like the console to be available over the network, supply a port after the -console (e.g. -console 2020). Now it is possible to telnet into the server at the given port.  It is recommended that you use ssh tunneling for security reasons (i.e. first ssh to the machine that is running the edge server, then telnet to the console). One thing to note is that after you telnet to the OSGi console, you cannot use &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://vihan.vn&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; thiet ke web&amp;lt;/span&amp;gt;] the &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; command as you normally would to close the telnet session.  This is because &amp;lt;tt&amp;gt;exit&amp;lt;/tt&amp;gt; will be caught by the OSGi console and will perform a System.exit().  Instead, to exit the telnet session &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;] while keeping the server running, just close the telnet window.&lt;br /&gt;
&lt;br /&gt;
==VMArgs==&lt;br /&gt;
VMArgs must follow the &amp;lt;tt&amp;gt;-vmargs&amp;lt;/tt&amp;gt; flag in the .ini file.  They must start with &amp;lt;tt&amp;gt;-D&amp;lt;/tt&amp;gt;.  Default values can be found in the &amp;lt;tt&amp;gt;bundle.properties&amp;lt;/tt&amp;gt; file in the spring directory for the appropriate option. Important VM args:&lt;br /&gt;
;-Dorg.rifidi.edge.configuration&lt;br /&gt;
:This is the path to the persistence file. See [[#rifidi.xml]].&lt;br /&gt;
;-Dcom.sun.management.jmxremote.port&lt;br /&gt;
:The port to open up JMX on.  This is important if you are using a program like VisualVM to profile the server&lt;br /&gt;
;-Djava.rmi.server.hostname&lt;br /&gt;
:The hostname to open up the RMI registry at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.core.rmi.port&lt;br /&gt;
:The port of the RMI registry Default is &amp;lt;tt&amp;gt;1101&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.host&lt;br /&gt;
:The hostname to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;127.0.0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.port&lt;br /&gt;
:The port to publish the ALE webservices at.  Default is &amp;lt;tt&amp;gt;8081&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.read&lt;br /&gt;
:The service name of the ALE reading service.  Default is &amp;lt;tt&amp;gt;ALEService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.edge.ale.logicalreader&lt;br /&gt;
:The service name of the ALE logical reader service. Default is &amp;lt;tt&amp;gt;ALELRService&amp;lt;/tt&amp;gt;&lt;br /&gt;
;-Dorg.rifidi.home&lt;br /&gt;
:The Rifidi directory. If not set, it defaults to ${user.dir}&lt;br /&gt;
;-Dorg.rifidi.ui.notify&lt;br /&gt;
:If set to true, reader adapters will send tag notifications to workbench. Default is true&lt;br /&gt;
&lt;br /&gt;
=rifidi.xml=&lt;br /&gt;
The rifidi.xml file is the persistence file for the Rifidi Edge Server.  The two important services that are saved are Reader Configurations and Command Configurations.&lt;br /&gt;
&lt;br /&gt;
==Loading a configuration file==&lt;br /&gt;
Whenever the edge server starts up, it looks for the file that is specified in the &amp;lt;tt&amp;gt;org.rifidi.configuration&amp;lt;/tt&amp;gt; vm flag. After the configuration file is read, the server will attempt to recreate all services specified in the file.  If a needed factory is not available, the service will be skipped and recreated when the factory becomes available.  For example, suppose the configuration file has an Alien Reader Configuration and an LLRP Reader Configuration.  Suppose that when  the server starts up, only the Alien plugin is available (so the Alien Reader Factory is available, but the LLRP Reader Factory is not).  At this point the Alien Reader is recreated.  If later the LLRP plugin is installed, then the LLRP reader will be recreated.&lt;br /&gt;
&lt;br /&gt;
==File Structure==&lt;br /&gt;
The edge server uses JAXB to persist a configuration file &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;].  Each service will have a serviceID and a factoryID.  The serviceID is the unique name of the service, and is used when using the service (such as starting a session on a reader).  The factoryID is the ID of the factory that can create a service.   The following is an example of file that has one Alien Reader saved.&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;configurationStore&amp;gt;&lt;br /&gt;
    &amp;lt;services&amp;gt;&lt;br /&gt;
        &amp;lt;attributes&amp;gt;&lt;br /&gt;
            &amp;lt;entry&amp;gt;&lt;br /&gt;
                &amp;lt;key&amp;gt;ReconnectionInterval&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;500&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;Port&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;20000&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;InvertExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;PersistTime&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;-1&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;Username&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;alien&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;Password&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;password&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;InvertExternalInput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ReaderNumber&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;ExternalOutput&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&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;IpAddress&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;127.0.0.1&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;MaxNumConnectionAttempts&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;10&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;RFAttenuation&amp;lt;/key&amp;gt;&lt;br /&gt;
                &amp;lt;value&amp;gt;0&amp;lt;/value&amp;gt;&lt;br /&gt;
            &amp;lt;/entry&amp;gt;&lt;br /&gt;
        &amp;lt;/attributes&amp;gt;&lt;br /&gt;
        &amp;lt;factoryID&amp;gt;Alien&amp;lt;/factoryID&amp;gt;&lt;br /&gt;
        &amp;lt;serviceID&amp;gt;Alien_1&amp;lt;/serviceID&amp;gt;&lt;br /&gt;
    &amp;lt;/services&amp;gt;&lt;br /&gt;
&amp;lt;/configurationStore&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Rifidi_Edge_Server_Application_Tutorials</id>
		<title>Rifidi Edge Server Application Tutorials</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Rifidi_Edge_Server_Application_Tutorials"/>
				<updated>2011-11-01T04:55:59Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With release 1.2.0 of the Rifidi Edge Server, a developer API is provided to make writing Rifidi Applications much easier. The best place to find out how to write applications is the developer document that is released as part of the SDK &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.proposable.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;proposal software&amp;lt;/span&amp;gt;] release.  There are several example applications &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://thepartyhub.com/contact-us/&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; party places&amp;lt;/span&amp;gt;] included with the SDK and the developer documentation describes them in detail &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.internetreputationmanagement.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;reputation management online&amp;lt;/span&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
*[http://rifidi.org/guides/Rifidi_Edge_Server_Developer_1.2.pdf Developer's Guide for 1.2.0]&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Architecture</id>
		<title>Edge Server Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Architecture"/>
				<updated>2011-11-01T04:55:02Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* OSGi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes several aspects of the Rifidi Edge Server Core.  It is intended for developers to understand how the core is structured.&lt;br /&gt;
=Overview=&lt;br /&gt;
There are two main aspects to understanding the edge server. The first is the three architectural layers that facilitate the flow of data from sensor to a designated endpoint.  The second is the runtime and how it uses service oriented architecture and OSGi to be dynamic and light weight.&lt;br /&gt;
==Layers==&lt;br /&gt;
This section shows the three conceptual architectural layers that data passes through on its journey from sensors to whatever endpoint the user chooses. &lt;br /&gt;
&lt;br /&gt;
[[Image:Dataflow3.png|thumbnail|400px|Dataflow through the three Architectural layers in the Rifidi Edge Server]]&lt;br /&gt;
&lt;br /&gt;
===Sensor Abstraction Layer===&lt;br /&gt;
The purpose of the edge server is to connect to any kind of sensors (e.g. RFID readers, Barcode readers, Mobile Devices) and collect information from them.  In many scenarios, this consists of connecting to a Gen2 fixed reader (such as Alien 9800, Motorolla LLRP, etc), and collecting EPC information. However, the edge server is designed in a way so that the edge server to collect many kinds of data (active, passive, etc) from many kinds of devices. This layer allows users to connect to devices in a sensor-agnostic way to collect the kind of data required for the application.&lt;br /&gt;
&lt;br /&gt;
===Application Engine Layer===&lt;br /&gt;
For most applications it is not desirable to save every event that the sensors produce.  Many sensors can send 1,000 of events a second, a large number of which might be duplicates. Most applications are interested in events that are one-level higher than the raw events produced by sensors.  For examples, an ERP system is probably interested in the event of a box arriving in area 1, and it is not desirable for the ERP system to do the work of filtering and processing all of duplicate reads the sensor produces.&lt;br /&gt;
&lt;br /&gt;
Complex Event Processing (CEP) is a paradigm of viewing data as ephemeral events (an event stream) and identifying meaningful (i.e. business) events from the stream using rules.  Rifidi Edge Server uses a Complex Event Processor called Esper.  It allows you to write queries using an SQL-like syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    select * from ReadCycle where ReaderID='gate_1'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One of the most important aspects of CEP is being able to use incorporate temporal knowledge into the queries.  This allows you to phrase queries like &amp;quot;Send an order_complete event when an itemA event is followed by an itemb event&amp;quot; or &amp;quot;send an order_cancelled event when an itemb event is not seen within 10 min of a itemA event.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Application Engine Layer is intended to let application developers build much of the functionality of their RFID applications using esper queries.&lt;br /&gt;
&lt;br /&gt;
===Communication Layer===&lt;br /&gt;
After data has been processed, it probably needs to be handed up to some kind of application-dependent system.  For example, some users might want the data to be stored in an &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.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; massage therapy singapore&amp;lt;/span&amp;gt;] database, others might want it to be pushed into an ERP system like SAP or handed to a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.com/products/?cid=2&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; led downlight singapore&amp;lt;/span&amp;gt;] Rich User Interface of some sort.  The edge server has several built in connectors to use, namely JMS and Web Services (via Spring's remoting framework).  However, as this is application dependant, it is possible to write your own connector (such as a TCP/IP socket connection) if the application needs it.&lt;br /&gt;
&lt;br /&gt;
In addition, the edge server also provides a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.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; singapore led lighting&amp;lt;/span&amp;gt;] built-in web container and MVC framework so that web applications can be deployed directly.&lt;br /&gt;
&lt;br /&gt;
==OSGi==&lt;br /&gt;
OSGi is a dynamic modules system for Java.  It provides several pieces of functionality including the following:&lt;br /&gt;
# A deployment unit (called a bundle), which is a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.premier-football.net&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; soccer jersey store&amp;lt;/span&amp;gt;] normal JAR with some extra information in the Manifest.&lt;br /&gt;
# A lightweight runtime that allows bundle lifecycle to be controlled.  In other words, you can start, stop, and update bundles at &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://thepartyhub.com/Showcase&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; party artists&amp;lt;/span&amp;gt;] runtime.&lt;br /&gt;
# Dependencies are explicitly stated in the Manifest either as &amp;quot;bundle dependencies&amp;quot; or &amp;quot;package dependencies&amp;quot;.&lt;br /&gt;
# Classes are only visible to other bundles if their containing packages have been exposed.  This allows developers to hide classes that should be strictly internal.&lt;br /&gt;
# The runtime provides a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://thepartyhub.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; event planners singapore&amp;lt;/span&amp;gt;] service registry -- a system-wide repository for bundles to provide functionality.&lt;br /&gt;
&lt;br /&gt;
The edge server is simply a collection of bundles that run in an OSGi environment (Equinox). Functionality between bundles is shared by means of services that are available in the service registry. Because bundles can be started and stopped while the rest of the server is still running, we can update non-essential parts of the edge server without restarting it.&lt;br /&gt;
&lt;br /&gt;
=Services=&lt;br /&gt;
In the Edge Server, services are POJOs that provide a specific piece of functionality to other components and are registered in the OSGi Registry.   For more information see [[How to use OSGi Services]]&lt;br /&gt;
== Core Services==&lt;br /&gt;
The following services are provided by the core bundle.&lt;br /&gt;
===Reader Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to sensor configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.ReaderDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensor&amp;gt; getReaders()&amp;lt;/tt&amp;gt; Get all available sensor configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensor getReaderByID(String ID)&amp;lt;/tt&amp;gt; - Get the sensor with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensorFactory&amp;gt; getReaderFactories()&amp;lt;/tt&amp;gt; - Get all registered sensor factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensorFactory getReaderFactoryByID()&amp;lt;/tt&amp;gt; - Get the sensor factory with the supplied ID&lt;br /&gt;
===Command Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to command configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.CommandDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfiguration&amp;gt; getCommands()&amp;lt;/tt&amp;gt; Get all available command configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfiguration getCommandByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfigurationFactory&amp;gt; getCommandFactories()&amp;lt;/tt&amp;gt; - Get all registered command configuration factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByReaderID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied sensor ID&lt;br /&gt;
&lt;br /&gt;
===Configuration Service===&lt;br /&gt;
'''Purpose''': Provide a way to save and load configurations from persistence.  Configurations (such as Sensor Configurations or Command Configurations) are created using a factory (that must be registered). Configurations have Attributes which can be changed via getters and setters.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.ConfigurationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void storeConfiguration()&amp;lt;/tt&amp;gt; - Store all configurations to persistence (i.e. xml file, database, etc).&lt;br /&gt;
*&amp;lt;tt&amp;gt;Configuration getConfiguration(String serviceID)&amp;lt;/tt&amp;gt; - Get a configuration (i.e. Sensor Configuration or Command Configuration)by service ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createService(String factoryID, AttributeList attributes)&amp;lt;/tt&amp;gt; - Create a new configuration using a factory with the supplied ID.  Use the supplied AttributeList to override defaults.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroyService(String serviceID)&amp;lt;/tt&amp;gt; - Destroy a service with the supplied ID&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;Configuration&amp;gt; getConfigurations()&amp;lt;/tt&amp;gt; - Return all Configurations.&lt;br /&gt;
&lt;br /&gt;
===Sensor Management Service===&lt;br /&gt;
'''Purpose''': Since there is a concept of &amp;quot;Logical Sensors&amp;quot;, it is possible to define a sensor that is a collection of physical sensors. This service allows sensors to be created, destroyed, grouped as part of a logical sensor, and subscribed to&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.sensors.management.SensorManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroySensor(String sensorName)&amp;lt;/tt&amp;gt; - Destroy a sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName, Collection&amp;lt;String&amp;gt; childSensors)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name and has the given child sensors &lt;br /&gt;
*&amp;lt;tt&amp;gt;void renameSensor(String oldName, String newName)&amp;lt;/tt&amp;gt; - Rename a sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Add the child sensor to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Add multiple children to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void setChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Set the children of this logical sensor to the supplied list&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Remove the given child sensor from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChildren(String sensorName, Collection&amp;lt;String&amp;gt; childrenNames)&amp;lt;/tt&amp;gt; - Remote all the given child sensors from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;Sensor subscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Subscribe an object to the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unsubscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Unsubscribe an object from the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publishToEsper(String sensorName)&amp;lt;/tt&amp;gt; - Publish all tags produced by this sensor to esper under the given sensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublishFromEsper(String sensorName)&amp;lt;/tt&amp;gt; - Stop publishing tags produced by this sensor to esper under the given SensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;SensorDTO getDTO(String sensorName)&amp;lt;/tt&amp;gt; - Get the Data Transfer Object of the sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;String&amp;gt; getSensors()&amp;lt;/tt&amp;gt; - Get a list of all children sensors belonging to this one.&lt;br /&gt;
&lt;br /&gt;
===JMX Service===&lt;br /&gt;
'''Purpose''': Exposes a Configuration via JMX&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.JMXService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publish(Configuration config)&amp;lt;/tt&amp;gt; - Publishes the given Configuration to JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublish(Configuration config)&amp;lt;/tt&amp;gt; - Removes the given Configuration from JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;public void setConfigurationControlMBean(ConfigurationControlMBean mbean)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==JMS Services==&lt;br /&gt;
The Edge server uses JMS internally to pass events.  To learn how JMS is configured inside of the edge server, see [[EdgeServerJMS| JMS in the Edge Server]].  The following services are preconfigured JMS components that facilitate using JMS in other areas of the edge server.  They are created and made available in the jms bundle&lt;br /&gt;
===Internal Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as an internal high-speed message bus.  Sensors will place tag reads on it.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Tags Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive tag reads.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Notification Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive notification events, such as when a sensor is created or deleted, or a session has been started or stopped.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the internal ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the external ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the internal broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the external broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Services==&lt;br /&gt;
There are a few other services that are important.  The interfaces for these services can be found in the edge server services bundle, and each service will be implemented in its own bundle.&lt;br /&gt;
===Esper Management Service===&lt;br /&gt;
'''Purpose''': Provides access to esper&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.esper.EsperManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;EPServiceProvider getProvider()&amp;lt;/tt&amp;gt; - Get the EsperServiceProvider so that you can use esper.&lt;br /&gt;
===Notification Service===&lt;br /&gt;
'''Purpose''': Allows the edge server to notify external clients when an important state change happens (such as when a sensor configuration is created or when a sensor session is started).  These methods should be called on this service when the corresponding event happens.  For example, when a session is created, the addSessionEvent() method should be called.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.notification.NotificationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void sessionStatusChanged(String readerID, String sessionID,SessionStatus sessionStatus)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandConfigFactoryEvent(String readerFactoryID,String commandConfigFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;removeCommandConfigFactoryEvent(String readerFactoryID,String commandFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void jobSubmitted(String readerID, String sessionID, Integer jobID, String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;jobDeleted(String readerID, String sessionID, Integer jobID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;attributesChanged(String configurationID, AttributeList attributes)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logging Service===&lt;br /&gt;
'''Purpose''': Allows the logging level to be changed at runtime.  For more information, see [[How to change logging levels]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.logging.LoggingService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;setLoggingLevel(String loggerName, String level)&amp;lt;/tt&amp;gt; - Change the logging level of the logger (class or package name) to the given logging level.&lt;br /&gt;
&lt;br /&gt;
=Core Bundles=&lt;br /&gt;
The edge server is deployed as a set of OSGi bundles.  The following bundles make up the core.&lt;br /&gt;
;org.rifidi.edge.api&lt;br /&gt;
: Provides core classes that are necessary for an outside UI to talk to the edge server via RMI and JMS, such as Data Transfer Objects (DTOs), JMS Notification Messages, RMI Interfaces, and Tag Messages.&lt;br /&gt;
;org.rifidi.edge.console&lt;br /&gt;
: Provides the ability to control the edge server using the OSGi console provided by eclipse equinox.  For more information about how to control the console, see [[Edge_Server_Console]].&lt;br /&gt;
;org.rifidi.edge.core&lt;br /&gt;
: Provides configuration &amp;amp; persistence, Management of reader and command configurations, Abstract classes and interfaces for sensor plugins to implement, and Esper,&lt;br /&gt;
;org.rifidi.edge.core.rmi.server&lt;br /&gt;
: Exposes core functionality via RMI for outside clients (especially UIs) to use to control the edge server.  It exposes roughly the same functionality as the console. For more information about how to expose a service using RMI see: [[How to export a service using RMI]]&lt;br /&gt;
;org.rifidi.edge.core.services&lt;br /&gt;
: Contains the interfaces for several OSGi services used within the edge sever&lt;br /&gt;
;org.rifidi.edge.core.jms&lt;br /&gt;
:Configures JMS for the edge server.  See [[EdgeServerJMS]] for more details&lt;br /&gt;
;org.rifidi.edge.core.services.logging&lt;br /&gt;
:Provides a service to modify the logging level at run time&lt;br /&gt;
;org.rifidi.edge.core.services.notifications&lt;br /&gt;
:Provides a service to notify external clients (such as UIs) about state changes inside the edge server&lt;br /&gt;
&lt;br /&gt;
=Important Dependencies=&lt;br /&gt;
==Spring==&lt;br /&gt;
===Spring DM===&lt;br /&gt;
==SLF4J==&lt;br /&gt;
==Esper==&lt;br /&gt;
==ActiveMQ==&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Edge_Server_Architecture</id>
		<title>Edge Server Architecture</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Edge_Server_Architecture"/>
				<updated>2011-11-01T04:54:07Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Communication Layer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes several aspects of the Rifidi Edge Server Core.  It is intended for developers to understand how the core is structured.&lt;br /&gt;
=Overview=&lt;br /&gt;
There are two main aspects to understanding the edge server. The first is the three architectural layers that facilitate the flow of data from sensor to a designated endpoint.  The second is the runtime and how it uses service oriented architecture and OSGi to be dynamic and light weight.&lt;br /&gt;
==Layers==&lt;br /&gt;
This section shows the three conceptual architectural layers that data passes through on its journey from sensors to whatever endpoint the user chooses. &lt;br /&gt;
&lt;br /&gt;
[[Image:Dataflow3.png|thumbnail|400px|Dataflow through the three Architectural layers in the Rifidi Edge Server]]&lt;br /&gt;
&lt;br /&gt;
===Sensor Abstraction Layer===&lt;br /&gt;
The purpose of the edge server is to connect to any kind of sensors (e.g. RFID readers, Barcode readers, Mobile Devices) and collect information from them.  In many scenarios, this consists of connecting to a Gen2 fixed reader (such as Alien 9800, Motorolla LLRP, etc), and collecting EPC information. However, the edge server is designed in a way so that the edge server to collect many kinds of data (active, passive, etc) from many kinds of devices. This layer allows users to connect to devices in a sensor-agnostic way to collect the kind of data required for the application.&lt;br /&gt;
&lt;br /&gt;
===Application Engine Layer===&lt;br /&gt;
For most applications it is not desirable to save every event that the sensors produce.  Many sensors can send 1,000 of events a second, a large number of which might be duplicates. Most applications are interested in events that are one-level higher than the raw events produced by sensors.  For examples, an ERP system is probably interested in the event of a box arriving in area 1, and it is not desirable for the ERP system to do the work of filtering and processing all of duplicate reads the sensor produces.&lt;br /&gt;
&lt;br /&gt;
Complex Event Processing (CEP) is a paradigm of viewing data as ephemeral events (an event stream) and identifying meaningful (i.e. business) events from the stream using rules.  Rifidi Edge Server uses a Complex Event Processor called Esper.  It allows you to write queries using an SQL-like syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    select * from ReadCycle where ReaderID='gate_1'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One of the most important aspects of CEP is being able to use incorporate temporal knowledge into the queries.  This allows you to phrase queries like &amp;quot;Send an order_complete event when an itemA event is followed by an itemb event&amp;quot; or &amp;quot;send an order_cancelled event when an itemb event is not seen within 10 min of a itemA event.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Application Engine Layer is intended to let application developers build much of the functionality of their RFID applications using esper queries.&lt;br /&gt;
&lt;br /&gt;
===Communication Layer===&lt;br /&gt;
After data has been processed, it probably needs to be handed up to some kind of application-dependent system.  For example, some users might want the data to be stored in an &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.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; massage therapy singapore&amp;lt;/span&amp;gt;] database, others might want it to be pushed into an ERP system like SAP or handed to a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.com/products/?cid=2&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; led downlight singapore&amp;lt;/span&amp;gt;] Rich User Interface of some sort.  The edge server has several built in connectors to use, namely JMS and Web Services (via Spring's remoting framework).  However, as this is application dependant, it is possible to write your own connector (such as a TCP/IP socket connection) if the application needs it.&lt;br /&gt;
&lt;br /&gt;
In addition, the edge server also provides a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.inleds.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; singapore led lighting&amp;lt;/span&amp;gt;] built-in web container and MVC framework so that web applications can be deployed directly.&lt;br /&gt;
&lt;br /&gt;
==OSGi==&lt;br /&gt;
OSGi is a dynamic modules system for Java.  It provides several pieces of functionality including the following:&lt;br /&gt;
# A deployment unit (called a bundle), which is a normal JAR with some extra information in the Manifest.&lt;br /&gt;
# A lightweight runtime that allows bundle lifecycle to be controlled.  In other words, you can start, stop, and update bundles at runtime.&lt;br /&gt;
# Dependencies are explicitly stated in the Manifest either as &amp;quot;bundle dependencies&amp;quot; or &amp;quot;package dependencies&amp;quot;.&lt;br /&gt;
# Classes are only visible to other bundles if their containing packages have been exposed.  This allows developers to hide classes that should be strictly internal.&lt;br /&gt;
# The runtime provides a service registry -- a system-wide repository for bundles to provide functionality.&lt;br /&gt;
&lt;br /&gt;
The edge server is simply a collection of bundles that run in an OSGi environment (Equinox). Functionality between bundles is shared by means of services that are available in the service registry. Because bundles can be started and stopped while the rest of the server is still running, we can update non-essential parts of the edge server without restarting it.&lt;br /&gt;
&lt;br /&gt;
=Services=&lt;br /&gt;
In the Edge Server, services are POJOs that provide a specific piece of functionality to other components and are registered in the OSGi Registry.   For more information see [[How to use OSGi Services]]&lt;br /&gt;
== Core Services==&lt;br /&gt;
The following services are provided by the core bundle.&lt;br /&gt;
===Reader Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to sensor configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.ReaderDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensor&amp;gt; getReaders()&amp;lt;/tt&amp;gt; Get all available sensor configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensor getReaderByID(String ID)&amp;lt;/tt&amp;gt; - Get the sensor with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractSensorFactory&amp;gt; getReaderFactories()&amp;lt;/tt&amp;gt; - Get all registered sensor factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractSensorFactory getReaderFactoryByID()&amp;lt;/tt&amp;gt; - Get the sensor factory with the supplied ID&lt;br /&gt;
===Command Data Access Object===&lt;br /&gt;
'''Purpose''': Provide access to command configurations that have been created.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.daos.CommandDAO&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfiguration&amp;gt; getCommands()&amp;lt;/tt&amp;gt; Get all available command configurations&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfiguration getCommandByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;Set&amp;lt;AbstractCommandConfigurationFactory&amp;gt; getCommandFactories()&amp;lt;/tt&amp;gt; - Get all registered command configuration factories&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied ID&lt;br /&gt;
* &amp;lt;tt&amp;gt;AbstractCommandConfigurationFactory getCommandFactoryByReaderID(String ID)&amp;lt;/tt&amp;gt; - Get the command configuration factory with the supplied sensor ID&lt;br /&gt;
&lt;br /&gt;
===Configuration Service===&lt;br /&gt;
'''Purpose''': Provide a way to save and load configurations from persistence.  Configurations (such as Sensor Configurations or Command Configurations) are created using a factory (that must be registered). Configurations have Attributes which can be changed via getters and setters.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.ConfigurationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void storeConfiguration()&amp;lt;/tt&amp;gt; - Store all configurations to persistence (i.e. xml file, database, etc).&lt;br /&gt;
*&amp;lt;tt&amp;gt;Configuration getConfiguration(String serviceID)&amp;lt;/tt&amp;gt; - Get a configuration (i.e. Sensor Configuration or Command Configuration)by service ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createService(String factoryID, AttributeList attributes)&amp;lt;/tt&amp;gt; - Create a new configuration using a factory with the supplied ID.  Use the supplied AttributeList to override defaults.&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroyService(String serviceID)&amp;lt;/tt&amp;gt; - Destroy a service with the supplied ID&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;Configuration&amp;gt; getConfigurations()&amp;lt;/tt&amp;gt; - Return all Configurations.&lt;br /&gt;
&lt;br /&gt;
===Sensor Management Service===&lt;br /&gt;
'''Purpose''': Since there is a concept of &amp;quot;Logical Sensors&amp;quot;, it is possible to define a sensor that is a collection of physical sensors. This service allows sensors to be created, destroyed, grouped as part of a logical sensor, and subscribed to&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.sensors.management.SensorManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void destroySensor(String sensorName)&amp;lt;/tt&amp;gt; - Destroy a sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;void createSensor(String sensorName, Collection&amp;lt;String&amp;gt; childSensors)&amp;lt;/tt&amp;gt; - Create a new sensor with the given name and has the given child sensors &lt;br /&gt;
*&amp;lt;tt&amp;gt;void renameSensor(String oldName, String newName)&amp;lt;/tt&amp;gt; - Rename a sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Add the child sensor to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Add multiple children to this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void setChildren(String sensorName, Collection&amp;lt;String&amp;gt; childNames)&amp;lt;/tt&amp;gt; - Set the children of this logical sensor to the supplied list&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChild(String sensorName, String childName)&amp;lt;/tt&amp;gt; - Remove the given child sensor from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeChildren(String sensorName, Collection&amp;lt;String&amp;gt; childrenNames)&amp;lt;/tt&amp;gt; - Remote all the given child sensors from this logical sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;Sensor subscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Subscribe an object to the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unsubscribe(Object subscriber, String sensorName)&amp;lt;/tt&amp;gt; - Unsubscribe an object from the sensor&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publishToEsper(String sensorName)&amp;lt;/tt&amp;gt; - Publish all tags produced by this sensor to esper under the given sensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublishFromEsper(String sensorName)&amp;lt;/tt&amp;gt; - Stop publishing tags produced by this sensor to esper under the given SensorName&lt;br /&gt;
*&amp;lt;tt&amp;gt;SensorDTO getDTO(String sensorName)&amp;lt;/tt&amp;gt; - Get the Data Transfer Object of the sensor with the given name&lt;br /&gt;
*&amp;lt;tt&amp;gt;Set&amp;lt;String&amp;gt; getSensors()&amp;lt;/tt&amp;gt; - Get a list of all children sensors belonging to this one.&lt;br /&gt;
&lt;br /&gt;
===JMX Service===&lt;br /&gt;
'''Purpose''': Exposes a Configuration via JMX&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.configuration.services.JMXService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods'''&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void publish(Configuration config)&amp;lt;/tt&amp;gt; - Publishes the given Configuration to JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;void unpublish(Configuration config)&amp;lt;/tt&amp;gt; - Removes the given Configuration from JMX&lt;br /&gt;
*&amp;lt;tt&amp;gt;public void setConfigurationControlMBean(ConfigurationControlMBean mbean)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==JMS Services==&lt;br /&gt;
The Edge server uses JMS internally to pass events.  To learn how JMS is configured inside of the edge server, see [[EdgeServerJMS| JMS in the Edge Server]].  The following services are preconfigured JMS components that facilitate using JMS in other areas of the edge server.  They are created and made available in the jms bundle&lt;br /&gt;
===Internal Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as an internal high-speed message bus.  Sensors will place tag reads on it.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Tags Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive tag reads.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Notification Destination===&lt;br /&gt;
'''Purpose''': A JMS Topic that serves as destination for clients that run outside the edge server's JVM to receive notification events, such as when a sensor is created or deleted, or a session has been started or stopped.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.Topic&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the internal ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External Broker Connection Factory===&lt;br /&gt;
'''Purpose''': A JMS Connection Factory that creates connections to the external ActiveMQ Broker.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;javax.jms.ConnectionFactory&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===Internal JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the internal broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===External JMS Template===&lt;br /&gt;
'''Purpose''': A Spring object that makes it easier to send messages to the external broker&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.springframework.jms.core.JmsTemplate&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Services==&lt;br /&gt;
There are a few other services that are important.  The interfaces for these services can be found in the edge server services bundle, and each service will be implemented in its own bundle.&lt;br /&gt;
===Esper Management Service===&lt;br /&gt;
'''Purpose''': Provides access to esper&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.esper.EsperManagementService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;EPServiceProvider getProvider()&amp;lt;/tt&amp;gt; - Get the EsperServiceProvider so that you can use esper.&lt;br /&gt;
===Notification Service===&lt;br /&gt;
'''Purpose''': Allows the edge server to notify external clients when an important state change happens (such as when a sensor configuration is created or when a sensor session is started).  These methods should be called on this service when the corresponding event happens.  For example, when a session is created, the addSessionEvent() method should be called.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.notification.NotificationService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeSessionEvent(String readerID, String sessionID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderEvent(String readerID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeCommandEvent(String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void removeReaderFactoryEvent(String readerFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void sessionStatusChanged(String readerID, String sessionID,SessionStatus sessionStatus)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void addCommandConfigFactoryEvent(String readerFactoryID,String commandConfigFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;removeCommandConfigFactoryEvent(String readerFactoryID,String commandFactoryID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;void jobSubmitted(String readerID, String sessionID, Integer jobID, String commandID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;jobDeleted(String readerID, String sessionID, Integer jobID)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;attributesChanged(String configurationID, AttributeList attributes)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Logging Service===&lt;br /&gt;
'''Purpose''': Allows the logging level to be changed at runtime.  For more information, see [[How to change logging levels]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Interface''': &amp;lt;tt&amp;gt;org.rifidi.edge.core.services.logging.LoggingService&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Methods''': &amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;setLoggingLevel(String loggerName, String level)&amp;lt;/tt&amp;gt; - Change the logging level of the logger (class or package name) to the given logging level.&lt;br /&gt;
&lt;br /&gt;
=Core Bundles=&lt;br /&gt;
The edge server is deployed as a set of OSGi bundles.  The following bundles make up the core.&lt;br /&gt;
;org.rifidi.edge.api&lt;br /&gt;
: Provides core classes that are necessary for an outside UI to talk to the edge server via RMI and JMS, such as Data Transfer Objects (DTOs), JMS Notification Messages, RMI Interfaces, and Tag Messages.&lt;br /&gt;
;org.rifidi.edge.console&lt;br /&gt;
: Provides the ability to control the edge server using the OSGi console provided by eclipse equinox.  For more information about how to control the console, see [[Edge_Server_Console]].&lt;br /&gt;
;org.rifidi.edge.core&lt;br /&gt;
: Provides configuration &amp;amp; persistence, Management of reader and command configurations, Abstract classes and interfaces for sensor plugins to implement, and Esper,&lt;br /&gt;
;org.rifidi.edge.core.rmi.server&lt;br /&gt;
: Exposes core functionality via RMI for outside clients (especially UIs) to use to control the edge server.  It exposes roughly the same functionality as the console. For more information about how to expose a service using RMI see: [[How to export a service using RMI]]&lt;br /&gt;
;org.rifidi.edge.core.services&lt;br /&gt;
: Contains the interfaces for several OSGi services used within the edge sever&lt;br /&gt;
;org.rifidi.edge.core.jms&lt;br /&gt;
:Configures JMS for the edge server.  See [[EdgeServerJMS]] for more details&lt;br /&gt;
;org.rifidi.edge.core.services.logging&lt;br /&gt;
:Provides a service to modify the logging level at run time&lt;br /&gt;
;org.rifidi.edge.core.services.notifications&lt;br /&gt;
:Provides a service to notify external clients (such as UIs) about state changes inside the edge server&lt;br /&gt;
&lt;br /&gt;
=Important Dependencies=&lt;br /&gt;
==Spring==&lt;br /&gt;
===Spring DM===&lt;br /&gt;
==SLF4J==&lt;br /&gt;
==Esper==&lt;br /&gt;
==ActiveMQ==&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Alien_9800</id>
		<title>Alien 9800</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Alien_9800"/>
				<updated>2011-11-01T04:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Autonomous Mode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:developerDoc]][[Category:EmulatorDoc]][[Category:userDoc]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The Alien 9800 is produced by Alien Technology.  It is a general purpose reader that can read Class 1 Gen 2 tags.  For an introduction on how to use the Alien reader see  the [[Alien_Beginners_Guide |Alien Beginner's Guide]]&lt;br /&gt;
&lt;br /&gt;
;Model Number: &lt;br /&gt;
:ALR 9800&lt;br /&gt;
;Network Protocol: &lt;br /&gt;
:TCP/IP&lt;br /&gt;
;Communication:   &lt;br /&gt;
:LAN TCP/IP(RJ-45), RS-232&lt;br /&gt;
;Antennas:&lt;br /&gt;
:4 ports&lt;br /&gt;
;General Purpose I/O:&lt;br /&gt;
: 4 Inputs, 8 Outputs&lt;br /&gt;
&lt;br /&gt;
===Historical Note===&lt;br /&gt;
The Alien reader was the first reader that Pramari implemented, so therefore some of code in the emulator (such as the timestamp information in the tags and the tag memory) is alien specific.  For more information about the structure of the emulator see [[Engine Overview]].&lt;br /&gt;
&lt;br /&gt;
==Basis of Virtual Reader==&lt;br /&gt;
The implementation of the virtual reader is based on the testing of an actual hardware reader.  Testing was done using wireshark to capture the client-reader communication.  This input output was then emulated.&lt;br /&gt;
===Documentation===&lt;br /&gt;
There is not a lot of documentation freely available, as it is not on Alien's website.  Documentation for this reader is bundled with the reader, so it can only be obtained by actually purchasing a reader.  However, some universities may have documentation available for use by its students.&lt;br /&gt;
===Client Tools===&lt;br /&gt;
The main client tools used for testing this program:&lt;br /&gt;
;Alien Tool&lt;br /&gt;
:The Alien Tool is a client program that ships with the reader.  It has an interesting look and feel.  Its tag grid mode is useful to determine if a reader is properly reading tags.&lt;br /&gt;
;BEA 2.2&lt;br /&gt;
:[[BEA]] is a commercial edgeware application.  It communicates with the alien reader via &amp;quot;on demand&amp;quot; mode.  The new version of BEA (version 3.0), also has an option to use autonomous mode to get tag reads&lt;br /&gt;
;Logic Alloy 1.0.10&lt;br /&gt;
:[[Logic Alloy]] ALE Server is an open source edgeware application.  It uses the alien reader's autonomous mode to obtain tag reads&lt;br /&gt;
;TagCentric&lt;br /&gt;
:[[TagCentric]] is an open source edgeware application that communicates with the alien reader via &amp;quot;on demand&amp;quot; commands.&lt;br /&gt;
;Example Client&lt;br /&gt;
:[[Alien Example Client]] shows how to connect to the alien reader using a simple java client.&lt;br /&gt;
&lt;br /&gt;
==Reader Design==&lt;br /&gt;
This section will give a brief overview of how the hardware reader operates for the purposes of emulation. &lt;br /&gt;
===Communication===&lt;br /&gt;
The Alien reader sends plain text messages over a TCP connection.  The connection can be easily tested by telnetting into the reader and issuing commands. The following is an example of a telnet session and getting the tag list.  The reader is running at 192.168.2.100:20000.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;$ telnet 192.168.2.100 20000&lt;br /&gt;
Trying 192.168.2.100...&lt;br /&gt;
Connected to 192.168.2.100.&lt;br /&gt;
Escape character is '^]'.&lt;br /&gt;
***********************************************&lt;br /&gt;
*&lt;br /&gt;
* Alien Technology : RFID Reader&lt;br /&gt;
*&lt;br /&gt;
***********************************************&lt;br /&gt;
&lt;br /&gt;
Username&amp;gt;alien&lt;br /&gt;
alien&lt;br /&gt;
&lt;br /&gt;
Password&amp;gt;password&lt;br /&gt;
********&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alien &amp;gt;get taglist&lt;br /&gt;
get taglist&lt;br /&gt;
(No tags)&lt;br /&gt;
&lt;br /&gt;
Alien &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When connecting programatically, it is useful to supress the prompt.  This is done by prepending a 0x01 to the beginning of the text to be sent.  Also keep in mind that all commands are terminated by a carriage return and a line feed (0x0d 0x0a)&lt;br /&gt;
&lt;br /&gt;
===Memory Model===&lt;br /&gt;
The memory model of the alien reader is based on the concept of persist time, which is the amount of time a tag stays in memory after having been seen by an antenna.  It is possible to change the persist time using the &amp;lt;code&amp;gt;set persistTime&amp;lt;/code&amp;gt; command.  For example, the following command will set the persist time to 500 ms. &lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;Alien &amp;gt;set persistTime=500&lt;br /&gt;
set persistTime&lt;br /&gt;
PersistTime = 500&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the persistTime is set to a -1, the tag will persist in memory until a &amp;lt;code&amp;gt;get tagList&amp;lt;/code&amp;gt; operation is performed (either on-demand or autonomously).&lt;br /&gt;
&lt;br /&gt;
===Getting Tags===&lt;br /&gt;
There are two main modes to get tags from an alien reader.  The simplest is &amp;quot;on demand&amp;quot; mode, in which the user simply issues a command and the reader sends back a tag list.  The Autonomous mode enables the reader to act as a client and send tag lists to a server at some location.&lt;br /&gt;
====On Demand====&lt;br /&gt;
To get tag reads in On Demand read, a user can send a 'get taglist' command, or more simply 't'.  The reader will respond with its tag list.&lt;br /&gt;
====Autonomous Mode====&lt;br /&gt;
Autonomous mode is more complicated.  A user will set up several parameters, such as the notifyAddress (the address of the server where tag lists are to be sent), notifyTime (a time interval a which messages will be sent), notifyTrigger (a condition upon which to fire a message), and others.  When a trigger is fired, or the notify time has expired, a message that contains the tag list will be sent to the server.&lt;br /&gt;
&lt;br /&gt;
The interaction between AutoMode and NotifyMode is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.sg/services/massage/sports-massage.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; sports massage singapore&amp;lt;/span&amp;gt;] important to understand.  If AutoMode is on, but NotifyMode is off, no messages will be sent.  If NotifyMode is on but AutoMode is off, messages will be sent containing blank TagLists.&lt;br /&gt;
&lt;br /&gt;
Autonomous mode messages consist of an optional header (controlled by the NotifyHeader variable) followed by a list of tags which were read.  The message format (controlled by the NotifyFormat variable) can be xml, terse, string, or custom.&lt;br /&gt;
&lt;br /&gt;
The NotifyTime is a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://physioactive.sg/services/sports-therapy.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; sports injury singapore&amp;lt;/span&amp;gt;] variable that controls how often time-based messages are sent, and is specified in seconds.  If set to zero, automatic, time-based notification is disabled.  The tags contained in each message are the tags in the TagList (i.e. the reader's tag memory) at the time the message was fired; the reader essentially gets the TagList (in the same way that a user could in interactive mode by typing “get TagList”) at regular intervals and puts the results in a message.&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
The Alien Reader requires the user to log in. The default name and password is &amp;quot;alien/password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Supported Features==&lt;br /&gt;
&lt;br /&gt;
The following is a list of important features of the Alien reader that are properly emulated by Rifidi&lt;br /&gt;
&lt;br /&gt;
===Login===&lt;br /&gt;
&lt;br /&gt;
It is possible to log into the alien reader with a username and password.  The alien reader will not work until you are logged in.&lt;br /&gt;
&lt;br /&gt;
===Getting and Setting variables===&lt;br /&gt;
&lt;br /&gt;
The rifidi Alien reader allows users to get and set all variables, using the &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; commands.&lt;br /&gt;
&lt;br /&gt;
===Getting TagList===&lt;br /&gt;
&lt;br /&gt;
As mentioned previously, it is possible to get the tag list using the &amp;lt;code&amp;gt;get taglist&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
===Persist Time===&lt;br /&gt;
&lt;br /&gt;
The persist time controls how long a tag resides in memory before it is deleted.  It works except for a bug if the peresttime=-1 as explained below&lt;br /&gt;
&lt;br /&gt;
===Autonomous Mode===&lt;br /&gt;
&lt;br /&gt;
Most of the autonomous mode works except that notifyTrigger only works properly when set to &amp;lt;code&amp;gt;truefalse&amp;lt;/code&amp;gt;, and does not properly emulate the other possible values for it.&lt;br /&gt;
&lt;br /&gt;
===Supported Commands===&lt;br /&gt;
A list of commands supported by rifidi:&lt;br /&gt;
&lt;br /&gt;
====General Commands====&lt;br /&gt;
*Quit (q)&lt;br /&gt;
*get/set ReaderName&lt;br /&gt;
*get ReaderType&lt;br /&gt;
*get ReaderVersion&lt;br /&gt;
*get / set ReaderNumber&lt;br /&gt;
*get / set Username&lt;br /&gt;
*get / set Password&lt;br /&gt;
&lt;br /&gt;
====TagList Commands====&lt;br /&gt;
*get Taglist (t)&lt;br /&gt;
*get / set PersistTime&lt;br /&gt;
*get / set TagListFormat (possible values = text, terse, xml)&lt;br /&gt;
*clearTagList&lt;br /&gt;
*get / set TagType&lt;br /&gt;
&lt;br /&gt;
====Radio Commands====&lt;br /&gt;
*get / set AntennaSequence&lt;br /&gt;
&lt;br /&gt;
====Autonomous Commands====&lt;br /&gt;
*get / set AutoMode (possible values = on, off)&lt;br /&gt;
*get / set AutoFalseOutput&lt;br /&gt;
*get / set AutoFalsePause&lt;br /&gt;
*get / set AutoStartPause&lt;br /&gt;
*get / set AutoStartTrigger&lt;br /&gt;
*get / set AutoStopTimer&lt;br /&gt;
*get / set AutoStopTrigger&lt;br /&gt;
*get / set AutoStopTimer&lt;br /&gt;
*get / set AutoTrueOutput&lt;br /&gt;
*get / set AutoTruePause&lt;br /&gt;
*get / set NotifyMode&lt;br /&gt;
*get / set NotifyAddress&lt;br /&gt;
*get / set NotifyFormat (possible values = text, terse, xml)&lt;br /&gt;
*get / set NotifyTime&lt;br /&gt;
*get / set NotifyTrigger&lt;br /&gt;
*get / set NotifyHeader (possible values = on, off)&lt;br /&gt;
&lt;br /&gt;
====Program Tag Commands====&lt;br /&gt;
*get / set ProgAntenna&lt;br /&gt;
*ProgramTag&lt;br /&gt;
*get / set Function&lt;br /&gt;
&lt;br /&gt;
====GPIO Commands====&lt;br /&gt;
*get / set ExternalOutput&lt;br /&gt;
&lt;br /&gt;
==Bugs and Unsupported Features==&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Rifidi:Source_Code</id>
		<title>Rifidi:Source Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Rifidi:Source_Code"/>
				<updated>2011-11-01T04:51:43Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Running Rifidi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
This page explains how to download and run the source code for the Rifidi products.  However, please keep in mind that the code in this repository is not guaranteed to be stable. If you are interested in our latest stable release, visit our sourceforge page: http://sourceforge.net/projects/rifidi/.&lt;br /&gt;
=Quick Instructions=&lt;br /&gt;
The following are the basic steps needed to begin running Rifidi from source.  If you have trouble or need more explanation, please see the more detailed instructions on this page.&lt;br /&gt;
# Download the Eclipse for plugin developers (3.5 is what we are using)&lt;br /&gt;
# Install the subclipse plugin&lt;br /&gt;
# Add this svn to the list of repositories: https://svn.rifidi.org/svn/rep-external&lt;br /&gt;
# Check out the following projects from rifidi/trunk: org.rifidi.binary, org.rifidi.emulator.target, org.rifidi.ui.ide&lt;br /&gt;
# Open up the target file in org.rifidi.emulator.target and click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
# Open up the .product file in org.rifidi.ui.ide and click &amp;quot;launch an eclipse application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Weekly Builds=&lt;br /&gt;
Because many of our users are intereted in running the latest version of the Rifidi products but don't want to go to all the trouble of downloading the source code, there is a weekly build of the products.  The weekly builds include the latest features, but is not as tested as the sourceforge releases.  A link will be provided soon.&lt;br /&gt;
=Rifidi Source Code=&lt;br /&gt;
For those who need to see the source code for the Rifidi products, you will have to check out the code from svn.  This section explains how to check out and run the code from source.&lt;br /&gt;
==Organization==&lt;br /&gt;
In general the code for Rifidi is organized into Eclipse plugins or bundles.  Eclipse handles the loading and execution of the plugins.  For more detailed information about how our source code is organized, please see [[Development and Release Process#Concepts]].&lt;br /&gt;
* '''SVN Structure''' - There are three main folders in the Rifidi directory on &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; (the main svn repository for Rifidi).  The ''trunk'' folder contains the code that is being developed.  It is ''not'' guaranteed to be stable.  The ''tags'' folder contains tagged versions of the source for each of &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.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;aircon service&amp;lt;/span&amp;gt;] the plugins.  The source in these plugins should be relatively stable.  The ''branches'' folder contains plugins that have been branched so that larger changes can be made on plugins without holding up other developers.  These changes can then later be merged back in.  For more details about our SVN, see [[Development and Release Process#SVN Structure]]&lt;br /&gt;
* Target Platform - A target platform is the base set of &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/ac_service.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;ac repair&amp;lt;/span&amp;gt;] plugins that an Eclipse application needs to run.  In order to provide a more stable environment and to ensure a clean separation between the base plugins that Rifidi needs and the base plugins that your Eclipse IDE needs, we provide a target platform for each of the Rifidi products.  You can find these in the trunk.  They will be named something like &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  For more information see [[Development and Release Process#Target Platforms]].&lt;br /&gt;
* org.rifidi.binary - As the source code for Rifidi gets larger it begins to get harder to maintain a stable set of plugins.  In order to simplify things, there is a folder in the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/refrg_service.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; refrigerator repair&amp;lt;/span&amp;gt;] svn into which stable binaries of each of the plugins used in the rifidi project will be placed.  This folder is used in conjunction with the target platform.&lt;br /&gt;
* Product File - In Eclipse, a product file is used to define the needed eclipse plugins.  Running this file will create a new Eclipse 'Run Configuration' in your IDE.  You can then tweak this run configuration as needed.&lt;br /&gt;
* Source Code Plugins - A stable binary version of each of the plugins is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://jamumassagesingapore.com/services/dejamu/post-natal&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; jamu postnatal massage&amp;lt;/span&amp;gt;] contained in the org.rifidi.binary folder.  However, if you wish to view the source of a particular plugin or run a plugin from source, you must download the code from either the version in the trunk or a tagged version in the tags directory.&lt;br /&gt;
&lt;br /&gt;
==Downloading the Code==&lt;br /&gt;
&lt;br /&gt;
Our code is hosted at https://svn.rifidi.org/svn/rep-external.  The svn repository allows anonymous read access.  Because the svn repository is the same one that developers submit to, it contains the latest Rifidi code.&lt;br /&gt;
&lt;br /&gt;
The following steps explain how to check out and run Rifidi Emulator.  The other products in the Rifidi Suite follow similar steps.  If you need help with them, you can ask questions on IRC or our forums.&lt;br /&gt;
&lt;br /&gt;
===Prerequisites===&lt;br /&gt;
&lt;br /&gt;
The Rifidi Emulator is written in java and consists of Eclipse plugins. At this point it is easiest to compile and build it inside of the eclipse environment.  &lt;br /&gt;
&lt;br /&gt;
====Install Eclipse====&lt;br /&gt;
Note that you need the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of eclipse.  Rifidi will not run on other versions.&lt;br /&gt;
* If you do not already have eclipse, or if you have a different version, you will need to get this version&lt;br /&gt;
** Go to http://www.eclipse.org/downloads/ and download the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of Eclipse to a convenient location.&lt;br /&gt;
** Unzip the package.&lt;br /&gt;
** Double click on the execution file to get it started [[Image:Rifidi_from_source-1-opening_eclipse.png |none|thumb|800px|Double click on the executable to open up eclipse]]&lt;br /&gt;
* If you have not used eclipse before, you will be required to select a workspace when eclipse is opening.&lt;br /&gt;
** After eclipse opens go to the workbench[[Image:Rifidi_from_source-2-wokbench.png |none|thumb|800px|Open up the workbench]]&lt;br /&gt;
* If you have an existing workspace, you will need to create a new one.&lt;br /&gt;
** Go to file -&amp;gt; switch workspace -&amp;gt; other [[Image:Rifidi_from_source-3-switch_workspace.png |none|thumb|800px|Open up the workbench]] &lt;br /&gt;
** Select a new directory for your Rifidi workspace.&lt;br /&gt;
&lt;br /&gt;
====Install Subclipse====&lt;br /&gt;
&lt;br /&gt;
Subclipse is an eclipse plugin that manages svn commands.&lt;br /&gt;
&lt;br /&gt;
* Follow the instructions at http://subclipse.tigris.org/install.html.&lt;br /&gt;
* In step 6 of the above instructions, don't install the Optional Integrations.  Only the subclipse plugin is needed&lt;br /&gt;
&lt;br /&gt;
===Add Repository===&lt;br /&gt;
&lt;br /&gt;
* Open the 'SVN Repository Exploring' perspective&lt;br /&gt;
** Window -&amp;gt; Open Perspective -&amp;gt; Other [[Image:Rifidi_from_source-4-svn_rep_explore1.png |none|thumb|800px|Open up the perspective picker]]&lt;br /&gt;
** SVN Repository Exploring [[Image:Rifidi_from_source-5-svn_rep_explore2.png |none|thumb|400px|Open up the SVN Repository Explorer]]&lt;br /&gt;
* Add the rifidi repository&lt;br /&gt;
** Click 'Add SVN Repository' button&lt;br /&gt;
** Add 'https://svn.rifidi.org/svn/rep-external'[[Image:Rifidi_from_source-6-add_rep.png |none|400px|thumb|Add the repository]]&lt;br /&gt;
&lt;br /&gt;
===Check Out Code===&lt;br /&gt;
&lt;br /&gt;
* Check out all the projects in the rifidi/trunk folder of the repository&lt;br /&gt;
** Highlight the folders you would like to check out. For Emulator you will need&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.emulator.taget3.5.2&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt;&lt;br /&gt;
** Right click them and select checkout [[Image:Rifidi_from_source-7-checkout1.png |none|800px|thumb|Select the projects]]&lt;br /&gt;
** Select Finish. [[Image:Rifidi_from_source-8-checkout2.png |none|400px|thumb|Checkout projects]]&lt;br /&gt;
&lt;br /&gt;
===Set The Target Platform===&lt;br /&gt;
* Open up the .target file in &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;&lt;br /&gt;
* Click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Running Rifidi==&lt;br /&gt;
&lt;br /&gt;
The last step to get Rifidi running is to create a run configuration.&lt;br /&gt;
&lt;br /&gt;
A run configuration is the set of plugins that will be loaded when you run the application.  Plugins can come from one of two places:&lt;br /&gt;
#Workspace - these are the plugins that you have in the source tree on the left&lt;br /&gt;
#Target Environment - These are the plugins defined by the target environment that you are using that the time.&lt;br /&gt;
&lt;br /&gt;
Because there is a product file &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://jamumassagesingapore.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; massage centres in singapore&amp;lt;/span&amp;gt;] for emulator defined in the &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt; plugin, the easiest way to create a new run configuration is by running the product file.  This will automatically create a new run configuration&lt;br /&gt;
&lt;br /&gt;
To Create a new Run Configuration: &lt;br /&gt;
* Switch to the Java perspective in the same way &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://jamumassagesingapore.com/services/pre-natal&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; prenatal massage in singapore&amp;lt;/span&amp;gt;] that you switched to the repository exploring view [[Image:Rifidi_from_source-9-java_view.png  |none|400px|thumb|Run Rifidi]]&lt;br /&gt;
* Right click on Rifidi.product in the org.rifidi.ui.ide project&lt;br /&gt;
* Click on &amp;quot;Run as eclipse application&amp;quot; [[Image:Rifidi_from_source-10_run_eclipse.png  |none|thumb|800px|Run Rifidi]]&lt;br /&gt;
* From now on, you can start Rifidi via the green triangle button at the top of eclipse&lt;br /&gt;
&lt;br /&gt;
If there was an error when starting the application, follow the step below to edit the run configuration:&lt;br /&gt;
&lt;br /&gt;
To Edit a Run Configuration:&lt;br /&gt;
* Run -&amp;gt; Open Run Dialog -&amp;gt; Eclipse Application -&amp;gt; Rifidi.product.  This is the run configuration.&lt;br /&gt;
* Go to the Tab Plug-ins.  The selected plugins are the ones that will be run.  Notice that there are two sections: &amp;quot;workspace&amp;quot; and &amp;quot;target platform&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Add Required Plug-ins&amp;quot; [[Image:Rifidi_from_source-11_add_plugins.png  |none|thumb|600px|Add required plugins]]&lt;br /&gt;
* check any plugins specifically required for the application to run (for example, the emulator requires the readers to be included).  Make sure that the plugin is coming from the place &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.miiny.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; deals singapore&amp;lt;/span&amp;gt;] that you intended (i.e. workspace or target platform).&lt;br /&gt;
* click the Button &amp;quot;Validate Plug-ins&amp;quot; to make sure everything is set up correctly&lt;br /&gt;
* click the Button &amp;quot;Apply&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Run&amp;quot; and start the Project&lt;br /&gt;
&lt;br /&gt;
==Updating the code==&lt;br /&gt;
&lt;br /&gt;
Now that you have downloaded the code into an eclipse workspace, it is easy to get changes to the code as soon as we add them to the svn.  &lt;br /&gt;
&lt;br /&gt;
To update the code:&lt;br /&gt;
&lt;br /&gt;
* Open up the Team Synchronizing Perspective in eclipse&lt;br /&gt;
* Click the button that says &amp;quot;Synchronize&amp;quot;.&lt;br /&gt;
* Select all projects.&lt;br /&gt;
* Install any updates by selecting all the updates show, right clicking and choosing 'update'&lt;br /&gt;
&lt;br /&gt;
Now that you have the new code, just hit the green run button on the toolbar at the top (Eclipse automatically compiles the code for you, so you don't have to worry about that).&lt;br /&gt;
&lt;br /&gt;
==Switching Branches==&lt;br /&gt;
If you need to run code from another branch or tag, please see [[Switching Branches]].&lt;br /&gt;
&lt;br /&gt;
==Viewing Source and Running From Trunk==&lt;br /&gt;
By default all of the rifidi plugins you are running in eclipse are pre-compiled, binary plugins contained in the &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt; folder.  If you want to view or edit the source for a particular plugin, you will need to check out the plugin from the trunk.  Once it is checked out make sure to edit your run configuration so that the application will use the plugin from the workspace and not from the target platform. &lt;br /&gt;
&lt;br /&gt;
For example, suppose I want to view the source for the Alien reader plugin.  I need to follow the steps above to check out and run rifidi emulator.  In addition, I need to check out the &amp;lt;code&amp;gt;org.rifidi.emulator.readers.alien&amp;lt;/code&amp;gt; plugin.  This is the code for the alien reader.  In addition, I need to edit the run configuration to make sure that my workspace alien reader plugin is being used instead of the target platform alien reader plugin.&lt;br /&gt;
&lt;br /&gt;
=Reporting Bugs=&lt;br /&gt;
&lt;br /&gt;
To report bugs, please use the forum at&lt;br /&gt;
&lt;br /&gt;
 http://forums.rifidi.org&lt;br /&gt;
&lt;br /&gt;
or drop by our IRC channel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#rifidi on irc.freenode.org.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also visit us online at http://www.rifidi.org&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<entry>
		<id>https://wiki.transcends.co/index.php/Rifidi:Source_Code</id>
		<title>Rifidi:Source Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.transcends.co/index.php/Rifidi:Source_Code"/>
				<updated>2011-11-01T04:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Organization */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:developerDoc]]&lt;br /&gt;
This page explains how to download and run the source code for the Rifidi products.  However, please keep in mind that the code in this repository is not guaranteed to be stable. If you are interested in our latest stable release, visit our sourceforge page: http://sourceforge.net/projects/rifidi/.&lt;br /&gt;
=Quick Instructions=&lt;br /&gt;
The following are the basic steps needed to begin running Rifidi from source.  If you have trouble or need more explanation, please see the more detailed instructions on this page.&lt;br /&gt;
# Download the Eclipse for plugin developers (3.5 is what we are using)&lt;br /&gt;
# Install the subclipse plugin&lt;br /&gt;
# Add this svn to the list of repositories: https://svn.rifidi.org/svn/rep-external&lt;br /&gt;
# Check out the following projects from rifidi/trunk: org.rifidi.binary, org.rifidi.emulator.target, org.rifidi.ui.ide&lt;br /&gt;
# Open up the target file in org.rifidi.emulator.target and click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
# Open up the .product file in org.rifidi.ui.ide and click &amp;quot;launch an eclipse application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Weekly Builds=&lt;br /&gt;
Because many of our users are intereted in running the latest version of the Rifidi products but don't want to go to all the trouble of downloading the source code, there is a weekly build of the products.  The weekly builds include the latest features, but is not as tested as the sourceforge releases.  A link will be provided soon.&lt;br /&gt;
=Rifidi Source Code=&lt;br /&gt;
For those who need to see the source code for the Rifidi products, you will have to check out the code from svn.  This section explains how to check out and run the code from source.&lt;br /&gt;
==Organization==&lt;br /&gt;
In general the code for Rifidi is organized into Eclipse plugins or bundles.  Eclipse handles the loading and execution of the plugins.  For more detailed information about how our source code is organized, please see [[Development and Release Process#Concepts]].&lt;br /&gt;
* '''SVN Structure''' - There are three main folders in the Rifidi directory on &amp;lt;code&amp;gt;rep-external&amp;lt;/code&amp;gt; (the main svn repository for Rifidi).  The ''trunk'' folder contains the code that is being developed.  It is ''not'' guaranteed to be stable.  The ''tags'' folder contains tagged versions of the source for each of &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.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;aircon service&amp;lt;/span&amp;gt;] the plugins.  The source in these plugins should be relatively stable.  The ''branches'' folder contains plugins that have been branched so that larger changes can be made on plugins without holding up other developers.  These changes can then later be merged back in.  For more details about our SVN, see [[Development and Release Process#SVN Structure]]&lt;br /&gt;
* Target Platform - A target platform is the base set of &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/ac_service.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;ac repair&amp;lt;/span&amp;gt;] plugins that an Eclipse application needs to run.  In order to provide a more stable environment and to ensure a clean separation between the base plugins that Rifidi needs and the base plugins that your Eclipse IDE needs, we provide a target platform for each of the Rifidi products.  You can find these in the trunk.  They will be named something like &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;.  For more information see [[Development and Release Process#Target Platforms]].&lt;br /&gt;
* org.rifidi.binary - As the source code for Rifidi gets larger it begins to get harder to maintain a stable set of plugins.  In order to simplify things, there is a folder in the &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.timewing.com.sg/refrg_service.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; refrigerator repair&amp;lt;/span&amp;gt;] svn into which stable binaries of each of the plugins used in the rifidi project will be placed.  This folder is used in conjunction with the target platform.&lt;br /&gt;
* Product File - In Eclipse, a product file is used to define the needed eclipse plugins.  Running this file will create a new Eclipse 'Run Configuration' in your IDE.  You can then tweak this run configuration as needed.&lt;br /&gt;
* Source Code Plugins - A stable binary version of each of the plugins is &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://jamumassagesingapore.com/services/dejamu/post-natal&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; jamu postnatal massage&amp;lt;/span&amp;gt;] contained in the org.rifidi.binary folder.  However, if you wish to view the source of a particular plugin or run a plugin from source, you must download the code from either the version in the trunk or a tagged version in the tags directory.&lt;br /&gt;
&lt;br /&gt;
==Downloading the Code==&lt;br /&gt;
&lt;br /&gt;
Our code is hosted at https://svn.rifidi.org/svn/rep-external.  The svn repository allows anonymous read access.  Because the svn repository is the same one that developers submit to, it contains the latest Rifidi code.&lt;br /&gt;
&lt;br /&gt;
The following steps explain how to check out and run Rifidi Emulator.  The other products in the Rifidi Suite follow similar steps.  If you need help with them, you can ask questions on IRC or our forums.&lt;br /&gt;
&lt;br /&gt;
===Prerequisites===&lt;br /&gt;
&lt;br /&gt;
The Rifidi Emulator is written in java and consists of Eclipse plugins. At this point it is easiest to compile and build it inside of the eclipse environment.  &lt;br /&gt;
&lt;br /&gt;
====Install Eclipse====&lt;br /&gt;
Note that you need the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of eclipse.  Rifidi will not run on other versions.&lt;br /&gt;
* If you do not already have eclipse, or if you have a different version, you will need to get this version&lt;br /&gt;
** Go to http://www.eclipse.org/downloads/ and download the &amp;quot;Eclipse for RCP/Plug-in Developers&amp;quot; version of Eclipse to a convenient location.&lt;br /&gt;
** Unzip the package.&lt;br /&gt;
** Double click on the execution file to get it started [[Image:Rifidi_from_source-1-opening_eclipse.png |none|thumb|800px|Double click on the executable to open up eclipse]]&lt;br /&gt;
* If you have not used eclipse before, you will be required to select a workspace when eclipse is opening.&lt;br /&gt;
** After eclipse opens go to the workbench[[Image:Rifidi_from_source-2-wokbench.png |none|thumb|800px|Open up the workbench]]&lt;br /&gt;
* If you have an existing workspace, you will need to create a new one.&lt;br /&gt;
** Go to file -&amp;gt; switch workspace -&amp;gt; other [[Image:Rifidi_from_source-3-switch_workspace.png |none|thumb|800px|Open up the workbench]] &lt;br /&gt;
** Select a new directory for your Rifidi workspace.&lt;br /&gt;
&lt;br /&gt;
====Install Subclipse====&lt;br /&gt;
&lt;br /&gt;
Subclipse is an eclipse plugin that manages svn commands.&lt;br /&gt;
&lt;br /&gt;
* Follow the instructions at http://subclipse.tigris.org/install.html.&lt;br /&gt;
* In step 6 of the above instructions, don't install the Optional Integrations.  Only the subclipse plugin is needed&lt;br /&gt;
&lt;br /&gt;
===Add Repository===&lt;br /&gt;
&lt;br /&gt;
* Open the 'SVN Repository Exploring' perspective&lt;br /&gt;
** Window -&amp;gt; Open Perspective -&amp;gt; Other [[Image:Rifidi_from_source-4-svn_rep_explore1.png |none|thumb|800px|Open up the perspective picker]]&lt;br /&gt;
** SVN Repository Exploring [[Image:Rifidi_from_source-5-svn_rep_explore2.png |none|thumb|400px|Open up the SVN Repository Explorer]]&lt;br /&gt;
* Add the rifidi repository&lt;br /&gt;
** Click 'Add SVN Repository' button&lt;br /&gt;
** Add 'https://svn.rifidi.org/svn/rep-external'[[Image:Rifidi_from_source-6-add_rep.png |none|400px|thumb|Add the repository]]&lt;br /&gt;
&lt;br /&gt;
===Check Out Code===&lt;br /&gt;
&lt;br /&gt;
* Check out all the projects in the rifidi/trunk folder of the repository&lt;br /&gt;
** Highlight the folders you would like to check out. For Emulator you will need&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.emulator.taget3.5.2&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt;&lt;br /&gt;
** Right click them and select checkout [[Image:Rifidi_from_source-7-checkout1.png |none|800px|thumb|Select the projects]]&lt;br /&gt;
** Select Finish. [[Image:Rifidi_from_source-8-checkout2.png |none|400px|thumb|Checkout projects]]&lt;br /&gt;
&lt;br /&gt;
===Set The Target Platform===&lt;br /&gt;
* Open up the .target file in &amp;lt;code&amp;gt;org.rifidi.emulator.target&amp;lt;/code&amp;gt;&lt;br /&gt;
* Click the button that says &amp;quot;set as target platform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Running Rifidi==&lt;br /&gt;
&lt;br /&gt;
The last step to get Rifidi running is to create a run configuration.&lt;br /&gt;
&lt;br /&gt;
A run configuration is the set of plugins that will be loaded when you run the application.  Plugins can come from one of two places:&lt;br /&gt;
#Workspace - these are the plugins that you have in the source tree on the left&lt;br /&gt;
#Target Environment - These are the plugins defined by the target environment that you are using that the time.&lt;br /&gt;
&lt;br /&gt;
Because there is a product file for emulator defined in the &amp;lt;code&amp;gt;org.rifidi.ui.ide&amp;lt;/code&amp;gt; plugin, the easiest way to create a new run configuration is by running the product file.  This will automatically create a new run configuration&lt;br /&gt;
&lt;br /&gt;
To Create a new Run Configuration: &lt;br /&gt;
* Switch to the Java perspective in the same way that you switched to the repository exploring view [[Image:Rifidi_from_source-9-java_view.png  |none|400px|thumb|Run Rifidi]]&lt;br /&gt;
* Right click on Rifidi.product in the org.rifidi.ui.ide project&lt;br /&gt;
* Click on &amp;quot;Run as eclipse application&amp;quot; [[Image:Rifidi_from_source-10_run_eclipse.png  |none|thumb|800px|Run Rifidi]]&lt;br /&gt;
* From now on, you can start Rifidi via the green triangle button at the top of eclipse&lt;br /&gt;
&lt;br /&gt;
If there was an error when starting the application, follow the step below to edit the run configuration:&lt;br /&gt;
&lt;br /&gt;
To Edit a Run Configuration:&lt;br /&gt;
* Run -&amp;gt; Open Run Dialog -&amp;gt; Eclipse Application -&amp;gt; Rifidi.product.  This is the run configuration.&lt;br /&gt;
* Go to the Tab Plug-ins.  The selected plugins are the ones that will be run.  Notice that there are two sections: &amp;quot;workspace&amp;quot; and &amp;quot;target platform&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Add Required Plug-ins&amp;quot; [[Image:Rifidi_from_source-11_add_plugins.png  |none|thumb|600px|Add required plugins]]&lt;br /&gt;
* check any plugins specifically required for the application to run (for example, the emulator requires the readers to be included).  Make sure that the plugin is coming from the place that you intended (i.e. workspace or target platform).&lt;br /&gt;
* click the Button &amp;quot;Validate Plug-ins&amp;quot; to make sure everything is set up correctly&lt;br /&gt;
* click the Button &amp;quot;Apply&amp;quot;&lt;br /&gt;
* click the Button &amp;quot;Run&amp;quot; and start the Project&lt;br /&gt;
&lt;br /&gt;
==Updating the code==&lt;br /&gt;
&lt;br /&gt;
Now that you have downloaded the code into an eclipse workspace, it is easy to get changes to the code as soon as we add them to the svn.  &lt;br /&gt;
&lt;br /&gt;
To update the code:&lt;br /&gt;
&lt;br /&gt;
* Open up the Team Synchronizing Perspective in eclipse&lt;br /&gt;
* Click the button that says &amp;quot;Synchronize&amp;quot;.&lt;br /&gt;
* Select all projects.&lt;br /&gt;
* Install any updates by selecting all the updates show, right clicking and choosing 'update'&lt;br /&gt;
&lt;br /&gt;
Now that you have the new code, just hit the green run button on the toolbar at the top (Eclipse automatically compiles the code for you, so you don't have to worry about that).&lt;br /&gt;
&lt;br /&gt;
==Switching Branches==&lt;br /&gt;
If you need to run code from another branch or tag, please see [[Switching Branches]].&lt;br /&gt;
&lt;br /&gt;
==Viewing Source and Running From Trunk==&lt;br /&gt;
By default all of the rifidi plugins you are running in eclipse are pre-compiled, binary plugins contained in the &amp;lt;code&amp;gt;org.rifidi.binary&amp;lt;/code&amp;gt; folder.  If you want to view or edit the source for a particular plugin, you will need to check out the plugin from the trunk.  Once it is checked out make sure to edit your run configuration so that the application will use the plugin from the workspace and not from the target platform. &lt;br /&gt;
&lt;br /&gt;
For example, suppose I want to view the source for the Alien reader plugin.  I need to follow the steps above to check out and run rifidi emulator.  In addition, I need to check out the &amp;lt;code&amp;gt;org.rifidi.emulator.readers.alien&amp;lt;/code&amp;gt; plugin.  This is the code for the alien reader.  In addition, I need to edit the run configuration to make sure that my workspace alien reader plugin is being used instead of the target platform alien reader plugin.&lt;br /&gt;
&lt;br /&gt;
=Reporting Bugs=&lt;br /&gt;
&lt;br /&gt;
To report bugs, please use the forum at&lt;br /&gt;
&lt;br /&gt;
 http://forums.rifidi.org&lt;br /&gt;
&lt;br /&gt;
or drop by our IRC channel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#rifidi on irc.freenode.org.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also visit us online at http://www.rifidi.org&lt;/div&gt;</summary>
		<author><name>Seoagent</name></author>	</entry>

	<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-10-13T07:33:42Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Current State */&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.bankerslifeinsurance.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;bankers life&amp;lt;/span&amp;gt;] totally separate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.skin-products-review.com/breastactives &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;breast actives&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/07/funny-nursery-rhymes-remixed.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;nursery rhymes&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.celebrationswineclub.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;Wine Clubs&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/05/crazy-artistic-tattoos.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;crazy tattoos&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&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;] being developed with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.chetankapur.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;Chetan Kapur&amp;lt;/span&amp;gt;] [http://alliancetransport.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;bus rental&amp;lt;/span&amp;gt;] the service-oriented 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 that is not separated into plugins&lt;br /&gt;
**Stable code mixed with development code&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 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 [http://www.cloutshoppe.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;online shop singapore&amp;lt;/span&amp;gt;] 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 plugin's manifest [http://www.miiny.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;deals singapore&amp;lt;/span&amp;gt;].&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.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;] 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 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>Seoagent</name></author>	</entry>

	<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-10-13T07:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Solution through Service Oriented Architecture */&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.bankerslifeinsurance.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;bankers life&amp;lt;/span&amp;gt;] totally separate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.skin-products-review.com/breastactives &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;breast actives&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/07/funny-nursery-rhymes-remixed.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;nursery rhymes&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.celebrationswineclub.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;Wine Clubs&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/05/crazy-artistic-tattoos.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;crazy tattoos&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&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;] being developed with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.chetankapur.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;Chetan Kapur&amp;lt;/span&amp;gt;] the service-oriented 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 that is not separated into plugins&lt;br /&gt;
**Stable code mixed with development code&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 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 [http://www.cloutshoppe.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;online shop singapore&amp;lt;/span&amp;gt;] 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 plugin's manifest [http://www.miiny.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;deals singapore&amp;lt;/span&amp;gt;].&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.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;] 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 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>Seoagent</name></author>	</entry>

	<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-10-13T07:32:28Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Steps to Complete */&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.bankerslifeinsurance.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;bankers life&amp;lt;/span&amp;gt;] totally separate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.skin-products-review.com/breastactives &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;breast actives&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/07/funny-nursery-rhymes-remixed.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;nursery rhymes&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.celebrationswineclub.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;Wine Clubs&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/05/crazy-artistic-tattoos.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;crazy tattoos&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&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;] being developed with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.chetankapur.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;Chetan Kapur&amp;lt;/span&amp;gt;] the service-oriented 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 that is not separated into plugins&lt;br /&gt;
**Stable code mixed with development code&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 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 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;
=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.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;] 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 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>Seoagent</name></author>	</entry>

	<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-10-13T07:32:04Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Steps to Complete */&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.bankerslifeinsurance.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;bankers life&amp;lt;/span&amp;gt;] totally separate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.skin-products-review.com/breastactives &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;breast actives&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/07/funny-nursery-rhymes-remixed.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;nursery rhymes&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.celebrationswineclub.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;Wine Clubs&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/05/crazy-artistic-tattoos.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;crazy tattoos&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&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;] being developed with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.chetankapur.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;Chetan Kapur&amp;lt;/span&amp;gt;] the service-oriented 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 that is not separated into plugins&lt;br /&gt;
**Stable code mixed with development code&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 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 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;
=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.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;] 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 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 products [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;]&lt;br /&gt;
.&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>Seoagent</name></author>	</entry>

	<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-10-13T07:30:40Z</updated>
		
		<summary type="html">&lt;p&gt;Seoagent: /* Rifidi As Single Application */&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.bankerslifeinsurance.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;bankers life&amp;lt;/span&amp;gt;] totally separate &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.skin-products-review.com/breastactives &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;breast actives&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/07/funny-nursery-rhymes-remixed.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;nursery rhymes&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.celebrationswineclub.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;Wine Clubs&amp;lt;/span&amp;gt;] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://itshumour.blogspot.com/2009/05/crazy-artistic-tattoos.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;crazy tattoos&amp;lt;/span&amp;gt;]&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&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;] being developed with &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://www.chetankapur.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;Chetan Kapur&amp;lt;/span&amp;gt;] the service-oriented 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 that is not separated into plugins&lt;br /&gt;
**Stable code mixed with development code&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 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 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;
=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.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;] 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 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 products &lt;br /&gt;
.&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.amaliadraghici.ro/portofolio/Machiaj%20mireasa/list/1 machiaj mireasa]&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>Seoagent</name></author>	</entry>

	</feed>