You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/12/25 09:02:01 UTC

[openmeetings] 01/01: no jira: H2 is being used as main test DB

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch h2-test-DB
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 908fa6298519d5d6448f331a3a909cbf0742ceaa
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Dec 25 16:01:41 2018 +0700

    no jira: H2 is being used as main test DB
---
 openmeetings-core/pom.xml                          |  1 -
 .../java/org/apache/openmeetings/cli/Admin.java    |  2 +-
 .../cli/ConnectionPropertiesPatcher.java           | 19 +++--
 .../org/apache/openmeetings/cli/H2Patcher.java     | 26 +++++++
 .../service/calendar/caldav/IcalUtils.java         | 25 ++++---
 .../openmeetings/util/ConnectionProperties.java    | 20 ++++--
 .../org/apache/openmeetings/util/OmFileHelper.java |  6 +-
 openmeetings-web/pom.xml                           |  8 ++-
 .../web/pages/install/InstallWizard.java           | 58 ++++++++++------
 .../WEB-INF/classes/META-INF/h2_persistence.xml    | 81 ++++++++++++++++++++++
 .../org/apache/openmeetings/cli/TestAdmin.java     |  4 +-
 .../openmeetings/derby/PrepareSystemFiles.java     |  2 +-
 .../webservice/AbstractWebServiceTest.java         | 17 ++++-
 pom.xml                                            |  8 ++-
 14 files changed, 221 insertions(+), 56 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index d7538d8..a6b4b0e 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -98,7 +98,6 @@
 		<dependency>
 			<groupId>org.kurento</groupId>
 			<artifactId>kurento-client</artifactId>
-			<version>6.8.0</version>
 		</dependency>
 		<!-- Test dependencies -->
 		<dependency>
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
index 00838cc..5317515 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
@@ -320,7 +320,7 @@ public class Admin {
 				|| cmdl.hasOption(OPTION_DB_PORT) || cmdl.hasOption(OPTION_DB_NAME) || cmdl.hasOption(OPTION_DB_USER)
 				|| cmdl.hasOption(OPTION_DB_PASS))
 		{
-			String dbType = cmdl.getOptionValue(OPTION_DB_TYPE, DbType.derby.name());
+			String dbType = cmdl.getOptionValue(OPTION_DB_TYPE, DbType.DERBY.getLabel());
 			connectionProperties = ConnectionPropertiesPatcher.patch(dbType
 					, cmdl.getOptionValue(OPTION_DB_HOST, "localhost")
 					, cmdl.getOptionValue(OPTION_DB_PORT, null)
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/ConnectionPropertiesPatcher.java b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/ConnectionPropertiesPatcher.java
index 6fc273d..80ab310 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/ConnectionPropertiesPatcher.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/ConnectionPropertiesPatcher.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.cli;
 
 import java.io.File;
+import java.util.Locale;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -50,22 +51,25 @@ public abstract class ConnectionPropertiesPatcher {
 	public static ConnectionPropertiesPatcher getPatcher(ConnectionProperties props) {
 		ConnectionPropertiesPatcher patcher;
 		switch (props.getDbType()) {
-			case db2:
+			case DB2:
 				patcher = new Db2Patcher();
 				break;
-			case mssql:
+			case MSSQL:
 				patcher = new MssqlPatcher();
 				break;
-			case mysql:
+			case MYSQL:
 				patcher = new MysqlPatcher();
 				break;
-			case oracle:
+			case ORACLE:
 				patcher = new OraclePatcher();
 				break;
-			case postgresql:
+			case POSTGRESQL:
 				patcher = new PostgresPatcher();
 				break;
-			case derby:
+			case H2:
+				patcher = new H2Patcher();
+				break;
+			case DERBY:
 			default:
 				patcher = new DerbyPatcher();
 				break;
@@ -165,7 +169,8 @@ public abstract class ConnectionPropertiesPatcher {
 				try {
 					//will try to "guess" dbType
 					String[] parts = prop.split(":");
-					connectionProperties.setDbType("sqlserver".equals(parts[1]) ? DbType.mssql : DbType.valueOf(parts[1]));
+					final String name = parts[1].toUpperCase(Locale.ROOT);
+					connectionProperties.setDbType("SQLSERVER".equals(name) ? DbType.MSSQL : DbType.valueOf(name));
 				} catch (Exception e) {
 					//ignore
 				}
diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/H2Patcher.java b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/H2Patcher.java
new file mode 100644
index 0000000..a6ab29f
--- /dev/null
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/H2Patcher.java
@@ -0,0 +1,26 @@
+/*
+ * 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.openmeetings.cli;
+
+public class H2Patcher extends ConnectionPropertiesPatcher {
+	@Override
+	protected String getUrl(String _url, String host, String _port, String _db) {
+		return _url; // no processing
+	}
+}
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
index fe96d1a..7a4acd1 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/caldav/IcalUtils.java
@@ -53,7 +53,7 @@ import net.fortuna.ical4j.model.DateTime;
 import net.fortuna.ical4j.model.Parameter;
 import net.fortuna.ical4j.model.Property;
 import net.fortuna.ical4j.model.PropertyList;
-import net.fortuna.ical4j.model.Recur;
+import net.fortuna.ical4j.model.Recur.Frequency;
 import net.fortuna.ical4j.model.TimeZoneRegistry;
 import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
 import net.fortuna.ical4j.model.component.CalendarComponent;
@@ -205,17 +205,26 @@ public class IcalUtils {
 		}
 
 		if (recur != null) {
-			Parameter freq = recur.getParameter("FREQ");
-			if (freq != null) {
-				if (freq.getValue().equals(Recur.DAILY)) {
+			Parameter pFreq = recur.getParameter("FREQ");
+			Frequency freq = Frequency.valueOf(pFreq.getValue());
+			switch (freq) {
+				case DAILY:
 					a.setIsDaily(true);
-				} else if (freq.getValue().equals(Recur.WEEKLY)) {
+					break;
+				case WEEKLY:
 					a.setIsWeekly(true);
-				} else if (freq.getValue().equals(Recur.MONTHLY)) {
+					break;
+				case MONTHLY:
 					a.setIsMonthly(true);
-				} else if (freq.getValue().equals(Recur.YEARLY)) {
+					break;
+				case YEARLY:
 					a.setIsYearly(true);
-				}
+					break;
+				case SECONDLY:
+				case MINUTELY:
+				case HOURLY:
+				default:
+					break;
 			}
 		}
 
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/ConnectionProperties.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/ConnectionProperties.java
index 9bdd639..1223467 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/ConnectionProperties.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/ConnectionProperties.java
@@ -19,24 +19,30 @@
 package org.apache.openmeetings.util;
 
 import java.io.Serializable;
+import java.util.Locale;
 
 public class ConnectionProperties implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	public enum DbType {
-		db2
-		, derby
-		, mssql
-		, mysql
-		, oracle
-		, postgresql
+		DB2
+		, DERBY
+		, MSSQL
+		, MYSQL
+		, ORACLE
+		, POSTGRESQL
+		, H2; // for testing purposes
+
+		public final String getLabel() {
+			return name().toLowerCase(Locale.ROOT);
+		}
 	}
 
 	private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
 	private String url = "jdbc:derby:openmeetings";
 	private String login = "user";
 	private String password = "secret";
-	private DbType dbType = DbType.derby;
+	private DbType dbType = DbType.DERBY;
 
 	public String getDriver() {
 		return driver;
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
index fee3d02..b014e42 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
@@ -31,6 +31,7 @@ import java.util.Locale;
 import java.util.Properties;
 
 import org.apache.openmeetings.util.ConnectionProperties.DbType;
+import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -255,11 +256,12 @@ public class OmFileHelper {
 	}
 
 	public static File getPersistence(String dbType) {
-		return getPersistence(DbType.valueOf(dbType));
+		return getPersistence(Strings.isEmpty(dbType) ? null
+				: DbType.valueOf(dbType.toUpperCase(Locale.ROOT)));
 	}
 
 	public static File getPersistence(DbType dbType) {
-		return new File(OmFileHelper.getWebinfDir(), dbType == null ? PERSISTENCE_NAME : String.format(DB_PERSISTENCE_NAME, dbType));
+		return new File(OmFileHelper.getWebinfDir(), dbType == null ? PERSISTENCE_NAME : String.format(DB_PERSISTENCE_NAME, dbType.getLabel()));
 	}
 
 	public static File getLdapConf(String name) {
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 94092e4..3fb30fc 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -521,7 +521,7 @@
 						<phase>generate-test-resources</phase>
 						<configuration>
 							<target>
-								<copy file="${project.basedir}/src/main/webapp/WEB-INF/classes/META-INF/derby_persistence.xml"
+								<copy file="${project.basedir}/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml"
 									tofile="${project.build.directory}/generated-test-res/META-INF/persistence.xml"
 									overwrite="true" force="true"/>
 							</target>
@@ -738,5 +738,11 @@
 			<artifactId>mockito-core</artifactId>
 			<scope>test</scope>
 		</dependency>
+<dependency>
+    <groupId>com.h2database</groupId>
+    <artifactId>h2</artifactId>
+    <version>1.4.197</version>
+    <scope>test</scope>
+</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
index d746010..df90df0 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/install/InstallWizard.java
@@ -34,9 +34,11 @@ import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.openmeetings.cli.ConnectionPropertiesPatcher;
 import org.apache.openmeetings.core.converter.DocumentConverter;
@@ -195,21 +197,20 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 		}
 	}
 
-	private final class DbStep extends BaseStep {
+	private final static class DbTypeDropDown extends DropDownChoice<DbType> {
 		private static final long serialVersionUID = 1L;
-		private final RequiredTextField<String> host = new RequiredTextField<>("host", Model.of(""));
-		private final RequiredTextField<Integer> port = new RequiredTextField<>("port", Model.of(0));
-		private final RequiredTextField<String> dbname = new RequiredTextField<>("dbname", Model.of(""));
-		private final RequiredTextField<String> user = new RequiredTextField<>("login");
-		private final TextField<String> pass = new TextField<>("password");
-		private final Form<ConnectionProperties> form = new Form<ConnectionProperties>("form", new CompoundPropertyModel<>(getProps(null))) {
-			private static final long serialVersionUID = 1L;
-			private final DropDownChoice<DbType> db = new DropDownChoice<>("dbType", Arrays.asList(DbType.values()), new ChoiceRenderer<DbType>() {
+
+		public DbTypeDropDown(String id) {
+			super(id);
+			Set<DbType> types = new LinkedHashSet<>(Arrays.asList(DbType.values()));
+			types.remove(DbType.H2);
+			setChoices(new ArrayList<>(types));
+			setChoiceRenderer(new ChoiceRenderer<DbType>() {
 				private static final long serialVersionUID = 1L;
 
 				@Override
 				public Object getDisplayValue(DbType object) {
-					return getString(String.format("install.wizard.db.step.%s.name", object.name()));
+					return getString(String.format("install.wizard.db.step.%s.name", object.getLabel()));
 				}
 
 				@Override
@@ -217,6 +218,19 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 					return object.name();
 				}
 			});
+		}
+	}
+
+	private final class DbStep extends BaseStep {
+		private static final long serialVersionUID = 1L;
+		private final RequiredTextField<String> host = new RequiredTextField<>("host", Model.of(""));
+		private final RequiredTextField<Integer> port = new RequiredTextField<>("port", Model.of(0));
+		private final RequiredTextField<String> dbname = new RequiredTextField<>("dbname", Model.of(""));
+		private final RequiredTextField<String> user = new RequiredTextField<>("login");
+		private final TextField<String> pass = new TextField<>("password");
+		private final Form<ConnectionProperties> form = new Form<ConnectionProperties>("form", new CompoundPropertyModel<>(getProps(null))) {
+			private static final long serialVersionUID = 1L;
+			private final DbTypeDropDown db = new DbTypeDropDown("dbType");
 
 			@Override
 			protected void onInitialize() {
@@ -247,7 +261,7 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 			}
 
 			private String getDbName(ConnectionProperties props) {
-				return getString("install.wizard.db.step.instructions." + props.getDbType().name());
+				return getString("install.wizard.db.step.instructions." + props.getDbType().getLabel());
 			}
 
 			@Override
@@ -266,13 +280,13 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 					valid = conn.isValid(0); //no timeout
 					String sql = null;
 					switch (props.getDbType()) {
-						case db2:
+						case DB2:
 							sql = "select count(*) from systables";
 							break;
-						case oracle:
+						case ORACLE:
 							sql = "SELECT 1 FROM DUAL";
 							break;
-						case derby:
+						case DERBY:
 							sql = "SELECT 1 FROM SYSIBM.SYSDUMMY1";
 							break;
 						default:
@@ -330,7 +344,7 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 					return props; // initial select
 				}
 				props = ConnectionPropertiesPatcher.getConnectionProperties(conf);
-				if (DbType.derby != props.getDbType()) {
+				if (DbType.DERBY != props.getDbType()) {
 					// resetting default login/password
 					props.setLogin(null);
 					props.setPassword(null);
@@ -344,13 +358,13 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 		private void initForm(boolean getProps, AjaxRequestTarget target) {
 			ConnectionProperties props = getProps ? getProps(form.getModelObject().getDbType()) : form.getModelObject();
 			form.setModelObject(props);
-			host.setVisible(props.getDbType() != DbType.derby);
-			port.setVisible(props.getDbType() != DbType.derby);
-			user.setVisible(props.getDbType() != DbType.derby);
-			pass.setVisible(props.getDbType() != DbType.derby);
+			host.setVisible(props.getDbType() != DbType.DERBY);
+			port.setVisible(props.getDbType() != DbType.DERBY);
+			user.setVisible(props.getDbType() != DbType.DERBY);
+			pass.setVisible(props.getDbType() != DbType.DERBY);
 			try {
 				switch (props.getDbType()) {
-					case mssql: {
+					case MSSQL: {
 						String url = props.getURL().substring("jdbc:sqlserver://".length());
 						String[] parts = url.split(";");
 						String[] hp = parts[0].split(":");
@@ -359,14 +373,14 @@ public class InstallWizard extends AbstractWizard<InstallationConfig> {
 						dbname.setModelObject(parts[1].substring(parts[1].indexOf('=') + 1));
 						}
 						break;
-					case oracle: {
+					case ORACLE: {
 						String[] parts = props.getURL().split(":");
 						host.setModelObject(parts[3].substring(1));
 						port.setModelObject(Integer.parseInt(parts[4]));
 						dbname.setModelObject(parts[5]);
 						}
 						break;
-					case derby: {
+					case DERBY: {
 						host.setModelObject("");
 						port.setModelObject(0);
 						String[] parts = props.getURL().split(";");
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
new file mode 100644
index 0000000..f22558c
--- /dev/null
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/META-INF/h2_persistence.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+
+-->
+<!-- persistence.xml schema -->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+		version="2.0">
+	<persistence-unit name="openmeetings" transaction-type="RESOURCE_LOCAL">
+		<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
+		<class>org.apache.openmeetings.db.entity.HistoricalEntity</class>
+		<class>org.apache.openmeetings.db.entity.basic.ChatMessage</class>
+		<class>org.apache.openmeetings.db.entity.basic.Configuration</class>
+		<class>org.apache.openmeetings.db.entity.basic.MailMessage</class>
+		<class>org.apache.openmeetings.db.entity.calendar.Appointment</class>
+		<class>org.apache.openmeetings.db.entity.calendar.MeetingMember</class>
+		<class>org.apache.openmeetings.db.entity.calendar.OmCalendar</class>
+		<class>org.apache.openmeetings.db.entity.file.BaseFileItem</class>
+		<class>org.apache.openmeetings.db.entity.file.FileItem</class>
+		<class>org.apache.openmeetings.db.entity.file.FileItemLog</class>
+		<class>org.apache.openmeetings.db.entity.log.ConferenceLog</class>
+		<class>org.apache.openmeetings.db.entity.record.Recording</class>
+		<class>org.apache.openmeetings.db.entity.record.RecordingChunk</class>
+		<class>org.apache.openmeetings.db.entity.room.Invitation</class>
+		<class>org.apache.openmeetings.db.entity.room.Room</class>
+		<class>org.apache.openmeetings.db.entity.room.RoomFile</class>
+		<class>org.apache.openmeetings.db.entity.room.RoomGroup</class>
+		<class>org.apache.openmeetings.db.entity.room.RoomModerator</class>
+		<class>org.apache.openmeetings.db.entity.room.RoomPoll</class>
+		<class>org.apache.openmeetings.db.entity.room.RoomPollAnswer</class>
+		<class>org.apache.openmeetings.db.entity.server.LdapConfig</class>
+		<class>org.apache.openmeetings.db.entity.server.OAuthServer</class>
+		<class>org.apache.openmeetings.db.entity.server.Sessiondata</class>
+		<class>org.apache.openmeetings.db.entity.server.SOAPLogin</class>
+		<class>org.apache.openmeetings.db.entity.user.Address</class>
+		<class>org.apache.openmeetings.db.entity.user.AsteriskSipUser</class>
+		<class>org.apache.openmeetings.db.entity.user.Group</class>
+		<class>org.apache.openmeetings.db.entity.user.GroupUser</class>
+		<class>org.apache.openmeetings.db.entity.user.PrivateMessage</class>
+		<class>org.apache.openmeetings.db.entity.user.PrivateMessageFolder</class>
+		<class>org.apache.openmeetings.db.entity.user.User</class>
+		<class>org.apache.openmeetings.db.entity.user.UserContact</class>
+		<exclude-unlisted-classes>false</exclude-unlisted-classes>
+		<properties>
+			<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
+			<property name="openjpa.ConnectionDriverName" value="org.apache.commons.dbcp2.BasicDataSource" />
+			<property name="openjpa.ConnectionProperties"
+				value="DriverClassName=org.h2.Driver,
+						Url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1,
+						create=true,
+						MaxActive=100,
+						MaxWait=10000,
+						TestOnBorrow=true,
+						Username=omdbuser,
+						Password=" />
+			<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
+			<property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO" />
+			<property name="openjpa.DataCache" value="true" />
+			<!-- QueryCache disabled due to changes outside of JPA doesn't take effect with caching -->
+			<property name="openjpa.QueryCache" value="false" />
+			<property name="openjpa.jdbc.DBDictionary" value="batchLimit=100" />
+			<property name="openjpa.jdbc.QuerySQLCache" value="false" />
+		</properties>
+	</persistence-unit>
+</persistence>
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java b/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java
index d6e0395..543c995 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/cli/TestAdmin.java
@@ -18,7 +18,7 @@
  */
 package org.apache.openmeetings.cli;
 
-import static org.apache.commons.io.FileUtils.deleteDirectory;
+import static org.apache.commons.io.FileUtils.deleteQuietly;
 import static org.apache.openmeetings.AbstractJUnitDefaults.adminUsername;
 import static org.apache.openmeetings.AbstractJUnitDefaults.email;
 import static org.apache.openmeetings.AbstractJUnitDefaults.group;
@@ -63,7 +63,7 @@ public class TestAdmin {
 	public void tearDown() throws IOException {
 		resetDerbyHome();
 		System.getProperties().remove(RED5_HOME);
-		deleteDirectory(tempFolder);
+		deleteQuietly(tempFolder);
 		WebApplication app = (WebApplication)Application.get(getWicketApplicationName());
 		if (app != null) {
 			destroyApplication();
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/derby/PrepareSystemFiles.java b/openmeetings-web/src/test/java/org/apache/openmeetings/derby/PrepareSystemFiles.java
index 3e6f6f7..3987450 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/derby/PrepareSystemFiles.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/derby/PrepareSystemFiles.java
@@ -50,7 +50,7 @@ public class PrepareSystemFiles {
 				conf.delete();
 			}
 
-			ConnectionPropertiesPatcher.patch(DbType.derby.name()
+			ConnectionPropertiesPatcher.patch(DbType.DERBY.name()
 					, "localhost"
 					, "1527"
 					, databaseHomeDirectory + "openmeetings"
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
index d2ac7fd..b2a2cd2 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
@@ -20,10 +20,13 @@ package org.apache.openmeetings.webservice;
 
 import static java.util.UUID.randomUUID;
 import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
+import static org.apache.commons.io.FileUtils.deleteQuietly;
 import static org.apache.openmeetings.AbstractJUnitDefaults.createPass;
 import static org.apache.openmeetings.AbstractJUnitDefaults.ensureSchema;
 import static org.apache.openmeetings.AbstractJUnitDefaults.soapUsername;
 import static org.apache.openmeetings.AbstractJUnitDefaults.userpass;
+import static org.apache.openmeetings.AbstractSpringTest.setOmHome;
+import static org.apache.openmeetings.cli.Admin.RED5_HOME;
 import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplication;
 import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
 import static org.junit.Assert.assertEquals;
@@ -35,6 +38,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.InetAddress;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -48,7 +52,6 @@ import org.apache.catalina.startup.Tomcat;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
-import org.apache.openmeetings.AbstractSpringTest;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
@@ -59,12 +62,14 @@ import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.installation.ImportInitvalues;
 import org.apache.openmeetings.webservice.util.AppointmentMessageBodyReader;
+import org.apache.tomcat.util.scan.Constants;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
 public class AbstractWebServiceTest {
+	private static Path TEMP_TOMCAT_BASE;
 	private static Tomcat tomcat;
 	private static final String HOST = "localhost";
 	private static final String CONTEXT = "/openmeetings";
@@ -106,14 +111,18 @@ public class AbstractWebServiceTest {
 
 	@BeforeClass
 	public static void initialize() throws Exception {
-		AbstractSpringTest.init();
+		setOmHome();
+		System.setProperty(Constants.SKIP_JARS_PROPERTY, "*");
+		TEMP_TOMCAT_BASE = Files.createTempDirectory("om" + randomUUID().toString());
+		File wd = TEMP_TOMCAT_BASE.toFile();
+		System.setProperty("user.dir", wd.getCanonicalPath());
+		System.setProperty(RED5_HOME, getOmHome().getCanonicalPath());
 		tomcat = new Tomcat();
 		Connector connector = new Connector("HTTP/1.1");
 		connector.setAttribute("address", InetAddress.getByName(HOST).getHostAddress());
 		connector.setPort(0);
 		tomcat.getService().addConnector(connector);
 		tomcat.setConnector(connector);
-		File wd = Files.createTempDirectory("om" + randomUUID().toString()).toFile();
 		tomcat.setBaseDir(wd.getCanonicalPath());
 		tomcat.getHost().setAppBase(wd.getCanonicalPath());
 		tomcat.getHost().setAutoDeploy(false);
@@ -137,6 +146,8 @@ public class AbstractWebServiceTest {
 			}
 			tomcat.destroy();
 		}
+		System.getProperties().remove(RED5_HOME);
+		deleteQuietly(TEMP_TOMCAT_BASE.toFile());
 	}
 
 	protected static CallResult<RoomDTO> createAndValidate(RoomDTO r) {
diff --git a/pom.xml b/pom.xml
index 6539adc..03e2d14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@
 		<wicket.version>8.3.0-SNAPSHOT</wicket.version>
 		<wicketju.version>8.1.0</wicketju.version>
 		<wickets.version>8.2.0</wickets.version>
-		<red5-client.version>1.0.10-M9</red5-client.version>
+		<red5-client.version>1.0.10-M10</red5-client.version>
 		<spring.version>5.1.3.RELEASE</spring.version>
 		<mina.version>2.0.19</mina.version>
 		<tomcat.version>9.0.14</tomcat.version>
@@ -113,6 +113,7 @@
 		<license.excludedScopes>test</license.excludedScopes>
 		<bcprov-jdk15on.version>1.60</bcprov-jdk15on.version>
 		<mockito.version>2.23.4</mockito.version>
+		<kurento.version>6.9.0</kurento.version>
 		<!--  URL of the ASF SonarQube server  -->
 		<sonar.host.url>https://builds.apache.org/analysis</sonar.host.url>
 		<!--  Exclude all generated code  -->
@@ -643,6 +644,11 @@
 				<version>${mockito.version}</version>
 				<scope>test</scope>
 			</dependency>
+			<dependency>
+				<groupId>org.kurento</groupId>
+				<artifactId>kurento-client</artifactId>
+				<version>${kurento.version}</version>
+			</dependency>
 		</dependencies>
 	</dependencyManagement>
 	<dependencies>