Skip to content

Commit cab99ac

Browse files
author
James Leigh
committed
Issue #859: Add SystemRepositoryFactory for reading repositories/SYSTEM/config.ttl files
Signed-off-by: James Leigh <james.leigh@ontotext.com>
1 parent 71d8ad0 commit cab99ac

6 files changed

Lines changed: 151 additions & 4 deletions

File tree

core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManager.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,10 @@ public synchronized void addRepositoryConfig(RepositoryConfig config)
403403
throws RepositoryException,
404404
RepositoryConfigException
405405
{
406+
addRepositoryConfig(config, true);
407+
}
408+
409+
private synchronized void addRepositoryConfig(RepositoryConfig config, boolean updateSystem) {
406410
File dataDir = getRepositoryDir(config.getID());
407411
if (!dataDir.exists()) {
408412
dataDir.mkdirs();
@@ -425,7 +429,9 @@ public synchronized void addRepositoryConfig(RepositoryConfig config)
425429
catch (IOException e) {
426430
throw new RepositoryConfigException(e);
427431
}
428-
super.addRepositoryConfig(config);
432+
if (updateSystem) {
433+
super.addRepositoryConfig(config);
434+
}
429435
part.renameTo(configFile);
430436
}
431437

@@ -434,7 +440,11 @@ public synchronized boolean removeRepository(String repositoryID)
434440
throws RepositoryException,
435441
RepositoryConfigException
436442
{
437-
boolean removed = super.removeRepository(repositoryID);
443+
return removeRepository(repositoryID, true);
444+
}
445+
446+
private boolean removeRepository(String repositoryID, boolean updateSystem) {
447+
boolean removed = updateSystem ? super.removeRepository(repositoryID) : false;
438448
File dataDir = getRepositoryDir(repositoryID);
439449
if (dataDir.isDirectory()) {
440450
logger.debug("Cleaning up data dir {} for repository {}", dataDir.getAbsolutePath(),
@@ -445,6 +455,7 @@ public synchronized boolean removeRepository(String repositoryID)
445455
catch (IOException e) {
446456
throw new RepositoryConfigException(e);
447457
}
458+
return true;
448459
}
449460
return removed;
450461
}
@@ -578,6 +589,9 @@ public void commit(RepositoryConnection con) {
578589
try {
579590
if (isRepositoryConfigContext(cleanupCon, context)) {
580591
String repositoryID = getRepositoryID(cleanupCon, context);
592+
if (SystemRepository.ID.equals(repositoryID)) {
593+
continue;
594+
}
581595
logger.debug("Reacting to modified repository config for {}",
582596
repositoryID);
583597
Repository repository = removeInitializedRepository(repositoryID);
@@ -614,6 +628,22 @@ public void commit(RepositoryConnection con) {
614628
}
615629
}
616630
}
631+
// update config.ttl files with what is now in SYSTEM repository
632+
SystemRepository systemRepository = getSystemRepository();
633+
for (String repositoryID : RepositoryConfigUtil.getRepositoryIDs(systemRepository)) {
634+
if (!SystemRepository.ID.equals(repositoryID)) {
635+
addRepositoryConfig(
636+
RepositoryConfigUtil.getRepositoryConfig(con.getRepository(), repositoryID),
637+
false);
638+
}
639+
}
640+
for (String repositoryID : getRepositoryIDs()) {
641+
if (!SystemRepository.ID.equals(repositoryID)
642+
&& !RepositoryConfigUtil.hasRepositoryConfig(systemRepository, repositoryID))
643+
{
644+
removeRepository(repositoryID, false);
645+
}
646+
}
617647
}
618648

619649
private boolean isRepositoryConfigContext(RepositoryConnection con, Resource context)

core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/RepositoryManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ public void addRepositoryConfig(RepositoryConfig config)
253253
{
254254
// update SYSTEM repository if there is one for 2.2 compatibility
255255
Repository systemRepository = getSystemRepository();
256-
if (systemRepository != null) {
256+
if (systemRepository != null && !SystemRepository.ID.equals(config.getID())) {
257257
RepositoryConfigUtil.updateRepositoryConfigs(systemRepository, config);
258258
}
259259
}

core/repository/manager/src/main/java/org/eclipse/rdf4j/repository/manager/SystemRepository.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,28 @@ public SystemRepository(File systemDir)
5656
throws RepositoryException
5757
{
5858
super();
59-
super.setDelegate(new SailRepository(new MemoryStore(systemDir)));
59+
setDataDir(systemDir);
60+
}
61+
62+
SystemRepository()
63+
throws RepositoryException
64+
{
65+
super();
6066
}
6167

6268
/*---------*
6369
* Methods *
6470
*---------*/
6571

72+
@Override
73+
public void setDataDir(File systemDir) {
74+
Repository delegate = super.getDelegate();
75+
if (delegate != null) {
76+
delegate.shutDown();
77+
}
78+
super.setDelegate(new SailRepository(new MemoryStore(systemDir)));
79+
}
80+
6681
@Override
6782
public void initialize()
6883
throws RepositoryException
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2017 Eclipse RDF4J contributors, Aduna, and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Distribution License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/org/documents/edl-v10.php.
7+
*******************************************************************************/
8+
package org.eclipse.rdf4j.repository.manager;
9+
10+
import org.eclipse.rdf4j.repository.Repository;
11+
import org.eclipse.rdf4j.repository.config.RepositoryConfigException;
12+
import org.eclipse.rdf4j.repository.config.RepositoryFactory;
13+
import org.eclipse.rdf4j.repository.config.RepositoryImplConfig;
14+
15+
public class SystemRepositoryFactory implements RepositoryFactory {
16+
17+
@Override
18+
public String getRepositoryType() {
19+
return SystemRepository.REPOSITORY_TYPE;
20+
}
21+
22+
@Override
23+
public RepositoryImplConfig getConfig() {
24+
return new SystemRepositoryConfig();
25+
}
26+
27+
@Override
28+
public Repository getRepository(RepositoryImplConfig config)
29+
throws RepositoryConfigException
30+
{
31+
return new SystemRepository();
32+
}
33+
34+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.eclipse.rdf4j.repository.manager.SystemRepositoryFactory

core/repository/manager/src/test/java/org/eclipse/rdf4j/repository/manager/LocalRepositoryManagerTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,25 @@
1010
import static org.hamcrest.core.Is.is;
1111
import static org.hamcrest.core.IsEqual.equalTo;
1212
import static org.junit.Assert.assertEquals;
13+
import static org.junit.Assert.assertFalse;
1314
import static org.junit.Assert.assertNotNull;
1415
import static org.junit.Assert.assertThat;
1516
import static org.junit.Assert.assertTrue;
1617

1718
import java.io.File;
1819
import java.io.IOException;
1920

21+
import org.eclipse.rdf4j.model.Model;
22+
import org.eclipse.rdf4j.model.Resource;
23+
import org.eclipse.rdf4j.model.impl.TreeModel;
2024
import org.eclipse.rdf4j.model.vocabulary.OWL;
2125
import org.eclipse.rdf4j.model.vocabulary.RDF;
2226
import org.eclipse.rdf4j.repository.Repository;
2327
import org.eclipse.rdf4j.repository.RepositoryConnection;
2428
import org.eclipse.rdf4j.repository.RepositoryException;
2529
import org.eclipse.rdf4j.repository.config.RepositoryConfig;
2630
import org.eclipse.rdf4j.repository.config.RepositoryConfigException;
31+
import org.eclipse.rdf4j.repository.config.RepositoryConfigUtil;
2732
import org.eclipse.rdf4j.repository.sail.config.ProxyRepositoryConfig;
2833
import org.eclipse.rdf4j.repository.sail.config.SailRepositoryConfig;
2934
import org.eclipse.rdf4j.sail.memory.config.MemoryStoreConfig;
@@ -192,4 +197,66 @@ public void testIsSafeToRemove()
192197
assertThat(manager.hasRepositoryConfig(PROXY_ID), is(equalTo(false)));
193198
assertThat(manager.isSafeToRemove(TEST_REPO), is(equalTo(true)));
194199
}
200+
201+
@Test
202+
public void testAddToSystemRepository() {
203+
RepositoryConfig config = manager.getRepositoryConfig(TEST_REPO);
204+
manager.addRepositoryConfig(new RepositoryConfig(SystemRepository.ID, new SystemRepositoryConfig()));
205+
manager.shutDown();
206+
manager = new LocalRepositoryManager(datadir);
207+
manager.initialize();
208+
try (RepositoryConnection con = manager.getSystemRepository().getConnection()) {
209+
Model model = new TreeModel();
210+
config.setID("changed");
211+
config.export(model, con.getValueFactory().createBNode());
212+
con.begin();
213+
con.add(model, con.getValueFactory().createBNode());
214+
con.commit();
215+
}
216+
assertTrue(manager.hasRepositoryConfig("changed"));
217+
}
218+
219+
@Test
220+
public void testModifySystemRepository() {
221+
RepositoryConfig config = manager.getRepositoryConfig(TEST_REPO);
222+
manager.addRepositoryConfig(new RepositoryConfig(SystemRepository.ID, new SystemRepositoryConfig()));
223+
manager.shutDown();
224+
manager = new LocalRepositoryManager(datadir);
225+
manager.initialize();
226+
try (RepositoryConnection con = manager.getSystemRepository().getConnection()) {
227+
Model model = new TreeModel();
228+
config.setTitle("Changed");
229+
config.export(model, con.getValueFactory().createBNode());
230+
Resource ctx = RepositoryConfigUtil.getContext(con, config.getID());
231+
con.begin();
232+
con.clear(ctx);
233+
con.add(model, ctx == null ? con.getValueFactory().createBNode() : ctx);
234+
con.commit();
235+
}
236+
assertEquals("Changed", manager.getRepositoryConfig(TEST_REPO).getTitle());
237+
}
238+
239+
@Test
240+
public void testRemoveFromSystemRepository() {
241+
RepositoryConfig config = manager.getRepositoryConfig(TEST_REPO);
242+
manager.addRepositoryConfig(new RepositoryConfig(SystemRepository.ID, new SystemRepositoryConfig()));
243+
manager.shutDown();
244+
manager = new LocalRepositoryManager(datadir);
245+
manager.initialize();
246+
try (RepositoryConnection con = manager.getSystemRepository().getConnection()) {
247+
Model model = new TreeModel();
248+
config.setID("changed");
249+
config.export(model, con.getValueFactory().createBNode());
250+
con.begin();
251+
con.add(model, con.getValueFactory().createBNode());
252+
con.commit();
253+
}
254+
assertTrue(manager.hasRepositoryConfig("changed"));
255+
try (RepositoryConnection con = manager.getSystemRepository().getConnection()) {
256+
con.begin();
257+
con.clear(RepositoryConfigUtil.getContext(con, config.getID()));
258+
con.commit();
259+
}
260+
assertFalse(manager.hasRepositoryConfig(config.getID()));
261+
}
195262
}

0 commit comments

Comments
 (0)