01: /**
02: * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, version 2.1, dated February 1999.
03: *
04: * This program is free software; you can redistribute it and/or modify
05: * it under the terms of the latest version of the GNU Lesser General
06: * Public License as published by the Free Software Foundation;
07: *
08: * This program is distributed in the hope that it will be useful,
09: * but WITHOUT ANY WARRANTY; without even the implied warranty of
10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11: * GNU Lesser General Public License for more details.
12: *
13: * You should have received a copy of the GNU Lesser General Public License
14: * along with this program (LICENSE.txt); if not, write to the Free Software
15: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16: */package org.jamwiki.utils;
17:
18: import java.text.MessageFormat;
19: import java.util.Properties;
20: import org.jamwiki.Environment;
21:
22: /**
23: * Class for controlling inter-wiki links. An interwiki link is a link that is
24: * specified using a namespace that is then resolved into an external link, such
25: * as "Wikipedia:Main Page", which would resolve to
26: * "http://en.wikipedia.org/wiki/Main_Page". The mappings of namespace values to
27: * URL patterns are persisted in WEB-INF/classes/interwiki.properties.
28: */
29: public class InterWikiHandler {
30:
31: /** Logger */
32: private static final WikiLogger logger = WikiLogger
33: .getLogger(InterWikiHandler.class.getName());
34: /** Properties bundle to store mappings */
35: private static Properties mapping;
36: /** Name of resource to access the persisted bundle */
37: private static final String RESOURCE_NAME = "/interwiki.properties";
38:
39: static {
40: InterWikiHandler.mapping = Environment
41: .loadProperties(RESOURCE_NAME);
42: }
43:
44: /**
45: *
46: */
47: private InterWikiHandler() {
48: }
49:
50: /**
51: * Retrieve an inter-wiki mapping for the given namespace and use the value
52: * parameter to create a URL to that wiki. For example, a namespace of
53: * "wikipedia" and a value of "Main Page" will resolve to a the URL
54: * "http://en.wikipedia.org/wiki/Main_Page".
55: *
56: * @param namespace The inter-wiki link namespace corresponding to the key
57: * value in the interwiki.properties file. This link is compared in a
58: * case-insensitive manner.
59: * @param value The page or topic name that is being linked to.
60: * @return Returns a formatted URL that links to the page specified by the
61: * namespace and value. If no namespace mapping is present then a string
62: * that combines the namespace and value is returned, such as
63: * "namespace:value".
64: */
65: public static String formatInterWiki(String namespace, String value) {
66: String pattern = InterWikiHandler.mapping.getProperty(namespace
67: .toLowerCase());
68: if (pattern == null) {
69: return namespace + NamespaceHandler.NAMESPACE_SEPARATOR
70: + value;
71: }
72: try {
73: Object[] objects = { Utilities.encodeForURL(value) };
74: return MessageFormat.format(pattern, objects);
75: } catch (Exception e) {
76: logger.warning("Unable to format " + pattern
77: + " with value " + value, e);
78: return namespace + NamespaceHandler.NAMESPACE_SEPARATOR
79: + value;
80: }
81: }
82:
83: /**
84: * Return true if there is an inter-wiki mapping for the given namespace.
85: *
86: * @param namespace The inter-wiki link namespace corresponding to the key
87: * value in the interwiki.properties file. This link is compared in a
88: * case-insensitive manner.
89: * @return <code>true</code> if an inter-wiki mapping exists, <code>false</code>
90: * otherwise.
91: */
92: public static boolean isInterWiki(String namespace) {
93: return InterWikiHandler.mapping.containsKey(namespace
94: .toLowerCase());
95: }
96: }
|