com.liferay.frontend.theme.contributor.extender.internal.ThemeContributorExtender.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.frontend.theme.contributor.extender.internal.ThemeContributorExtender.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.frontend.theme.contributor.extender.internal;

import com.liferay.osgi.felix.util.AbstractExtender;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringPool;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import java.net.URL;

import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.List;

import org.apache.felix.utils.extender.Extension;
import org.apache.felix.utils.log.Logger;

import org.json.JSONObject;
import org.json.JSONTokener;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;

/**
 * @author Michael Bradford
 */
@Component(immediate = true)
public class ThemeContributorExtender extends AbstractExtender {

    @Activate
    protected void activate(BundleContext bundleContext) throws Exception {
        _logger = new Logger(bundleContext);

        start(bundleContext);
    }

    @Deactivate
    protected void deactivate(BundleContext bundleContext) throws Exception {
        stop(bundleContext);
    }

    @Override
    protected void debug(Bundle bundle, String s) {
        _logger.log(Logger.LOG_DEBUG, "[" + bundle + "] " + s);
    }

    @Override
    protected Extension doCreateExtension(Bundle bundle) throws Exception {
        String type = _getProperty(bundle, "Liferay-Theme-Contributor-Type", "themeContributorType");

        if (type == null) {
            return null;
        }

        BundleWebResourcesImpl bundleWebResources = _scanForResources(bundle);

        if (bundleWebResources == null) {
            return null;
        }

        int themeContributorWeight = GetterUtil
                .getInteger(_getProperty(bundle, "Liferay-Theme-Contributor-Weight", "themeContributorWeight"));

        return new ThemeContributorExtension(bundle, bundleWebResources, themeContributorWeight);
    }

    @Override
    protected void error(String s, Throwable t) {
        _logger.log(Logger.LOG_ERROR, s, t);
    }

    @Override
    protected void warn(Bundle bundle, String s, Throwable t) {
        _logger.log(Logger.LOG_WARNING, "[" + bundle + "] " + s, t);
    }

    private String _getProperty(Bundle bundle, String headerName, String jsonName) {

        Dictionary<String, String> headers = bundle.getHeaders();

        String type = headers.get(headerName);

        if (type == null) {
            URL entryURL = bundle.getEntry("/package.json");

            if (entryURL != null) {
                try (Reader reader = new InputStreamReader(entryURL.openStream())) {

                    JSONTokener jsonTokener = new JSONTokener(reader);

                    JSONObject packageJsonObject = new JSONObject(jsonTokener);

                    JSONObject liferayThemeJSONObject = packageJsonObject.optJSONObject("liferayTheme");

                    if (liferayThemeJSONObject != null) {
                        type = liferayThemeJSONObject.getString(jsonName);
                    }
                } catch (IOException ioe) {
                    throw new RuntimeException(ioe);
                }
            }
        }

        return type;
    }

    private BundleWebResourcesImpl _scanForResources(Bundle bundle) {
        final List<String> cssResourcePaths = new ArrayList<>();
        final List<String> jsResourcePaths = new ArrayList<>();

        Enumeration<URL> cssEntries = bundle.findEntries("/META-INF/resources", "*.css", true);
        Enumeration<URL> jsEntries = bundle.findEntries("/META-INF/resources", "*.js", true);

        if (cssEntries != null) {
            while (cssEntries.hasMoreElements()) {
                URL url = cssEntries.nextElement();

                String path = url.getFile();

                path = path.replace("/META-INF/resources", "");

                int index = path.lastIndexOf('/');

                if (!StringPool.UNDERLINE.equals(path.charAt(index + 1)) && !path.endsWith("_rtl.css")) {

                    cssResourcePaths.add(path);
                }
            }
        }

        if (jsEntries != null) {
            while (jsEntries.hasMoreElements()) {
                URL url = jsEntries.nextElement();

                String path = url.getFile();

                jsResourcePaths.add(path.replace("/META-INF/resources", ""));
            }
        }

        if (cssResourcePaths.isEmpty() && jsResourcePaths.isEmpty()) {
            return null;
        } else {
            return new BundleWebResourcesImpl(cssResourcePaths, jsResourcePaths);
        }
    }

    private Logger _logger;

}