Skip to content

Commit e1cc3d7

Browse files
authored
Merge pull request #1793 from sbespalov/issues/1790
issues/1790: Make it possible to use standalone cassandra
2 parents b2f536d + e65d295 commit e1cc3d7

File tree

18 files changed

+228
-99
lines changed

18 files changed

+228
-99
lines changed

strongbox-commons/src/main/java/org/carlspring/strongbox/config/CommonConfig.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
"org.carlspring.strongbox.configuration",
1010
"org.carlspring.strongbox.io",
1111
"org.carlspring.strongbox.net",
12-
"org.carlspring.strongbox.db",
1312
"org.carlspring.strongbox.resource",
1413
"org.carlspring.strongbox.rest",
1514
"org.carlspring.strongbox.storage.repository",

strongbox-storage/strongbox-storage-api/src/main/java/org/carlspring/strongbox/booters/ResourcesBooter.java renamed to strongbox-data-service/src/main/java/org/carlspring/strongbox/booters/ResourcesBooter.java

File renamed without changes.

strongbox-data-service/src/main/java/org/carlspring/strongbox/config/DataServiceConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import org.carlspring.strongbox.config.hazelcast.HazelcastConfiguration;
44
import org.carlspring.strongbox.config.janusgraph.EmbeddedDbServerConfiguration;
55
import org.carlspring.strongbox.config.janusgraph.InMemoryDbServerConfiguration;
6+
import org.carlspring.strongbox.config.janusgraph.RemoteDbServerConfiguration;
67
import org.carlspring.strongbox.gremlin.adapters.EntityTraversalAdaptersConfig;
78
import org.carlspring.strongbox.gremlin.server.GremlinServerConfig;
89
import org.carlspring.strongbox.repositories.RepositoriesConfig;
10+
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
911
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1012
import org.springframework.cache.CacheManager;
1113
import org.springframework.cache.annotation.EnableCaching;
@@ -30,11 +32,13 @@
3032
@Configuration
3133
@Lazy(false)
3234
@EnableConfigurationProperties
35+
@ConfigurationPropertiesScan
3336
@EnableTransactionManagement(proxyTargetClass = true, order = DataServiceConfig.TRANSACTIONAL_INTERCEPTOR_ORDER)
3437
@EnableAspectJAutoProxy(proxyTargetClass = true)
3538
@ComponentScan({ "org.carlspring.strongbox.data" })
3639
@Import({ EmbeddedDbServerConfiguration.class,
3740
InMemoryDbServerConfiguration.class,
41+
RemoteDbServerConfiguration.class,
3842
GremlinServerConfig.class,
3943
RepositoriesConfig.class,
4044
EntityTraversalAdaptersConfig.class,

strongbox-data-service/src/main/java/org/carlspring/strongbox/config/janusgraph/EmbeddedDbServerConfiguration.java

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@
1919
import org.slf4j.Logger;
2020
import org.slf4j.LoggerFactory;
2121
import org.springframework.boot.context.properties.ConfigurationProperties;
22+
import org.springframework.boot.context.properties.ConstructorBinding;
2223
import org.springframework.context.annotation.Bean;
2324
import org.springframework.context.annotation.Condition;
2425
import org.springframework.context.annotation.ConditionContext;
2526
import org.springframework.context.annotation.Conditional;
2627
import org.springframework.context.annotation.Configuration;
28+
import org.springframework.core.env.ConfigurableEnvironment;
2729
import org.springframework.core.type.AnnotatedTypeMetadata;
2830
import org.strongbox.db.server.CassandraEmbeddedConfiguration;
2931
import org.strongbox.db.server.CassandraEmbeddedProperties;
30-
import org.strongbox.db.server.EmbeddedDbServer;
31-
import org.strongbox.db.server.EmbeddedJanusGraphWithCassandraServer;
3232
import org.strongbox.db.server.JanusGraphConfiguration;
3333
import org.strongbox.db.server.JanusGraphProperties;
34+
import org.strongbox.db.server.JanusGraphServer;
35+
import org.strongbox.db.server.JanusGraphWithEmbeddedCassandra;
3436

3537
/**
3638
* @author Przemyslaw Fusik
@@ -46,24 +48,24 @@ public class EmbeddedDbServerConfiguration implements Condition
4648
public static final String PATH_STRONGBOX_DB = "META-INF/org/carlsparing/strongbox/db";
4749

4850
@Bean
49-
EmbeddedDbServer embeddedDbServer(CassandraEmbeddedConfiguration cassandraConfiguration,
51+
JanusGraphServer embeddedDbServer(CassandraEmbeddedConfiguration cassandraConfiguration,
5052
JanusGraphConfiguration janusGraphConfiguration)
5153
{
5254

53-
if (!Files.exists(Paths.get(cassandraConfiguration.getStorageFolder())))
55+
if (!Files.exists(Paths.get(cassandraConfiguration.getStorageRoot())))
5456
{
5557
logger.info(String.format("Extract storage from [%s].", PATH_STRONGBOX_DB));
5658
initStorage(cassandraConfiguration);
57-
logger.info(String.format("Sotorage extracted to [%s].", cassandraConfiguration.getStorageFolder()));
59+
logger.info(String.format("Storage extracted to [%s].", cassandraConfiguration.getStorageRoot()));
5860
}
5961

60-
return new EmbeddedJanusGraphWithCassandraServer(cassandraConfiguration, janusGraphConfiguration);
62+
return new JanusGraphWithEmbeddedCassandra(cassandraConfiguration, janusGraphConfiguration);
6163
}
6264

6365
public JarFile getDbSchemaClasspathLocation()
6466
throws IOException
6567
{
66-
URL systemResource = EmbeddedJanusGraphWithCassandraServer.class.getResource("/" + PATH_STRONGBOX_DB);
68+
URL systemResource = JanusGraphWithEmbeddedCassandra.class.getResource("/" + PATH_STRONGBOX_DB);
6769
if (systemResource == null)
6870
{
6971
throw new IOException(String.format("Storage resource [%s] not found.", PATH_STRONGBOX_DB));
@@ -86,7 +88,7 @@ private void initStorage(CassandraEmbeddedConfiguration cassandraConfiguration)
8688
continue;
8789
}
8890

89-
Path filePath = Paths.get(cassandraConfiguration.getStorageFolder(),
91+
Path filePath = Paths.get(cassandraConfiguration.getStorageRoot(),
9092
file.getName().replace(PATH_STRONGBOX_DB, ""));
9193
if (file.isDirectory())
9294
{
@@ -114,39 +116,42 @@ private void initStorage(CassandraEmbeddedConfiguration cassandraConfiguration)
114116
}
115117

116118
@Bean
117-
JanusGraph JanusGraph(EmbeddedDbServer server)
119+
JanusGraph JanusGraph(JanusGraphServer server)
118120
throws Exception
119121
{
120-
JanusGraph janusGraph = ((EmbeddedJanusGraphWithCassandraServer) server).getJanusGraph();
121-
logger.info("Apply schema changes.");
122-
new StrongboxSchema().createSchema(janusGraph);
123-
logger.info("Schema changes applied.");
124-
125-
return janusGraph;
126-
}
127-
128-
@Bean
129-
@ConfigurationProperties(prefix = "strongbox.db.janus-graph")
130-
JanusGraphConfiguration janusGraphConfiguration()
131-
{
132-
return new JanusGraphProperties();
133-
}
134-
135-
@Bean
136-
CassandraEmbeddedConfiguration cassandraEmbeddedConfiguration(JanusGraphConfiguration janusGraphConfiguration)
137-
{
138-
return CassandraEmbeddedProperties.getInstance(janusGraphConfiguration.getStorageRoot(),
139-
janusGraphConfiguration.getStoragePort());
122+
return new StrongboxSchema().createSchema(server.getJanusGraph());
140123
}
141124

142125
@Override
143126
public boolean matches(ConditionContext conditionContext,
144127
AnnotatedTypeMetadata metadata)
145128

146129
{
147-
JanusGraphDbProfile profile = JanusGraphDbProfile.resolveProfile(conditionContext.getEnvironment());
130+
JanusGraphDbProfile profile = JanusGraphDbProfile.resolveProfile((ConfigurableEnvironment) conditionContext.getEnvironment());
148131

149132
return profile.getName().equals(JanusGraphDbProfile.PROFILE_EMBEDDED);
150133
}
151134

135+
// @ConstructorBinding
136+
// @ConfigurationProperties(prefix = "strongbox.db.janusgraph")
137+
// public class StrongboxJanusGraphProperties extends JanusGraphProperties {
138+
//
139+
// public StrongboxJanusGraphProperties(String configLocation)
140+
// {
141+
// super(configLocation);
142+
// }
143+
// }
144+
145+
// @ConstructorBinding
146+
// @ConfigurationProperties(prefix = "strongbox.db.cassandra")
147+
// public class StrongboxCassandraEmbeddedProperties extends CassandraEmbeddedProperties {
148+
//
149+
// public StrongboxCassandraEmbeddedProperties(String storageRoot,
150+
// String configLocatoion)
151+
// {
152+
// super(storageRoot, configLocatoion);
153+
// }
154+
//
155+
// }
156+
152157
}

strongbox-data-service/src/main/java/org/carlspring/strongbox/config/janusgraph/InMemoryDbServerConfiguration.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22

33
import org.carlspring.strongbox.db.schema.StrongboxSchema;
44
import org.janusgraph.core.JanusGraph;
5-
import org.slf4j.Logger;
6-
import org.slf4j.LoggerFactory;
75
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
import org.springframework.boot.context.properties.ConstructorBinding;
87
import org.springframework.context.annotation.Bean;
98
import org.springframework.context.annotation.Condition;
109
import org.springframework.context.annotation.ConditionContext;
1110
import org.springframework.context.annotation.Conditional;
1211
import org.springframework.context.annotation.Configuration;
12+
import org.springframework.core.env.ConfigurableEnvironment;
1313
import org.springframework.core.type.AnnotatedTypeMetadata;
14-
import org.strongbox.db.server.EmbeddedDbServer;
15-
import org.strongbox.db.server.EmbeddedJanusGraphWithCassandraServer;
1614
import org.strongbox.db.server.InMemoryJanusGraphServer;
1715
import org.strongbox.db.server.JanusGraphConfiguration;
1816
import org.strongbox.db.server.JanusGraphProperties;
17+
import org.strongbox.db.server.JanusGraphServer;
1918

2019
/**
2120
* @author sbespalov
@@ -25,42 +24,37 @@
2524
public class InMemoryDbServerConfiguration implements Condition
2625
{
2726

28-
private static final Logger logger = LoggerFactory.getLogger(InMemoryDbServerConfiguration.class);
29-
3027
@Bean
31-
EmbeddedDbServer embeddedDbServer(JanusGraphConfiguration janusGraphConfiguration)
28+
JanusGraphServer embeddedDbServer(JanusGraphConfiguration janusGraphConfiguration)
3229
{
33-
3430
return new InMemoryJanusGraphServer(janusGraphConfiguration);
3531
}
3632

3733
@Bean
38-
JanusGraph JanusGraph(EmbeddedDbServer server)
34+
JanusGraph JanusGraph(JanusGraphServer server)
3935
throws Exception
4036
{
41-
JanusGraph janusGraph = ((InMemoryJanusGraphServer) server).getJanusGraph();
42-
logger.info("Apply schema changes.");
43-
new StrongboxSchema().createSchema(janusGraph);
44-
logger.info("Schema changes applied.");
45-
46-
return janusGraph;
47-
}
48-
49-
@Bean
50-
@ConfigurationProperties(prefix = "strongbox.db.janus-graph")
51-
JanusGraphConfiguration janusGraphConfiguration()
52-
{
53-
return new JanusGraphProperties();
37+
return new StrongboxSchema().createSchema(server.getJanusGraph());
5438
}
5539

5640
@Override
5741
public boolean matches(ConditionContext conditionContext,
5842
AnnotatedTypeMetadata metadata)
5943

6044
{
61-
JanusGraphDbProfile profile = JanusGraphDbProfile.resolveProfile(conditionContext.getEnvironment());
45+
JanusGraphDbProfile profile = JanusGraphDbProfile.resolveProfile((ConfigurableEnvironment) conditionContext.getEnvironment());
6246

6347
return profile.getName().equals(JanusGraphDbProfile.PROFILE_MEMORY);
6448
}
49+
50+
// @ConstructorBinding
51+
// @ConfigurationProperties(prefix = "strongbox.db.janusgraph")
52+
// public class StrongboxJanusGraphProperties extends JanusGraphProperties {
53+
//
54+
// public StrongboxJanusGraphProperties(String configLocation)
55+
// {
56+
// super(configLocation);
57+
// }
58+
// }
6559

6660
}
Lines changed: 58 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,40 @@
11
package org.carlspring.strongbox.config.janusgraph;
22

33
import java.io.IOException;
4-
import java.io.InputStream;
54
import java.lang.reflect.UndeclaredThrowableException;
6-
import java.util.Properties;
5+
import java.nio.file.Paths;
6+
import java.util.Collections;
7+
import java.util.Map;
8+
import java.util.Optional;
79

10+
import org.apache.commons.io.IOUtils;
11+
import org.carlspring.strongbox.util.CollectionUtils;
812
import org.slf4j.Logger;
913
import org.slf4j.LoggerFactory;
10-
import org.springframework.core.env.Environment;
14+
import org.springframework.core.env.ConfigurableEnvironment;
15+
import org.springframework.core.env.MapPropertySource;
16+
import org.springframework.core.io.FileSystemResource;
17+
import org.springframework.core.io.Resource;
18+
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
19+
20+
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
1121

1222
public class JanusGraphDbProfile
1323
{
1424

1525
private static final Logger logger = LoggerFactory.getLogger(JanusGraphDbProfile.class);
1626

17-
public static final String PROPERTY_PROFILE = "strongbox.db.janus-graph.profile";
27+
public static final String PROPERTY_PROFILE = "strongbox.db.profile";
1828

19-
public static final String PROFILE_MEMORY = "janusgraph_MEMORY";
29+
public static final String PROFILE_MEMORY = "db_MEMORY";
2030

21-
public static final String PROFILE_EMBEDDED = "janusgraph_EMBEDDED";
31+
public static final String PROFILE_EMBEDDED = "db_EMBEDDED";
2232

23-
public static final String PROFILE_REMOTE = "janusgraph_REMOTE";
33+
public static final String PROFILE_REMOTE = "db_REMOTE";
2434

2535
private final String name;
36+
private final YAMLMapper yamlMapper = new YAMLMapper();
37+
private final PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
2638

2739
public JanusGraphDbProfile(String name)
2840
{
@@ -34,48 +46,60 @@ public String getName()
3446
return name;
3547
}
3648

37-
public static JanusGraphDbProfile resolveProfile(Environment environment)
49+
public Map<String, Object> loadConfiguration(String strongboxHome)
50+
throws IOException
51+
{
52+
String classPathResourceName = "classpath:etc/conf/" + name + ".yaml";
53+
Optional<Resource> dbConfigResourceOptional = Optional.ofNullable(strongboxHome)
54+
.map(p -> Paths.get(p, "etc/conf"))
55+
.map(p -> p.resolve(name + ".yaml"))
56+
.map(FileSystemResource::new)
57+
.map(Resource.class::cast);
58+
dbConfigResourceOptional.ifPresent(path -> logger.debug("Checking JanusGraph DB config from [{}].", path));
59+
dbConfigResourceOptional = dbConfigResourceOptional.filter(Resource::exists);
60+
dbConfigResourceOptional.ifPresent(path -> logger.debug("Using JanusGraph DB config from [{}].", path));
61+
Resource dbConfigResource = dbConfigResourceOptional.orElseGet(() -> {
62+
logger.info("Using JanusGraph DB config from [{}].", classPathResourceName);
63+
return resourceResolver.getResource(classPathResourceName);
64+
});
65+
66+
byte[] dbConfigContent = IOUtils.toByteArray(dbConfigResource.getInputStream());
67+
if (dbConfigContent == null || dbConfigContent.length == 0)
68+
{
69+
return Collections.emptyMap();
70+
}
71+
72+
Map<String, Object> dbProfilePropertiesMap = yamlMapper.readValue(dbConfigContent,
73+
Map.class);
74+
75+
return CollectionUtils.flattenMap(dbProfilePropertiesMap);
76+
}
77+
78+
public static JanusGraphDbProfile resolveProfile(ConfigurableEnvironment environment)
3879
{
3980
try
4081
{
41-
bootstrap();
82+
return bootstrap(environment);
4283
}
4384
catch (IOException e)
4485
{
4586
throw new UndeclaredThrowableException(e);
4687
}
47-
String profile = environment.getProperty(PROPERTY_PROFILE, PROFILE_MEMORY);
48-
49-
return new JanusGraphDbProfile(profile);
5088
}
5189

52-
public static void bootstrap()
90+
private static JanusGraphDbProfile bootstrap(ConfigurableEnvironment environment)
5391
throws IOException
5492
{
55-
String profile = System.getProperty(PROPERTY_PROFILE, PROFILE_MEMORY);
93+
String profileName = environment.getProperty(PROPERTY_PROFILE, PROFILE_MEMORY);
94+
logger.info("Bootstrap JanusGraph DB config with profile [{}].", profileName);
5695

57-
logger.info("Bootstrap JanusGraph connection properties with profile [{}].", profile);
58-
59-
try (InputStream is = JanusGraphDbProfile.class.getResourceAsStream(String.format("/META-INF/properties/%s.properties",
60-
profile)))
61-
{
62-
Properties properties = new Properties();
63-
properties.load(is);
96+
JanusGraphDbProfile profile = new JanusGraphDbProfile(profileName);
97+
Map<String, Object> dbProfilePropertiesMap = profile.loadConfiguration(environment.getProperty("strongbox.home"));
6498

65-
properties.keySet()
66-
.stream()
67-
.forEach(p -> {
68-
if (System.getProperty((String) p) != null)
69-
{
70-
return;
71-
}
72-
73-
logger.debug("Using default value for JanusGraph connection property [{}].", p);
74-
75-
System.setProperty((String) p, properties.getProperty((String) p));
76-
});
77-
}
99+
MapPropertySource propertySource = new MapPropertySource("strongbox-db-profile", dbProfilePropertiesMap);
100+
environment.getPropertySources().addLast(propertySource);
78101

102+
return profile;
79103
}
80104

81105
}

0 commit comments

Comments
 (0)