use of nl.knaw.huygens.timbuctoo.server.endpoints.v2.Search in project ORCID-Source by ORCID.
the class PublicV2ApiServiceVersionedDelegatorTest method testSearchByQuery.
@Test
public void testSearchByQuery() {
MockitoAnnotations.initMocks(this);
Search search = new Search();
Result result = new Result();
result.setOrcidIdentifier(new OrcidIdentifier("some-orcid-id"));
search.getResults().add(result);
Response searchResponse = Response.ok(search).build();
Mockito.when(mockServiceDelegatorNonVersioned.searchByQuery(Matchers.<Map<String, List<String>>>any())).thenReturn(searchResponse);
TargetProxyHelper.injectIntoProxy(serviceDelegator, "publicV2ApiServiceDelegator", mockServiceDelegatorNonVersioned);
Response response = serviceDelegator.searchByQuery(new HashMap<String, List<String>>());
// just testing MemberV2ApiServiceDelegatorImpl's response is returned
assertNotNull(response);
assertNotNull(response.getEntity());
assertTrue(response.getEntity() instanceof Search);
assertEquals(1, ((Search) response.getEntity()).getResults().size());
assertEquals("some-orcid-id", ((Search) response.getEntity()).getResults().get(0).getOrcidIdentifier().getPath());
TargetProxyHelper.injectIntoProxy(serviceDelegator, "publicV2ApiServiceDelegator", serviceDelegatorNonVersioned);
}
use of nl.knaw.huygens.timbuctoo.server.endpoints.v2.Search in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class SearchIT method setupBeforeEach.
/**
* Before Test Case
*/
@BeforeEach
public void setupBeforeEach() throws ClientException {
// level 1
page1Path = authorClient.createPage("page_1", "page_1", rootPage, defaultPageTemplate).getSlingPath();
HashMap<String, String> data = new HashMap<String, String>();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Parent Page 1");
Commons.editNodeProperties(adminClient, page1Path, data);
// create 20 pages
for (int i = 0; i < 20; i++) {
String pagePath = authorClient.createPage("page" + i, "page" + i, page1Path, defaultPageTemplate).getSlingPath();
data.clear();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Page " + i);
Commons.editNodeProperties(adminClient, pagePath, data);
}
// level 2
page11Path = authorClient.createPage("page_1_1", "page_1_1", page1Path, defaultPageTemplate).getSlingPath();
data.clear();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Page 1.1");
Commons.editNodeProperties(adminClient, page11Path, data);
// level 2 1
page111Path = authorClient.createPage("page_1_1_1", "page_1_1_1", page11Path, defaultPageTemplate).getSlingPath();
data.clear();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Page 1.1.1");
Commons.editNodeProperties(adminClient, page111Path, data);
// level 2 2
page112Path = authorClient.createPage("page_1_1_2", "page_1_1_2", page11Path, defaultPageTemplate).getSlingPath();
data.clear();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Page 1.1.2");
Commons.editNodeProperties(adminClient, page112Path, data);
// level 2 3
String page113Path = authorClient.createPage("page_1_1_3", "page_1_1_3", page11Path, defaultPageTemplate).getSlingPath();
data.clear();
data.put("_charset_", "UTF-8");
data.put("./jcr:content/jcr:title", "Page 1.1.3");
Commons.editNodeProperties(adminClient, page113Path, data);
// 2.
String policySuffix = "/structure/page/new_policy";
data.clear();
data.put("jcr:title", "New Policy");
data.put("sling:resourceType", "wcm/core/components/policy/policy");
data.put("clientlibs", clientlibs);
String policyPath1 = "/conf/" + label + "/settings/wcm/policies/core-component/components";
policyPath = Commons.createPolicy(adminClient, policySuffix, data, policyPath1);
// 3.
String policyLocation = "core-component/components";
String policyAssignmentPath = defaultPageTemplate + "/policies/jcr:content";
data.clear();
data.put("cq:policy", policyLocation + policySuffix);
data.put("sling:resourceType", "wcm/core/components/policies/mappings");
Commons.assignPolicy(adminClient, "", data, policyAssignmentPath);
// create a proxy component
proxyPath = Commons.createProxyComponent(adminClient, Commons.rtSearch_v1, Commons.proxyPath, null, null);
// add the component to test page
compPath = Commons.addComponent(adminClient, proxyPath, page11Path + Commons.relParentCompPath, "search", null);
// open test page in page editor
editorPage = new PageEditorPage(page11Path);
editorPage.open();
search = new Search();
}
use of nl.knaw.huygens.timbuctoo.server.endpoints.v2.Search in project timbuctoo by HuygensING.
the class JsonMetadata method getForCollection.
private JsonNode getForCollection(Collection collection, List<Vertex> relations, boolean withCollectionInfo) {
ArrayNode result = jsnA();
collection.getWriteableProperties().forEach((name, prop) -> {
ObjectNode desc = jsnO("name", jsn(name), "type", jsn(prop.getTypeId()));
prop.getOptions().ifPresent(options -> desc.set("options", jsnA(options.stream().map(JsonBuilder::jsn))));
prop.getParts().ifPresent(parts -> desc.set("options", jsnA(parts.stream().map(JsonBuilder::jsn))));
result.add(desc);
});
// FIXME add check to vres that certifies that the defined derived relations exist in the database
String abstractType = collection.getAbstractType();
Vre vre = collection.getVre();
Map<String, String> keywordTypes = vre.getKeywordTypes();
String relationCollectionName = vre.getImplementerOf("relation").map(Collection::getCollectionName).orElse(null);
if (relationCollectionName == null) {
LOG.warn(Logmarkers.databaseInvariant, "Collection {} seems to have no relationCollections", collection.getCollectionName());
}
relations.stream().filter(v -> getProp(v, "relationtype_sourceTypeName", String.class).orElse("").equals(abstractType)).forEach(v -> {
String timId = getProp(v, "tim_id", String.class).orElse("<unknown>");
Optional<String> regularName = getProp(v, "relationtype_regularName", String.class);
Optional<String> inverseName = getProp(v, "relationtype_inverseName", String.class);
Optional<String> abstractTargetType = getProp(v, "relationtype_targetTypeName", String.class);
Optional<String> targetType = abstractTargetType.flatMap(typeName -> vre.getImplementerOf(typeName).map(Collection::getCollectionName));
if (regularName.isPresent() && inverseName.isPresent() && targetType.isPresent()) {
// special support for keywords:
URI quickSearchUrl;
if (abstractTargetType.orElse("").equals("keyword")) {
quickSearchUrl = Autocomplete.makeUrl(targetType.get(), Optional.empty(), Optional.ofNullable(keywordTypes.get(regularName.get())));
} else {
quickSearchUrl = Autocomplete.makeUrl(targetType.get());
}
boolean isSymmetric = getProp(v, "relationtype_symmetric", Boolean.class).orElse(false);
result.add(jsnO("name", jsn(regularName.get()), "type", jsn("relation"), "quicksearch", jsn(quickSearchUrl.toString()), "relation", jsnO(// for search
"direction", isSymmetric ? jsn("BOTH") : jsn("OUT"), "outName", jsn(regularName.get()), "inName", jsn(inverseName.get()), "targetCollection", jsn(targetType.get()), // for CRUD
"relationCollection", jsn(relationCollectionName), "relationTypeId", jsn(timId))));
} else {
if (!regularName.isPresent() || !inverseName.isPresent() || !abstractTargetType.isPresent()) {
LOG.error(Logmarkers.databaseInvariant, "RelationType should have a relationtype_regularName, relationtype_inverseName and " + "relationtype_targetTypeName, but one of those is missing for " + v.id());
}
}
});
relations.stream().filter(v -> {
final String targetType = getProp(v, "relationtype_targetTypeName", String.class).orElse("");
final boolean isSymmetric = getProp(v, "relationtype_symmetric", Boolean.class).orElse(false);
if (isSymmetric) {
final String sourceType = getProp(v, "relationtype_sourceTypeName", String.class).orElse("");
return targetType.equals(abstractType) && !sourceType.equals(targetType);
} else {
return targetType.equals(abstractType);
}
}).forEach(v -> {
String timId = getProp(v, "tim_id", String.class).orElse("<unknown>");
Optional<String> regularName = getProp(v, "relationtype_regularName", String.class);
Optional<String> inverseName = getProp(v, "relationtype_inverseName", String.class);
Optional<String> abstractTargetType = getProp(v, "relationtype_sourceTypeName", String.class);
Optional<String> targetType = abstractTargetType.flatMap(typeName -> vre.getImplementerOf(typeName).map(Collection::getCollectionName));
if (regularName.isPresent() && inverseName.isPresent() && targetType.isPresent()) {
// special support for keywords:
URI quickSearchUrl;
if (abstractTargetType.orElse("").equals("keyword")) {
quickSearchUrl = Autocomplete.makeUrl(targetType.get(), Optional.empty(), Optional.ofNullable(keywordTypes.get(regularName.get())));
} else {
quickSearchUrl = Autocomplete.makeUrl(targetType.get());
}
result.add(jsnO("name", jsn(inverseName.get()), "type", jsn("relation"), "quicksearch", jsn(quickSearchUrl.toString()), "relation", jsnO(// for search
"direction", jsn("IN"), "outName", jsn(regularName.get()), "inName", jsn(inverseName.get()), "targetCollection", jsn(targetType.get()), // for CRUD
"relationCollection", jsn(relationCollectionName), "relationTypeId", jsn(timId))));
} else {
if (!regularName.isPresent() || !inverseName.isPresent() || !abstractTargetType.isPresent()) {
LOG.error(Logmarkers.databaseInvariant, "RelationType should have a relationtype_regularName, relationtype_inverseName and " + "relationtype_targetTypeName, but one of those is missing for " + v.id());
}
}
});
if (withCollectionInfo) {
return jsnO("collectionName", jsn(collection.getCollectionName()), "collectionLabel", jsn(collection.getCollectionLabel()), "description", jsn(collection.getDescription()), "unknown", jsn(collection.isUnknown()), "relationCollection", jsn(collection.isRelationCollection()), "archetypeName", jsn(collection.getAbstractType()), "properties", result);
} else {
return result;
}
}
use of nl.knaw.huygens.timbuctoo.server.endpoints.v2.Search 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