    001/*
    002    Licensed to the Apache Software Foundation (ASF) under one
    003    or more contributor license agreements.  See the NOTICE file
    004    distributed with this work for additional information
    005    regarding copyright ownership.  The ASF licenses this file
    006    to you under the Apache License, Version 2.0 (the
    007    "License"); you may not use this file except in compliance
    008    with the License.  You may obtain a copy of the License at
    009
    010       http://www.apache.org/licenses/LICENSE-2.0
    011
    012    Unless required by applicable law or agreed to in writing,
    013    software distributed under the License is distributed on an
    014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015    KIND, either express or implied.  See the License for the
    016    specific language governing permissions and limitations
    017    under the License.
    018 */
    019package org.apache.wiki.modules;
    020
    021import org.apache.wiki.util.FileUtil;
    022import org.jdom2.Element;
    023
    024import java.io.BufferedInputStream;
    025import java.io.ByteArrayOutputStream;
    026import java.io.IOException;
    027import java.net.URL;
    028
    029/**
    030 *  A WikiModule describes whatever JSPWiki plugin there is: it can be a plugin, an editor, a filter, etc.
    031 *
    032 *  @since 2.4
    033 */
    034public class WikiModuleInfo implements Comparable< WikiModuleInfo > {
    035    protected String m_name;
    036    protected String m_description;
    037    protected String m_moduleUrl;
    038    protected String m_moduleVersion;
    039    protected String m_htmlTemplate;
    040    protected String m_scriptLocation;
    041    protected String m_scriptText;
    042    protected String m_stylesheetLocation;
    043    protected String m_stylesheetText;
    044    protected String m_author;
    045    protected String m_authorUrl;
    046    protected URL    m_resource;
    047    protected String m_minVersion;
    048    protected String m_maxVersion;
    049    protected String m_adminBeanClass;
    050
    051    /**
    052     *  Create a new info container.
    053     *
    054     *  @param name The name of the module.
    055     */
    056    public WikiModuleInfo( final String name ) {
    057        m_name = name;
    058    }
    059
    060    /**
    061     *  The WikiModuleInfo is equal to another WikiModuleInfo, if the name is equal.  All objects are unique across JSPWiki.
    062     *
    063     *  @param obj {@inheritDoc}
    064     *  @return {@inheritDoc}
    065     */
    066    @Override
    067    public boolean equals( final Object obj) {
    068        if( obj instanceof WikiModuleInfo ) {
    069            return ( ( WikiModuleInfo )obj ).m_name.equals( m_name );
    070        }
    071
    072        return false;
    073    }
    074
    075    /**
    076     *  {@inheritDoc}
    077     */
    078    @Override
    079    public int hashCode() {
    080        return m_name.hashCode();
    081    }
    082
    083    /**
    084     *  Initializes the ModuleInfo from some standard XML elements which are under the given element.
    085     *
    086     *  @param el The element to parse.
    087     */
    088    protected void initializeFromXML( final Element el ) {
    089        m_adminBeanClass = el.getChildText( "adminBean" );
    090        m_author = el.getChildText( "author" );
    091        m_authorUrl = el.getChildText( "authorUrl" );
    092        m_description = el.getChildText( "description" );
    093        m_maxVersion = el.getChildText( "maxVersion" );
    094        m_minVersion = el.getChildText( "minVersion" );
    095        m_scriptLocation = el.getChildText( "script" );
    096        m_stylesheetLocation = el.getChildText( "stylesheet" );
    097        m_htmlTemplate = el.getChildText( "template" );
    098        m_moduleUrl = el.getChildText( "url" );
    099        m_moduleVersion = el.getChildText( "version" );
    100    }
    101
    102    /**
    103     *  Returns the AdminBean class which is supposed to manage this module.
    104     *
    105     *  @return A class name.
    106     */
    107    public String getAdminBeanClass() {
    108        return m_adminBeanClass;
    109    }
    110
    111    /**
    112     *  Returns the common name for this particular module.  Note that this is not the class name, nor is it an alias.
    113     *  For different modules the name may have different meanings.
    114     *  <p>
    115     *  Every module defines a name, so this method should never return null.
    116     *
    117     *  @return A module name.
    118     */
    119    public String getName() {
    120        return m_name;
    121    }
    122
    123    /**
    124     *  The description of what this module does.
    125     *
    126     *  @return A module description.
    127     */
    128    public String getDescription() {
    129        return m_description;
    130    }
    131
    132    /**
    133     *  The URL for this getting more information about this module.
    134     *
    135     *  @return A module URL.
    136     */
    137    public String getModuleUrl() {
    138        return m_moduleUrl;
    139    }
    140
    141    /**
    142     *  The current version of the implemented module
    143     *
    144     *  @return A module version.
    145     */
    146    public String getModuleVersion() {
    147        return m_moduleVersion;
    148    }
    149
    150    /**
    151     *  Return the location of the html template for this module.
    152     *
    153     *  @return The path to the location.
    154     */
    155    public String getHtmlTemplate() {
    156        return m_htmlTemplate;
    157    }
    158
    159    /**
    160     *  Returns the style sheet location for this module.
    161     *
    162     *  @return The path to the location.
    163     */
    164    public String getStylesheetLocation() {
    165        return m_stylesheetLocation;
    166    }
    167
    168    /**
    169     *  Return the location of the script for this module.
    170     *
    171     *  @return The path to the location.
    172     */
    173    public String getScriptLocation() {
    174        return m_scriptLocation;
    175    }
    176
    177    /**
    178     *  Returns the name of the author of this plugin (if defined).
    179     * @return Author name, or null.
    180     */
    181    public String getAuthor() {
    182        return m_author;
    183    }
    184
    185    /**
    186     *  Returns the url of the author of this plugin (if defined).
    187     */
    188    public String getAuthorUrl() {
    189        return m_authorUrl;
    190    }
    191
    192    /**
    193     *  Returns the minimum version of JSPWiki that this module supports.
    194     *
    195     *  @return The minimum version.
    196     */
    197    public String getMinVersion() {
    198        return m_minVersion;
    199    }
    200
    201    /**
    202     *  Returns the maximum version of JSPWiki that this module supports.
    203     *
    204     *  @return The maximum version.
    205     */
    206    public String getMaxVersion() {
    207        return m_maxVersion;
    208    }
    209
    210    /**
    211     *  Attempts to locate a resource from a JAR file and returns it as a string.
    212     *
    213     *  @param resourceLocation an URI of the resource
    214     *  @return The content of the file
    215     *
    216     *  @throws IOException if the JAR file or the resource cannot be read
    217     */
    218    protected String getTextResource( final String resourceLocation ) throws IOException {
    219        if( m_resource == null ) {
    220            return "";
    221        }
    222
    223        // The text of this resource should be loaded from the same
    224        //   jar-file as the jspwiki_modules.xml -file! This is because 2 plugins
    225        //   could have the same name of the resourceLocation!
    226        //   (2 plugins could have their stylesheet-files in 'ini/jspwiki.css')
    227
    228        // So try to construct a resource that loads this resource from the same jar-file.
    229        String spec = m_resource.toString();
    230
    231        // Replace the 'PLUGIN_RESOURCE_LOCATION' with the requested resourceLocation.
    232        final int length = BaseModuleManager.PLUGIN_RESOURCE_LOCATION.length();
    233        spec = spec.substring( 0, spec.length() - length ) + resourceLocation;
    234
    235        final URL url = new URL( spec );
    236        try( final BufferedInputStream in = new BufferedInputStream( url.openStream() );
    237             final ByteArrayOutputStream out = new ByteArrayOutputStream(1024) ) {
    238            FileUtil.copyContents( in, out );
    239            return out.toString();
    240        }
    241    }
    242
    243    /**
    244     *  {@inheritDoc}
    245     */
    246    @Override
    247    public int compareTo( final WikiModuleInfo mod ) {
    248        return m_name.compareTo( mod.getName() );
    249    }
    250
    251}