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     */
019    package org.apache.wiki.modules;
020    
021    import java.io.BufferedInputStream;
022    import java.io.ByteArrayOutputStream;
023    import java.io.IOException;
024    import java.net.URL;
025    
026    import org.jdom2.Element;
027    
028    import org.apache.wiki.util.FileUtil;
029    
030    /**
031     *  A WikiModule describes whatever JSPWiki plugin there is: it can be a plugin,
032     *  an editor, a filter, etc.
033     *
034     *  @since 2.4
035     */
036    public class WikiModuleInfo
037        implements Comparable<WikiModuleInfo>
038    {
039        protected String m_name;
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 URL    m_resource;
046        protected String m_minVersion;
047        protected String m_maxVersion;
048        protected String m_adminBeanClass;
049        
050        /**
051         *  Create a new info container.
052         *  
053         *  @param name The name of the module.
054         */
055        public WikiModuleInfo( String name )
056        {
057            m_name = name;
058        }
059        
060        /**
061         *  The WikiModuleInfo is equal to another WikiModuleInfo, if the name is equal.  All
062         *  objects are unique across JSPWiki.
063         *  
064         *  @param obj {@inheritDoc}
065         *  @return {@inheritDoc}
066         */
067        @Override
068        public boolean equals(Object obj)
069        {
070            if( obj instanceof WikiModuleInfo )
071            {
072                return ((WikiModuleInfo)obj).m_name.equals( m_name );
073            }
074            
075            return false;
076        }
077    
078        /**
079         *  {@inheritDoc}
080         */
081        @Override
082        public int hashCode()
083        {
084            return m_name.hashCode();
085        }
086    
087        /**
088         *  Initializes the ModuleInfo from some standard XML elements
089         *  which are under the given element.
090         *  
091         *  @param el The element to parse.
092         */
093        protected void initializeFromXML( Element el )
094        {
095            m_scriptLocation     = el.getChildText("script");
096            m_stylesheetLocation = el.getChildText("stylesheet");
097            m_author             = el.getChildText("author");
098            m_minVersion         = el.getChildText("minVersion");
099            m_maxVersion         = el.getChildText("maxVersion");
100            m_adminBeanClass     = el.getChildText("adminBean");
101        }
102    
103        /**
104         *  Returns the AdminBean class which is supposed to manage this module.
105         *  
106         *  @return A class name.
107         */
108        public String getAdminBeanClass()
109        {
110            return m_adminBeanClass;
111        }
112        
113        /**
114         *  Returns the common name for this particular module.  Note that
115         *  this is not the class name, nor is it an alias.  For different modules
116         *  the name may have different meanings.
117         *  <p>
118         *  Every module defines a name, so this method should never return null.
119         *  
120         *  @return A module name.
121         */
122        public String getName()
123        {
124            return m_name;
125        }
126    
127        /**
128         *  Returns the style sheet location for this module.
129         *  
130         *  @return The path to the location.
131         */
132        public String getStylesheetLocation()
133        {
134            return m_stylesheetLocation;
135        }
136    
137        /**
138         *  Return the location of the script for this module.
139         *  
140         *  @return The path to the location.
141         */
142        public String getScriptLocation()
143        {
144            return m_scriptLocation;
145        }
146    
147        /**
148         *  Returns the name of the author of this plugin (if defined).
149         * @return Author name, or null.
150         */
151        public String getAuthor()
152        {
153            return m_author;
154        }
155    
156        /**
157         *  Returns the minimum version of JSPWiki that this module supports.
158         *  
159         *  @return The minimum version.
160         */
161        public String getMinVersion()
162        {
163            return m_minVersion;
164        }
165        
166        /**
167         *  Returns the maximum version of JSPWiki that this module supports.
168         *  
169         *  @return The maximum version.
170         */
171        public String getMaxVersion()
172        {
173            return m_maxVersion;
174        }
175    
176        /**
177         *  Attempts to locate a resource from a JAR file and returns it as a string.
178         *  
179         *  @param resourceLocation an URI of the resource
180         *  @return The content of the file
181         *  
182         *  @throws IOException if the JAR file or the resource cannot be read
183         */
184        protected String getTextResource(String resourceLocation) 
185            throws IOException
186        {
187            if(m_resource == null)
188            {
189                return "";
190            }
191        
192            // The text of this resource should be loaded from the same
193            //   jar-file as the jspwiki_modules.xml -file! This is because 2 plugins
194            //   could have the same name of the resourceLocation!
195            //   (2 plugins could have their stylesheet-files in 'ini/jspwiki.css')
196        
197            // So try to construct a resource that loads this resource from the
198            //   same jar-file.
199            String spec = m_resource.toString();
200        
201            // Replace the 'PLUGIN_RESOURCE_LOCATION' with the requested
202            //   resourceLocation.
203            int length = ModuleManager.PLUGIN_RESOURCE_LOCATION.length();
204            spec = spec.substring(0, spec.length() - length) + resourceLocation;
205        
206            URL url = new URL(spec);
207            BufferedInputStream   in  = new BufferedInputStream(url.openStream());
208            ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
209            
210            FileUtil.copyContents( in, out );
211        
212            in.close();
213            String text = out.toString();
214            out.close();
215            
216            return text;
217        }
218    
219        /**
220         *  {@inheritDoc}
221         */
222        public int compareTo(WikiModuleInfo arg0)
223        {
224            return m_name.compareTo( arg0.getName() );
225        }
226    
227    }