|
Tutorial OSGi
|
![]() |
Utilisation du service HTTPDans les exemples précedents, nous avons étudié les bases de OSGi et nous avons vu un mécanisme permettant de faciliter la gestion des dépendances dans OSGi. La spécification de OSGi définit en plus de l'API du framework, une série de services qui doivent être implémentés par défault. L'un d'entre eux, HTTP s'occupe de mettre en marche un serveur HTTP pour pouvoir interagir avec le framework à travers un navigateur par exemple. Cet exemple vise à montrer l'utilisation de HTTP pour créer un client au service de correction orthographique qui permette de verifier l'orthographe d'une phrase à travers une page web générée par une servlet. Nous allons installer d'abord installer http.jar et servlet.jar
Il faudra ensuite démarrer le service http et vérifier qu'il n'y à pas d'éxceptions. Le client que nous allons créer utilise le ServiceBinder, donc il doit avoir un activateur qui hérite du GenericActivator: /** OSGi and Gravity Service Binder tutorial. * * Example8: A client to the SpellCheckerService that registers a Servlet * * @author: Humberto.Cervantes@imag.fr **/ package tutorial.example8; import org.ungoverned.gravity.servicebinder.GenericActivator; public class Activator extends GenericActivator { } Le descripteur metadata.xml décrit deux dépendances: une envers le service http et une autre envers le service de correction orthographique <?xml version="1.0" encoding="UTF-8"?><bundle> <instance class="tutorial.example8.ClientImpl"> <property name="version" value="1.0" type="string"/> <requires service="tutorial.example5.service.SpellCheckService" filter="" cardinality="1..1" policy="dynamic" bind-method="bindSpellChecker" unbind-method="unbindSpellChecker" /> <requires service="org.osgi.service.http.HttpService" filter="" cardinality="1..1" policy="static" bind-method="bindHttpService" unbind-method="unbindHttpService" /> </instance> </bundle> Le manifeste du bundle est le suivant: Bundle-Activator: tutorial.example8.ActivatorImport-Package: tutorial.example5.service, org.ungoverned.gravity.servicebinder, org.ungoverned.gravity.common, org.osgi.service.http, javax.servlet.http, javax.servlet Import-Service: tutorial.example5.service.SpellCheckService Bundle-Name: Servlet spell checker Bundle-Description: A bundle that uses the spell check service Bundle-Vendor: Humberto Bundle-Version: 1.0.0 Metadata-Location: tutorial/example8/metadata.xml Le code du composant est le suivant: /** OSGi and Gravity Service Binder tutorial. * * Example8: A client to the SpellCheckerService that registers a Servlet * * @author: Humberto.Cervantes@imag.fr **/ package tutorial.example8; import tutorial.example5.service.SpellCheckService; import org.osgi.service.http.HttpService; import org.osgi.service.http.HttpContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URL; import org.ungoverned.gravity.common.Lifecycle; /** * The class ClientImpl is a client to the SpellCheckerService that registers * a servlet. * **/ public class ClientImpl implements Lifecycle { private HttpService m_http; private SpellCheckService m_checker; public ClientImpl() { } public void bindSpellChecker(SpellCheckService checker) { m_checker = checker; } public void unbindSpellChecker(SpellCheckService checker) { m_checker = null; } public void bindHttpService(HttpService http) { m_http = http; } public void unbindHttpService(HttpService http) { m_http = null; } /** * This method is called when the instance is becoming valid, that is * that it has received the http and the checker services **/ public void activate() { registerServlet(); } /** * This method is called when the instance becomes invalid * **/ public void deactivate() { try { m_http.unregister("/spellchecker"); m_http.unregister("/resources"); } catch(Exception e) { } } private void registerServlet() { HttpContext hc=new HttpContext() { public boolean handleSecurity(HttpServletRequest req,HttpServletResponse res) { return true; } public String getMimeType(String name) { return null; } public URL getResource(String path) { URL u=getClass().getResource(path); return u; } }; try { ServletImpl impl = new ServletImpl(); impl.setChecker(m_checker); m_http.registerServlet("/spellchecker", impl, null, null); m_http.registerResources("/resources","/spellchecker",hc); } catch(Exception e) { e.printStackTrace(); } } } Finalement le code de la servlet: /** OSGi and Gravity Service Binder tutorial. * * Example8: A client to the SpellCheckerService that registers a Servlet * * @author: Humberto.Cervantes@imag.fr **/ package tutorial.example8; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServlet; import javax.swing.tree.TreeModel; import java.util.Calendar; import java.util.Vector; import java.io.IOException; import tutorial.example5.service.SpellCheckService; /** * Implementation of the servlet */ class ServletImpl extends HttpServlet { private SpellCheckService m_checker; private String m_string = ""; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String html = "<HTML>\n" + "<title>SpellChecker:</title>\n" + "<body bgcolor=\"#ffffff\">\n" + "<center> <h1>Spell check service.</h1> </center>\n\n"+ "<blockquote>"; html+="<FORM METHOD=POST ACTION=\"/spellchecker\">"; html+="<TD VALIGN=\"TOP\" ALIGN=\"LEFT\">"; html+="Check spelling for: "; html+="<INPUT NAME=\"entry\" TYPE=\"TEXT\" SIZE=30 MAXLENGTH=100 VALUE=\""+m_string+"\">"; if(m_string.equals("") == false) { html+="<blockquote>"; String[] errors = m_checker.check(m_string); if (errors == null) { //System.out.println("Passage is correct."); html+="<br>String is correct<br>"; } else { //System.out.println("Incorrect word(s):"); html+="<br>Incorrect words:<blockquote>"; for (int i = 0; i < errors.length; i++) { //System.out.println(" " + errors[i]); html+=errors[i]+"<br>"; } html+="</blockquote>"; } html+="</blockquote>"; } html+="</blockquote>"; html+="</body></HTML>\n"; ServletOutputStream out = resp.getOutputStream(); resp.setContentType("text/html"); out.println(html); out.close(); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { m_string = req.getParameter("entry"); doGet(req,resp); } void setChecker(SpellCheckService checker) { m_checker = checker; } } Finalement on crée le bundle avec le fichier build_example8.xml. Il faut noter que pour compiler il faudra copier servlet.jar et http.jar dans le repertoire lib/.
Si le
service de correction orthographique est présent, on doit
pouvoir diriger le navigateur à l'adresse suivante: http://localhost:8080/spellchecker Si tout se passe bien, on doit voir un écran comme le suivant: ![]() A Faire: Tester les modifications des services en arretant par exemple les dictionnaires. Avec ceci nous terminons le tutorial OSGi.
|
![]() |
||
|