From 964c2e432f2f960f8ada5c0f2599fe153d0df22e Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Fri, 23 May 2014 23:04:46 +0200
Subject: [PATCH] Include JavaConfig based configuration in spring main
 configuration

This will allow dynamic configuration depending on property file settings.

Removed connector client bean from XML based configuration and added bean
creation into JavaBased config class. Bean will be created if there is
a property "connector.enable" with value "true" otherwise no bean will
be created wich has the same behavior removing bean definition from XML
configuration file.

No need to change application config - can be done in property file :-)
---
 .../de/thm/arsnova/config/ExtraConfig.java    | 41 +++++++++++++++++++
 .../de/thm/arsnova/config/package-info.java   |  1 +
 .../webapp/WEB-INF/spring/spring-main.xml     |  9 +---
 src/main/webapp/arsnova.properties.example    |  1 +
 .../thm/arsnova/config/ExtraConfigTest.java   | 37 +++++++++++++++++
 src/test/resources/arsnova.properties.example |  1 +
 6 files changed, 82 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/config/ExtraConfig.java
 create mode 100644 src/main/java/de/thm/arsnova/config/package-info.java
 create mode 100644 src/test/java/de/thm/arsnova/config/ExtraConfigTest.java

diff --git a/src/main/java/de/thm/arsnova/config/ExtraConfig.java b/src/main/java/de/thm/arsnova/config/ExtraConfig.java
new file mode 100644
index 000000000..d33ce426f
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/config/ExtraConfig.java
@@ -0,0 +1,41 @@
+package de.thm.arsnova.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.core.env.Environment;
+
+import de.thm.arsnova.connector.client.ConnectorClient;
+import de.thm.arsnova.connector.client.ConnectorClientImpl;
+
+@Configuration
+@PropertySources({
+	@PropertySource("arsnova.properties.example"),
+	@PropertySource("file:///etc/arsnova/connector.properties"),
+})
+public class ExtraConfig {
+
+	@Autowired
+	private Environment env;
+
+	@Bean
+	public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
+		return new PropertySourcesPlaceholderConfigurer();
+	}
+
+	@Bean(name = "connectorClient")
+	public ConnectorClient connectorClient() {
+		if (! "true".equals(env.getProperty("connector.enable"))) {
+			return null;
+		}
+
+		ConnectorClientImpl connectorClient = new ConnectorClientImpl();
+		connectorClient.setServiceLocation(env.getProperty("connector.uri"));
+		connectorClient.setUsername(env.getProperty("connector.username"));
+		connectorClient.setPassword(env.getProperty("connector.password"));
+		return connectorClient;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/config/package-info.java b/src/main/java/de/thm/arsnova/config/package-info.java
new file mode 100644
index 000000000..87aa44641
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/config/package-info.java
@@ -0,0 +1 @@
+package de.thm.arsnova.config;
diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml
index 894bf271a..31686a7ec 100644
--- a/src/main/webapp/WEB-INF/spring/spring-main.xml
+++ b/src/main/webapp/WEB-INF/spring/spring-main.xml
@@ -23,7 +23,7 @@
 	</bean>
 
 	<context:component-scan
-		base-package="de.thm.arsnova.dao,de.thm.arsnova.services,de.thm.arsnova.events" />
+		base-package="de.thm.arsnova.dao,de.thm.arsnova.services,de.thm.arsnova.events,de.thm.arsnova.config" />
 	<context:annotation-config />
 
 	<task:annotation-driven />
@@ -43,11 +43,4 @@
 	<bean id="userService" scope="singleton" class="de.thm.arsnova.services.UserService" />
 
 	<bean id="databaseDao" class="de.thm.arsnova.dao.CouchDBDao" />
-
-	<!-- Example of connector client configuration -->
-	<!-- Uncomment bean definition to activate connector -->
-	<!-- bean id="connectorClient" scope="singleton" class="de.thm.arsnova.connector.client.ConnectorClientImpl"> 
-		<property name="serviceLocation" value="${connector.uri}"></property> <property 
-		name="username" value="${connector.username}"></property> <property name="password" 
-		value="${connector.password}"></property> </bean -->
 </beans>
diff --git a/src/main/webapp/arsnova.properties.example b/src/main/webapp/arsnova.properties.example
index 678e41714..e92e71bf6 100644
--- a/src/main/webapp/arsnova.properties.example
+++ b/src/main/webapp/arsnova.properties.example
@@ -29,6 +29,7 @@ couchdb.password=
 socketio.ip=0.0.0.0
 socketio.port=10443
 
+connector.enable=false
 connector.uri=http://localhost:8080/connector-service
 connector.username=test
 connector.password=test
diff --git a/src/test/java/de/thm/arsnova/config/ExtraConfigTest.java b/src/test/java/de/thm/arsnova/config/ExtraConfigTest.java
new file mode 100644
index 000000000..ea65c72a7
--- /dev/null
+++ b/src/test/java/de/thm/arsnova/config/ExtraConfigTest.java
@@ -0,0 +1,37 @@
+package de.thm.arsnova.config;
+
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import de.thm.arsnova.connector.client.ConnectorClient;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = {
+		"file:src/main/webapp/WEB-INF/spring/arsnova-servlet.xml",
+		"file:src/main/webapp/WEB-INF/spring/spring-main.xml",
+		"file:src/main/webapp/WEB-INF/spring/spring-security.xml",
+		"file:src/test/resources/test-config.xml",
+		"file:src/test/resources/test-socketioconfig.xml"
+})
+public class ExtraConfigTest {
+
+	@Autowired
+	PropertySourcesPlaceholderConfigurer configurer;
+
+	@Autowired(required = false)
+	private ConnectorClient connectorClient;
+
+	@Test
+	public void testShouldNotLoadConnectorClientByDefault() {
+		assertNull(connectorClient);
+	}
+
+}
diff --git a/src/test/resources/arsnova.properties.example b/src/test/resources/arsnova.properties.example
index 00c73a8d1..f5830dcb6 100644
--- a/src/test/resources/arsnova.properties.example
+++ b/src/test/resources/arsnova.properties.example
@@ -27,6 +27,7 @@ upload.filesize_b=1048576
 socketio.ip=0.0.0.0
 socketio.port=10443
 
+connector.enable=false
 connector.uri=http://localhost:8080/connector-service
 connector.username=test
 connector.password=test
-- 
GitLab