use of nl.knaw.huygens.timbuctoo.core.TransactionEnforcer in project timbuctoo by HuygensING.
the class LoadSaveVresTest method onlyReloadReloadsTheConfigurationsFromTheGraph.
@Test
public void onlyReloadReloadsTheConfigurationsFromTheGraph() throws JsonProcessingException {
TinkerPopGraphManager graphManager = newGraph().withVertex(v -> {
v.withLabel(Vre.DATABASE_LABEL).withProperty(Vre.VRE_NAME_PROPERTY_NAME, "VreA");
}).wrap();
TransactionEnforcer transactionEnforcer = TransactionEnforcerStubs.forGraphWrapper(graphManager);
DatabaseConfiguredVres instance = new DatabaseConfiguredVres(transactionEnforcer);
assertThat(instance.getVre("VreA"), instanceOf(Vre.class));
assertThat(instance.getVre("VreB"), CoreMatchers.equalTo(null));
// TODO find a clearer way to write this test.
// This call overrides the GraphManager pointer, so the DatabaseConfiguredVres has an empty database again.
graphManager = newGraph().withVertex(v -> {
v.withLabel(Vre.DATABASE_LABEL).withProperty(Vre.VRE_NAME_PROPERTY_NAME, "VreB");
}).wrap();
assertThat(instance.getVre("VreA"), instanceOf(Vre.class));
assertThat(instance.getVre("VreB"), CoreMatchers.equalTo(null));
instance.reload();
assertThat(instance.getVre("VreB"), instanceOf(Vre.class));
assertThat(instance.getVre("VreA"), CoreMatchers.equalTo(null));
}
use of nl.knaw.huygens.timbuctoo.core.TransactionEnforcer in project timbuctoo by HuygensING.
the class DatabaseRdfIndexTest method indexTest.
@Test
public void indexTest() throws Exception {
final TinkerPopGraphManager mgr = newGraph().wrap();
final Database database = new Database(mgr);
TransactionEnforcer transactionEnforcer = forGraphWrapper(mgr);
new ScaffoldMigrator(mgr).execute();
transactionEnforcer.execute(timbuctooActions -> {
timbuctooActions.ensureVreExists("myVre");
return commit();
});
mgr.getGraph().tx().onClose(x -> assertThat("Transaction should not be closed to be able to verify this unittest. It's okay that you close " + "a transaction during findOrCreateEntity, but you should find another way to verify that findOrCreateIndex " + "can find nodes in the index before a commit was called.", false));
database.findOrCreateEntity("myVre", NodeFactory.createURI("http://example.org/test"));
// Index is created
assertThat(mgr.getGraphDatabase().index().existsForNodes(RDFINDEX_NAME), is(true));
// The nodes is available
assertThat(mgr.getGraphDatabase().index().forNodes(RDFINDEX_NAME).get("myVre", "http://example.org/test").size(), is(1));
}
use of nl.knaw.huygens.timbuctoo.core.TransactionEnforcer in project timbuctoo by HuygensING.
the class LoadSaveVresTest method itLoadsTheConfigurationsFromAGraph.
@Test
public void itLoadsTheConfigurationsFromAGraph() throws JsonProcessingException {
final HashMap<String, String> keywordTypes = new HashMap<>();
keywordTypes.put("key", "value");
final String keywordTypesJson = new ObjectMapper().writeValueAsString(keywordTypes);
final TinkerPopGraphManager graphManager = newGraph().withVertex("documents", v -> {
v.withProperty(Collection.COLLECTION_NAME_PROPERTY_NAME, "documents").withProperty(Collection.ENTITY_TYPE_NAME_PROPERTY_NAME, "document").withProperty(Collection.IS_RELATION_COLLECTION_PROPERTY_NAME, false);
}).withVertex(v -> {
v.withLabel(Vre.DATABASE_LABEL).withProperty(Vre.VRE_NAME_PROPERTY_NAME, "VreA").withProperty(Vre.KEYWORD_TYPES_PROPERTY_NAME, keywordTypesJson).withOutgoingRelation(Vre.HAS_COLLECTION_RELATION_NAME, "documents");
}).wrap();
TransactionEnforcer transactionEnforcer = forGraphWrapper(graphManager);
DatabaseConfiguredVres instance = new DatabaseConfiguredVres(transactionEnforcer);
assertThat(instance.getVre("VreA"), instanceOf(Vre.class));
assertThat(instance.getCollection("documents").get(), instanceOf(Collection.class));
assertThat(instance.getCollectionForType("document").get(), instanceOf(Collection.class));
assertThat(instance.getVres().get("VreA"), instanceOf(Vre.class));
}
use of nl.knaw.huygens.timbuctoo.core.TransactionEnforcer in project timbuctoo by HuygensING.
the class TimbuctooV4 method run.
@Override
public void run(TimbuctooConfiguration configuration, Environment environment) throws Exception {
// environment.jersey().property(ServerProperties.TRACING, "ALL");
// // environment.jersey().property(ServerProperties.TRACING_THRESHOLD, "VERBOSE");
// Make sure we know what version is running
Properties properties = new Properties();
InputStream gitproperties = getClass().getClassLoader().getResourceAsStream("git.properties");
String currentVersion;
if (gitproperties != null) {
properties.load(gitproperties);
currentVersion = properties.getProperty("git.commit.id");
} else {
currentVersion = "NO-GIT-PROPERTIES-FOUND";
LoggerFactory.getLogger(this.getClass()).error("NO-GIT-PROPERTIES-FOUND");
}
LoggerFactory.getLogger(this.getClass()).info("Now launching timbuctoo version: " + currentVersion);
HttpClientBuilder apacheHttpClientBuilder = new HttpClientBuilder(environment).using(configuration.getHttpClientConfiguration());
CloseableHttpClient httpClient = apacheHttpClientBuilder.build("httpclient");
// Support services
SecurityFactory securityConfig = configuration.getSecurityConfiguration().createNewSecurityFactory(httpClient);
securityConfig.getHealthChecks().forEachRemaining(check -> {
register(environment, check.getLeft(), new LambdaHealthCheck(check.getRight()));
});
// Database migration
LinkedHashMap<String, DatabaseMigration> migrations = new LinkedHashMap<>();
migrations.put("fix-dcarkeywords-displayname-migration", new FixDcarKeywordDisplayNameMigration());
migrations.put("fix-pids-migration", new MakePidsAbsoluteUrls());
UriHelper uriHelper = configuration.getUriHelper();
environment.lifecycle().addServerLifecycleListener(new BaseUriDeriver(configuration));
TinkerPopConfig tinkerPopConfig = configuration.getDatabaseConfiguration();
final TinkerPopGraphManager graphManager = new TinkerPopGraphManager(tinkerPopConfig, migrations);
final PersistenceManager persistenceManager = configuration.getPersistenceManagerFactory().build();
UrlGenerator uriToRedirectToFromPersistentUrls = (coll, id, rev) -> uriHelper.fromResourceUri(SingleEntity.makeUrl(coll, id, rev));
final UrlGenerator pathWithoutVersionAndRevision = (coll, id, rev) -> URI.create(SingleEntity.makeUrl(coll, id, null).toString().replaceFirst("^/v2.1/", ""));
final UrlGenerator uriWithoutRev = (coll, id, rev) -> uriHelper.fromResourceUri(SingleEntity.makeUrl(coll, id, null));
HandleAdder handleAdder = new HandleAdder(persistenceManager, activeMqBundle);
// TODO make function when TimbuctooActions does not depend on TransactionEnforcer anymore
TimbuctooActions.TimbuctooActionsFactory timbuctooActionsFactory = new TimbuctooActions.TimbuctooActionsFactoryImpl(securityConfig.getPermissionFetcher(), Clock.systemDefaultZone(), handleAdder, uriToRedirectToFromPersistentUrls, () -> new TinkerPopOperations(graphManager));
TransactionEnforcer transactionEnforcer = new TransactionEnforcer(timbuctooActionsFactory);
graphManager.onGraph(g -> new ScaffoldMigrator(graphManager).execute());
handleAdder.init(transactionEnforcer);
final Vres vres = new DatabaseConfiguredVres(transactionEnforcer);
migrations.put("prepare-for-bia-import-migration", new PrepareForBiaImportMigration(vres, graphManager));
migrations.put("give-existing-relationtypes-rdf-uris", new RelationTypeRdfUriMigration());
migrations.put("remove-search-results", new RemoveSearchResultsMigration());
migrations.put("move-indices-to-isLatest-vertex", new MoveIndicesToIsLatestVertexMigration(vres));
final ResourceSyncService resourceSyncService = new ResourceSyncService(httpClient, new ResourceSyncContext());
final JsonMetadata jsonMetadata = new JsonMetadata(vres, graphManager);
final AutocompleteService.AutocompleteServiceFactory autocompleteServiceFactory = new AutocompleteService.AutocompleteServiceFactory(uriWithoutRev);
environment.lifecycle().manage(graphManager);
final CrudServiceFactory crudServiceFactory = new CrudServiceFactory(vres, securityConfig.getUserValidator(), pathWithoutVersionAndRevision);
final Webhooks webhooks = configuration.getWebhooks().getWebHook(environment);
DataSetRepository dataSetRepository = configuration.getDataSetConfiguration().createRepository(environment.lifecycle().executorService("dataSet").build(), securityConfig.getPermissionFetcher(), configuration.getDatabases(), configuration.getRdfIdHelper(), (combinedId -> {
try {
webhooks.dataSetUpdated(combinedId);
} catch (IOException e) {
LOG.error("Webhook call failed", e);
}
}), configuration.dataSetsArePublicByDefault());
environment.lifecycle().manage(new DataSetRepositoryManager(dataSetRepository));
ErrorResponseHelper errorResponseHelper = new ErrorResponseHelper();
AuthCheck authCheck = new AuthCheck(securityConfig.getUserValidator(), securityConfig.getPermissionFetcher(), dataSetRepository);
register(environment, new RdfUpload(authCheck));
register(environment, new TabularUpload(authCheck, dataSetRepository, errorResponseHelper));
register(environment, new Rml(dataSetRepository, errorResponseHelper, securityConfig.getUserValidator()));
SerializerWriterRegistry serializerWriterRegistry = new SerializerWriterRegistry(new CsvWriter(), new JsonLdWriter(), new JsonWriter(), new GraphVizWriter());
final PaginationArgumentsHelper argHelper = new PaginationArgumentsHelper(configuration.getCollectionFilters());
final GraphQl graphQlEndpoint = new GraphQl(new RootQuery(dataSetRepository, serializerWriterRegistry, configuration.getArchetypesSchema(), new RdfWiringFactory(dataSetRepository, argHelper, configuration.getDefaultSummaryProps()), new DerivedSchemaTypeGenerator(argHelper), environment.getObjectMapper()), serializerWriterRegistry, securityConfig.getUserValidator(), uriHelper, securityConfig.getPermissionFetcher(), dataSetRepository);
register(environment, graphQlEndpoint);
if (securityConfig instanceof TwitterSecurityFactory) {
final TwitterLogin twitterLogin = new TwitterLogin();
register(environment, twitterLogin);
}
register(environment, new JsonLdEditEndpoint(securityConfig.getUserValidator(), securityConfig.getPermissionFetcher(), dataSetRepository, new HttpClientBuilder(environment).build("json-ld")));
register(environment, new RootEndpoint(uriHelper, configuration.getUserRedirectUrl()));
if (securityConfig instanceof OldStyleSecurityFactory) {
register(environment, new Authenticate(((OldStyleSecurityFactory) securityConfig).getLoggedInUsers()));
}
register(environment, new Me(securityConfig.getUserValidator()));
register(environment, new Search(configuration, uriHelper, graphManager));
register(environment, new Autocomplete(autocompleteServiceFactory, transactionEnforcer));
register(environment, new Index(securityConfig.getUserValidator(), crudServiceFactory, transactionEnforcer));
register(environment, new SingleEntity(securityConfig.getUserValidator(), crudServiceFactory, transactionEnforcer));
register(environment, new SingleEntityNTriple(transactionEnforcer, uriHelper));
register(environment, new WomenWritersEntityGet(crudServiceFactory, transactionEnforcer));
register(environment, new LegacySingleEntityRedirect(uriHelper));
register(environment, new LegacyIndexRedirect(uriHelper));
register(environment, new Discover(resourceSyncService));
if (configuration.isAllowGremlinEndpoint()) {
register(environment, new Gremlin(graphManager));
}
register(environment, new Graph(graphManager, vres));
register(environment, new RelationTypes(graphManager));
register(environment, new Metadata());
register(environment, new nl.knaw.huygens.timbuctoo.server.endpoints.v2.system.vres.Metadata(jsonMetadata));
register(environment, new MyVres(securityConfig.getUserValidator(), securityConfig.getPermissionFetcher(), transactionEnforcer, uriHelper));
register(environment, new ListVres(uriHelper, transactionEnforcer));
register(environment, new VreImage(transactionEnforcer));
final ExecutorService rfdExecutorService = environment.lifecycle().executorService("rdf-import").build();
register(environment, new ImportRdf(graphManager, vres, rfdExecutorService, transactionEnforcer));
register(environment, new Import(new ResourceSyncFileLoader(httpClient), authCheck));
register(environment, new WellKnown());
RsDocumentBuilder rsDocumentBuilder = new RsDocumentBuilder(dataSetRepository, configuration.getUriHelper());
register(environment, new RsEndpoint(rsDocumentBuilder, securityConfig.getUserValidator()));
// Admin resources
if (securityConfig instanceof OldStyleSecurityFactory) {
final OldStyleSecurityFactory oldStyleSecurityFactory = (OldStyleSecurityFactory) securityConfig;
environment.admin().addTask(new UserCreationTask(new LocalUserCreator(oldStyleSecurityFactory.getLoginCreator(), oldStyleSecurityFactory.getUserCreator(), oldStyleSecurityFactory.getVreAuthorizationCreator())));
}
environment.admin().addTask(new DatabaseValidationTask(new DatabaseValidator(graphManager, new LabelsAddedToVertexDatabaseCheck(), new InvariantsCheck(vres), new FullTextIndexCheck()), Clock.systemUTC(), 5000));
environment.admin().addTask(new DbLogCreatorTask(graphManager));
environment.admin().addTask(new BdbDumpTask(configuration.getDatabases()));
if (configuration.getDatabaseBackupper().isPresent()) {
environment.admin().addTask(new StagingBackup(configuration.getDatabaseBackupper().get().create(configuration.getDatabaseConfiguration().getDatabasePath(), configuration.getDatabases().getDatabaseLocation())));
}
// register health checks
// Dropwizard Health checks are used to check whether requests should be routed to this instance
// For example, checking if neo4j is in a valid state is not a "HealthCheck" because if the database on one instance
// is in an invalid state, then this applies to all other instances too. So once the database is in an invalid state
// timbuctoo will be down.
//
// checking whether this instance is part of the neo4j quorum is a good HealthCheck because running a database query
// on those instances that are not part of the quorum will block forever, while the other instances will respond
// just fine.
register(environment, "Neo4j database connection", graphManager);
// Log all http requests
register(environment, new LoggingFilter(1024, currentVersion));
register(environment, new TransactionFilter(graphManager));
// Allow all CORS requests
register(environment, new PromiscuousCorsFilter());
// Add embedded AMQ (if any) to the metrics
configuration.getLocalAmqJmxPath(HANDLE_QUEUE).ifPresent(rethrowConsumer(jmxPath -> {
String dwMetricName = name(this.getClass(), "localAmq");
ObjectName jmxMetricName = new ObjectName(jmxPath);
environment.metrics().register(dwMetricName + ".enqueueCount", new JmxAttributeGauge(jmxMetricName, "EnqueueCount"));
environment.metrics().register(dwMetricName + ".dequeueCount", new JmxAttributeGauge(jmxMetricName, "DequeueCount"));
}));
setupObjectMapping(environment);
}
Aggregations