/
MultitenancyTestHelperSchemaManagementTool.java
164 lines (141 loc) · 6.02 KB
/
MultitenancyTestHelperSchemaManagementTool.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.util.impl.integrationtest.mapper.orm.multitenancy.impl;
import java.util.Map;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.tool.schema.internal.HibernateSchemaManagementTool;
import org.hibernate.tool.schema.internal.SchemaCreatorImpl;
import org.hibernate.tool.schema.internal.SchemaDropperImpl;
import org.hibernate.tool.schema.internal.exec.GenerationTarget;
import org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase;
import org.hibernate.tool.schema.internal.exec.JdbcContext;
import org.hibernate.tool.schema.spi.ContributableMatcher;
import org.hibernate.tool.schema.spi.DelayedDropAction;
import org.hibernate.tool.schema.spi.ExecutionOptions;
import org.hibernate.tool.schema.spi.ExtractionTool;
import org.hibernate.tool.schema.spi.SchemaCreator;
import org.hibernate.tool.schema.spi.SchemaDropper;
import org.hibernate.tool.schema.spi.SchemaManagementTool;
import org.hibernate.tool.schema.spi.SchemaMigrator;
import org.hibernate.tool.schema.spi.SchemaTruncator;
import org.hibernate.tool.schema.spi.SchemaValidator;
import org.hibernate.tool.schema.spi.SourceDescriptor;
import org.hibernate.tool.schema.spi.TargetDescriptor;
import org.hibernate.testing.boot.JdbcConnectionAccessImpl;
class MultitenancyTestHelperSchemaManagementTool
implements SchemaManagementTool, Service, ServiceRegistryAwareService {
static class Initiator
implements StandardServiceInitiator<SchemaManagementTool> {
private final String[] tenantIds;
public Initiator(String[] tenantIds) {
this.tenantIds = tenantIds;
}
@Override
public Class<SchemaManagementTool> getServiceInitiated() {
return SchemaManagementTool.class;
}
@Override
public SchemaManagementTool initiateService(Map<String,Object> configurationValues, ServiceRegistryImplementor registry) {
return new MultitenancyTestHelperSchemaManagementTool( tenantIds );
}
}
private final HibernateSchemaManagementTool toolDelegate = new HibernateSchemaManagementTool();
private final String[] tenantIds;
private GenerationTargetToDatabase[] generationTargets;
private MultitenancyTestHelperSchemaManagementTool(String[] tenantIds) {
this.tenantIds = tenantIds;
}
@Override
public void injectServices(ServiceRegistryImplementor serviceRegistry) {
toolDelegate.injectServices( serviceRegistry );
this.generationTargets = createSchemaTargets( serviceRegistry );
}
private GenerationTargetToDatabase[] createSchemaTargets(ServiceRegistryImplementor serviceRegistry) {
H2LazyMultiTenantConnectionProvider multiTenantConnectionProvider = (H2LazyMultiTenantConnectionProvider)
serviceRegistry.getService( MultiTenantConnectionProvider.class );
GenerationTargetToDatabase[] targets = new GenerationTargetToDatabase[tenantIds.length];
int index = 0;
for ( String tenantId : tenantIds ) {
ConnectionProvider connectionProvider = multiTenantConnectionProvider.selectConnectionProvider( tenantId );
targets[index] = new GenerationTargetToDatabase(
new DdlTransactionIsolatorTestingImpl( serviceRegistry,
new JdbcConnectionAccessImpl( connectionProvider ) ) );
index++;
}
return targets;
}
@Override
public SchemaCreator getSchemaCreator(Map<String,Object> options) {
return new SchemaCreator() {
final SchemaCreatorImpl delegate = (SchemaCreatorImpl) toolDelegate.getSchemaCreator( options );
@Override
public void doCreation(Metadata metadata, ExecutionOptions executionOptions,
ContributableMatcher contributableMatcher, SourceDescriptor sourceDescriptor,
TargetDescriptor targetDescriptor) {
delegate.doCreation( metadata, true, generationTargets );
}
};
}
@Override
public SchemaDropper getSchemaDropper(Map<String,Object> options) {
return new SchemaDropper() {
final SchemaDropperImpl delegate = (SchemaDropperImpl) toolDelegate.getSchemaDropper( options );
@Override
public void doDrop(Metadata metadata, ExecutionOptions executionOptions,
ContributableMatcher contributableMatcher, SourceDescriptor sourceDescriptor,
TargetDescriptor targetDescriptor) {
delegate.doDrop( metadata, true, generationTargets );
}
@Override
public DelayedDropAction buildDelayedAction(Metadata metadata, ExecutionOptions executionOptions,
ContributableMatcher contributableMatcher, SourceDescriptor sourceDescriptor) {
return new DelayedDropAction() {
@Override
public void perform(ServiceRegistry serviceRegistry) {
delegate.doDrop( metadata, true, generationTargets );
}
};
}
};
}
@Override
public SchemaMigrator getSchemaMigrator(Map<String,Object> options) {
throw notSupported();
}
@Override
public SchemaValidator getSchemaValidator(Map<String,Object> options) {
throw notSupported();
}
@Override
public SchemaTruncator getSchemaTruncator(Map<String, Object> options) {
throw notSupported();
}
@Override
public void setCustomDatabaseGenerationTarget(GenerationTarget generationTarget) {
throw notSupported();
}
@Override
public ExtractionTool getExtractionTool() {
throw notSupported();
}
@Override
public GenerationTarget[] buildGenerationTargets(TargetDescriptor targetDescriptor, JdbcContext jdbcContext,
Map<String, Object> options, boolean needsAutoCommit) {
throw notSupported();
}
private UnsupportedOperationException notSupported() {
return new UnsupportedOperationException(
"This feature is not supported when simulating multi-tenancy with test helpers" );
}
}