org.apache.marmotta.platform.core.services.modules.ModuleServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.marmotta.platform.core.services.modules.ModuleServiceImpl.java

Source

/**
 * 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.
 */
package org.apache.marmotta.platform.core.services.modules;

import com.google.common.collect.ImmutableList;
import org.apache.marmotta.platform.core.api.modules.ModuleService;
import org.apache.marmotta.platform.core.model.module.ModuleConfiguration;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.MapConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;

/**
 * Add file description here!
 * <p/>
 * User: sschaffe
 */
@ApplicationScoped
public class ModuleServiceImpl implements ModuleService {

    private String default_container_name = "Others";

    private Logger log = LoggerFactory.getLogger(ModuleServiceImpl.class);

    private Set<String> modules;

    private HashMap<String, ArrayList<String>> containers;

    private HashMap<String, Integer> container_weight;

    private Map<String, Configuration> configurationMap;
    private Map<String, Configuration> jarURLs;

    @PostConstruct
    public void initialize() {

        //default_container_name = configurationService.getStringConfiguration("kiwi.pages.default_container.name",default_container_name);
        //default_container_number = configurationService.getIntConfiguration("kiwi.pages.default_container.number",default_container_number);

        modules = new HashSet<String>();
        containers = new HashMap<String, ArrayList<String>>();
        container_weight = new HashMap<String, Integer>();

        configurationMap = new HashMap<String, Configuration>();
        jarURLs = new HashMap<String, Configuration>();

        try {
            Enumeration<URL> modulePropertiesEnum = this.getClass().getClassLoader()
                    .getResources("kiwi-module.properties");

            while (modulePropertiesEnum.hasMoreElements()) {
                URL moduleUrl = modulePropertiesEnum.nextElement();

                Configuration moduleProperties = null;
                try {
                    Set<Configuration> configurations = new HashSet<Configuration>();

                    // get basic module configuration
                    moduleProperties = new PropertiesConfiguration(moduleUrl);
                    configurations.add(moduleProperties);

                    String moduleName = moduleProperties.getString("name");
                    modules.add(moduleName);

                    String c_name = moduleProperties.getString("container") != null
                            ? moduleProperties.getString("container")
                            : default_container_name;

                    if (containers.get(c_name) == null) {
                        containers.put(c_name, new ArrayList<String>());
                    }
                    containers.get(c_name).add(moduleName);

                    if (container_weight.get(c_name) == null) {
                        container_weight.put(c_name, -1);
                    }

                    if (moduleProperties.getString("container.weight") != null) {
                        container_weight.put(c_name, Math.max(container_weight.get(c_name),
                                moduleProperties.getInt("container.weight", -1)));
                    }

                    URLConnection urlConnection = moduleUrl.openConnection();
                    URL jarUrl;
                    if (urlConnection instanceof JarURLConnection) {
                        JarURLConnection conn = (JarURLConnection) urlConnection;
                        jarUrl = conn.getJarFileURL();
                    } else {
                        String fileUrl = moduleUrl.toString();
                        jarUrl = new URL(fileUrl.substring(0, fileUrl.lastIndexOf("/")));
                    }

                    // get the build information
                    try {
                        PropertiesConfiguration buildInfo = new PropertiesConfiguration(
                                new URL("jar:" + jarUrl.toString() + "!/buildinfo.properties"));
                        buildInfo.setDelimiterParsingDisabled(true);
                        configurations.add(buildInfo);
                    } catch (ConfigurationException ex) {
                    }

                    // alternative: maven buildinfo plugin
                    try {
                        PropertiesConfiguration buildInfo = new PropertiesConfiguration(
                                new URL("jar:" + jarUrl.toString() + "!/build.info"));
                        buildInfo.setDelimiterParsingDisabled(true);
                        configurations.add(buildInfo);
                    } catch (ConfigurationException ex) {
                    }

                    // create runtime configuration
                    MapConfiguration runtimeConfiguration = new MapConfiguration(new HashMap<String, Object>());
                    runtimeConfiguration.setProperty("runtime.jarfile", jarUrl.toString());
                    configurations.add(runtimeConfiguration);

                    CompositeConfiguration moduleConfiguration = new CompositeConfiguration(configurations);
                    configurationMap.put(moduleName, moduleConfiguration);
                    jarURLs.put(jarUrl.toString(), moduleConfiguration);

                } catch (ConfigurationException e) {
                    log.error("error parsing kiwi-module.properties file at {}", moduleUrl, e);
                }

            }
            //TODO container should be sortable
        } catch (IOException ex) {
            log.error("I/O error while trying to retrieve kiwi-module.properties file", ex);
        }
    }

    /**
     * Provide the current module configuration to the service injecting it
     *
     */
    @Override
    @Produces
    public ModuleConfiguration getModuleConfiguration(InjectionPoint injectionPoint) {
        URL jarUrl = injectionPoint.getMember().getDeclaringClass().getProtectionDomain().getCodeSource()
                .getLocation();
        Configuration cfg = jarURLs.get(jarUrl.toString());
        if (cfg != null) {
            return new ModuleConfiguration(cfg);
        } else {
            return new ModuleConfiguration(new MapConfiguration(new HashMap<String, Object>()));
        }
    }

    /**
     * Provide the current module configuration for the given class, i.e. the configuration of the
     * module containing the class.
     */
    @Override
    public ModuleConfiguration getModuleConfiguration(Class<?> cls) {
        URL jarUrl = cls.getProtectionDomain().getCodeSource().getLocation();
        Configuration cfg = jarURLs.get(jarUrl.toString());
        if (cfg != null) {
            return new ModuleConfiguration(cfg);
        } else {
            return new ModuleConfiguration(new MapConfiguration(new HashMap<String, Object>()));
        }
    }

    /**
     * Return a list of entities used by this module. Each entry is a fully-qualified classname of
     * an entity class that this module registers.
     *
     * @param moduleName
     * @return
     */
    @Deprecated
    @Override
    public Collection<String> getEntities(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return ImmutableList.copyOf(config.getStringArray("entities"));
        else
            return null;
    }

    /**
     * List the names of all currently active modules
     *
     * @return
     */
    @Override
    public Collection<String> listModules() {
        return modules;
    }

    public List<String> listSortedModules() {
        return sortModules(modules);
    }

    /**
     * returns all modules within a container
     * @param container
     * @return
     */
    public Collection<String> listModules(String container) {
        if (containers.containsKey(container)) {
            return containers.get(container);
        } else
            return null;
    }

    @Override
    public List<String> listSortedModules(String container) {
        if (containers.containsKey(container)) {
            return sortModules(containers.get(container));
        } else
            return null;
    }

    /**
     * sort modules
     * @param m
     * @return
     */
    private List<String> sortModules(Collection<String> m) {
        List<String> sorted = new ArrayList<String>(m);
        Collections.sort(sorted, new Comparator<String>() {
            @Override
            public int compare(String o, String o2) {
                return ((Integer) getWeight(o)).compareTo(getWeight(o2));
            }
        });
        return sorted;
    }

    /**
     * Lists containers and underlying modules
     * @return
     */
    public Collection<String> listContainers() {
        return containers.keySet();
    }

    @Override
    public List<String> listSortedContainers() {
        List sorted = new ArrayList(containers.keySet());
        Collections.sort(sorted, new Comparator<String>() {
            @Override
            public int compare(String o, String o2) {
                return container_weight.get(o2).compareTo(container_weight.get(o));
            }
        });
        return sorted;
    }

    /**
     * Return the configuration for the module identified by the name given as argument. Returns an
     * immutable Apache Commons Configuration object, or null if the module is not found.
     *
     * @param moduleName
     * @return
     */
    @Override
    public ModuleConfiguration getModuleConfiguration(String moduleName) {

        Configuration cfg = configurationMap.get(moduleName);
        if (cfg != null) {
            return new ModuleConfiguration(cfg);
        } else {
            return new ModuleConfiguration(new MapConfiguration(new HashMap<String, Object>()));
        }
    }

    /**
     * Get the URL of the JAR file of the module whose name is given as argument.
     *
     * @param moduleName
     * @return
     */
    @Override
    public URL getModuleJar(String moduleName) {
        try {
            return new URL(configurationMap.get(moduleName).getString("runtime.jarfile"));
        } catch (MalformedURLException e) {
            return null;
        }
    }

    /**
     * Get the path relative to the Apache Marmotta base URL where the web contents of this URL can be found
     *
     * @param moduleName
     * @return
     */
    @Override
    public String getModuleWeb(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return config.getString("baseurl", "/" + moduleName);
        else
            return null;
    }

    /**
     * Return a list of webservices used by this module. Each entry is a fully-qualified classname
     * of a webservice class that this module registers.
     *
     * @param moduleName
     * @return
     */
    @Override
    public Collection<String> getWebservices(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return ImmutableList.copyOf(config.getStringArray("webservices"));
        else
            return null;
    }

    /**
     * Return a list of filters used by this module. Each entry is a fully-qualified classname
     * of a filter class implementing LMFHttpFilter that this module registers.
     *
     * @param moduleName
     * @return
     */
    @Override
    public Collection<String> getFilters(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return ImmutableList.copyOf(config.getStringArray("filters"));
        else
            return null;
    }

    /**
     * returns the icon (if set), null otherwise
     * @param moduleName
     * @return
     */
    @Override
    public String getIcon(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return config.getString("icon");
        else
            return null;
    }

    /**
     * Return a list of admin pages (links)
     * @param moduleName
     * @return
     */
    @Override
    public List<String> getAdminPages(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null) {
            if (!config.subset("adminpage.").isEmpty()) {
                ArrayList<String> l = new ArrayList<String>();
                while (config.getString("adminpage." + l.size() + ".link") != null) {
                    l.add(config.getString("adminpage." + l.size() + ".link"));
                }
                return l;
            } else
                return ImmutableList.copyOf(config.getStringArray("adminpages"));
        } else
            return null;
    }

    /**
     * returns  more complex admin page description
     * @param moduleName
     * @return
     */
    @Override
    public List<HashMap<String, String>> getAdminPageObjects(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null) {
            ArrayList<HashMap<String, String>> l = new ArrayList<HashMap<String, String>>();
            if (!config.subset("adminpage").isEmpty()) {
                while (config.getString("adminpage." + l.size() + ".link") != null) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("link",
                            config.getString("baseurl") + config.getString("adminpage." + l.size() + ".link"));
                    map.put("title", config.getString("adminpage." + l.size() + ".title"));
                    l.add(map);
                }
            } else {
                for (String path : config.getStringArray("adminpages")) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    map.put("link", config.getString("baseurl") + path);
                    String title;
                    if (path.lastIndexOf(".") > path.lastIndexOf("/") + 1)
                        title = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf(".")).replaceAll("_",
                                " ");
                    else
                        title = path.substring(path.lastIndexOf("/") + 1);
                    map.put("title", title);
                    l.add(map);
                }
            }
            return l;
        } else
            return null;
    }

    @Override
    public int getWeight(String moduleName) {
        Configuration config = getModuleConfiguration(moduleName).getConfiguration();
        if (config != null)
            return config.getInt("weight", 50);
        else
            return 50;
    }

}