View Javadoc

1   /**
2    * This file Copyright (c) 2003-2010 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.cms.beans.config;
35  
36  import info.magnolia.cms.util.SimpleUrlPattern;
37  import info.magnolia.cms.util.UrlPattern;
38  import info.magnolia.context.MgnlContext;
39  import info.magnolia.context.WebContext;
40  
41  import java.util.HashMap;
42  import java.util.Iterator;
43  import java.util.List;
44  import java.util.Map;
45  
46  import org.apache.commons.lang.StringUtils;
47  
48  
49  /**
50   * Simple VirtualURI mapping that can forward to a different url depending on the request host name. The "host" property
51   * must be a list of uri=destination strings. See below for a sample configuration:
52   *
53   * <pre>
54   * [] virtualURIMapping
55   *    [] default
56   *     - class            info.magnolia.cms.beans.config.HostBasedVirtualURIMapping
57   *     - fromURI          /
58   *     - toURI            redirect:/.magnolia/pages/adminCentral.html
59   *       [] hosts
60   *        - 1             www.acme.com=forward:/acme/en/index.html
61   *        - 2             www.acme.de=forward:/acme/de/index.html
62   * </pre>
63   * @author fgiust
64   * @version $Id: HostBasedVirtualURIMapping.java 36178 2010-08-03 16:34:52Z gjoseph $
65   */
66  public class HostBasedVirtualURIMapping implements VirtualURIMapping {
67  
68      private String fromURI;
69  
70      private UrlPattern pattern;
71  
72      private String toURI;
73  
74      private Map<String, String> hosts = new HashMap<String, String>();
75  
76      /**
77       *
78       */
79      public HostBasedVirtualURIMapping() {
80          hosts = new HashMap<String, String>();
81      }
82  
83      // required by content2bean in order to make addHost work, do not remove!
84      public List<String> getHosts() {
85          return null;
86      }
87  
88      /**
89       * Adds a host mapping (used by content2bean).
90       * @param mapping in the form host=path
91       */
92      public void addHost(String mapping) {
93          String[] hostToPath = StringUtils.split(mapping, "=");
94          if (hostToPath != null && hostToPath.length == 2) {
95              synchronized (hosts) {
96                  hosts.put(hostToPath[0], hostToPath[1]);
97              }
98          }
99      }
100 
101     public MappingResult mapURI(String uri) {
102 
103         String destination = toURI;
104 
105         if (pattern != null && pattern.match(uri)) {
106 
107             String requestHost = ((WebContext) MgnlContext.getInstance()).getRequest().getServerName();
108 
109             if (hosts != null) {
110 
111                 Iterator<Map.Entry<String, String>> hostIt = hosts.entrySet().iterator();
112                 while (hostIt.hasNext()) {
113 
114                     Map.Entry<String, String> hk = hostIt.next();
115                     if (requestHost.endsWith(hk.getKey())) {
116                         destination = hk.getValue();
117                         break;
118                     }
119                 }
120             }
121 
122             MappingResult r = new MappingResult();
123             r.setLevel(pattern.getLength());
124             r.setToURI(destination);
125             return r;
126         }
127         return null;
128     }
129 
130     public String getFromURI() {
131         return this.fromURI;
132     }
133 
134     public void setFromURI(String fromURI) {
135         this.fromURI = fromURI;
136         this.pattern = new SimpleUrlPattern(fromURI);
137     }
138 
139     public String getToURI() {
140         return this.toURI;
141     }
142 
143     public void setToURI(String toURI) {
144         this.toURI = toURI;
145     }
146 
147     @Override
148     public String toString() {
149         return fromURI + " --> " + toURI;
150     }
151 
152 }