I know that this question has already been asked .In the previously asked questions there is a link from where we can find the details about org.apache.xmlrpc but I cound not determine the alternative for addHandler method of WebServer class.
I have two projects
1 Server
Server project consist of
1.1 AreaServer
1.2 AreaHandler
2 Client
Client project consist of
2.1 Client
AreaHandler class copmutes the area of the circle for a given radius. AreaServer uses AreaHandler class.
AreaServer
package webtutorial;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.xmlrpc.webserver.WebServer;
/**
*
* @author Dev Parzival
*/
public class AreaServer {
public static void main(String $[]){
try {
startServer($);
} catch (IOException ex) {
Logger.getLogger(AreaServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void startServer(String $[]) throws IOException{
WebServer server;
server=new WebServer(Integer.parseInt($[0]));
server.addHandler("area",new AreaHandler());
server.start();
}
}
AreaHandler
package webtutorial;
/**
*
* @author Dev Parzival
*/
public class AreaHandler {
/**
*
* @param radius radius of circle whose area has to be computed
* @return area of the circle whose type is double
*/
public double circleArea(double radius){
return Math.PI*radius*radius;
}
}
Client
package client;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
/**
*
* @author Dev Parzival
* @date 02-Sep-2020
* @time 08:46:01
*/
public class Client {
/**
* @param $ the command line arguments , represent the radius of the circle whose area is to be computer via the server.
*/
public static void main(String[] $) {
// TODO code application logic here
Client client=new Client();
double radius=Double.parseDouble($[0]);
try{
double area=client.areaCircle(radius);
System.out.println("Area of the circle is : "+area);
}
catch(Exception ex){
System.out.println(ex);
}
}
public double areaCircle(double radius) throws IOException,XmlRpcException{
double area=0;
XmlRpcClient client=new XmlRpcClient();
ArrayList<Double> vec=new ArrayList<Double>();
vec.add(new Double(radius));
Object result=client.execute("area.circleArea", vec);
area=Double.parseDouble(result.toString());
return area;
}
}
The addHandler method is deprecated so I want to know how can do this
server.addHandler("area",new AreaHandler());
Link the AreaHandler class with area So when client request the server it returns the area.
You can still use deprecated methods. What version of xmlrpc are you using?
The docs indicate that you can use PropertyHandlerMapping
to add mappings from a property file.
PropertyHandlerMapping phm = new PropertyHandlerMapping();
/* Load handler definitions from a property file.
* The property file might look like:
* Calculator=org.apache.xmlrpc.demo.Calculator
* org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
*/
phm.load(Thread.currentThread().getContextClassLoader(),
"MyHandlers.properties");
xmlRpcServer.setHandlerMapping(phm);
Or you can add them directly:
/* You may also provide the handler classes directly,
* like this:
* phm.addHandler("Calculator",
* org.apache.xmlrpc.demo.Calculator.class);
* phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),
* org.apache.xmlrpc.demo.proxy.AdderImpl.class);
*/
See: https://ws.apache.org/xmlrpc/server.html
You can still add a handler, like this:
WebServer server = new WebServer(Integer.parseInt($[0]));
PropertyHandlerMapping handlerMapping = new PropertyHandlerMapping();
handlerMapping.addHandler("area", AreaHandler.class);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
xmlRpcServer.setHandlerMapping(handlerMapping);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
server.start();