001    /**
002     *
003     * Copyright 2005 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    package org.apache.geronimo.system.plugin;
018    
019    import java.io.Serializable;
020    import java.net.URL;
021    import java.util.List;
022    import java.util.ArrayList;
023    import org.apache.geronimo.kernel.repository.Artifact;
024    import org.apache.geronimo.system.configuration.GBeanOverride;
025    
026    /**
027     * Various metadata on a configuration that's used when listing, importing,
028     * and exporting configurations.
029     *
030     * @version $Rev: 427388 $ $Date: 2006-07-31 17:43:46 -0700 (Mon, 31 Jul 2006) $
031     */
032    public class PluginMetadata implements Serializable, Comparable {
033        private final String name;
034        private final Artifact moduleId;
035        private final String category;
036        private final String description;
037        private final String pluginURL;
038        private final String author;
039        private License[] licenses = new License[0];
040        private final Hash hash;
041        private String[] geronimoVersions = new String[0];
042        private String[] jvmVersions = new String[0];
043        private Prerequisite[] prerequisites = new Prerequisite[0];
044        private String[] dependencies = new String[0];
045        private String[] forceStart = new String[0];
046        private String[] obsoletes = new String[0];
047        private URL[] repositories = new URL[0];
048        private CopyFile[] filesToCopy = new CopyFile[0];
049        private GBeanOverride[] configXmls = new GBeanOverride[0];
050    
051        private final boolean installed;
052        private final boolean eligible;
053    
054        public PluginMetadata(String name, Artifact moduleId, String category, String description, String pluginURL, String author, Hash hash, boolean installed, boolean eligible) {
055            this.name = name;
056            this.moduleId = moduleId;
057            this.category = category;
058            this.description = description;
059            this.pluginURL = pluginURL;
060            this.author = author;
061            this.hash = hash;
062            this.installed = installed;
063            this.eligible = eligible;
064        }
065    
066        public void setDependencies(String[] dependencies) {
067            this.dependencies = dependencies;
068        }
069    
070        public void setObsoletes(String[] obsoletes) {
071            this.obsoletes = obsoletes;
072        }
073    
074        public void setForceStart(String[] forceStart) {
075            this.forceStart = forceStart;
076        }
077    
078        /**
079         * Gets the Config ID for this configuration, which is a globally unique
080         * identifier.
081         */
082        public Artifact getModuleId() {
083            return moduleId;
084        }
085    
086        /**
087         * Gets a human-readable name for this configuration.
088         */
089        public String getName() {
090            return name;
091        }
092    
093        /**
094         * Gets a description of this configuration and why it is interesting
095         */
096        public String getDescription() {
097            return description;
098        }
099    
100        /**
101         * Gets a description of this module in HTML format (with paragraph
102         * markers).
103         */
104        public String getHTMLDescription() {
105            String[] paras = splitParas(description);
106            StringBuffer buf = new StringBuffer();
107            for (int i = 0; i < paras.length; i++) {
108                String para = paras[i];
109                buf.append("<p>").append(para).append("</p>\n");
110            }
111            return buf.toString();
112        }
113    
114        /**
115         * Gets a category name for this configuration.  In a list, configurations
116         * in the same category will be listed together.  There are no specific
117         * allowed values, though each repository may have standards for that.
118         */
119        public String getCategory() {
120            return category;
121        }
122    
123        public boolean isInstalled() {
124            return installed;
125        }
126    
127        public String getVersion() {
128            return moduleId.getVersion() == null ? "unknown version" : moduleId.getVersion().toString();
129        }
130    
131        /**
132         * Gets the JAR or configuration dependencies for this configuration,  Each
133         * String in the result is an Artifact (or Config ID) in String form.
134         * Generally speaking, the dependency names may be partial artifact names
135         * (but not, for example, if this whole thing is a plugin list).
136         */
137        public String[] getDependencies() {
138            return dependencies;
139        }
140    
141        /**
142         * Gets the configurations obsoleted by this configuration.  Each
143         * String in the result is an Artifact (or Config ID) in String form.
144         */
145        public String[] getObsoletes() {
146            return obsoletes;
147        }
148    
149        /**
150         * Gets the configurations that should definitely be started when the
151         * install process completes.
152         */
153        public String[] getForceStart() {
154            return forceStart;
155        }
156    
157        public String[] getGeronimoVersions() {
158            return geronimoVersions;
159        }
160    
161        public String getAuthor() {
162            return author;
163        }
164    
165        public Hash getHash() {
166            return hash;
167        }
168    
169        public String getPluginURL() {
170            return pluginURL;
171        }
172    
173        public URL[] getRepositories() {
174            return repositories;
175        }
176    
177        public void setGeronimoVersions(String[] geronimoVersions) {
178            this.geronimoVersions = geronimoVersions;
179        }
180    
181        public License[] getLicenses() {
182            return licenses;
183        }
184    
185        public void setLicenses(License[] licenses) {
186            this.licenses = licenses;
187        }
188    
189        public String[] getJvmVersions() {
190            return jvmVersions;
191        }
192    
193        public void setJvmVersions(String[] jdkVersions) {
194            this.jvmVersions = jdkVersions;
195        }
196    
197        public Prerequisite[] getPrerequisites() {
198            return prerequisites;
199        }
200    
201        public void setRepositories(URL[] repositories) {
202            this.repositories = repositories;
203        }
204    
205        public void setPrerequisites(Prerequisite[] prerequisites) {
206            this.prerequisites = prerequisites;
207        }
208    
209        public boolean isEligible() {
210            return eligible;
211        }
212    
213        /**
214         * Gets a list of files to copy from the plugin CAR into the server installation.
215         */
216        public CopyFile[] getFilesToCopy() {
217            return filesToCopy;
218        }
219    
220        public void setFilesToCopy(CopyFile[] filesToCopy) {
221            this.filesToCopy = filesToCopy;
222        }
223    
224        /**
225         * Gets a list of settings to populate in config.xml
226         */
227        public GBeanOverride[] getConfigXmls() {
228            return configXmls;
229        }
230    
231        public void setConfigXmls(GBeanOverride[] configXmls) {
232            this.configXmls = configXmls;
233        }
234    
235        public int compareTo(Object o) {
236            PluginMetadata other = (PluginMetadata) o;
237            int test = category.compareTo(other.category);
238            if(test != 0) return test;
239            test = name.compareTo(other.name);
240    
241            return test;
242        }
243    
244        public static class License implements Serializable {
245            private final String name;
246            private final boolean osiApproved;
247    
248            public License(String name, boolean osiApproved) {
249                this.name = name;
250                this.osiApproved = osiApproved;
251            }
252    
253            public String getName() {
254                return name;
255            }
256    
257            public boolean isOsiApproved() {
258                return osiApproved;
259            }
260        }
261    
262        public static class Hash implements Serializable {
263            private final String type; // MD5 or SHA-1
264            private final String value;
265    
266            public Hash(String type, String value) {
267                this.type = type;
268                this.value = value;
269            }
270    
271            public String getType() {
272                return type;
273            }
274    
275            public String getValue() {
276                return value;
277            }
278        }
279    
280        public static class CopyFile implements Serializable {
281            private final boolean relativeToVar;  // if not, relative to the Geronimo install directory
282            private final String sourceFile;
283            private final String destDir;
284    
285            public CopyFile(boolean relativeToVar, String sourceFile, String destDir) {
286                this.relativeToVar = relativeToVar;
287                this.sourceFile = sourceFile;
288                this.destDir = destDir;
289            }
290    
291            public boolean isRelativeToVar() {
292                return relativeToVar;
293            }
294    
295            public String getSourceFile() {
296                return sourceFile;
297            }
298    
299            public String getDestDir() {
300                return destDir;
301            }
302        }
303    
304        public static class Prerequisite implements Serializable {
305            private final Artifact moduleId;
306            private final String resourceType;
307            private final String description;
308            private final boolean present;
309    
310            public Prerequisite(Artifact moduleId, boolean present) {
311                this.moduleId = moduleId;
312                this.present = present;
313                resourceType = null;
314                description = null;
315            }
316    
317            public Prerequisite(Artifact moduleId, boolean present, String resourceType, String description) {
318                this.moduleId = moduleId;
319                this.present = present;
320                this.resourceType = resourceType;
321                this.description = description;
322            }
323    
324            public Artifact getModuleId() {
325                return moduleId;
326            }
327    
328            public String getResourceType() {
329                return resourceType;
330            }
331    
332            public String getDescription() {
333                return description;
334            }
335    
336            public boolean isPresent() {
337                return present;
338            }
339    
340            public String getModuleIdWithStars() {
341                StringBuffer buf = new StringBuffer();
342                if(moduleId.getGroupId() == null) {
343                    buf.append("*");
344                } else {
345                    buf.append(moduleId.getGroupId());
346                }
347                buf.append("/");
348                if(moduleId.getArtifactId() == null) {
349                    buf.append("*");
350                } else {
351                    buf.append(moduleId.getArtifactId());
352                }
353                buf.append("/");
354                if(moduleId.getVersion() == null) {
355                    buf.append("*");
356                } else {
357                    buf.append(moduleId.getVersion());
358                }
359                buf.append("/");
360                if(moduleId.getType() == null) {
361                    buf.append("*");
362                } else {
363                    buf.append(moduleId.getType());
364                }
365                return buf.toString();
366            }
367        }
368    
369        private static String[] splitParas(String desc) {
370            int start = 0, last=0;
371            List list = new ArrayList();
372            boolean inSpace = false, multiple = false;
373            for(int i=0; i<desc.length(); i++) {
374                char c = desc.charAt(i);
375                if(inSpace) {
376                    if(Character.isWhitespace(c)) {
377                        if(c == '\r' || c == '\n') {
378                            multiple = true;
379                            for(int j=i+1; j<desc.length(); j++) {
380                                char d = desc.charAt(j);
381                                if(d != c && (d == '\r' || d == '\n')) {
382                                    i = j;
383                                } else {
384                                    break;
385                                }
386                            }
387                        }
388                    } else {
389                        if(multiple) {
390                            list.add(desc.substring(last, start).trim());
391                            last = i;
392                        }
393                        inSpace = false;
394                    }
395                } else {
396                    if(c == '\r' || c == '\n') {
397                        inSpace = true;
398                        multiple = false;
399                        start = i;
400                        for(int j=i+1; j<desc.length(); j++) {
401                            char d = desc.charAt(j);
402                            if(d != c && (d == '\r' || d == '\n')) {
403                                i = j;
404                            } else {
405                                break;
406                            }
407                        }
408                    }
409                }
410            }
411            if(last < desc.length()) {
412                list.add(desc.substring(last).trim());
413            }
414            return (String[]) list.toArray(new String[list.size()]);
415        }
416    }