...
Step 1 - Create a new component
Code Block |
---|
ant create-component
Component name: restcomponent
Component resource name: RestComponent
Webapp name: restcomponent
Base permission: RESTCOMPONENT
|
Step 2 - Grab apache wink*
Download apache wink. I used http://www.apache.org/dyn/closer.cgi/incubator/wink/1.0-incubating/apache-wink-1.0-incubating.zip
Unzip and copy lib/* and dist/* to your ofbiz component restcomponent/lib
\* read this https://dzone.com/articles/apache-cxf-vs-apache-axis-vs for a comparison between 3 Apache solutions regarding REST
Step 3 - Create java files and update web.xml
...
PingApplication.java
PingResource.java
Code Block |
---|
package restcomponent;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class PingApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(PingResource.class);
return classes;
}
}
|
Code Block |
---|
package restcomponent;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.entity.DelegatorFactory;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.service.GenericDispatcher;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceUtil;
@Path("/ping")
public class PingResource {
@GET
@Produces("text/plain")
@Path("{message}")
public Response sayHello(@PathParam("message") String message) {
GenericDelegator delegator = (GenericDelegator) DelegatorFactory.getDelegator("default");
LocalDispatcher dispatcher = GenericDispatcher.getLocalDispatcher("default",delegator);
Map<String, String> paramMap = UtilMisc.toMap( "message", message );
Map<String, Object> result = FastMap.newInstance();
try {
result = dispatcher.runSync("ping", paramMap);
} catch (GenericServiceException e1) {
Debug.logError(e1, PingResource.class.getName());
return Response.serverError().entity(e1.toString()).build();
}
if (ServiceUtil.isSuccess(result)) {
return Response.ok("RESPONSE: *** " + result.get("message") + " ***").type("text/plain").build();
}
if (ServiceUtil.isError(result) || ServiceUtil.isFailure(result)) {
return Response.serverError().entity(ServiceUtil.getErrorMessage(result)).build();
}
// shouldn't ever get here ... should we?
throw new RuntimeException("Invalid ");
}
}
|
Update restcomponent/webapp/restcomponent/WEB-INF/web.xml:
Code Block |
---|
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Open For Business - RestComponent Component</display-name>
<description>RestComponent Component of the Open For Business Project</description>
<servlet>
<servlet-name>restServlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>restcomponent.PingApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
|
...
Turn on auth="true" in framework/common/servicedef/services_test.xml
Code Block |
---|
<service name="ping" engine="java" export="true" require-new-transaction="true"
location="org.ofbiz.common.CommonServices" invoke="ping" auth="true">
|
Now change PingResource to take http headers with the login.username and login.password and pass the values to the service.
Code Block |
---|
package restcomponent;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.entity.DelegatorFactory;
import org.ofbiz.entity.GenericDelegator;
import org.ofbiz.service.GenericDispatcher;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ServiceUtil;
@Path("/ping")
public class PingResource {
@Context
HttpHeaders headers;
@GET
@Produces("text/plain")
@Path("{message}")
public Response sayHello(@PathParam("message") String message) {
String username = null;
String password = null;
try {
username = headers.getRequestHeader("login.username").get(0);
password = headers.getRequestHeader("login.password").get(0);
} catch (NullPointerException e) {
return Response.serverError().entity("Problem reading http header(s): login.username or login.password").build();
}
if (username == null || password == null) {
return Response.serverError().entity("Problem reading http header(s): login.username or login.password").build();
}
GenericDelegator delegator = (GenericDelegator) DelegatorFactory.getDelegator("default");
LocalDispatcher dispatcher = GenericDispatcher.getLocalDispatcher("default",delegator);
Map<String, String> paramMap = UtilMisc.toMap(
"message", message,
"login.username", username,
"login.password", password
);
Map<String, Object> result = FastMap.newInstance();
try {
result = dispatcher.runSync("ping", paramMap);
} catch (GenericServiceException e1) {
Debug.logError(e1, PingResource.class.getName());
return Response.serverError().entity(e1.toString()).build();
}
if (ServiceUtil.isSuccess(result)) {
return Response.ok("RESPONSE: *** " + result.get("message") + " ***").type("text/plain").build();
}
if (ServiceUtil.isError(result) || ServiceUtil.isFailure(result)) {
return Response.serverError().entity(ServiceUtil.getErrorMessage(result)).build();
}
// shouldn't ever get here ... should we?
throw new RuntimeException("Invalid ");
}
}
|
Now trying accessing with web browser:
Code Block |
---|
Access to the specified resource () has been forbidden.
|
...