This is an automated email from the ASF dual-hosted git repository.
grv pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-plugins.git The following commit(s) were added to refs/heads/trunk by this push: new e31fd64 Improved: Added support for publishing/unpublishing a resource and conditional auth support 2.Implemented: Added schema file for REST XML DSL e31fd64 is described below commit e31fd640fd1a341caa843dcb2b85cc5c0c2760a5 Author: Girish Vasmatkar <[hidden email]> AuthorDate: Thu Sep 17 17:39:07 2020 +0530 Improved: Added support for publishing/unpublishing a resource and conditional auth support 2.Implemented: Added schema file for REST XML DSL --- ofbiz-rest-impl/dtd/rest-api.xsd | 87 ++++++++++++++++++++++ .../apache/ofbiz/ws/rs/core/OFBizApiConfig.java | 41 ++++++---- .../apache/ofbiz/ws/rs/model/ModelApiReader.java | 6 +- .../apache/ofbiz/ws/rs/model/ModelOperation.java | 24 ++++++ .../apache/ofbiz/ws/rs/model/ModelResource.java | 54 ++++++++++---- .../ws/rs/resources/OFBizServiceResource.java | 40 +++++----- 6 files changed, 199 insertions(+), 53 deletions(-) diff --git a/ofbiz-rest-impl/dtd/rest-api.xsd b/ofbiz-rest-impl/dtd/rest-api.xsd new file mode 100644 index 0000000..972dfcf --- /dev/null +++ b/ofbiz-rest-impl/dtd/rest-api.xsd @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<!-- NOTE: files using this schema are found in the service directory in a component when named *.rest.xml --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> + <xs:element name="api"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="resource"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="displayName" type="xs:string"/> + <xs:attribute name="description" type="xs:string"/> + </xs:complexType> + </xs:element> + <xs:element name="resource"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="operation"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="path" type="xs:string" use="required"/> + <xs:attribute name="displayName" type="xs:string"/> + <xs:attribute name="description" type="xs:string"/> + <xs:attribute name="publish" type="xs:boolean" default="true"/> + <xs:attribute name="auth" type="xs:boolean" default="true"/> + </xs:complexType> + </xs:element> + <xs:element name="operation"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="1" ref="service"/> + </xs:sequence> + <xs:attribute name="verb" use="required"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="get"/> + <xs:enumeration value="patch"/> + <xs:enumeration value="put"/> + <xs:enumeration value="post"/> + <xs:enumeration value="delete"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="produces" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="application/xml"/> + <xs:enumeration value="application/json"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="consumes" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="application/xml"/> + <xs:enumeration value="application/json"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="path" type="xs:string" use="optional"/> + <xs:attribute name="description" type="xs:string"/> + <xs:attribute name="auth" type="xs:boolean" default="true"/> + </xs:complexType> + </xs:element> + <xs:element name="service"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> +</xs:schema> diff --git a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/core/OFBizApiConfig.java b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/core/OFBizApiConfig.java index 5a168fe..b9d02cb 100644 --- a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/core/OFBizApiConfig.java +++ b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/core/OFBizApiConfig.java @@ -48,11 +48,13 @@ import org.glassfish.jersey.server.model.ResourceMethod; public class OFBizApiConfig extends ResourceConfig { private static final String MODULE = OFBizApiConfig.class.getName(); private static final Map<String, ModelApi> MICRO_APIS = new HashMap<>(); + public OFBizApiConfig() { packages("org.apache.ofbiz.ws.rs.resources"); packages("org.apache.ofbiz.ws.rs.security.auth"); packages("org.apache.ofbiz.ws.rs.spi.impl"); - //packages("io.swagger.v3.jaxrs2.integration.resources"); //commenting it out to generate customized OpenApi Spec + // packages("io.swagger.v3.jaxrs2.integration.resources"); //commenting it out + // to generate customized OpenApi Spec register(JacksonFeature.class); register(MultiPartFeature.class); if (Debug.verboseOn()) { @@ -99,22 +101,31 @@ public class OFBizApiConfig extends ResourceConfig { Debug.logInfo("Registring Resource Definitions from API - " + k, MODULE); List<ModelResource> resources = v.getResources(); resources.forEach(modelResource -> { - Resource.Builder resourceBuilder = Resource.builder(modelResource.getPath()).name(modelResource.getName()); - for (ModelOperation op : modelResource.getOperations()) { - if (UtilValidate.isEmpty(op.getPath())) { // Add the method to the parent resource - ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod(op.getVerb().toUpperCase()); - methodBuilder.produces(MediaType.APPLICATION_JSON).nameBindings(Secured.class); - String serviceName = op.getService(); - methodBuilder.handledBy(new ServiceRequestHandler(serviceName)); - } else { - Resource.Builder childResourceBuilder = resourceBuilder.addChildResource(op.getPath()); - ResourceMethod.Builder childResourceMethodBuilder = childResourceBuilder.addMethod(op.getVerb().toUpperCase()); - childResourceMethodBuilder.produces(MediaType.APPLICATION_JSON).nameBindings(Secured.class); - String serviceName = op.getService(); - childResourceMethodBuilder.handledBy(new ServiceRequestHandler(serviceName)); + if (modelResource.isPublish()) { + Resource.Builder resourceBuilder = Resource.builder(modelResource.getPath()) + .name(modelResource.getName()); + for (ModelOperation op : modelResource.getOperations()) { + if (UtilValidate.isEmpty(op.getPath())) { // Add the method to the parent resource + ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod(op.getVerb().toUpperCase()); + methodBuilder.produces(MediaType.APPLICATION_JSON); + if (op.isAuth()) { + methodBuilder.nameBindings(Secured.class); + } + String serviceName = op.getService(); + methodBuilder.handledBy(new ServiceRequestHandler(serviceName)); + } else { + Resource.Builder childResourceBuilder = resourceBuilder.addChildResource(op.getPath()); + ResourceMethod.Builder childResourceMethodBuilder = childResourceBuilder.addMethod(op.getVerb().toUpperCase()); + childResourceMethodBuilder.produces(MediaType.APPLICATION_JSON); + if (op.isAuth()) { + childResourceMethodBuilder.nameBindings(Secured.class); + } + String serviceName = op.getService(); + childResourceMethodBuilder.handledBy(new ServiceRequestHandler(serviceName)); + } } + registerResources(resourceBuilder.build()); } - registerResources(resourceBuilder.build()); }); }); } diff --git a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelApiReader.java b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelApiReader.java index 208e3af..0bfe9da 100644 --- a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelApiReader.java +++ b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelApiReader.java @@ -52,7 +52,8 @@ public final class ModelApiReader { .description(UtilXml.checkEmpty(resourceEle.getAttribute("description")).intern()) .displayName(UtilXml.checkEmpty(resourceEle.getAttribute("displayName")).intern()) .path(UtilXml.checkEmpty(resourceEle.getAttribute("path")).intern()) - .enabled(Boolean.parseBoolean(UtilXml.checkEmpty(resourceEle.getAttribute("name")).intern())); + .publish(Boolean.parseBoolean(UtilXml.checkEmpty(resourceEle.getAttribute("publish")).intern())) + .auth(Boolean.parseBoolean(UtilXml.checkEmpty(resourceEle.getAttribute("auth")).intern())); createOperations(resourceEle, resource); Debug.logInfo(resource.toString(), MODULE); api.addResource(resource); @@ -69,7 +70,8 @@ public final class ModelApiReader { .verb(UtilXml.checkEmpty(operationEle.getAttribute("verb")).intern()).service(serviceName) .produces(UtilXml.checkEmpty(operationEle.getAttribute("produces")).intern()) .consumes(UtilXml.checkEmpty(operationEle.getAttribute("consumes")).intern()) - .description(UtilXml.checkEmpty(operationEle.getAttribute("description")).intern()); + .description(UtilXml.checkEmpty(operationEle.getAttribute("description")).intern()) + .auth(Boolean.parseBoolean(UtilXml.checkEmpty(operationEle.getAttribute("auth")).intern())); resource.addOperation(op); } } diff --git a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelOperation.java b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelOperation.java index 65ea5ca..b8a32a0 100644 --- a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelOperation.java +++ b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelOperation.java @@ -26,6 +26,30 @@ public class ModelOperation { private String consumes; private String path; private String description; + private boolean auth; + + /** + * @return the auth + */ + public boolean isAuth() { + return auth; + } + + /** + * @param auth the auth to set + */ + public void setAuth(boolean auth) { + this.auth = auth; + } + + /** + * @param value + * @return + */ + public ModelOperation auth(boolean auth) { + this.auth = auth; + return this; + } /** * Gets the value of the service property. diff --git a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelResource.java b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelResource.java index 0103f6f..a27a0e3 100644 --- a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelResource.java +++ b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/model/ModelResource.java @@ -28,7 +28,38 @@ public class ModelResource { private String path; private String displayName; private String description; - private boolean enabled; + private boolean publish; + private boolean auth; + + /** + * @return the auth + */ + public boolean isAuth() { + return auth; + } + + /** + * @param auth the auth to set + */ + public void setAuth(boolean auth) { + this.auth = auth; + } + + /** + * @param auth + * @return + */ + public ModelResource auth(boolean auth) { + this.auth = auth; + return this; + } + + /** + * @param publish the publish to set + */ + protected void setPublish(boolean publish) { + this.publish = publish; + } /** * @return the operation @@ -142,25 +173,18 @@ public class ModelResource { } /** - * @return the enabled - */ - public Boolean getEnabled() { - return enabled; - } - - /** - * @param enabled the enabled to set + * @return the publish */ - public void setEnabled(Boolean enabled) { - this.enabled = enabled; + public boolean isPublish() { + return publish; } /** - * @param enabled + * @param publish * @return */ - public ModelResource enabled(boolean enabled) { - this.enabled = enabled; + public ModelResource publish(boolean publish) { + this.publish = publish; return this; } @@ -171,7 +195,7 @@ public class ModelResource { public String toString() { // TODO Auto-generated method stub return "name: " + name + ", path: " + path + ", displayName: " + displayName + ", description: " + description - + ", enabled: " + enabled; + + ", publish: " + publish; } } diff --git a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/resources/OFBizServiceResource.java b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/resources/OFBizServiceResource.java index 9eb0a3b..6b335b6 100644 --- a/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/resources/OFBizServiceResource.java +++ b/ofbiz-rest-impl/src/main/java/org/apache/ofbiz/ws/rs/resources/OFBizServiceResource.java @@ -91,8 +91,8 @@ public class OFBizServiceResource extends OFBizResource { serviceList.add(serviceMap); } } - Success success = new Success(Response.Status.OK.getStatusCode(), Response.Status.OK.getReasonPhrase(), Response.Status.OK.getReasonPhrase(), - serviceList); + Success success = new Success(Response.Status.OK.getStatusCode(), Response.Status.OK.getReasonPhrase(), + Response.Status.OK.getReasonPhrase(), serviceList); return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(success).build(); } @@ -108,14 +108,13 @@ public class OFBizServiceResource extends OFBizResource { @Produces(MediaType.APPLICATION_JSON) @Secured public Response doGet(@QueryParam(value = "inParams") ApiServiceRequest serviceRequest, - @PathParam(value = "serviceName") String serviceName) throws IOException, GenericServiceException { + @PathParam(value = "serviceName") String serviceName) throws IOException, GenericServiceException { if (UtilValidate.isEmpty(serviceRequest) || UtilValidate.isEmpty(serviceRequest.getInParams())) { throw new BadRequestException("Missing Parameter: 'inParams'"); } ServiceRequestProcessor processor = new ServiceRequestProcessor(); - return processor.process( - UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.GET, "requestMap", serviceRequest.getInParams(), "dispatcher", - getDispatcher(), "request", httpRequest)); + return processor.process(UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.GET, "requestMap", + serviceRequest.getInParams(), "dispatcher", getDispatcher(), "request", httpRequest)); } /** @@ -129,15 +128,15 @@ public class OFBizServiceResource extends OFBizResource { @POST @Path("/{serviceName}") @Produces(MediaType.APPLICATION_JSON) - public Response doPost(HashMap<String, Object> serviceInParams, @PathParam(value = "serviceName") String serviceName) + public Response doPost(HashMap<String, Object> serviceInParams, + @PathParam(value = "serviceName") String serviceName) throws IOException, GenericEntityException, GenericServiceException { if (UtilValidate.isEmpty(serviceInParams)) { throw new BadRequestException("The request body is missing."); } ServiceRequestProcessor processor = new ServiceRequestProcessor(); - return processor.process( - UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.POST, "requestMap", serviceInParams, "dispatcher", getDispatcher(), - "request", httpRequest)); + return processor.process(UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.POST, "requestMap", + serviceInParams, "dispatcher", getDispatcher(), "request", httpRequest)); } /** @@ -157,9 +156,8 @@ public class OFBizServiceResource extends OFBizResource { throw new BadRequestException("The request body is missing."); } ServiceRequestProcessor processor = new ServiceRequestProcessor(); - return processor.process( - UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.PUT, "requestMap", serviceInParams, "dispatcher", getDispatcher(), - "request", httpRequest)); + return processor.process(UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.PUT, "requestMap", + serviceInParams, "dispatcher", getDispatcher(), "request", httpRequest)); } /** @@ -173,15 +171,15 @@ public class OFBizServiceResource extends OFBizResource { @PATCH @Path("/{serviceName}") @Produces(MediaType.APPLICATION_JSON) - public Response doPatch(HashMap<String, Object> serviceInParams, @PathParam(value = "serviceName") String serviceName) + public Response doPatch(HashMap<String, Object> serviceInParams, + @PathParam(value = "serviceName") String serviceName) throws IOException, GenericEntityException, GenericServiceException { if (UtilValidate.isEmpty(serviceInParams)) { throw new BadRequestException("The request body is missing."); } ServiceRequestProcessor processor = new ServiceRequestProcessor(); - return processor.process( - UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.PATCH, "requestMap", serviceInParams, "dispatcher", getDispatcher(), - "request", httpRequest)); + return processor.process(UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.PATCH, "requestMap", + serviceInParams, "dispatcher", getDispatcher(), "request", httpRequest)); } /** @@ -195,14 +193,14 @@ public class OFBizServiceResource extends OFBizResource { @DELETE @Path("/{serviceName}") @Produces(MediaType.APPLICATION_JSON) - public Response doDelete(HashMap<String, Object> serviceInParams, @PathParam(value = "serviceName") String serviceName) + public Response doDelete(HashMap<String, Object> serviceInParams, + @PathParam(value = "serviceName") String serviceName) throws IOException, GenericEntityException, GenericServiceException { if (UtilValidate.isEmpty(serviceInParams)) { throw new BadRequestException("The request body is missing."); } ServiceRequestProcessor processor = new ServiceRequestProcessor(); - return processor.process( - UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.DELETE, "requestMap", serviceInParams, "dispatcher", getDispatcher(), - "request", httpRequest)); + return processor.process(UtilMisc.toMap("serviceName", serviceName, "httpVerb", HttpMethod.DELETE, "requestMap", + serviceInParams, "dispatcher", getDispatcher(), "request", httpRequest)); } } |
Free forum by Nabble | Edit this page |