001    package de.deepamehta.core.impl;
002    
003    import de.deepamehta.core.service.PluginInfo;
004    import de.deepamehta.core.util.JavaUtils;
005    
006    import org.codehaus.jettison.json.JSONObject;
007    import org.codehaus.jettison.json.JSONException;
008    
009    import org.osgi.framework.Bundle;
010    
011    import java.util.ArrayList;
012    import java.util.Enumeration;
013    import java.util.List;
014    import java.util.logging.Logger;
015    
016    
017    
018    class PluginInfoImpl implements PluginInfo {
019    
020        // ------------------------------------------------------------------------------------------------------- Constants
021    
022        private static final String PLUGIN_FILE           = "/web/script/plugin.js";
023        private static final String PLUGIN_RENDERERS_PATH = "/web/script/renderers/";
024        private static final String PLUGIN_HELPER_PATH    = "/web/script/helper/";
025        private static final String PLUGIN_STYLE_PATH     = "/web/style/";
026    
027        // ---------------------------------------------------------------------------------------------- Instance Variables
028    
029        private Bundle pluginBundle;
030        private JSONObject pluginInfo = new JSONObject();
031    
032        private Logger logger = Logger.getLogger(getClass().getName());
033    
034        // ---------------------------------------------------------------------------------------------------- Constructors
035    
036        PluginInfoImpl(String pluginUri, Bundle pluginBundle) {
037            this.pluginBundle = pluginBundle;
038            try {
039                pluginInfo.put("plugin_uri", pluginUri);
040                pluginInfo.put("has_plugin_file", hasPluginFile());
041                pluginInfo.put("stylesheets", getStylesheets());
042                pluginInfo.put("renderers", getRenderers());
043                pluginInfo.put("helper", getHelper());
044            } catch (Exception e) {
045                throw new RuntimeException("Serialization failed (" + this + ")", e);
046            }
047        }
048    
049        // -------------------------------------------------------------------------------------------------- Public Methods
050    
051        @Override
052        public JSONObject toJSON() {
053            return pluginInfo;
054        }
055    
056        // ------------------------------------------------------------------------------------------------- Private Methods
057    
058        private boolean hasPluginFile() {
059            return pluginBundle.getEntry(PLUGIN_FILE) != null;
060        }
061    
062        private List<String> getStylesheets() {
063            return getFilenames(PLUGIN_STYLE_PATH);
064        }
065    
066        private JSONObject getRenderers() throws JSONException {
067            JSONObject renderers = new JSONObject();
068            renderers.put("page_renderers",   getRenderers("page_renderers"));
069            renderers.put("simple_renderers", getRenderers("simple_renderers"));
070            renderers.put("multi_renderers",  getRenderers("multi_renderers"));
071            // ### TODO: renderers.put("topicmap_renderers", getRenderers("topicmap_renderers"));
072            return renderers;
073        }
074    
075        private List<String> getHelper() {
076            return getFilenames(PLUGIN_HELPER_PATH);
077        }
078    
079        // ---
080    
081        private List<String> getRenderers(String renderersDir) {
082            return getFilenames(PLUGIN_RENDERERS_PATH + renderersDir);
083        }
084    
085        private List<String> getFilenames(String path) {
086            List<String> filenames = new ArrayList();
087            Enumeration<String> e = pluginBundle.getEntryPaths(path);
088            if (e != null) {
089                while (e.hasMoreElements()) {
090                    String entryPath = e.nextElement();
091                    // ignore directories ### TODO: to be dropped? Use helper/ instead? See Webclient page_renderers
092                    if (entryPath.endsWith("/")) {
093                        continue;
094                    }
095                    //
096                    filenames.add(JavaUtils.getFilename(entryPath));
097                }
098            }
099            return filenames;
100        }
101    }