populate proxy

git-svn-id: https://svn.apache.org/repos/asf/lenya/trunk@1038622 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/org.apache.lenya.core.proxy/pom.xml b/org.apache.lenya.core.proxy/pom.xml
index 08b3980..57c8210 100644
--- a/org.apache.lenya.core.proxy/pom.xml
+++ b/org.apache.lenya.core.proxy/pom.xml
@@ -16,7 +16,10 @@
   <description>Implements proxy capabilities in Lenya</description>
   
   <dependencies>
-  
+  <dependency>
+      <groupId>org.apache.lenya</groupId>
+      <artifactId>lenya-core-document-api</artifactId>
+    </dependency>
   <!-- TODO : see if all theses dependencies are required -->
     <dependency>
       <groupId>org.apache.cocoon</groupId>
diff --git a/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/GlobalProxies.java b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/GlobalProxies.java
new file mode 100644
index 0000000..743fcf4
--- /dev/null
+++ b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/GlobalProxies.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.linking;
+
+import org.apache.lenya.cms.publication.Proxy;
+
+/**
+ * Service to manage the web-application-wide proxy settings.
+ */
+public interface GlobalProxies {
+    
+    /**
+     * The service role.
+     */
+    String ROLE = GlobalProxies.class.getName();
+    
+    /**
+     * @param ssl If SSL is used.
+     * @return A proxy.
+     */
+    Proxy getProxy(boolean ssl);
+
+}
diff --git a/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/impl/GlobalProxiesImpl.java b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/impl/GlobalProxiesImpl.java
new file mode 100644
index 0000000..30cf4fb
--- /dev/null
+++ b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/linking/impl/GlobalProxiesImpl.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.linking.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cocoon.processing.ProcessInfoProvider;
+import org.apache.cocoon.spring.configurator.WebAppContextUtils;
+import org.apache.cocoon.util.AbstractLogEnabled;
+import org.apache.lenya.cms.linking.GlobalProxies;
+import org.apache.lenya.cms.publication.Proxy;
+import org.apache.lenya.cms.publication.ProxyImpl;
+
+/**
+ * GlobalProxy service implementation.
+ * The class is implemented as a singleton.
+ */
+public class GlobalProxiesImpl extends AbstractLogEnabled implements GlobalProxies {
+    
+    private Map ssl2proxy = new HashMap();
+
+    public Proxy getProxy(boolean ssl) {
+        Object key = Boolean.valueOf(ssl);
+        Proxy proxy = (Proxy) this.ssl2proxy.get(key);
+        if (proxy == null) {
+            proxy = initializeProxy(key);
+        }
+        return proxy;
+    }
+
+    protected synchronized Proxy initializeProxy(Object key) {
+        ProcessInfoProvider process = (ProcessInfoProvider) WebAppContextUtils
+                .getCurrentWebApplicationContext().getBean(ProcessInfoProvider.ROLE);
+        Proxy proxy = new ProxyImpl();
+        proxy.setUrl(process.getRequest().getContextPath());
+        this.ssl2proxy.put(key, proxy);
+        return proxy;
+    }
+    
+    public void setNonSslProxyUrl(String url) {
+        Proxy proxy = new ProxyImpl();
+        proxy.setUrl(url);
+        setProxy(false, proxy);
+    }
+
+    public void setSslProxyUrl(String url) {
+        Proxy proxy = new ProxyImpl();
+        proxy.setUrl(url);
+        setProxy(true, proxy);
+    }
+
+    /**
+     * @param ssl If the proxy is responsible for SSL requests.
+     * @param proxy A proxy.
+     */
+    public void setProxy(boolean ssl, Proxy proxy) {
+        this.ssl2proxy.put(Boolean.valueOf(ssl), proxy);
+    }
+
+}
diff --git a/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/Proxy.java b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/Proxy.java
new file mode 100644
index 0000000..719a13a
--- /dev/null
+++ b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/Proxy.java
@@ -0,0 +1,35 @@
+package org.apache.lenya.cms.publication;
+
+public interface Proxy {
+
+	/**
+	 * @param area The area.
+	 * @return The proxy URL if no proxy is declared in {@link PublicationConfiguration#CONFIGURATION_FILE}.
+	 */
+	public String getDefaultUrl();
+
+	/**
+	 * Returns the absolute URL of a particular document.
+	 * @param document The document.
+	 * @return A string.
+	 */
+	public String getURL(Document document);
+
+	/**
+	 * Returns the proxy URL.
+	 * @return A string.
+	 */
+	public String getUrl();
+
+	/**
+	 * Sets the proxy URL.
+	 * @param _url The url to set.
+	 */
+	public void setUrl(String _url);
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString();
+
+}
\ No newline at end of file
diff --git a/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/ProxyImpl.java b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/ProxyImpl.java
new file mode 100644
index 0000000..fbdba30
--- /dev/null
+++ b/org.apache.lenya.core.proxy/src/main/java/org/apache/lenya/cms/publication/ProxyImpl.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.lenya.cms.publication;
+
+import org.apache.commons.lang.Validate;
+
+/**
+ * <p>
+ * An object of this class represents a proxy configuration.
+ * </p>
+ * <p>
+ * Configuration example (<code>$PUB_HOME/config/publication.xml</code>):
+ * </p>
+ * <pre>
+ * &lt;proxies&gt;
+ *   &lt;proxy area="live" ssl="true" url="https://www.host.com/ssl/default"/&gt;
+ *   &lt;proxy area="live" ssl="false" url="http://www.host.com/default"/&gt;
+ *   &lt;proxy area="authoring" ssl="true" url="https://www.host.com/lenya/default/authoring"/&gt;
+ *   &lt;proxy area="authoring" ssl="false" url="http://www.host.com/lenya/default/authoring"/&gt;
+ * &lt;proxies;&gt;
+ * </pre>
+ * 
+ */
+public class ProxyImpl implements Proxy {
+    
+    private String defaultUrl;
+    private String url;
+
+    /**
+     * @param defaultUrl The default proxy URL.
+     */
+    public ProxyImpl(String defaultUrl) {
+        Validate.notNull(defaultUrl);
+        this.defaultUrl = defaultUrl;
+    }
+
+    /**
+     */
+    public ProxyImpl() {
+    }
+
+    /**
+     * @param area The area.
+     * @return The proxy URL if no proxy is declared in {@link PublicationConfiguration#CONFIGURATION_FILE}.
+     */
+    public String getDefaultUrl() {
+        return this.defaultUrl;
+    }
+
+    /**
+     * Returns the absolute URL of a particular document.
+     * @param document The document.
+     * @return A string.
+     */
+    public String getURL(Document document) {
+        return getUrl() + document.getCanonicalDocumentURL();
+    }
+
+    /**
+     * Returns the proxy URL.
+     * @return A string.
+     */
+    public String getUrl() {
+        if (this.url != null) {
+            return this.url;
+        }
+        else if (this.defaultUrl != null) {
+            return this.defaultUrl;
+        }
+        else {
+            throw new IllegalStateException("This proxy has no URL.");
+        }
+    }
+
+    /**
+     * Sets the proxy URL.
+     * @param _url The url to set.
+     */
+    public void setUrl(String _url) {
+        Validate.notNull(_url);
+        this.url = _url;
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return "Proxy URL=[" + getUrl() + "]";
+    }
+    
+}
\ No newline at end of file