From 553e4e531d8b9753a958a86c8475b168d650ad38 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 15 Nov 2010 15:20:36 +0000
Subject: [PATCH] LMS-1870 extending IViewContext and WebClientConfiguration in
 order to allow technology specific properties for web client

SVN: 18699
---
 .../AbstractPluginViewContext.java            | 27 +++++++--
 .../client/application/CommonViewContext.java | 10 ++++
 .../web/client/application/IViewContext.java  |  4 ++
 .../web/server/AbstractClientService.java     | 10 ++++
 .../WebClientConfigurationProvider.java       | 28 +++++++++-
 .../generic/server/AbstractServer.java        |  4 +-
 .../basic/dto/WebClientConfiguration.java     | 13 +++++
 .../client/application/DemoViewContext.java   |  3 +-
 .../application/GenericViewContext.java       |  3 +-
 .../client/application/QueryViewContext.java  |  3 +-
 .../WebClientConfigurationProviderTest.java   | 56 +++++++++++++++++++
 11 files changed, 147 insertions(+), 14 deletions(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProviderTest.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
index a951d4fcf51..ea121f11639 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractPluginViewContext.java
@@ -28,6 +28,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.Vi
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.IProfilingTable;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ApplicationInfo;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebClientConfiguration;
 
 /**
  * An <i>abstract</i> {@link IViewContext} implementation which should be extended by each plugin
@@ -38,6 +40,21 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.I
 public abstract class AbstractPluginViewContext<T extends IClientServiceAsync> implements
         IViewContext<T>
 {
+    static String getPropertyOrNull(IViewContext<?> viewContext, String key)
+    {
+        ApplicationInfo applicationInfo = viewContext.getModel().getApplicationInfo();
+        if (applicationInfo == null)
+        {
+            return null;
+        }
+        WebClientConfiguration webClientConfiguration = applicationInfo.getWebClientConfiguration();
+        if (webClientConfiguration == null)
+        {
+            return null;
+        }
+        return webClientConfiguration.getPropertyOrNull(viewContext.getTechnology(), key);
+    }
+
     private final IViewContext<ICommonClientServiceAsync> commonViewContext;
 
     private final T service;
@@ -52,11 +69,6 @@ public abstract class AbstractPluginViewContext<T extends IClientServiceAsync> i
         initializeLocatorHandlerRegistry(commonViewContext.getLocatorResolverRegistry());
     }
 
-    /**
-     * Returns the name of the technology.
-     */
-    protected abstract String getTechnology();
-
     /**
      * Creates the service. Implementations will usually invoke {@link GWT#create(Class)} with the
      * corresponding synchronous service interface.
@@ -72,6 +84,11 @@ public abstract class AbstractPluginViewContext<T extends IClientServiceAsync> i
         return service;
     }
 
+    public String getPropertyOrNull(String key)
+    {
+        return getPropertyOrNull(this, key);
+    }
+
     public final IViewContext<ICommonClientServiceAsync> getCommonViewContext()
     {
         return commonViewContext;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
index 06a35f599be..01cf8943605 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/CommonViewContext.java
@@ -125,6 +125,16 @@ public final class CommonViewContext implements IViewContext<ICommonClientServic
         return service;
     }
 
+    public String getTechnology()
+    {
+        return TECHNOLOGY_NAME;
+    }
+
+    public String getPropertyOrNull(String key)
+    {
+        return AbstractPluginViewContext.getPropertyOrNull(this, key);
+    }
+    
     public final GenericViewModel getModel()
     {
         return viewModel;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
index 4eafa948e3b..3feebd8c1d5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/IViewContext.java
@@ -33,12 +33,16 @@ public interface IViewContext<T extends IClientServiceAsync> extends IMessagePro
         IProfilingTable
 {
     public void addMessageSource(String messageSource);
+    
+    public String getTechnology();
 
     public IViewContext<ICommonClientServiceAsync> getCommonViewContext();
 
     public T getService();
 
     public GenericViewModel getModel();
+    
+    public String getPropertyOrNull(String key);
 
     public void initDisplaySettingsManager();
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
index 761eca32d83..fbfa272b79e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Properties;
 import java.util.Set;
 
 import javax.annotation.Resource;
@@ -30,6 +31,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
+import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
 import ch.systemsx.cisd.openbis.BuildAndEnvironmentInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.IClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService;
@@ -86,6 +88,9 @@ public abstract class AbstractClientService implements IClientService,
     @Resource(name = "common-service")
     protected ICommonClientService commonClientService;
 
+    @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME)
+    private ExposablePropertyPlaceholderConfigurer configurer;
+
     private String cifexURL;
 
     private String cifexRecipient;
@@ -115,6 +120,11 @@ public abstract class AbstractClientService implements IClientService,
         this.requestContextProvider = requestContextProvider;
     }
 
+    protected Properties getServiceProperties()
+    {
+        return configurer == null ? new Properties() : configurer.getResolvedProps();
+    }
+
     protected void transformXML(IEntityPropertiesHolder propertiesHolder)
     {
         new XMLPropertyTransformer().transformXMLProperties(Arrays.asList(propertiesHolder));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
index b808aaae97e..bdf71ab1ee6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProvider.java
@@ -20,7 +20,9 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
+import java.util.Set;
 
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil.SectionProperties;
@@ -52,6 +54,8 @@ public class WebClientConfigurationProvider
     private static final String HIDE_FILE_VIEW = "hide-file-view";
 
     private static final String DEFAULT_VIEW_MODE = "default-view-mode";
+    
+    static final String TECHNOLOGIES = "technologies";
 
     private WebClientConfiguration webClientConfiguration = new WebClientConfiguration();
 
@@ -62,9 +66,31 @@ public class WebClientConfigurationProvider
             return;
         }
         Properties properties = PropertyUtils.loadProperties(configurationFile);
-        webClientConfiguration = new WebClientConfiguration();
+        init(properties);
+    }
+    
+    WebClientConfigurationProvider(Properties properties)
+    {
+        init(properties);
+    }
+
+    private void init(Properties properties)
+    {
         webClientConfiguration.setDefaultViewMode(extractDefaultViewMode(properties));
         webClientConfiguration.setViews(extractHiddenSections(properties));
+        SectionProperties[] props =
+                PropertyParametersUtil.extractSectionProperties(properties, TECHNOLOGIES, false);
+        for (SectionProperties sectionProperties : props)
+        {
+            Properties technologyProperties = sectionProperties.getProperties();
+            Set<Entry<Object, Object>> entrySet = technologyProperties.entrySet();
+            Map<String, String> map = new HashMap<String, String>();
+            for (Entry<Object, Object> entry : entrySet)
+            {
+                map.put(entry.getKey().toString(), entry.getValue().toString());
+            }
+            webClientConfiguration.addPropertiesForTechnology(sectionProperties.getKey(), map);
+        }
     }
 
     private Map<String, DetailViewConfiguration> extractHiddenSections(Properties properties)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index 221b3612fb5..16a65d16c27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -83,7 +83,7 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
 
     @Resource(name = ComponentNames.REMOTE_HOST_VALIDATOR)
     private IRemoteHostValidator remoteHostValidator;
-
+    
     protected AbstractServer()
     {
         operationLog.info(String.format("Creating new '%s' implementation: '%s'.", IServer.class
@@ -108,7 +108,7 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
         this.sampleTypeSlaveServerPlugin = sampleTypeSlaveServerPlugin;
         this.dataSetTypeSlaveServerPlugin = dataSetTypeSlaveServerPlugin;
     }
-
+    
     public final void setSampleTypeSlaveServerPlugin(
             ISampleTypeSlaveServerPlugin sampleTypeSlaveServerPlugin)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
index a50f4946483..4247bb28b4c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebClientConfiguration.java
@@ -35,8 +35,21 @@ public class WebClientConfiguration implements IsSerializable, Serializable
 
     private Map<String, DetailViewConfiguration> views =
             new HashMap<String, DetailViewConfiguration>();
+    
+    private Map<String, Map<String, String>> technologyProperties = new HashMap<String, Map<String, String>>();
 
     private ViewMode defaultViewMode;
+    
+    public String getPropertyOrNull(String technology, String key)
+    {
+        Map<String, String> properties = technologyProperties.get(technology);
+        return properties == null ? null : properties.get(key);
+    }
+    
+    public void addPropertiesForTechnology(String technology, Map<String, String> properties)
+    {
+        technologyProperties.put(technology, properties);
+    }
 
     public Map<String, DetailViewConfiguration> getViews()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/DemoViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/DemoViewContext.java
index 4fb51b6b3ed..f49923ce3ac 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/DemoViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/DemoViewContext.java
@@ -22,8 +22,7 @@ public final class DemoViewContext extends AbstractPluginViewContext<IDemoClient
         super(commonViewContext);
     }
 
-    @Override
-    protected String getTechnology()
+    public String getTechnology()
     {
         return TECHNOLOGY_NAME;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/GenericViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/GenericViewContext.java
index c577a7905bd..c9ee5584605 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/GenericViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/GenericViewContext.java
@@ -22,8 +22,7 @@ public final class GenericViewContext extends AbstractPluginViewContext<IGeneric
         super(commonViewContext);
     }
 
-    @Override
-    protected String getTechnology()
+    public String getTechnology()
     {
         return TECHNOLOGY_NAME;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryViewContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryViewContext.java
index 6dbfa66cce2..098df87a2d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryViewContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/QueryViewContext.java
@@ -38,8 +38,7 @@ public class QueryViewContext extends AbstractPluginViewContext<IQueryClientServ
         super(commonViewContext);
     }
 
-    @Override
-    protected String getTechnology()
+    public String getTechnology()
     {
         return TECHNOLOGY_NAME;
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProviderTest.java
new file mode 100644
index 00000000000..938b5c8bdf1
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/WebClientConfigurationProviderTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed 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 ch.systemsx.cisd.openbis.generic.client.web.server;
+
+import java.util.Properties;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebClientConfiguration;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class WebClientConfigurationProviderTest extends AssertJUnit
+{
+    @Test
+    public void testNoTechnologyProperties()
+    {
+        WebClientConfigurationProvider provider = new WebClientConfigurationProvider(new Properties());
+        assertEquals(null, provider.getWebClientConfiguration().getPropertyOrNull("hello", "world"));
+    }
+    
+    @Test
+    public void testTechnologyProperties()
+    {
+        Properties properties = new Properties();
+        properties.setProperty(WebClientConfigurationProvider.TECHNOLOGIES, "t1, t2");
+        properties.setProperty("t1.a" , "alpha1");
+        properties.setProperty("t2.b" , "beta1");
+        
+        WebClientConfigurationProvider provider = new WebClientConfigurationProvider(properties);
+        WebClientConfiguration webClientConfiguration = provider.getWebClientConfiguration();
+        
+        assertEquals("alpha1", webClientConfiguration.getPropertyOrNull("t1", "a"));
+        assertEquals(null, provider.getWebClientConfiguration().getPropertyOrNull("t2", "a"));
+    }
+    
+    
+}
-- 
GitLab