com.labs64.netlicensing.service.NetLicensingService Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of netlicensing-client Show documentation
Show all versions of netlicensing-client Show documentation
Java wrapper for Labs64 NetLicensing RESTful API
The newest version!
/* Licensed 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
*
* https://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.
*/
package com.labs64.netlicensing.service;
import java.util.HashMap;
import java.util.Map;
import com.labs64.netlicensing.provider.HttpMethod;
import com.labs64.netlicensing.provider.Form;
import org.apache.commons.lang3.StringUtils;
import com.labs64.netlicensing.domain.Constants;
import com.labs64.netlicensing.domain.EntityFactory;
import com.labs64.netlicensing.domain.vo.Context;
import com.labs64.netlicensing.domain.vo.MetaInfo;
import com.labs64.netlicensing.domain.vo.Page;
import com.labs64.netlicensing.exception.NetLicensingException;
import com.labs64.netlicensing.exception.RestException;
import com.labs64.netlicensing.exception.ServiceException;
import com.labs64.netlicensing.provider.RestProvider;
import com.labs64.netlicensing.provider.RestProviderImpl;
import com.labs64.netlicensing.provider.RestResponse;
import com.labs64.netlicensing.schema.SchemaFunction;
import com.labs64.netlicensing.schema.context.Netlicensing;
import com.labs64.netlicensing.util.CheckUtils;
import com.labs64.netlicensing.util.SignatureUtils;
/**
* Provides generic requests to NetLicensing services. This class is supposed to be used by other **Service classes.
*/
public class NetLicensingService {
private static NetLicensingService instance;
private final EntityFactory entityFactory = new EntityFactory();
/**
* Private constructor
*/
private NetLicensingService() {
}
/**
* @return instance of NetLicensingService class
*/
static NetLicensingService getInstance() {
if (instance == null) {
synchronized (NetLicensingService.class) {
if (instance == null) {
instance = new NetLicensingService();
}
}
}
return instance;
}
/**
* Helper method for performing GET request to NetLicensing API services. Finds and returns first suitable item with
* type resultType from the response.
*
* @param context
* context for the NetLicensing API call
* @param urlTemplate
* the REST URL template
* @param queryParams
* The REST query parameters values. May be null if there are no parameters.
* @param resultType
* the type of the result
* @return first suitable item with type resultType from the response
* @throws com.labs64.netlicensing.exception.NetLicensingException
*/
RES get(final Context context, final String urlTemplate, final Map queryParams,
final Class resultType, final MetaInfo... meta) throws NetLicensingException {
final Netlicensing netlicensing = request(context, HttpMethod.GET, urlTemplate, null, queryParams);
return processResponse(meta, netlicensing, resultType);
}
/**
* Helper method for performing GET request to NetLicensing API service that returns page of items with type
* resultType.
*
* @param context
* context for the NetLicensing API call
* @param urlTemplate
* the REST URL template
* @param queryParams
* The REST query parameters values. May be null if there are no parameters.
* @param resultType
* the type of the item of the result page
* @return page of items with type resultType from the response
* @throws com.labs64.netlicensing.exception.NetLicensingException
*/
Page list(final Context context, final String urlTemplate, final Map queryParams,
final Class resultType) throws NetLicensingException {
final Netlicensing netlicensing = request(context, HttpMethod.GET, urlTemplate, null, queryParams);
return entityFactory.createPage(netlicensing, resultType);
}
/**
* Helper method for performing POST request to NetLicensing API services. Finds and returns first suitable item
* with type resultType from the response.
*
* @param context
* context for the NetLicensing API call
* @param urlTemplate
* the REST URL template
* @param request
* The request body to be sent to the server. May be null.
* @param resultType
* the type of the result
* @return first suitable item with type resultType from the response or null if response has no content
* @throws com.labs64.netlicensing.exception.NetLicensingException
*/
RES post(final Context context, final String urlTemplate, final Form request, final Class resultType,
final MetaInfo... meta)
throws NetLicensingException {
final Netlicensing netlicensing = request(context, HttpMethod.POST, urlTemplate, request, null);
// if response has no content
if (netlicensing == null) {
return null;
} else {
return processResponse(meta, netlicensing, resultType);
}
}
/**
* Helper method for performing DELETE request to NetLicensing API services.
*
* @param context
* context for the NetLicensing API call
* @param urlTemplate
* the REST URL template
* @param queryParams
* The REST query parameters values. May be null if there are no parameters.
* @throws NetLicensingException
*/
void delete(final Context context, final String urlTemplate, final Map queryParams)
throws NetLicensingException {
request(context, HttpMethod.DELETE, urlTemplate, null, queryParams);
}
/**
* Helper method for performing request to NetLicensing API services. Knows about context for the NetLicensing API
* calls, does authentication, provides error handling based on status of the response.
*
* @param context
* context for the NetLicensing API call
* @param method
* the HTTP method to be used, i.e. GET, POST, DELETE
* @param urlTemplate
* the REST URL template
* @param request
* The request body to be sent to the server. May be null.
* @param queryParams
* The REST query parameters values. May be null if there are no parameters.
* @return {@link Netlicensing} response object
* @throws NetLicensingException
*/
public Netlicensing request(final Context context, final HttpMethod method, final String urlTemplate,
final Form request,
final Map queryParams) throws NetLicensingException {
CheckUtils.paramNotNull(context, "context");
Form combinedRequest = request;
Map combinedQueryParams = queryParams;
if (StringUtils.isNotBlank(context.getVendorNumber())) {
if (HttpMethod.POST.equals(method)) {
if (combinedRequest == null) {
combinedRequest = new Form();
}
combinedRequest.param(Constants.Vendor.VENDOR_NUMBER, context.getVendorNumber());
} else {
if (combinedQueryParams == null) {
combinedQueryParams = new HashMap<>();
}
combinedQueryParams.put(Constants.Vendor.VENDOR_NUMBER, context.getVendorNumber());
}
}
final RestProviderImpl restProvider = new RestProviderImpl(context.getBaseUrl());
configure(restProvider, context);
final RestResponse response = restProvider.call(method.name(), urlTemplate, combinedRequest, Netlicensing.class,
combinedQueryParams);
if (!isErrorStatus(response.getStatusCode())) {
switch (response.getStatusCode()) {
case 200:
final Netlicensing netlicensing = response.getEntity();
SignatureUtils.check(context, netlicensing);
return netlicensing;
case 204:
return null;
default:
throw new RestException(String.format("Unsupported response status code %s.",
response.getStatusCode()));
}
} else {
if (SchemaFunction.hasErrorInfos(response.getEntity())) {
throw new ServiceException(response.getStatusCode(), response.getHeaders(), response.getEntity());
} else {
throw new RestException(String.format("Unknown service error %s.", response.getStatusCode()));
}
}
}
/**
* Passes the authentication data specified in the context of the call to the RESTful provider.
*
* @param restProvider
* RESTful provider to be authenticated
* @param context
* additional context
* @throws RestException
*/
private void configure(final RestProvider restProvider, final Context context) throws RestException {
if (context.getSecurityMode() == null) {
throw new RestException("Security mode must be specified.");
}
switch (context.getSecurityMode()) {
case BASIC_AUTHENTICATION:
restProvider.authenticate(context.getUsername(), context.getPassword());
break;
case APIKEY_IDENTIFICATION:
restProvider.authenticate(context.getApiKey());
break;
case ANONYMOUS_IDENTIFICATION:
break;
default:
throw new RestException("Unknown security mode.");
}
if (context.containsKey(RestProvider.Configuration.class)) {
final Object config = context.getObject(RestProvider.Configuration.class);
if (config instanceof RestProvider.Configuration) {
restProvider.configure((RestProvider.Configuration) config);
}
}
}
/**
* @param status
* info about status
* @return true if HTTP status represents client error or server error, false otherwise
*/
private boolean isErrorStatus(final int statusCode) {
int family = statusCode / 100;
return (family == 4) // client error 4xx
|| (family == 5); // server error 5xx
}
protected RES processResponse(final MetaInfo[] meta, final Netlicensing netlicensing, final Class resultType)
throws NetLicensingException {
if ((meta != null) && (meta.length > 0) && (meta[0] != null)) {
if (netlicensing.getId() != null) {
meta[0].setValue(Constants.PROP_ID, netlicensing.getId());
}
}
return entityFactory.create(netlicensing, resultType);
}
}