This is an automated email from the ASF dual-hosted git repository.
kimmking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 45271bf Ass JDBCOrchestrationSchemaContexts (#7068)
45271bf is described below
commit 45271bf05fe9584ccb71344b1c273cc234935002
Author: Juan Pan(Trista) <[email protected]>
AuthorDate: Tue Aug 25 19:57:43 2020 +0800
Ass JDBCOrchestrationSchemaContexts (#7068)
---
.../core/schema/OrchestrationSchemaContexts.java | 22 ++---
.../fixture/TestOrchestrationSchemaContexts.java | 3 +-
.../shardingsphere-jdbc-orchestration/pom.xml | 5 +
.../schema/JDBCOrchestrationSchemaContexts.java | 71 ++++++++++++++
.../JDBCOrchestrationSchemaContextsTest.java | 102 +++++++++++++++++++++
.../schema/ProxyOrchestrationSchemaContexts.java | 3 +-
6 files changed, 188 insertions(+), 18 deletions(-)
diff --git
a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
index b4cba98..cfce01e 100644
---
a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
+++
b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
@@ -39,7 +39,6 @@ import
org.apache.shardingsphere.kernel.context.SchemaContexts;
import org.apache.shardingsphere.kernel.context.SchemaContextsBuilder;
import org.apache.shardingsphere.kernel.context.StandardSchemaContexts;
import org.apache.shardingsphere.kernel.context.runtime.RuntimeContext;
-import org.apache.shardingsphere.kernel.context.schema.DataSourceParameter;
import org.apache.shardingsphere.kernel.context.schema.ShardingSphereSchema;
import
org.apache.shardingsphere.metrics.configuration.config.MetricsConfiguration;
import org.apache.shardingsphere.metrics.facade.MetricsTrackerManagerFacade;
@@ -59,6 +58,7 @@ import
org.apache.shardingsphere.orchestration.core.registry.event.DisabledState
import
org.apache.shardingsphere.orchestration.core.registry.schema.OrchestrationSchema;
import javax.sql.DataSource;
+import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
@@ -113,11 +113,14 @@ public abstract class OrchestrationSchemaContexts
implements SchemaContexts {
return schemaContexts.getDatabaseType();
}
- private DatabaseType getDatabaseType(final Map<String, Map<String,
DataSourceParameter>> dataSourceParametersMap) {
- if (dataSourceParametersMap.isEmpty() ||
dataSourceParametersMap.values().iterator().next().isEmpty()) {
+ private DatabaseType getDatabaseType(final Map<String, Map<String,
DataSource>> dataSourcesMap) throws SQLException {
+ if (dataSourcesMap.isEmpty() ||
dataSourcesMap.values().iterator().next().isEmpty()) {
return schemaContexts.getDatabaseType();
}
- return
DatabaseTypes.getDatabaseTypeByURL(dataSourceParametersMap.values().iterator().next().values().iterator().next().getUrl());
+ DataSource dataSource =
dataSourcesMap.values().iterator().next().values().iterator().next();
+ try (Connection connection = dataSource.getConnection()) {
+ return
DatabaseTypes.getDatabaseTypeByURL(connection.getMetaData().getURL());
+ }
}
@Override
@@ -335,8 +338,7 @@ public abstract class OrchestrationSchemaContexts
implements SchemaContexts {
private SchemaContext getAddedSchemaContext(final SchemaAddedEvent
schemaAddedEvent) throws Exception {
String schemaName = schemaAddedEvent.getShardingSchemaName();
Map<String, Map<String, DataSource>> dataSourcesMap =
createDataSourcesMap(Collections.singletonMap(schemaName,
schemaAddedEvent.getDataSourceConfigurations()));
- Map<String, Map<String, DataSourceParameter>> dataSourceParametersMap
= createDataSourceParametersMap(Collections.singletonMap(schemaName,
schemaAddedEvent.getDataSourceConfigurations()));
- DatabaseType databaseType = getDatabaseType(dataSourceParametersMap);
+ DatabaseType databaseType = getDatabaseType(dataSourcesMap);
SchemaContextsBuilder schemaContextsBuilder = new
SchemaContextsBuilder(databaseType, dataSourcesMap,
Collections.singletonMap(schemaName,
schemaAddedEvent.getRuleConfigurations()), schemaContexts.getAuthentication(),
schemaContexts.getProps().getProps());
return
schemaContextsBuilder.build().getSchemaContexts().get(schemaName);
@@ -403,12 +405,4 @@ public abstract class OrchestrationSchemaContexts
implements SchemaContexts {
protected abstract Map<String, DataSource>
getModifiedDataSources(SchemaContext oldSchemaContext, Map<String,
DataSourceConfiguration> newDataSources) throws Exception;
protected abstract Map<String, Map<String, DataSource>>
createDataSourcesMap(Map<String, Map<String, DataSourceConfiguration>>
dataSourcesMap) throws Exception;
-
- /**
- * Create data source parameters map.
- *
- * @param dataSourcesMap data source map
- * @return data source parameters map
- */
- public abstract Map<String, Map<String, DataSourceParameter>>
createDataSourceParametersMap(Map<String, Map<String, DataSourceConfiguration>>
dataSourcesMap);
}
diff --git
a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/test/java/org/apache/shardingsphere/orchestration/core/schema/fixture/TestOrchestrationSchemaContexts.java
b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/test/java/org/apache/shardingsphere/orchestration/core/schema/fixture/TestOrchestrationSchemaCont
[...]
index 91eed66..3e8bf98 100644
---
a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/test/java/org/apache/shardingsphere/orchestration/core/schema/fixture/TestOrchestrationSchemaContexts.java
+++
b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/test/java/org/apache/shardingsphere/orchestration/core/schema/fixture/TestOrchestrationSchemaContexts.java
@@ -74,8 +74,7 @@ public final class TestOrchestrationSchemaContexts extends
OrchestrationSchemaCo
return result;
}
- @Override
- public Map<String, Map<String, DataSourceParameter>>
createDataSourceParametersMap(final Map<String, Map<String,
DataSourceConfiguration>> dataSourcesMap) {
+ private Map<String, Map<String, DataSourceParameter>>
createDataSourceParametersMap(final Map<String, Map<String,
DataSourceConfiguration>> dataSourcesMap) {
Map<String, Map<String, DataSourceParameter>> result = new
LinkedHashMap<>();
for (Map.Entry<String, Map<String, DataSourceConfiguration>> entry :
dataSourcesMap.entrySet()) {
result.put(entry.getKey(),
getDataSourceParameterMap(entry.getValue()));
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/pom.xml
b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/pom.xml
index b583a73..523b702 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/pom.xml
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/pom.xml
@@ -44,6 +44,11 @@
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
+ <artifactId>shardingsphere-orchestration-core-schema</artifactId>
+ <version>${project.parent.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-orchestration-repository-api</artifactId>
<version>${project.version}</version>
</dependency>
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
new file mode 100644
index 0000000..11578f0
--- /dev/null
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
@@ -0,0 +1,71 @@
+/*
+ * 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.shardingsphere.driver.orchestration.internal.schema;
+
+import com.google.common.collect.Maps;
+import org.apache.commons.collections4.map.LinkedMap;
+import
org.apache.shardingsphere.driver.orchestration.internal.util.DataSourceConverter;
+import org.apache.shardingsphere.infra.config.DataSourceConfiguration;
+import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.apache.shardingsphere.kernel.context.SchemaContext;
+import org.apache.shardingsphere.kernel.context.SchemaContexts;
+import org.apache.shardingsphere.orchestration.core.facade.OrchestrationFacade;
+import
org.apache.shardingsphere.orchestration.core.schema.OrchestrationSchemaContexts;
+
+import javax.sql.DataSource;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * JDBC orchestration schemaContexts.
+ */
+public final class JDBCOrchestrationSchemaContexts extends
OrchestrationSchemaContexts {
+
+ protected JDBCOrchestrationSchemaContexts(final SchemaContexts
schemaContexts, final OrchestrationFacade orchestrationFacade) {
+ super(schemaContexts, orchestrationFacade);
+ }
+
+ @Override
+ protected Map<String, DataSource> getAddedDataSources(final SchemaContext
oldSchemaContext, final Map<String, DataSourceConfiguration> newDataSources)
throws Exception {
+ Map<String, DataSourceConfiguration> newDataSourceConfigs =
Maps.filterKeys(newDataSources, each ->
!oldSchemaContext.getSchema().getDataSources().containsKey(each));
+ return DataSourceConverter.getDataSourceMap(newDataSourceConfigs);
+ }
+
+ @Override
+ protected Map<String, DataSource> getModifiedDataSources(final
SchemaContext oldSchemaContext, final Map<String, DataSourceConfiguration>
newDataSources) throws Exception {
+ Map<String, DataSourceConfiguration> modifiedDataSourceConfigs =
+
newDataSources.entrySet().stream().filter(this::isModifiedDataSource).collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (key, repeatKey) -> key, LinkedHashMap::new));
+ return DataSourceConverter.getDataSourceMap(modifiedDataSourceConfigs);
+ }
+
+ private synchronized boolean isModifiedDataSource(final Entry<String,
DataSourceConfiguration> dataSourceConfigs) {
+ Map<String, DataSourceConfiguration> oldDataSourceConfigs =
DataSourceConverter.getDataSourceConfigurationMap(getSchemaContexts().get(DefaultSchema.LOGIC_NAME).getSchema().getDataSources());
+ return oldDataSourceConfigs.containsKey(dataSourceConfigs.getKey()) &&
!oldDataSourceConfigs.get(dataSourceConfigs.getKey()).equals(dataSourceConfigs.getValue());
+ }
+
+ @Override
+ protected Map<String, Map<String, DataSource>> createDataSourcesMap(final
Map<String, Map<String, DataSourceConfiguration>> dataSourcesMap) throws
Exception {
+ Map<String, Map<String, DataSource>> result = new
LinkedMap<>(dataSourcesMap.size());
+ for (Entry<String, Map<String, DataSourceConfiguration>> entry :
dataSourcesMap.entrySet()) {
+ result.put(entry.getKey(),
DataSourceConverter.getDataSourceMap(entry.getValue()));
+ }
+ return result;
+ }
+}
diff --git
a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/test/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContextsTest.java
b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/test/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContextsTest.java
new file mode 100644
index 0000000..3adb45e
--- /dev/null
+++
b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/test/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContextsTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.shardingsphere.driver.orchestration.internal.schema;
+
+import org.apache.commons.collections4.map.LinkedMap;
+import org.apache.commons.dbcp2.BasicDataSource;
+import
org.apache.shardingsphere.driver.orchestration.internal.util.DataSourceConverter;
+import org.apache.shardingsphere.infra.auth.Authentication;
+import org.apache.shardingsphere.infra.config.DataSourceConfiguration;
+import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
+import org.apache.shardingsphere.kernel.context.SchemaContext;
+import org.apache.shardingsphere.kernel.context.StandardSchemaContexts;
+import org.apache.shardingsphere.kernel.context.runtime.RuntimeContext;
+import org.apache.shardingsphere.kernel.context.schema.ShardingSphereSchema;
+import
org.apache.shardingsphere.orchestration.core.common.event.DataSourceChangedEvent;
+import org.apache.shardingsphere.orchestration.core.facade.OrchestrationFacade;
+import org.apache.shardingsphere.orchestration.core.registry.RegistryCenter;
+import org.apache.shardingsphere.transaction.ShardingTransactionManagerEngine;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.sql.DataSource;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(MockitoJUnitRunner.class)
+public final class JDBCOrchestrationSchemaContextsTest {
+
+ @Mock
+ private RegistryCenter registryCenter;
+
+ @Mock
+ private OrchestrationFacade facade;
+
+ private JDBCOrchestrationSchemaContexts schemaContexts;
+
+ @Before
+ public void setUp() {
+
when(registryCenter.loadDisabledDataSources()).thenReturn(Collections.emptyList());
+ when(facade.getRegistryCenter()).thenReturn(registryCenter);
+ schemaContexts = new JDBCOrchestrationSchemaContexts(new
StandardSchemaContexts(new LinkedMap<>(), new Authentication(),
+ new ConfigurationProperties(new Properties()), new
H2DatabaseType()), facade);
+ }
+
+ private Map<String, SchemaContext> getSchemaContextMap() {
+ ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+ when(schema.getDataSources()).thenReturn(getDataSources());
+ RuntimeContext runtimeContext = mock(RuntimeContext.class);
+ when(runtimeContext.getTransactionManagerEngine()).thenReturn(new
ShardingTransactionManagerEngine());
+ SchemaContext result = new SchemaContext(DefaultSchema.LOGIC_NAME,
schema, runtimeContext);
+ return Collections.singletonMap(DefaultSchema.LOGIC_NAME, result);
+ }
+
+ private Map<String, DataSource> getDataSources() {
+ BasicDataSource result = new BasicDataSource();
+ result.setDriverClassName("org.h2.Driver");
+
result.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL");
+ result.setUsername("sa");
+ result.setPassword("");
+ return Collections.singletonMap("db0", result);
+ }
+
+ @Test
+ public void assertRenewDataSourceChangedEvent() throws Exception {
+ schemaContexts.getSchemaContexts().putAll(getSchemaContextMap());
+ DataSourceChangedEvent event = new
DataSourceChangedEvent(DefaultSchema.LOGIC_NAME, getDataSourceConfigurations());
+ schemaContexts.renew(event);
+ }
+
+ private Map<String, DataSourceConfiguration> getDataSourceConfigurations()
{
+ BasicDataSource result = new BasicDataSource();
+ result.setDriverClassName("org.h2.Driver");
+
result.setUrl("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL");
+ result.setUsername("sa");
+ result.setPassword("");
+ return
DataSourceConverter.getDataSourceConfigurationMap(Collections.singletonMap("db0",
result));
+ }
+}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-orchestration/src/main/java/org/apache/shardingsphere/proxy/orchestration/schema/ProxyOrchestrationSchemaContexts.java
b/shardingsphere-proxy/shardingsphere-proxy-orchestration/src/main/java/org/apache/shardingsphere/proxy/orchestration/schema/ProxyOrchestrationSchemaContexts.java
index a2f5010..a4a9276 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-orchestration/src/main/java/org/apache/shardingsphere/proxy/orchestration/schema/ProxyOrchestrationSchemaContexts.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-orchestration/src/main/java/org/apache/shardingsphere/proxy/orchestration/schema/ProxyOrchestrationSchemaContexts.java
@@ -85,8 +85,7 @@ public final class ProxyOrchestrationSchemaContexts extends
OrchestrationSchemaC
return result;
}
- @Override
- public Map<String, Map<String, DataSourceParameter>>
createDataSourceParametersMap(final Map<String, Map<String,
DataSourceConfiguration>> dataSources) {
+ private Map<String, Map<String, DataSourceParameter>>
createDataSourceParametersMap(final Map<String, Map<String,
DataSourceConfiguration>> dataSources) {
Map<String, Map<String, DataSourceParameter>> result = new
LinkedHashMap<>(dataSources.size(), 1);
for (Entry<String, Map<String, DataSourceConfiguration>> entry :
dataSources.entrySet()) {
result.put(entry.getKey(),
DataSourceConverter.getDataSourceParameterMap(entry.getValue()));