com.pawelniewiadomski.devs.jira.servlet.LicenseServlet.java Source code

Java tutorial

Introduction

Here is the source code for com.pawelniewiadomski.devs.jira.servlet.LicenseServlet.java

Source

package com.pawelniewiadomski.devs.jira.servlet;

import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Nonnull;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.atlassian.sal.api.ApplicationProperties;
import com.atlassian.sal.api.auth.LoginUriProvider;
import com.atlassian.sal.api.message.I18nResolver;
import com.atlassian.sal.api.user.UserManager;
import com.atlassian.templaterenderer.TemplateRenderer;
import com.atlassian.upm.api.license.entity.PluginLicense;
import com.atlassian.upm.api.util.Option;
import com.atlassian.upm.license.storage.lib.AtlassianMarketplaceUriFactory;
import com.atlassian.upm.license.storage.lib.PluginLicenseStoragePluginUnresolvedException;
import com.atlassian.upm.license.storage.lib.ThirdPartyPluginLicenseStorageManager;

import org.apache.commons.lang.StringUtils;

/**
 * A license administration servlet that uses {@link ThirdPartyPluginLicenseStorageManager} to:
 *  - get the current plugin license,
 *  - update the plugin license,
 *  - remove the plugin license,
 *  - buy, try, upgrade, and renew your license directly from My Atlassian,
 *  - check for a licensing-aware UPM,
 *  - and properly handle if a licensing-aware UPM is detected.
 *
 * This servlet can be reached at http://localhost:2990/jira/plugins/servlet/com.pawelniewiadomski.devs.jira.jira-bulk-create-plugin/license
 */
public class LicenseServlet extends HttpServlet {
    private static final String TEMPLATE = "com/pawelniewiadomski/devs/jira/views/license-admin.vm";

    private final ThirdPartyPluginLicenseStorageManager licenseManager;
    private final AtlassianMarketplaceUriFactory uriFactory;
    private final ApplicationProperties applicationProperties;
    private final TemplateRenderer renderer;
    private final LoginUriProvider loginUriProvider;
    private final UserManager userManager;
    private final I18nResolver i18nResolver;

    public LicenseServlet(ThirdPartyPluginLicenseStorageManager licenseManager,
            AtlassianMarketplaceUriFactory uriFactory, ApplicationProperties applicationProperties,
            TemplateRenderer renderer, LoginUriProvider loginUriProvider, UserManager userManager,
            I18nResolver i18nResolver) {
        this.licenseManager = licenseManager;
        this.uriFactory = uriFactory;
        this.applicationProperties = applicationProperties;
        this.renderer = renderer;
        this.loginUriProvider = loginUriProvider;
        this.userManager = userManager;
        this.i18nResolver = i18nResolver;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (!hasAdminPermission()) {
            redirectToLogin(req, resp);
            return;
        }

        final Map<String, Object> context = initVelocityContext(resp);
        addEligibleMarketplaceButtons(context);
        renderer.render(TEMPLATE, context, resp.getWriter());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if (!hasAdminPermission()) {
            redirectToLogin(req, resp);
            return;
        }

        final Map<String, Object> context = initVelocityContext(resp);

        if (!context.containsKey("errorMessage")) {
            try {
                if (!licenseManager.isUpmLicensingAware()) {
                    String license = req.getParameter("license");
                    Option<PluginLicense> validatedLicense = licenseManager.validateLicense(license);

                    //we have an empty/null license parameter - let's remove the stored license.
                    if (StringUtils.isEmpty(license)) {
                        licenseManager.removeRawLicense();
                        context.put("successMessage",
                                i18nResolver.getText("plugin.license.storage.admin.license.remove"));
                        context.put("license", licenseManager.getLicense());
                    }
                    //we have a non-empty license parameter - let's update the license if it is valid.
                    else if (validatedLicense.isDefined()) {
                        licenseManager.setRawLicense(license);
                        if (validatedLicense.get().getError().isDefined()) {
                            context.put("warningMessage",
                                    i18nResolver.getText("plugin.license.storage.admin.license.update.invalid"));
                        } else {
                            context.put("successMessage",
                                    i18nResolver.getText("plugin.license.storage.admin.license.update"));
                        }
                        context.put("license", licenseManager.getLicense());
                    }
                    //we have an invalid license - do nothing.
                    else {
                        context.put("errorMessage",
                                i18nResolver.getText("plugin.license.storage.admin.license.invalid"));
                    }
                }
            } catch (PluginLicenseStoragePluginUnresolvedException e) {
                context.put("errorMessage",
                        i18nResolver.getText("plugin.license.storage.admin.plugin.unavailable"));
                context.put("storagePluginIsAvailable", false);
            }
        }

        addEligibleMarketplaceButtons(context); //must be invoked *after* the license update has occurred.
        renderer.render(TEMPLATE, context, resp.getWriter());
    }

    @Nonnull
    public static URI getServletLocation(@Nonnull String baseUrl) {
        return URI.create(
                baseUrl + "/plugins/servlet/com.pawelniewiadomski.devs.jira.jira-bulk-create-plugin/license");
    }

    private Map<String, Object> initVelocityContext(HttpServletResponse resp) {
        resp.setContentType("text/html;charset=utf-8");
        URI servletUri = getServletLocation(applicationProperties.getBaseUrl());

        final Map<String, Object> context = new HashMap<String, Object>();

        resp.setContentType("text/html;charset=utf-8");
        context.put("servletUri", servletUri);
        context.put("storagePluginIsAvailable", true);

        try {
            context.put("license", licenseManager.getLicense());
            context.put("upmLicensingAware", licenseManager.isUpmLicensingAware());
            context.put("pluginKey", licenseManager.getPluginKey());
            if (licenseManager.isUpmLicensingAware()) {
                context.put("warningMessage",
                        i18nResolver.getText("plugin.license.storage.admin.upm.licensing.aware",
                                licenseManager.getPluginManagementUri()));
            }
        } catch (PluginLicenseStoragePluginUnresolvedException e) {
            context.put("errorMessage", i18nResolver.getText("plugin.license.storage.admin.plugin.unavailable"));
            context.put("storagePluginIsAvailable", false);
        }

        return context;
    }

    private void addEligibleMarketplaceButtons(Map<String, Object> context) {
        URI servletUri = getServletLocation(applicationProperties.getBaseUrl());

        try {
            boolean eligibleButtons = false;

            if (uriFactory.isPluginBuyable()) {
                context.put("buyPluginUri", uriFactory.getBuyPluginUri(servletUri));
                eligibleButtons = true;
            }
            if (uriFactory.isPluginTryable()) {
                context.put("tryPluginUri", uriFactory.getTryPluginUri(servletUri));
                eligibleButtons = true;
            }
            if (uriFactory.isPluginRenewable()) {
                context.put("renewPluginUri", uriFactory.getRenewPluginUri(servletUri));
                eligibleButtons = true;
            }
            if (uriFactory.isPluginUpgradable()) {
                context.put("upgradePluginUri", uriFactory.getUpgradePluginUri(servletUri));
                eligibleButtons = true;
            }

            context.put("eligibleButtons", eligibleButtons);
        } catch (PluginLicenseStoragePluginUnresolvedException e) {
            context.put("errorMessage", i18nResolver.getText("plugin.license.storage.admin.plugin.unavailable"));
            context.put("storagePluginIsAvailable", false);
        }
    }

    private boolean hasAdminPermission() {
        String user = userManager.getRemoteUsername();
        try {
            return user != null && (userManager.isAdmin(user) || userManager.isSystemAdmin(user));
        } catch (NoSuchMethodError e) {
            // userManager.isAdmin(String) was not added until SAL 2.1.
            // We need this check to ensure backwards compatibility with older product versions.
            return user != null && userManager.isSystemAdmin(user);
        }
    }

    private void redirectToLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.sendRedirect(
                loginUriProvider.getLoginUri(URI.create(request.getRequestURL().toString())).toASCIIString());
    }
}