First application (Avalanche - application framework for Java)
  "Avalanche - application framework for Java" - implementation of technology erasing the differences between 
      
        
        
        
      
      local and remote code calls.  Fault tolerance, scalability, 
      
        
        
        
      
      modifiability, continuous availability come bundled with nice bonuses. 
  All programming languages ββsuggest starting with writing a simple output program. 
      
        
        
        
      
      Hello world messages.  This example is not suitable for demonstrating functional 
      
        
        
        
      
      features of "Avalanche - application framework for Java", since calling this example is always 
      
        
        
        
      
      returns the same string and does not allow to identify the source that returned this 
      
        
        
        
      
      result. 
  For the first application, you need to implement two classes (function and application), one 
      
        
        
        
      
      interface (function adapter) and one JSP page to display the result.  Designed by 
      
        
        
        
      
      the application will run under Tomcat. 
Function Class Implementation - DemoFunction
  There is nothing special in the function implementation class; it is a regular Java class.  As 
      
        
        
        
      
      function class any class can be used.  Let the function demo class 
      
        
        
        
      
      returns the following information from the operating system: PID of the process and server name; 
      
        
        
        
      
      operating system version;  name of the operating system. 
Class Code DemoFunction.java
package ru.funsys.demo.avalanche; import java.lang.management.ManagementFactory; import java.util.Hashtable; public class DemoFunction { /** * .<br> * <br> * <br> * <b>os.name</b> - ,<br> * <b>os.version</b> - <br> * <b>PID@name</b> - * * @return */ public Hashtable<String, String> getInfo() { Hashtable<String, String> result = new Hashtable<String, String>(); result.put("os.name", System.getProperty("os.name")); result.put("os.version", System.getProperty("os.version")); result.put("PID@name", ManagementFactory.getRuntimeMXBean().getName()); return result; } }
β DemoAdapter
     Java,  β  ,  
      
        
        
        
      
    
   ,      
      
        
        
        
      
    
.   DemoFunction     
DemoAdapter.java
package ru.funsys.demo.avalanche; import java.util.Hashtable; import ru.funsys.avalanche.AvalancheRemote; public interface DemoAdapter { public Hashtable<String, String> getInfo() throws AvalancheRemote; }
 ,      DemoAdapter 
      
        
        
        
      
    
    AvalancheException. 
      
        
        
        
      
    
     RMI    Java,   
      
        
        
        
      
    
:
-   (   β DemoFunction)    
      
 
 ( β DemoAdapter)
-   ( β DemoAdapter)      
      
 
 (, DemoFunction), ,
 
 .
, .
β DemoApplication
 DemoApplication β    getInfo()  DemoFunction
      
        
        
        
      
    
   DemoAdapter.   DemoApplication 
      
        
        
        
      
    
   getInfo()   TXT  HTML.
DemoApplication.java
package ru.funsys.demo.avalanche; import java.util.Enumeration; import java.util.Hashtable; import ru.funsys.avalanche.Application; import ru.funsys.avalanche.AvalancheRemote; public class DemoApplication extends Application { /** * */ private DemoAdapter info; /** * * HTML . * * @param html true, HTML, false * * @return HTML */ public String getInfo(boolean html) { StringBuilder builder = new StringBuilder(); if (html) { builder.append("<table border=\"1\">"); builder.append("<tr><th>key</th><th>value</th></tr>"); } try { // Hashtable<String, String> result = info.getInfo(); for (Enumeration<String> enumeration = result.keys(); enumeration.hasMoreElements(); ) { String key = enumeration.nextElement(); String value = result.get(key); if (html) { builder.append("<tr><td>").append(key).append("</td><td>").append(value).append("</td></tr>"); } else { builder.append(key).append(": ").append(value).append("\r\n"); } } } catch (AvalancheRemote e) { if (html) { builder.append("<tr><td>").append("error").append("</td><td>").append(e.getLocalizedMessage()).append("</td></tr>"); } else { builder.append("error").append(": ").append(e.getLocalizedMessage()).append("\r\n"); } } if (html) builder.append("</table>"); return builder.toString(); } }
: ru.funsys.avalanche.Application.
info , , getAdapter(String name) ru.funsys.avalanche.Application. . .
JSP β first.jsp
JSP . DemoApplication getInfo c true.
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title> </title> </head> <body> <h1> </h1> <jsp:useBean id='DemoApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/> <%= DemoApp.getInfo(true) %> <br> </body> </html>
. .
web.xml
web.xml AvalancheServlet, log4j. AvalancheServlet avalanche-config.xml.
<?xml version="1.0" encoding="UTF-8"?> <!-- web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" --> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Demo Avalanche</display-name> <description> framework Avalanche </description> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <display-name>AvalancheServlet</display-name> <servlet-name>AvalancheServlet</servlet-name> <servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class> <init-param> <param-name>avalanche.config</param-name> <param-value>${catalina.base}/conf/avalanche-config.xml</param-value> </init-param> <init-param> <param-name>avalanche.log4j</param-name> <param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> </web-app>
avalanche-config.xml
<?xml version="1.0" encoding="UTF-8"?> <avalanche name="Demo Application"> <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " /> <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" > <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" /> </application> </avalanche>
<function> <application>. <application> <adapter>, uri (. name <function>).
name <application>, DemoApp id DemoApplication JSP .
DemoFunction
, , REST, SOAP .
"Avalanche β application framework for Java" DemoFunction. .
avalanche-config.xml :
- <interface>,
- <connector>, .
RMI
RMI
<interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" />
:
- localhost
- 23000 RMI Remote Server
- rmi-connector
<connector>
<connector class="RMIConnector" name="rmi-connector" port="23000" > <publish name="info" function="info-function" /> </connector>
:
- rmi-connector
- 23000 RMI Remote Server
- <publish> info-function , info-function info
HTTP
HTTP
<interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" />
:
- localhost
- 8080 HTTP Server
- demo
- connector AvalancheServlet
- http-connector
<connector>
<connector class="HTTPConnector" name="http-connector" > <publish name="info" function="info-function" /> </connector>
:
- http-connector
- <publish> info-function , info-function info
! HTTP , HTTP (Tomcat).
<multipart-config> AvalancheServlet <servlet-mapping> URI web.xml.
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0" --> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Demo Avalanche</display-name> <description> framework Avalanche </description> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <display-name>AvalancheServlet</display-name> <servlet-name>AvalancheServlet</servlet-name> <servlet-class>ru.funsys.servlet.http.AvalancheServlet</servlet-class> <init-param> <param-name>avalanche.config</param-name> <param-value>${catalina.base}/conf/avalanche-config.xml</param-value> </init-param> <init-param> <param-name>avalanche.log4j</param-name> <param-value>${catalina.base}/conf/avalanche-log4j.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <multipart-config> <!-- 50MB max --> <max-file-size>52428800</max-file-size> <max-request-size>52428800</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> <servlet-mapping> <servlet-name>AvalancheServlet</servlet-name> <url-pattern>/connector/*</url-pattern> </servlet-mapping> </web-app>
, <application> RMIApp HTTPApp. uri <adapter> -/- , .. rmi-interface/info http-interface/info.
avalanche-config.xml RMI HTTP
<?xml version="1.0" encoding="UTF-8"?> <avalanche name="Demo Application"> <interface name="rmi-interface" uri="rmi://localhost:23000/rmi-connector" /> <interface name="http-interface" uri="http://localhost:8080/demo/connector/http-connector" /> <function class="ru.funsys.demo.avalanche.DemoFunction" name="info-function" description=" " /> <application class="ru.funsys.demo.avalanche.DemoApplication" name="DemoApp" > <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="info-function" /> </application> <application class="ru.funsys.demo.avalanche.DemoApplication" name="RMIApp" > <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="rmi-interface/info" /> </application> <application class="ru.funsys.demo.avalanche.DemoApplication" name="HTTPApp" > <adapter class="ru.funsys.demo.avalanche.DemoAdapter" name="info" uri="http-interface/info" /> </application> <connector class="RMIConnector" name="rmi-connector" port="23000" > <publish name="info" function="info-function" /> </connector> <connector class="HTTPConnector" name="http-connector" > <publish name="info" function="info-function" /> </connector> </avalanche>
JSP first.jsp RMI HTTP, id RMIApp HTTPApp .
rmi.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title> - RMI</title> </head> <body> <h1> - RMI</h1> <p> - RMI </p> <jsp:useBean id='RMIApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/> <%= RMIApp.getInfo(true) %> </body> </html>
http.jsp
<%@ page import="ru.funsys.demo.avalanche.DemoApplication"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title> - HTTP</title> </head> <body> <h1> - HTTP</h1> <p> - HTTP </p> <jsp:useBean id='HTTPApp' scope='application' class='ru.funsys.demo.avalanche.DemoApplication'/> <%= HTTPApp.getInfo(true) %> </body> </html>
, localhost <interface> avalanche-config.xml, .
, .
, , GitHub