Java tutorial
package com.dotcms.rest; import com.dotcms.enterprise.LicenseUtil; import com.dotcms.enterprise.cluster.action.ResetLicenseServerAction; import com.dotcms.enterprise.cluster.action.ServerAction; import com.dotcms.enterprise.cluster.action.model.ServerActionBean; import com.dotcms.repackage.javax.ws.rs.Consumes; import com.dotcms.repackage.javax.ws.rs.DELETE; import com.dotcms.repackage.javax.ws.rs.GET; import com.dotcms.repackage.javax.ws.rs.POST; import com.dotcms.repackage.javax.ws.rs.Path; import com.dotcms.repackage.javax.ws.rs.PathParam; import com.dotcms.repackage.javax.ws.rs.Produces; import com.dotcms.repackage.javax.ws.rs.QueryParam; import com.dotcms.repackage.javax.ws.rs.core.Context; import com.dotcms.repackage.javax.ws.rs.core.MediaType; import com.dotcms.repackage.javax.ws.rs.core.Response; import com.dotcms.repackage.org.apache.commons.httpclient.HttpStatus; import com.dotcms.repackage.org.glassfish.jersey.media.multipart.FormDataContentDisposition; import com.dotcms.repackage.org.glassfish.jersey.media.multipart.FormDataParam; import com.dotcms.repackage.org.json.JSONArray; import com.dotcms.repackage.org.json.JSONObject; import com.dotmarketing.business.APILocator; import com.dotmarketing.business.DotStateException; import com.dotmarketing.business.web.WebAPILocator; import com.dotmarketing.db.HibernateUtil; import com.dotmarketing.exception.DotHibernateException; import com.dotmarketing.util.AdminLogger; import com.dotmarketing.util.Config; import com.dotmarketing.util.Logger; import com.dotmarketing.util.PortletID; import com.dotmarketing.util.UtilMethods; import com.liferay.portal.language.LanguageUtil; import com.liferay.portal.model.User; import java.io.InputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @Path("/license") public class LicenseResource { private final WebResource webResource = new WebResource(); @GET @Path("/all/{params:.*}") @Produces(MediaType.APPLICATION_JSON) public Response getAll(@Context HttpServletRequest request, @PathParam("params") String params) { webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); try { JSONArray array = new JSONArray(); for (Map<String, Object> lic : LicenseUtil.getLicenseRepoList()) { JSONObject obj = new JSONObject(); for (Map.Entry<String, Object> entry : lic.entrySet()) { //Lets exclude some data we don' want/need to expose if (entry.getKey().equals("serverid")) { obj.put(entry.getKey(), entry.getValue() != null ? LicenseUtil.getDisplayServerId((String) lic.get("serverId")) : ""); obj.put("fullserverid", entry.getValue() != null ? entry.getValue() : ""); } else if (entry.getKey().equals("serverId") || entry.getKey().equals("license")) { //Just ignore these fields } else if (entry.getKey().equals("id")) { obj.put(entry.getKey(), entry.getKey() != null ? entry.getValue() : ""); obj.put("idDisplay", entry.getValue() != null ? LicenseUtil.getDisplaySerial((String) entry.getValue()) : ""); } else { obj.put(entry.getKey(), entry.getKey() != null ? entry.getValue() : ""); } } array.put(obj); } return Response.ok(array.toString(), MediaType.APPLICATION_JSON_TYPE).build(); } catch (Exception ex) { Logger.error(this, "can't get all license on repo", ex); return Response.serverError().build(); } } @POST @Path("/upload/{params:.*}") @Consumes(MediaType.MULTIPART_FORM_DATA) public Response putZipFile(@Context HttpServletRequest request, @PathParam("params") String params, @FormDataParam("file") InputStream inputFile, @FormDataParam("file") FormDataContentDisposition inputFileDetail, @FormDataParam("return") String ret) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); try { if (inputFile != null) { LicenseUtil.uploadLicenseRepoFile(inputFile); AdminLogger.log(this.getClass(), "putZipFile", "uploaded zip to license repo", initData.getUser()); return Response.ok().build(); } return Response.status(Response.Status.BAD_REQUEST).entity("where is the zip file?") .type(MediaType.TEXT_PLAIN).build(); } catch (Exception ex) { Logger.error(this, "can't upload license to repo", ex); return Response.serverError().build(); } } @DELETE @Path("/delete/{params:.*}") public Response delete(@Context HttpServletRequest request, @PathParam("params") String params) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); String id = initData.getParamsMap().get("id"); try { if (UtilMethods.isSet(id)) { LicenseUtil.deleteLicense(id); //waiting 10seconds just in case the user is only changing the server license // if not the try to remove it //TODO } else { return Response.status(Response.Status.BAD_REQUEST).entity("no id provided") .type(MediaType.TEXT_PLAIN).build(); } AdminLogger.log(this.getClass(), "delete", "Deleted license from repo with id " + id, initData.getUser()); return Response.ok().build(); } catch (Exception ex) { Logger.error(this, "can't delete license " + id, ex); return Response.serverError().build(); } } @POST @Path("/pick/{params:.*}") public Response pickLicense(@Context HttpServletRequest request, @PathParam("params") String params) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); String serial = initData.getParamsMap().get("serial"); final long currentLevel = LicenseUtil.getLevel(); final String currentSerial = currentLevel > 100 ? LicenseUtil.getSerial() : ""; if (currentLevel < 200 || !currentSerial.equals(serial)) { try { HibernateUtil.startTransaction(); LicenseUtil.pickLicense(serial); LicenseUtil.updateLicenseHeartbeat(); HibernateUtil.commitTransaction(); AdminLogger.log(LicenseResource.class, "pickLicense", "Picked license from repo. Serial: " + serial, initData.getUser()); } catch (Exception ex) { Logger.error(this, "can't pick license " + serial, ex); try { HibernateUtil.rollbackTransaction(); } catch (DotHibernateException e) { Logger.warn(this, "can't rollback", e); } return Response.serverError().build(); } } if (currentLevel == 100 || currentSerial.equals(LicenseUtil.getSerial())) { return Response.notModified().build(); } else { return Response.ok().build(); } } @POST @Path("/free/{params:.*}") public Response freeLicense(@Context HttpServletRequest request, @PathParam("params") String params) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); String localServerId = APILocator.getServerAPI().readServerId(); String remoteServerId = initData.getParamsMap().get("serverid"); String serial = initData.getParamsMap().get("serial"); try { //If we are removing a remote Server we need to create a ServerAction. if (UtilMethods.isSet(remoteServerId) && !remoteServerId.equals("undefined")) { ResetLicenseServerAction resetLicenseServerAction = new ResetLicenseServerAction(); Long timeoutSeconds = new Long(1); ServerActionBean resetLicenseServerActionBean = resetLicenseServerAction .getNewServerAction(localServerId, remoteServerId, timeoutSeconds); resetLicenseServerActionBean = APILocator.getServerActionAPI() .saveServerActionBean(resetLicenseServerActionBean); //Waits for 3 seconds in order all the servers respond. int maxWaitTime = timeoutSeconds.intValue() * 1000 + Config.getIntProperty("CLUSTER_SERVER_THREAD_SLEEP", 2000); int passedWaitTime = 0; //Trying to NOT wait whole 3 secons for returning the info. while (passedWaitTime <= maxWaitTime) { try { Thread.sleep(10); passedWaitTime += 10; resetLicenseServerActionBean = APILocator.getServerActionAPI() .findServerActionBean(resetLicenseServerActionBean.getId()); //No need to wait if we have all Action results. if (resetLicenseServerActionBean != null && resetLicenseServerActionBean.isCompleted()) { passedWaitTime = maxWaitTime + 1; } } catch (InterruptedException ex) { Thread.currentThread().interrupt(); passedWaitTime = maxWaitTime + 1; } } //If we reach the timeout and the server didn't respond. //We assume the server is down and remove the license from the table. if (!resetLicenseServerActionBean.isCompleted()) { resetLicenseServerActionBean.setCompleted(true); resetLicenseServerActionBean.setFailed(true); resetLicenseServerActionBean.setResponse(new com.dotmarketing.util.json.JSONObject() .put(ServerAction.ERROR_STATE, "Server did NOT respond on time")); APILocator.getServerActionAPI().saveServerActionBean(resetLicenseServerActionBean); LicenseUtil.freeLicenseOnRepo(serial, remoteServerId); //If it was completed but we got some error, we need to alert it. } else if (resetLicenseServerActionBean.isCompleted() && resetLicenseServerActionBean.isFailed()) { throw new Exception( resetLicenseServerActionBean.getResponse().getString(ServerAction.ERROR_STATE)); } //If the server we are removing license is local. } else { HibernateUtil.startTransaction(); LicenseUtil.freeLicenseOnRepo(); HibernateUtil.commitTransaction(); } AdminLogger.log(LicenseResource.class, "freeLicense", "License From Repo Freed", initData.getUser()); } catch (Exception exception) { Logger.error(this, "can't free license ", exception); try { if (HibernateUtil.getSession().isOpen()) { HibernateUtil.rollbackTransaction(); } } catch (DotHibernateException dotHibernateException) { Logger.warn(this, "can't rollback", dotHibernateException); } return Response.serverError().build(); } return Response.ok().build(); } @POST @Path("/requestCode/{params:.*}") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response requestLicense(@Context HttpServletRequest request, @PathParam("params") String params) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); Map<String, String> paramsMap = initData.getParamsMap(); //Validate the parameters String licenseType = paramsMap.get("licensetype"); String licenseLevel = paramsMap.get("licenselevel"); StringBuilder responseMessage = new StringBuilder(); if (!UtilMethods.isSet(licenseType)) { return Response.status(HttpStatus.SC_BAD_REQUEST).entity( responseMessage.append("Error: ").append("'licenseType'").append(" is a required param.")) .build(); } if (!UtilMethods.isSet(licenseLevel)) { return Response.status(HttpStatus.SC_BAD_REQUEST).entity( responseMessage.append("Error: ").append("'licenseLevel'").append(" is a required param.")) .build(); } try { HttpSession session = request.getSession(); session.setAttribute("iwantTo", "request_code"); session.setAttribute("license_type", licenseType); session.setAttribute("license_level", licenseLevel); if (!"trial".equals(licenseType) && !"dev".equals(licenseType) && !"prod".equals(licenseType) ) { throw new DotStateException("invalid License Type"); } LicenseUtil.processForm(request); JSONObject jsonResponse = new JSONObject(); if (UtilMethods.isSet(request.getAttribute("requestCode"))) { jsonResponse.put("success", true); jsonResponse.put("requestCode", request.getAttribute("requestCode")); } else { jsonResponse.put("success", false); } return Response.ok(jsonResponse.toString(), MediaType.APPLICATION_JSON_TYPE).build(); } catch (Exception ex) { Logger.error(this, "can't request license ", ex); return Response.serverError().build(); } } @POST @Path("/applyLicense") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response applyLicense(@Context HttpServletRequest request, @PathParam("params") String params, @QueryParam("licenseText") String licenseText) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); //Validate the parameters StringBuilder responseMessage = new StringBuilder(); if (!UtilMethods.isSet(licenseText)) { return Response.status(HttpStatus.SC_BAD_REQUEST).entity( responseMessage.append("Error: ").append("'licenseText'").append(" is a required param.")) .build(); } try { HttpSession session = request.getSession(); session.setAttribute("applyForm", Boolean.TRUE); session.setAttribute("iwantTo", "paste_license"); session.setAttribute("paste_license", "paste_license"); session.setAttribute("license_text", licenseText); String error = LicenseUtil.processForm(request); User u = WebAPILocator.getUserWebAPI().getLoggedInUser(request); if (error != null) { return Response .ok(LanguageUtil.get(u, "license-bad-id-explanation"), MediaType.APPLICATION_JSON_TYPE) .build(); } return Response.ok(error, MediaType.APPLICATION_JSON_TYPE).build(); } catch (Exception ex) { Logger.error(this, "can't request license ", ex); return Response.serverError().build(); } } @POST @Path("/resetLicense/{params:.*}") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response resetLicense(@Context HttpServletRequest request, @PathParam("params") String params) { InitDataObject initData = webResource.init(params, true, request, true, PortletID.CONFIGURATION.toString()); try { freeLicense(request, params); HttpSession session = request.getSession(); session.setAttribute("applyForm", Boolean.TRUE); session.setAttribute("iwantTo", "paste_license"); session.setAttribute("paste_license", "paste_license"); session.setAttribute("license_text", "blah"); String error = LicenseUtil.processForm(request); return Response.ok("", MediaType.APPLICATION_JSON_TYPE).build(); } catch (Exception ex) { Logger.error(this, "can't request license ", ex); return Response.serverError().build(); } } }