Merge pull request 'springdoc-openapi-ui' (#7) from springdoc-openapi-ui into master

Reviewed-on: #7
This commit is contained in:
Michele Artini 2022-09-08 10:40:34 +02:00
commit 236ac912c6
83 changed files with 1409 additions and 1609 deletions

View File

@ -1,42 +1,52 @@
package eu.dnetlib.bioschemas.api; package eu.dnetlib.bioschemas.api;
import eu.dnetlib.common.app.AbstractDnetApp; import io.swagger.v3.oas.models.tags.Tag;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors; import eu.dnetlib.common.app.AbstractDnetApp;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket; import java.util.Arrays;
import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.List;
@SpringBootApplication @SpringBootApplication
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@ComponentScan(basePackages = "eu.dnetlib") @ComponentScan(basePackages = "eu.dnetlib")
public class MainApplication extends AbstractDnetApp { public class MainApplication extends AbstractDnetApp {
public static final String BIOSCHEMAS_APIS = "D-Net Bioschemas Service APIs";
public static void main(final String[] args) { public static void main(final String[] args) {
SpringApplication.run(MainApplication.class, args); SpringApplication.run(MainApplication.class, args);
} }
@Bean
public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
.group(BIOSCHEMAS_APIS)
.pathsToMatch("/api/**")
.build();
}
@Override @Override
protected void configSwagger(final Docket docket) { protected String swaggerTitle() {
docket.select() return BIOSCHEMAS_APIS;
.apis(RequestHandlerSelectors.any()) }
.paths(p -> p.contains("/api/"))
.build() @Override
.apiInfo(new ApiInfoBuilder() protected List<Tag> swaggerTags() {
.title("D-Net Bioschemas Service APIs") return Arrays.asList(new Tag().name(BIOSCHEMAS_APIS).description(BIOSCHEMAS_APIS));
.description("APIs documentation") }
.version("1.1")
.contact(ApiInfo.DEFAULT_CONTACT) @Override
.license("Apache 2.0") protected String swaggerDesc() {
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") return BIOSCHEMAS_APIS;
.build());
} }
} }

View File

@ -1,9 +1,14 @@
package eu.dnetlib.bioschemas.api.controller; package eu.dnetlib.bioschemas.api.controller;
import eu.dnetlib.bioschemas.api.MainApplication;
import eu.dnetlib.bioschemas.api.scraper.ScrapingExecution; import eu.dnetlib.bioschemas.api.scraper.ScrapingExecution;
import eu.dnetlib.bioschemas.api.scraper.ScrapingExecutor; import eu.dnetlib.bioschemas.api.scraper.ScrapingExecutor;
import eu.dnetlib.bioschemas.api.utils.BioschemasException; import eu.dnetlib.bioschemas.api.utils.BioschemasException;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator; import org.apache.commons.io.LineIterator;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -27,6 +32,7 @@ import java.nio.charset.StandardCharsets;
@RestController @RestController
@RequestMapping("/api") @RequestMapping("/api")
@Tag(name = MainApplication.BIOSCHEMAS_APIS)
public class BioschemasAPIController extends AbstractDnetController { public class BioschemasAPIController extends AbstractDnetController {
@Value("${outputFolder}") @Value("${outputFolder}")
@ -41,19 +47,24 @@ public class BioschemasAPIController extends AbstractDnetController {
private static final Log log = LogFactory.getLog(BioschemasAPIController.class); private static final Log log = LogFactory.getLog(BioschemasAPIController.class);
@Operation(summary = "start the scraping operation", description = "<H1>Working input values are in the following table</H1><BR><TABLE><TR><TH>datasourceKey</TH><TH>sitemapUrl</TH></TR><TR><TD>ped</TD><TD>https://proteinensemble.org/sitemap2.xml.gz</TD></TR><TR><TD>disprot</TD><TD>https://disprot.org/sitemap2.xml.gz</TD></TR><TR><TD>mobidb</TD><TD>https://mobidb.org/sitemap2.xml.gz</TD></TR></TABLE>")
@GetMapping("/startScraping") @GetMapping("/startScraping")
public ScrapingExecution startScraping(@RequestParam final String datasourceKey, @RequestParam final String sitemapUrl, final HttpServletRequest req) { public ScrapingExecution startScraping(@Parameter(name = "datasourceKey") @RequestParam final String datasourceKey,
@Parameter(name = "sitemapUrl") @RequestParam final String sitemapUrl,
final HttpServletRequest req) {
logger.info("<STARTSCRAPING> datasourceKey: "+datasourceKey+" sitemapUrl:"+sitemapUrl); logger.info("<STARTSCRAPING> datasourceKey: "+datasourceKey+" sitemapUrl:"+sitemapUrl);
return scrapingExecutor.startScraping(datasourceKey, sitemapUrl, getOutputDataPattern(), req.getRemoteAddr(), getOutputFolder()); return scrapingExecutor.startScraping(datasourceKey, sitemapUrl, getOutputDataPattern(), req.getRemoteAddr(), getOutputFolder());
} }
@Operation(summary = "check the status of last scraping operation")
@GetMapping("/startScraping/status") @GetMapping("/startScraping/status")
public final ScrapingExecution statusScraping() { public final ScrapingExecution statusScraping() {
return scrapingExecutor.getLastScrapingExecution(); return scrapingExecutor.getLastScrapingExecution();
} }
@Operation(summary = "retrieve the nquads downloaded for one specific provider")
@RequestMapping(value = "/getNQuads", method = RequestMethod.GET) @RequestMapping(value = "/getNQuads", method = RequestMethod.GET)
public String getNQuads(@RequestParam final String datasourceKey, HttpServletResponse response) throws BioschemasException, IOException { public String getNQuads(@Parameter(name = "datasourceKey") @RequestParam final String datasourceKey, HttpServletResponse response) throws BioschemasException, IOException {
logger.info("<GETNQUADS> datasourceKey: "+datasourceKey); logger.info("<GETNQUADS> datasourceKey: "+datasourceKey);

View File

@ -11,7 +11,7 @@ public class HomeController extends AbstractDnetController {
"/doc", "/swagger" "/doc", "/swagger"
}) })
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
} }

View File

@ -1,14 +1,15 @@
package eu.dnetlib.broker; package eu.dnetlib.broker;
import java.util.ArrayList;
import java.util.List;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import springfox.documentation.builders.ApiInfoBuilder; import io.swagger.v3.oas.models.tags.Tag;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Tag;
import springfox.documentation.spring.web.plugins.Docket;
@SpringBootApplication @SpringBootApplication
public class LiteratureBrokerServiceApplication extends AbstractDnetApp { public class LiteratureBrokerServiceApplication extends AbstractDnetApp {
@ -24,22 +25,28 @@ public class LiteratureBrokerServiceApplication extends AbstractDnetApp {
SpringApplication.run(LiteratureBrokerServiceApplication.class, args); SpringApplication.run(LiteratureBrokerServiceApplication.class, args);
} }
@Override @Bean
protected void configSwagger(final Docket docket) { public GroupedOpenApi publicApi() {
docket.select() return GroupedOpenApi.builder()
.apis(RequestHandlerSelectors.any()) .group("Broker APIs")
.paths(p -> p.startsWith("/api/")) .pathsToMatch("/api/**")
.build() .build();
.tags(new Tag(TAG_EVENTS, "Events management"), new Tag(TAG_SUBSCRIPTIONS, "Subscriptions management"), new Tag(TAG_NOTIFICATIONS,
"Notifications management"), new Tag(TAG_TOPIC_TYPES, "Topic types management"), new Tag(TAG_OPENAIRE, "OpenAIRE use case"))
.apiInfo(new ApiInfoBuilder()
.title("Literature Broker Service")
.description("APIs documentation")
.version("1.1")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
} }
@Override
protected String swaggerTitle() {
return "OpenAIRE Broker API";
}
@Override
protected List<Tag> swaggerTags() {
final List<Tag> tags = new ArrayList<>();
tags.add(new Tag().name(TAG_EVENTS).description("Events management"));
tags.add(new Tag().name(TAG_SUBSCRIPTIONS).description("Subscriptions management"));
tags.add(new Tag().name(TAG_NOTIFICATIONS).description("Notifications management"));
tags.add(new Tag().name(TAG_TOPIC_TYPES).description("Topic types management"));
tags.add(new Tag().name(TAG_OPENAIRE).description("OpenAIRE use case"));
return tags;
}
} }

View File

@ -16,10 +16,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import eu.dnetlib.broker.common.elasticsearch.Event; import eu.dnetlib.broker.common.elasticsearch.Event;
import eu.dnetlib.broker.common.elasticsearch.Notification; import eu.dnetlib.broker.common.elasticsearch.Notification;
import eu.dnetlib.broker.common.properties.ElasticSearchProperties; import eu.dnetlib.broker.common.properties.ElasticSearchProperties;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration @Configuration
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@EnableTransactionManagement @EnableTransactionManagement

View File

@ -8,6 +8,6 @@ public class ApiDocController {
@GetMapping({ "/apidoc", "/api-doc", "/doc", "/swagger" }) @GetMapping({ "/apidoc", "/api-doc", "/doc", "/swagger" })
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
} }

View File

@ -31,12 +31,12 @@ import eu.dnetlib.broker.common.elasticsearch.EventStatsManager.BrowseEntry;
import eu.dnetlib.broker.common.subscriptions.Subscription; import eu.dnetlib.broker.common.subscriptions.Subscription;
import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository; import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/api/events") @RequestMapping("/api/events")
@Api(tags = LiteratureBrokerServiceApplication.TAG_EVENTS) @Tag(name = LiteratureBrokerServiceApplication.TAG_EVENTS)
public class EventsController extends AbstractDnetController { public class EventsController extends AbstractDnetController {
private static final Log log = LogFactory.getLog(AbstractDnetController.class); private static final Log log = LogFactory.getLog(AbstractDnetController.class);
@ -50,25 +50,25 @@ public class EventsController extends AbstractDnetController {
@Autowired @Autowired
private EventStatsManager eventStatsManager; private EventStatsManager eventStatsManager;
@ApiOperation("Return an event by ID") @Operation(summary = "Return an event by ID")
@GetMapping("/{id}") @GetMapping("/{id}")
public Event getEvent(@PathVariable final String id) { public Event getEvent(@PathVariable final String id) {
return eventRepository.findById(id).get(); return eventRepository.findById(id).get();
} }
@ApiOperation("Delete an event by ID") @Operation(summary = "Delete an event by ID")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public void deleteEvent(@PathVariable final String id) { public void deleteEvent(@PathVariable final String id) {
eventRepository.deleteById(id); eventRepository.deleteById(id);
} }
@ApiOperation("Save an event by ID") @Operation(summary = "Save an event by ID")
@PostMapping("/{id}") @PostMapping("/{id}")
public Event saveEvent(@RequestBody final Event event) { public Event saveEvent(@RequestBody final Event event) {
return eventRepository.save(event); return eventRepository.save(event);
} }
@ApiOperation("Return a page of events") @Operation(summary = "Return a page of events")
@GetMapping("/list/{page}/{pageSize}") @GetMapping("/list/{page}/{pageSize}")
public List<Event> events( public List<Event> events(
@PathVariable final int page, @PathVariable final int page,
@ -76,7 +76,7 @@ public class EventsController extends AbstractDnetController {
return Lists.newArrayList(eventRepository.findAll(PageRequest.of(page, pageSize))); return Lists.newArrayList(eventRepository.findAll(PageRequest.of(page, pageSize)));
} }
@ApiOperation("Return a page of events by topic") @Operation(summary = "Return a page of events by topic")
@GetMapping("/byTopic/{page}/{pageSize}") @GetMapping("/byTopic/{page}/{pageSize}")
public List<Event> eventsByTopic( public List<Event> eventsByTopic(
@PathVariable final int page, @PathVariable final int page,
@ -85,7 +85,7 @@ public class EventsController extends AbstractDnetController {
return Lists.newArrayList(eventRepository.findByTopic(topic, PageRequest.of(page, pageSize))); return Lists.newArrayList(eventRepository.findByTopic(topic, PageRequest.of(page, pageSize)));
} }
@ApiOperation("Delete all the events") @Operation(summary = "Delete all the events")
@DeleteMapping("/all") @DeleteMapping("/all")
public Map<String, Object> clearEvents() { public Map<String, Object> clearEvents() {
eventRepository.deleteAll(); eventRepository.deleteAll();
@ -94,13 +94,13 @@ public class EventsController extends AbstractDnetController {
return res; return res;
} }
@ApiOperation("Delete the expired events") @Operation(summary = "Delete the expired events")
@DeleteMapping("/expired") @DeleteMapping("/expired")
public Map<String, Object> deleteExpiredEvents() { public Map<String, Object> deleteExpiredEvents() {
return deleteEventsByExpiryDate(0, new Date().getTime()); return deleteEventsByExpiryDate(0, new Date().getTime());
} }
@ApiOperation("Delete the events with the creationDate in a range") @Operation(summary = "Delete the events with the creationDate in a range")
@DeleteMapping("/byCreationDate/{from}/{to}") @DeleteMapping("/byCreationDate/{from}/{to}")
public Map<String, Long> deleteEventsByCreationDate(@PathVariable final long from, @PathVariable final long to) { public Map<String, Long> deleteEventsByCreationDate(@PathVariable final long from, @PathVariable final long to) {
final Map<String, Long> res = new HashMap<>(); final Map<String, Long> res = new HashMap<>();
@ -113,7 +113,7 @@ public class EventsController extends AbstractDnetController {
return res; return res;
} }
@ApiOperation("Delete the events with the expiryDate in a range") @Operation(summary = "Delete the events with the expiryDate in a range")
@DeleteMapping("/byExpiryDate/{from}/{to}") @DeleteMapping("/byExpiryDate/{from}/{to}")
public Map<String, Object> deleteEventsByExpiryDate(@PathVariable final long from, @PathVariable final long to) { public Map<String, Object> deleteEventsByExpiryDate(@PathVariable final long from, @PathVariable final long to) {
new Thread(() -> { new Thread(() -> {
@ -128,13 +128,13 @@ public class EventsController extends AbstractDnetController {
return res; return res;
} }
@ApiOperation("Return the topics of the indexed events (all)") @Operation(summary = "Return the topics of the indexed events (all)")
@GetMapping("/topics/all") @GetMapping("/topics/all")
public List<BrowseEntry> browseTopics() { public List<BrowseEntry> browseTopics() {
return eventStatsManager.browseTopics(); return eventStatsManager.browseTopics();
} }
@ApiOperation("Return the topics of the indexed events (only with subscriptions)") @Operation(summary = "Return the topics of the indexed events (only with subscriptions)")
@GetMapping("/topics/withSubscriptions") @GetMapping("/topics/withSubscriptions")
public List<BrowseEntry> browseTopicsWithSubscriptions() { public List<BrowseEntry> browseTopicsWithSubscriptions() {

View File

@ -14,16 +14,15 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.broker.LiteratureBrokerServiceApplication;
import eu.dnetlib.broker.common.elasticsearch.Notification; import eu.dnetlib.broker.common.elasticsearch.Notification;
import eu.dnetlib.broker.common.elasticsearch.NotificationRepository; import eu.dnetlib.broker.common.elasticsearch.NotificationRepository;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/api/notifications") @RequestMapping("/api/notifications")
@Api(tags = LiteratureBrokerServiceApplication.TAG_NOTIFICATIONS) @Tag(name = "LiteratureBrokerServiceApplication.TAG_NOTIFICATIONS")
public class NotificationsController extends AbstractDnetController { public class NotificationsController extends AbstractDnetController {
private static final Log log = LogFactory.getLog(NotificationsController.class); private static final Log log = LogFactory.getLog(NotificationsController.class);
@ -31,31 +30,31 @@ public class NotificationsController extends AbstractDnetController {
@Autowired @Autowired
private NotificationRepository notificationRepository; private NotificationRepository notificationRepository;
@ApiOperation("Return a notification by ID") @Operation(summary = "Return a notification by ID")
@GetMapping("/{id}") @GetMapping("/{id}")
public Notification getNotification(@PathVariable final String id) { public Notification getNotification(@PathVariable final String id) {
return notificationRepository.findById(id).get(); return notificationRepository.findById(id).get();
} }
@ApiOperation("Delete a notification by ID") @Operation(summary = "Delete a notification by ID")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public void deleteNotification(@PathVariable final String id) { public void deleteNotification(@PathVariable final String id) {
notificationRepository.deleteById(id); notificationRepository.deleteById(id);
} }
@ApiOperation("Save a notification by ID") @Operation(summary = "Save a notification by ID")
@PostMapping("/{id}") @PostMapping("/{id}")
public Notification saveNotification(@RequestBody final Notification notification) { public Notification saveNotification(@RequestBody final Notification notification) {
return notificationRepository.save(notification); return notificationRepository.save(notification);
} }
@ApiOperation("Delete all notifications") @Operation(summary = "Delete all notifications")
@DeleteMapping("") @DeleteMapping("")
public void deleteAllNotifications() { public void deleteAllNotifications() {
notificationRepository.deleteAll(); notificationRepository.deleteAll();
} }
@ApiOperation("Delete the notifications with the date in a range") @Operation(summary = "Delete the notifications with the date in a range")
@DeleteMapping("/byDate/{from}/{to}") @DeleteMapping("/byDate/{from}/{to}")
public Map<String, Object> deleteNotificationsByDate(@PathVariable final long from, @PathVariable final long to) { public Map<String, Object> deleteNotificationsByDate(@PathVariable final long from, @PathVariable final long to) {
new Thread(() -> { new Thread(() -> {

View File

@ -16,13 +16,13 @@ import eu.dnetlib.broker.common.subscriptions.Subscription;
import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository; import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
import eu.dnetlib.broker.matchers.SubscriptionEventMatcher; import eu.dnetlib.broker.matchers.SubscriptionEventMatcher;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@Profile("!openaire") @Profile("!openaire")
@RestController @RestController
@RequestMapping("/api/matching") @RequestMapping("/api/matching")
@Api(tags = LiteratureBrokerServiceApplication.TAG_MATCHING) @Tag(name = LiteratureBrokerServiceApplication.TAG_MATCHING)
public class StartMatchingController extends AbstractDnetController { public class StartMatchingController extends AbstractDnetController {
@Autowired @Autowired
@ -31,7 +31,7 @@ public class StartMatchingController extends AbstractDnetController {
@Autowired(required = false) @Autowired(required = false)
private SubscriptionEventMatcher subscriptionEventMatcher; private SubscriptionEventMatcher subscriptionEventMatcher;
@ApiOperation("Launch the thread that produces new notifications") @Operation(summary = "Launch the thread that produces new notifications")
@GetMapping("/start") @GetMapping("/start")
public List<String> startMatching() { public List<String> startMatching() {
if (subscriptionEventMatcher != null) { if (subscriptionEventMatcher != null) {
@ -42,7 +42,7 @@ public class StartMatchingController extends AbstractDnetController {
} }
} }
@ApiOperation("Launch the thread that produces new notifications by subscriptuion id") @Operation(summary = "Launch the thread that produces new notifications by subscriptuion id")
@GetMapping("/start/{subscriptionId}") @GetMapping("/start/{subscriptionId}")
public List<String> startMatching(@PathVariable final String subscriptionId) { public List<String> startMatching(@PathVariable final String subscriptionId) {
final Optional<Subscription> s = subscriptionRepo.findById(subscriptionId); final Optional<Subscription> s = subscriptionRepo.findById(subscriptionId);

View File

@ -29,12 +29,12 @@ import eu.dnetlib.broker.common.subscriptions.NotificationMode;
import eu.dnetlib.broker.common.subscriptions.Subscription; import eu.dnetlib.broker.common.subscriptions.Subscription;
import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository; import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/api/subscriptions") @RequestMapping("/api/subscriptions")
@Api(tags = LiteratureBrokerServiceApplication.TAG_SUBSCRIPTIONS) @Tag(name = LiteratureBrokerServiceApplication.TAG_SUBSCRIPTIONS)
public class SubscriptionsController extends AbstractDnetController { public class SubscriptionsController extends AbstractDnetController {
@Autowired @Autowired
@ -53,26 +53,26 @@ public class SubscriptionsController extends AbstractDnetController {
} }
}; };
@ApiOperation("Return the list of subscriptions") @Operation(summary = "Return the list of subscriptions")
@GetMapping("") @GetMapping("")
public Iterable<Subscription> listSubscriptions() { public Iterable<Subscription> listSubscriptions() {
return subscriptionRepo.findAll(); return subscriptionRepo.findAll();
} }
@ApiOperation("Return a subscription by ID") @Operation(summary = "Return a subscription by ID")
@GetMapping("/{id}") @GetMapping("/{id}")
public Subscription getSubscription(@PathVariable final String id) { public Subscription getSubscription(@PathVariable final String id) {
return subscriptionRepo.findById(id).get(); return subscriptionRepo.findById(id).get();
} }
@ApiOperation("Delete a subscription by ID and its notifications") @Operation(summary = "Delete a subscription by ID and its notifications")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public void deleteSubscription(@PathVariable final String id) { public void deleteSubscription(@PathVariable final String id) {
subscriptionRepo.deleteById(id); subscriptionRepo.deleteById(id);
notificationRepo.deleteBySubscriptionId(id); notificationRepo.deleteBySubscriptionId(id);
} }
@ApiOperation("Perform a new subscription") @Operation(summary = "Perform a new subscription")
@PostMapping("") @PostMapping("")
public Subscription registerSubscription(@RequestBody final InSubscription inSub) { public Subscription registerSubscription(@RequestBody final InSubscription inSub) {
final Subscription sub = inSub.asSubscription(); final Subscription sub = inSub.asSubscription();
@ -80,7 +80,7 @@ public class SubscriptionsController extends AbstractDnetController {
return sub; return sub;
} }
@ApiOperation("Delete all subscriptions and notifications") @Operation(summary = "Delete all subscriptions and notifications")
@DeleteMapping("") @DeleteMapping("")
public Map<String, Object> clearSubscriptions() { public Map<String, Object> clearSubscriptions() {
final Map<String, Object> res = new HashMap<>(); final Map<String, Object> res = new HashMap<>();
@ -90,7 +90,7 @@ public class SubscriptionsController extends AbstractDnetController {
return res; return res;
} }
@ApiOperation("Reset the last notification date") @Operation(summary = "Reset the last notification date")
@DeleteMapping("/{id}/date") @DeleteMapping("/{id}/date")
public void deleteNotificationDate(@PathVariable final String id) { public void deleteNotificationDate(@PathVariable final String id) {
final Subscription s = subscriptionRepo.findById(id).get(); final Subscription s = subscriptionRepo.findById(id).get();
@ -98,7 +98,7 @@ public class SubscriptionsController extends AbstractDnetController {
subscriptionRepo.save(s); subscriptionRepo.save(s);
} }
@ApiOperation("Reset all the last notification dates") @Operation(summary = "Reset all the last notification dates")
@GetMapping("/resetLastNotificationDates") @GetMapping("/resetLastNotificationDates")
public void deleteAllNotificationDates() { public void deleteAllNotificationDates() {
for (final Subscription s : subscriptionRepo.findAll()) { for (final Subscription s : subscriptionRepo.findAll()) {

View File

@ -22,12 +22,12 @@ import eu.dnetlib.broker.LiteratureBrokerServiceApplication;
import eu.dnetlib.broker.common.topics.TopicType; import eu.dnetlib.broker.common.topics.TopicType;
import eu.dnetlib.broker.common.topics.TopicTypeRepository; import eu.dnetlib.broker.common.topics.TopicTypeRepository;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/api/topic-types") @RequestMapping("/api/topic-types")
@Api(tags = LiteratureBrokerServiceApplication.TAG_TOPIC_TYPES) @Tag(name = LiteratureBrokerServiceApplication.TAG_TOPIC_TYPES)
public class TopicsController extends AbstractDnetController { public class TopicsController extends AbstractDnetController {
@Autowired @Autowired
@ -36,13 +36,13 @@ public class TopicsController extends AbstractDnetController {
private final Predicate<String> verifyExpression = private final Predicate<String> verifyExpression =
Pattern.compile("^([a-zA-Z0-9._-]+|<[a-zA-Z0-9._-]+>)(\\/([a-zA-Z0-9._-]+|<[a-zA-Z0-9._-]+>))+$").asPredicate(); Pattern.compile("^([a-zA-Z0-9._-]+|<[a-zA-Z0-9._-]+>)(\\/([a-zA-Z0-9._-]+|<[a-zA-Z0-9._-]+>))+$").asPredicate();
@ApiOperation("Return the list of topic types") @Operation(summary = "Return the list of topic types")
@GetMapping("") @GetMapping("")
public Iterable<TopicType> listTopicTypes() { public Iterable<TopicType> listTopicTypes() {
return topicTypeRepo.findAll(); return topicTypeRepo.findAll();
} }
@ApiOperation("Register a new topic type") @Operation(summary = "Register a new topic type")
@PostMapping("/add") @PostMapping("/add")
public TopicType registerTopicType(@RequestParam final String name, public TopicType registerTopicType(@RequestParam final String name,
@RequestParam final String expression, @RequestParam final String expression,
@ -61,20 +61,20 @@ public class TopicsController extends AbstractDnetController {
return type; return type;
} }
@ApiOperation("Return a topic type by ID") @Operation(summary = "Return a topic type by ID")
@GetMapping("/{id}") @GetMapping("/{id}")
public TopicType getTopicType(@PathVariable final String id) { public TopicType getTopicType(@PathVariable final String id) {
return topicTypeRepo.findById(id).get(); return topicTypeRepo.findById(id).get();
} }
@ApiOperation("Delete a topic type by ID") @Operation(summary = "Delete a topic type by ID")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public List<String> deleteTopicType(@PathVariable final String id) { public List<String> deleteTopicType(@PathVariable final String id) {
topicTypeRepo.deleteById(id); topicTypeRepo.deleteById(id);
return Arrays.asList("Done."); return Arrays.asList("Done.");
} }
@ApiOperation("Delete all topic types") @Operation(summary = "Delete all topic types")
@DeleteMapping("") @DeleteMapping("")
public Map<String, Object> clearTopicTypes() { public Map<String, Object> clearTopicTypes() {
final Map<String, Object> res = new HashMap<>(); final Map<String, Object> res = new HashMap<>();

View File

@ -56,13 +56,13 @@ import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
import eu.dnetlib.broker.events.output.DispatcherManager; import eu.dnetlib.broker.events.output.DispatcherManager;
import eu.dnetlib.broker.objects.OaBrokerEventPayload; import eu.dnetlib.broker.objects.OaBrokerEventPayload;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@Profile("openaire") @Profile("openaire")
@RestController @RestController
@RequestMapping("/api/openaireBroker") @RequestMapping("/api/openaireBroker")
@Api(tags = LiteratureBrokerServiceApplication.TAG_OPENAIRE) @Tag(name = LiteratureBrokerServiceApplication.TAG_OPENAIRE)
public class OpenaireBrokerController extends AbstractDnetController { public class OpenaireBrokerController extends AbstractDnetController {
@Autowired @Autowired
@ -85,7 +85,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
private static final Log log = LogFactory.getLog(OpenaireBrokerController.class); private static final Log log = LogFactory.getLog(OpenaireBrokerController.class);
@ApiOperation("Return the datasources having events") @Operation(summary = "Return the datasources having events")
@GetMapping("/datasources") @GetMapping("/datasources")
public List<BrowseEntry> findDatasourcesWithEvents(@RequestParam(defaultValue = "false", required = false) final boolean useIndex) { public List<BrowseEntry> findDatasourcesWithEvents(@RequestParam(defaultValue = "false", required = false) final boolean useIndex) {
return useIndex ? findDatasourcesWithEventsUsingIndex() : findDatasourcesWithEventsUsingDb(); return useIndex ? findDatasourcesWithEventsUsingIndex() : findDatasourcesWithEventsUsingDb();
@ -123,7 +123,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
} }
} }
@ApiOperation("Return the topics of the events of a datasource") @Operation(summary = "Return the topics of the events of a datasource")
@GetMapping("/topicsForDatasource") @GetMapping("/topicsForDatasource")
public List<BrowseEntry> findTopicsForDatasource(@RequestParam final String ds, public List<BrowseEntry> findTopicsForDatasource(@RequestParam final String ds,
@RequestParam(defaultValue = "false", required = false) final boolean useIndex) { @RequestParam(defaultValue = "false", required = false) final boolean useIndex) {
@ -163,7 +163,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
} }
} }
@ApiOperation("Return a page of events of a datasource (by topic)") @Operation(summary = "Return a page of events of a datasource (by topic)")
@GetMapping("/events/{nPage}/{size}") @GetMapping("/events/{nPage}/{size}")
public EventsPage showEvents(@RequestParam final String ds, @RequestParam final String topic, @PathVariable final int nPage, @PathVariable final int size) { public EventsPage showEvents(@RequestParam final String ds, @RequestParam final String topic, @PathVariable final int nPage, @PathVariable final int size) {
@ -191,7 +191,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
return new EventsPage(ds, topic, nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list); return new EventsPage(ds, topic, nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list);
} }
@ApiOperation("Return a page of events of a datasource (by query)") @Operation(summary = "Return a page of events of a datasource (by query)")
@PostMapping("/events/{nPage}/{size}") @PostMapping("/events/{nPage}/{size}")
public EventsPage advancedShowEvents(@PathVariable final int nPage, @PathVariable final int size, @RequestBody final AdvQueryObject qObj) { public EventsPage advancedShowEvents(@PathVariable final int nPage, @PathVariable final int size, @RequestBody final AdvQueryObject qObj) {
@ -227,7 +227,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
return new EventsPage(qObj.getDatasource(), qObj.getTopic(), nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list); return new EventsPage(qObj.getDatasource(), qObj.getTopic(), nPage, overrideGetTotalPage(page, size), page.getTotalHits(), list);
} }
@ApiOperation("Perform a subscription") @Operation(summary = "Perform a subscription")
@PostMapping("/subscribe") @PostMapping("/subscribe")
public Subscription registerSubscription(@RequestBody final OpenaireSubscription oSub) { public Subscription registerSubscription(@RequestBody final OpenaireSubscription oSub) {
final Subscription sub = oSub.asSubscription(); final Subscription sub = oSub.asSubscription();
@ -237,7 +237,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
return sub; return sub;
} }
@ApiOperation("Return the subscriptions of an user (by email and datasource (optional))") @Operation(summary = "Return the subscriptions of an user (by email and datasource (optional))")
@GetMapping("/subscriptions") @GetMapping("/subscriptions")
public Map<String, List<SimpleSubscriptionDesc>> subscriptions(@RequestParam final String email, @RequestParam(required = false) final String ds) { public Map<String, List<SimpleSubscriptionDesc>> subscriptions(@RequestParam final String email, @RequestParam(required = false) final String ds) {
final Iterable<Subscription> iter = subscriptionRepo.findBySubscriber(email); final Iterable<Subscription> iter = subscriptionRepo.findBySubscriber(email);
@ -247,7 +247,7 @@ public class OpenaireBrokerController extends AbstractDnetController {
.collect(Collectors.groupingBy(SimpleSubscriptionDesc::getDatasource)); .collect(Collectors.groupingBy(SimpleSubscriptionDesc::getDatasource));
} }
@ApiOperation("Return a page of notifications") @Operation(summary = "Return a page of notifications")
@GetMapping("/notifications/{subscrId}/{nPage}/{size}") @GetMapping("/notifications/{subscrId}/{nPage}/{size}")
public EventsPage notifications(@PathVariable final String subscrId, @PathVariable final int nPage, @PathVariable final int size) { public EventsPage notifications(@PathVariable final String subscrId, @PathVariable final int nPage, @PathVariable final int size) {
@ -279,14 +279,14 @@ public class OpenaireBrokerController extends AbstractDnetController {
} }
@ApiOperation("Send notifications") @Operation(summary = "Send notifications")
@GetMapping("/notifications/send/{date}") @GetMapping("/notifications/send/{date}")
private List<String> sendMailForNotifications(@PathVariable final long date) { private List<String> sendMailForNotifications(@PathVariable final long date) {
new Thread(() -> innerSendMailForNotifications(date)).start(); new Thread(() -> innerSendMailForNotifications(date)).start();
return Arrays.asList("Sending ..."); return Arrays.asList("Sending ...");
} }
@ApiOperation("Update stats") @Operation(summary = "Update stats")
@GetMapping("/stats/update") @GetMapping("/stats/update")
private List<String> updateStats() { private List<String> updateStats() {
new Thread(() -> { new Thread(() -> {

View File

@ -27,7 +27,7 @@
<a class="nav-link dropdown-toggle" href="javascript:void(0)" data-toggle="dropdown">Tools <span class="caret"></span></a> <a class="nav-link dropdown-toggle" href="javascript:void(0)" data-toggle="dropdown">Tools <span class="caret"></span></a>
<div class="dropdown-menu dropdown-menu-right"> <div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="{{t.url}}" target="_blank" ng-repeat="t in tools">{{t.name}}</a> <a class="dropdown-item" href="{{t.url}}" target="_blank" ng-repeat="t in tools">{{t.name}}</a>
<a class="dropdown-item" href="/swagger-ui/" target="_blank">API documentation</a> <a class="dropdown-item" href="/apidoc" target="_blank">API documentation</a>
</div> </div>
</li> </li>
</ul> </ul>

View File

@ -16,10 +16,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import eu.dnetlib.broker.common.elasticsearch.Event; import eu.dnetlib.broker.common.elasticsearch.Event;
import eu.dnetlib.broker.common.elasticsearch.Notification; import eu.dnetlib.broker.common.elasticsearch.Notification;
import eu.dnetlib.broker.common.properties.ElasticSearchProperties; import eu.dnetlib.broker.common.properties.ElasticSearchProperties;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration @Configuration
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@EnableTransactionManagement @EnableTransactionManagement

View File

@ -1,14 +1,15 @@
package eu.dnetlib.broker; package eu.dnetlib.broker;
import java.util.Arrays;
import java.util.List;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import springfox.documentation.builders.ApiInfoBuilder; import io.swagger.v3.oas.models.tags.Tag;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Tag;
import springfox.documentation.spring.web.plugins.Docket;
@SpringBootApplication @SpringBootApplication
public class BrokerPublicApplication extends AbstractDnetApp { public class BrokerPublicApplication extends AbstractDnetApp {
@ -19,22 +20,22 @@ public class BrokerPublicApplication extends AbstractDnetApp {
SpringApplication.run(BrokerPublicApplication.class, args); SpringApplication.run(BrokerPublicApplication.class, args);
} }
@Override @Bean
protected void configSwagger(final Docket docket) { public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
docket.select() .group("Broker Public APIs")
.apis(RequestHandlerSelectors.any()) .pathsToMatch("/**")
.paths(p -> p.startsWith("/")) .build();
.build()
.tags(new Tag(OA_PUBLIC_APIS, OA_PUBLIC_APIS))
.apiInfo(new ApiInfoBuilder()
.title("OpenAIRE Public Broker API")
.description("APIs documentation")
.version("1.1")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
} }
@Override
protected String swaggerTitle() {
return "OpenAIRE Public Broker API";
}
@Override
protected List<Tag> swaggerTags() {
return Arrays.asList(new Tag().name(OA_PUBLIC_APIS).description(OA_PUBLIC_APIS));
}
} }

View File

@ -8,6 +8,6 @@ public class ApiDocController {
@GetMapping({ "/apidoc", "/api-doc", "/doc", "/swagger" }) @GetMapping({ "/apidoc", "/api-doc", "/doc", "/swagger" })
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
} }

View File

@ -63,13 +63,13 @@ import eu.dnetlib.broker.common.subscriptions.Subscription;
import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository; import eu.dnetlib.broker.common.subscriptions.SubscriptionRepository;
import eu.dnetlib.broker.objects.OaBrokerEventPayload; import eu.dnetlib.broker.objects.OaBrokerEventPayload;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
@Profile("openaire") @Profile("openaire")
@RestController @RestController
@RequestMapping("/") @RequestMapping("/")
@Api(tags = BrokerPublicApplication.OA_PUBLIC_APIS) @Tag(name = BrokerPublicApplication.OA_PUBLIC_APIS)
public class OpenairePublicController extends AbstractDnetController { public class OpenairePublicController extends AbstractDnetController {
@Autowired @Autowired
@ -97,7 +97,7 @@ public class OpenairePublicController extends AbstractDnetController {
private static final Log log = LogFactory.getLog(OpenairePublicController.class); private static final Log log = LogFactory.getLog(OpenairePublicController.class);
@ApiOperation("Returns notifications by subscription using scrolls (first page)") @Operation(summary = "Returns notifications by subscription using scrolls (first page)")
@GetMapping("/scroll/notifications/bySubscriptionId/{subscrId}") @GetMapping("/scroll/notifications/bySubscriptionId/{subscrId}")
public ScrollPage<ShortEventMessage> prepareScrollNotificationsBySubscrId(@PathVariable final String subscrId) { public ScrollPage<ShortEventMessage> prepareScrollNotificationsBySubscrId(@PathVariable final String subscrId) {
@ -130,7 +130,7 @@ public class OpenairePublicController extends AbstractDnetController {
} }
} }
@ApiOperation("Returns notifications using scrolls (other pages)") @Operation(summary = "Returns notifications using scrolls (other pages)")
@GetMapping("/scroll/notifications/{scrollId}") @GetMapping("/scroll/notifications/{scrollId}")
public ScrollPage<ShortEventMessage> scrollNotifications(@PathVariable final String scrollId) { public ScrollPage<ShortEventMessage> scrollNotifications(@PathVariable final String scrollId) {
@ -147,7 +147,7 @@ public class OpenairePublicController extends AbstractDnetController {
} }
} }
@ApiOperation("Returns notifications as file") @Operation(summary = "Returns notifications as file")
@GetMapping(value = "/file/notifications/bySubscriptionId/{subscrId}", produces = "application/gzip") @GetMapping(value = "/file/notifications/bySubscriptionId/{subscrId}", produces = "application/gzip")
public void notificationsAsFile(final HttpServletResponse res, @PathVariable final String subscrId) throws Exception { public void notificationsAsFile(final HttpServletResponse res, @PathVariable final String subscrId) throws Exception {
@ -184,7 +184,7 @@ public class OpenairePublicController extends AbstractDnetController {
} }
@ApiOperation("Returns events as file by opendoarId") @Operation(summary = "Returns events as file by opendoarId")
@GetMapping(value = "/file/events/opendoar/{id}", produces = "application/gzip") @GetMapping(value = "/file/events/opendoar/{id}", produces = "application/gzip")
public void opendoarEventsAsFile(final HttpServletResponse res, @PathVariable final String id) { public void opendoarEventsAsFile(final HttpServletResponse res, @PathVariable final String id) {
@ -252,13 +252,13 @@ public class OpenairePublicController extends AbstractDnetController {
return first; return first;
} }
@ApiOperation("Returns the list of subscriptions by user email") @Operation(summary = "Returns the list of subscriptions by user email")
@GetMapping(value = "/subscriptions") @GetMapping(value = "/subscriptions")
private Iterable<Subscription> listSubscriptionsByUser(@RequestParam final String email) { private Iterable<Subscription> listSubscriptionsByUser(@RequestParam final String email) {
return subscriptionRepo.findBySubscriber(email); return subscriptionRepo.findBySubscriber(email);
} }
@ApiOperation("Returns the status of the application") @Operation(summary = "Returns the status of the application")
@GetMapping(value = "/status") @GetMapping(value = "/status")
private Map<String, Long> status() { private Map<String, Long> status() {
final Map<String, Long> res = new LinkedHashMap<>(); final Map<String, Long> res = new LinkedHashMap<>();
@ -269,7 +269,7 @@ public class OpenairePublicController extends AbstractDnetController {
return res; return res;
} }
@ApiOperation("Store the feedback of an event (MOCK)") @Operation(summary = "Store the feedback of an event (MOCK)")
@RequestMapping(value = "/feedback/events", method = { @RequestMapping(value = "/feedback/events", method = {
RequestMethod.POST, RequestMethod.PATCH RequestMethod.POST, RequestMethod.PATCH
}) })

View File

@ -2,6 +2,6 @@
<html> <html>
<head> <head>
<title>OpenAIRE Broker Public API</title> <title>OpenAIRE Broker Public API</title>
<meta http-equiv="refresh" content="2; url = ./swagger" /> <meta http-equiv="refresh" content="2; url = ./apidoc" />
</head> </head>
</html> </html>

View File

@ -1,53 +1,36 @@
package eu.dnetlib.data.mdstore.manager; package eu.dnetlib.data.mdstore.manager;
import org.springframework.beans.factory.annotation.Value; import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication @SpringBootApplication
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@EntityScan("eu.dnetlib.dhp.schema.mdstore") @EntityScan("eu.dnetlib.dhp.schema.mdstore")
public class MainApplication extends AbstractDnetApp { public class MainApplication extends AbstractDnetApp {
@Value("${dhp.swagger.api.host}")
private String swaggetHost;
@Value("${dhp.swagger.api.basePath}")
private String swaggerPath;
public static void main(final String[] args) { public static void main(final String[] args) {
SpringApplication.run(MainApplication.class, args); SpringApplication.run(MainApplication.class, args);
} }
@Bean
public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
.group("MDStore APIs")
.pathsToMatch("/mdstores/**")
.build();
}
@Override @Override
protected void configSwagger(final Docket docket) { protected String swaggerTitle() {
docket return "MDStore Manager APIs";
.host(swaggetHost)
.pathMapping(swaggerPath)
.select()
.apis(RequestHandlerSelectors.any())
.paths(p -> p.contains("/mdstores"))
.build()
.apiInfo(new ApiInfoBuilder()
.title("MDStore Manager APIs")
.description("APIs documentation")
.version("1.1")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
} }
} }

View File

@ -23,15 +23,13 @@ import eu.dnetlib.data.mdstore.manager.utils.DatabaseUtils;
import eu.dnetlib.data.mdstore.manager.utils.HdfsClient; import eu.dnetlib.data.mdstore.manager.utils.HdfsClient;
import eu.dnetlib.dhp.schema.mdstore.MDStoreVersion; import eu.dnetlib.dhp.schema.mdstore.MDStoreVersion;
import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo; import eu.dnetlib.dhp.schema.mdstore.MDStoreWithInfo;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/mdstores") @RequestMapping("/mdstores")
@Api(tags = { @Tag(name = "Metadata Stores")
"Metadata Stores"
})
public class MDStoreController extends AbstractDnetController { public class MDStoreController extends AbstractDnetController {
@Autowired @Autowired
@ -42,67 +40,67 @@ public class MDStoreController extends AbstractDnetController {
private static final Logger log = LoggerFactory.getLogger(DatabaseUtils.class); private static final Logger log = LoggerFactory.getLogger(DatabaseUtils.class);
@ApiOperation("Return all the mdstores") @Operation(summary = "Return all the mdstores")
@GetMapping("/") @GetMapping("/")
public Iterable<MDStoreWithInfo> find() { public Iterable<MDStoreWithInfo> find() {
return databaseUtils.listMdStores(); return databaseUtils.listMdStores();
} }
@ApiOperation("Return all the mdstore identifiers") @Operation(summary = "Return all the mdstore identifiers")
@GetMapping("/ids") @GetMapping("/ids")
public List<String> findIdentifiers() { public List<String> findIdentifiers() {
return databaseUtils.listMdStoreIDs(); return databaseUtils.listMdStoreIDs();
} }
@ApiOperation("Return a mdstores by id") @Operation(summary = "Return a mdstores by id")
@GetMapping("/mdstore/{mdId}") @GetMapping("/mdstore/{mdId}")
public MDStoreWithInfo getMdStore(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException { public MDStoreWithInfo getMdStore(@Parameter(name = "the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException {
return databaseUtils.findMdStore(mdId); return databaseUtils.findMdStore(mdId);
} }
@ApiOperation("Increase the read count of the current mdstore") @Operation(summary = "Increase the read count of the current mdstore")
@GetMapping("/mdstore/{mdId}/startReading") @GetMapping("/mdstore/{mdId}/startReading")
public MDStoreVersion startReading(@ApiParam("the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException { public MDStoreVersion startReading(@Parameter(name = "the mdstore identifier") @PathVariable final String mdId) throws MDStoreManagerException {
return databaseUtils.startReading(mdId); return databaseUtils.startReading(mdId);
} }
@ApiOperation("Create a new mdstore") @Operation(summary = "Create a new mdstore")
@GetMapping("/new/{format}/{layout}/{interpretation}") @GetMapping("/new/{format}/{layout}/{interpretation}")
public MDStoreWithInfo createMDStore( public MDStoreWithInfo createMDStore(
@ApiParam("mdstore format") @PathVariable final String format, @Parameter(name = "mdstore format") @PathVariable final String format,
@ApiParam("mdstore layout") @PathVariable final String layout, @Parameter(name = "mdstore layout") @PathVariable final String layout,
@ApiParam("mdstore interpretation") @PathVariable final String interpretation, @Parameter(name = "mdstore interpretation") @PathVariable final String interpretation,
@ApiParam("datasource name") @RequestParam(required = true) final String dsName, @Parameter(name = "datasource name") @RequestParam(required = true) final String dsName,
@ApiParam("datasource id") @RequestParam(required = true) final String dsId, @Parameter(name = "datasource id") @RequestParam(required = true) final String dsId,
@ApiParam("api id") @RequestParam(required = true) final String apiId) throws MDStoreManagerException { @Parameter(name = "api id") @RequestParam(required = true) final String apiId) throws MDStoreManagerException {
final String id = databaseUtils.createMDStore(format, layout, interpretation, dsName, dsId, apiId); final String id = databaseUtils.createMDStore(format, layout, interpretation, dsName, dsId, apiId);
return databaseUtils.findMdStore(id); return databaseUtils.findMdStore(id);
} }
@ApiOperation("Delete a mdstore by id") @Operation(summary = "Delete a mdstore by id")
@DeleteMapping("/mdstore/{mdId}") @DeleteMapping("/mdstore/{mdId}")
public StatusResponse delete(@ApiParam("the id of the mdstore that will be deleted") @PathVariable final String mdId) throws MDStoreManagerException { public StatusResponse delete(@Parameter(name = "the id of the mdstore that will be deleted") @PathVariable final String mdId) throws MDStoreManagerException {
final String hdfsPath = databaseUtils.deleteMdStore(mdId); final String hdfsPath = databaseUtils.deleteMdStore(mdId);
hdfsClient.deletePath(hdfsPath); hdfsClient.deletePath(hdfsPath);
return StatusResponse.DELETED; return StatusResponse.DELETED;
} }
@ApiOperation("Return all the versions of a mdstore") @Operation(summary = "Return all the versions of a mdstore")
@GetMapping("/mdstore/{mdId}/versions") @GetMapping("/mdstore/{mdId}/versions")
public Iterable<MDStoreVersion> listVersions(@PathVariable final String mdId) throws MDStoreManagerException { public Iterable<MDStoreVersion> listVersions(@PathVariable final String mdId) throws MDStoreManagerException {
return databaseUtils.listVersions(mdId); return databaseUtils.listVersions(mdId);
} }
@ApiOperation("Create a new preliminary version of a mdstore") @Operation(summary = "Create a new preliminary version of a mdstore")
@GetMapping("/mdstore/{mdId}/newVersion") @GetMapping("/mdstore/{mdId}/newVersion")
public MDStoreVersion prepareNewVersion(@ApiParam("the id of the mdstore for which will be created a new version") @PathVariable final String mdId) { public MDStoreVersion prepareNewVersion(@Parameter(name = "the id of the mdstore for which will be created a new version") @PathVariable final String mdId) {
return databaseUtils.prepareMdStoreVersion(mdId); return databaseUtils.prepareMdStoreVersion(mdId);
} }
@ApiOperation("Promote a preliminary version to current") @Operation(summary = "Promote a preliminary version to current")
@GetMapping("/version/{versionId}/commit/{size}") @GetMapping("/version/{versionId}/commit/{size}")
public MDStoreVersion commitVersion(@ApiParam("the id of the version that will be promoted to the current version") @PathVariable final String versionId, public MDStoreVersion commitVersion(@Parameter(name = "the id of the version that will be promoted to the current version") @PathVariable final String versionId,
@ApiParam("the size of the new current mdstore") @PathVariable final long size) throws MDStoreManagerException { @Parameter(name = "the size of the new current mdstore") @PathVariable final long size) throws MDStoreManagerException {
try { try {
return databaseUtils.commitMdStoreVersion(versionId, size); return databaseUtils.commitMdStoreVersion(versionId, size);
} finally { } finally {
@ -110,46 +108,46 @@ public class MDStoreController extends AbstractDnetController {
} }
} }
@ApiOperation("Abort a preliminary version") @Operation(summary = "Abort a preliminary version")
@GetMapping("/version/{versionId}/abort") @GetMapping("/version/{versionId}/abort")
public StatusResponse commitVersion(@ApiParam("the id of the version to abort") @PathVariable final String versionId) throws MDStoreManagerException { public StatusResponse commitVersion(@Parameter(name = "the id of the version to abort") @PathVariable final String versionId) throws MDStoreManagerException {
final String hdfsPath = databaseUtils.deleteMdStoreVersion(versionId, true); final String hdfsPath = databaseUtils.deleteMdStoreVersion(versionId, true);
hdfsClient.deletePath(hdfsPath); hdfsClient.deletePath(hdfsPath);
return StatusResponse.ABORTED; return StatusResponse.ABORTED;
} }
@ApiOperation("Return an existing mdstore version") @Operation(summary = "Return an existing mdstore version")
@GetMapping("/version/{versionId}") @GetMapping("/version/{versionId}")
public MDStoreVersion getVersion(@ApiParam("the id of the version that has to be deleted") @PathVariable final String versionId) public MDStoreVersion getVersion(@Parameter(name = "the id of the version that has to be deleted") @PathVariable final String versionId)
throws MDStoreManagerException { throws MDStoreManagerException {
return databaseUtils.findVersion(versionId); return databaseUtils.findVersion(versionId);
} }
@ApiOperation("Delete a mdstore version") @Operation(summary = "Delete a mdstore version")
@DeleteMapping("/version/{versionId}") @DeleteMapping("/version/{versionId}")
public StatusResponse deleteVersion(@ApiParam("the id of the version that has to be deleted") @PathVariable final String versionId, public StatusResponse deleteVersion(@Parameter(name = "the id of the version that has to be deleted") @PathVariable final String versionId,
@ApiParam("if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force) @Parameter(name = "if true, the controls on writing and readcount values will be skipped") @RequestParam(required = false, defaultValue = "false") final boolean force)
throws MDStoreManagerException { throws MDStoreManagerException {
final String hdfsPath = databaseUtils.deleteMdStoreVersion(versionId, force); final String hdfsPath = databaseUtils.deleteMdStoreVersion(versionId, force);
hdfsClient.deletePath(hdfsPath); hdfsClient.deletePath(hdfsPath);
return StatusResponse.DELETED; return StatusResponse.DELETED;
} }
@ApiOperation("Decrease the read count of a mdstore version") @Operation(summary = "Decrease the read count of a mdstore version")
@GetMapping("/version/{versionId}/endReading") @GetMapping("/version/{versionId}/endReading")
public MDStoreVersion endReading(@ApiParam("the id of the version that has been completely read") @PathVariable final String versionId) public MDStoreVersion endReading(@Parameter(name = "the id of the version that has been completely read") @PathVariable final String versionId)
throws MDStoreManagerException { throws MDStoreManagerException {
return databaseUtils.endReading(versionId); return databaseUtils.endReading(versionId);
} }
@ApiOperation("Reset the read count of a mdstore version") @Operation(summary = "Reset the read count of a mdstore version")
@GetMapping("/version/{versionId}/resetReading") @GetMapping("/version/{versionId}/resetReading")
public MDStoreVersion resetReading(@ApiParam("the id of the version") @PathVariable final String versionId) public MDStoreVersion resetReading(@Parameter(name = "the id of the version") @PathVariable final String versionId)
throws MDStoreManagerException { throws MDStoreManagerException {
return databaseUtils.resetReading(versionId); return databaseUtils.resetReading(versionId);
} }
@ApiOperation("Delete expired versions") @Operation(summary = "Delete expired versions")
@DeleteMapping("/versions/expired") @DeleteMapping("/versions/expired")
public StatusResponse deleteExpiredVersions() { public StatusResponse deleteExpiredVersions() {
new Thread(this::performDeleteOfExpiredVersions).start(); new Thread(this::performDeleteOfExpiredVersions).start();
@ -169,10 +167,10 @@ public class MDStoreController extends AbstractDnetController {
log.info("Done."); log.info("Done.");
} }
@ApiOperation("Fix the inconsistencies on HDFS") @Operation(summary = "Fix the inconsistencies on HDFS")
@GetMapping("/hdfs/inconsistencies") @GetMapping("/hdfs/inconsistencies")
public Set<String> fixHdfsInconsistencies( public Set<String> fixHdfsInconsistencies(
@ApiParam("force the deletion of hdfs paths") @RequestParam(required = false, defaultValue = "false") final boolean delete) @Parameter(name = "force the deletion of hdfs paths") @RequestParam(required = false, defaultValue = "false") final boolean delete)
throws MDStoreManagerException { throws MDStoreManagerException {
final Set<String> hdfsDirs = hdfsClient.listHadoopDirs(); final Set<String> hdfsDirs = hdfsClient.listHadoopDirs();
@ -189,7 +187,7 @@ public class MDStoreController extends AbstractDnetController {
return toDelete; return toDelete;
} }
@ApiOperation("Show informations") @Operation(summary = "Show informations")
@GetMapping("/info") @GetMapping("/info")
public Map<String, Object> info() { public Map<String, Object> info() {
final Map<String, Object> info = new LinkedHashMap<>(); final Map<String, Object> info = new LinkedHashMap<>();
@ -201,21 +199,21 @@ public class MDStoreController extends AbstractDnetController {
return info; return info;
} }
@ApiOperation("list the file inside the path of a mdstore version") @Operation(summary = "list the file inside the path of a mdstore version")
@GetMapping("/version/{versionId}/parquet/files") @GetMapping("/version/{versionId}/parquet/files")
public Set<String> listVersionFiles(@PathVariable final String versionId) throws MDStoreManagerException { public Set<String> listVersionFiles(@PathVariable final String versionId) throws MDStoreManagerException {
final String path = databaseUtils.findVersion(versionId).getHdfsPath(); final String path = databaseUtils.findVersion(versionId).getHdfsPath();
return hdfsClient.listContent(path + "/store", HdfsClient::isParquetFile); return hdfsClient.listContent(path + "/store", HdfsClient::isParquetFile);
} }
@ApiOperation("read the parquet file of a mdstore version") @Operation(summary = "read the parquet file of a mdstore version")
@GetMapping("/version/{versionId}/parquet/content/{limit}") @GetMapping("/version/{versionId}/parquet/content/{limit}")
public List<Map<String, String>> listVersionParquet(@PathVariable final String versionId, @PathVariable final long limit) throws MDStoreManagerException { public List<Map<String, String>> listVersionParquet(@PathVariable final String versionId, @PathVariable final long limit) throws MDStoreManagerException {
final String path = databaseUtils.findVersion(versionId).getHdfsPath(); final String path = databaseUtils.findVersion(versionId).getHdfsPath();
return hdfsClient.readParquetFiles(path + "/store", limit); return hdfsClient.readParquetFiles(path + "/store", limit);
} }
@ApiOperation("read the parquet file of a mdstore (current version)") @Operation(summary = "read the parquet file of a mdstore (current version)")
@GetMapping("/mdstore/{mdId}/parquet/content/{limit}") @GetMapping("/mdstore/{mdId}/parquet/content/{limit}")
public List<Map<String, String>> listMdstoreParquet(@PathVariable final String mdId, @PathVariable final long limit) throws MDStoreManagerException { public List<Map<String, String>> listMdstoreParquet(@PathVariable final String mdId, @PathVariable final long limit) throws MDStoreManagerException {
final String versionId = databaseUtils.findMdStore(mdId).getCurrentVersion(); final String versionId = databaseUtils.findMdStore(mdId).getCurrentVersion();

View File

@ -11,6 +11,6 @@ public class SwaggerController {
"/apidoc", "/api-doc", "/doc", "/swagger" "/apidoc", "/api-doc", "/doc", "/swagger"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
} }

View File

@ -42,5 +42,5 @@ dhp.mdstore-manager.hadoop.zeppelin.name-prefix = mdstoreManager
dhp.mdstore-manager.inspector.records.max = 1000 dhp.mdstore-manager.inspector.records.max = 1000
dhp.swagger.api.host = localhost # dhp.swagger.api.host = localhost
dhp.swagger.api.basePath = / dhp.swagger.api.basePath = /**

View File

@ -20,7 +20,7 @@
<h1>Metadata Store Manager</h1> <h1>Metadata Store Manager</h1>
<hr /> <hr />
<a href="./swagger-ui/" target="_blank">API documentation</a> <a href="./apidoc" target="_blank">API documentation</a>
<hr /> <hr />
<a href="javascript:void(0)" data-toggle="modal" data-target="#newMdstoreModal">create a new mdstore</a> <a href="javascript:void(0)" data-toggle="modal" data-target="#newMdstoreModal">create a new mdstore</a>
<hr /> <hr />

View File

@ -1,19 +1,15 @@
package eu.dnetlib; package eu.dnetlib;
import static springfox.documentation.builders.RequestHandlerSelectors.basePackage; import org.springdoc.core.GroupedOpenApi;
import java.time.LocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration; import org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import eu.dnetlib.DnetOpenaireExporterProperties.Swagger;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import eu.dnetlib.openaire.community.CommunityApiController; import eu.dnetlib.openaire.community.CommunityApiController;
import eu.dnetlib.openaire.context.ContextApiController; import eu.dnetlib.openaire.context.ContextApiController;
@ -21,16 +17,9 @@ import eu.dnetlib.openaire.dsm.DsmApiController;
import eu.dnetlib.openaire.funders.FundersApiController; import eu.dnetlib.openaire.funders.FundersApiController;
import eu.dnetlib.openaire.info.InfoController; import eu.dnetlib.openaire.info.InfoController;
import eu.dnetlib.openaire.project.ProjectsController; import eu.dnetlib.openaire.project.ProjectsController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@EnableSwagger2
@SpringBootApplication @SpringBootApplication
@EnableAutoConfiguration(exclude = { @EnableAutoConfiguration(exclude = {
SolrAutoConfiguration.class SolrAutoConfiguration.class
@ -43,67 +32,56 @@ public class DNetOpenaireExporterApplication extends AbstractDnetApp {
SpringApplication.run(DNetOpenaireExporterApplication.class, args); SpringApplication.run(DNetOpenaireExporterApplication.class, args);
} }
@Autowired @Override
private DnetOpenaireExporterProperties config; protected String swaggerTitle() {
return "D-Net Exporter APIs";
@Bean
public Docket dsm() {
return _docket("Datasource Manager", DsmApiController.class.getPackage().getName(), config.getSwaggerDsm(), V1);
}
@Bean
public Docket projects() {
return _docket("OpenAIRE Projects", ProjectsController.class.getPackage().getName(), config.getSwaggerProjects(), V1);
}
@Bean
public Docket funders() {
return _docket("OpenAIRE Funders", FundersApiController.class.getPackage().getName(), config.getSwaggerFunders(), V1);
}
@Bean
public Docket communities() {
return _docket("OpenAIRE Communities", CommunityApiController.class.getPackage().getName(), config.getSwaggerCommunities(), V1);
}
@Bean
public Docket contexts() {
return _docket("OpenAIRE Contexts", ContextApiController.class.getPackage().getName(), config.getSwaggerCommunities(), V1);
}
private Docket _docket(final String groupName, final String controllerPackage, final Swagger swag, final String version) {
final Docket d = new Docket(DocumentationType.SWAGGER_2);
configSwagger(d, groupName, controllerPackage, swag, version);
return d;
} }
@Override @Override
protected void configSwagger(final Docket docket) { protected String swaggerVersion() {
configSwagger(docket, "OpenAIRE Info", InfoController.class.getPackage().getName(), config.getSwaggerInfo(), V1); return V1;
} }
private void configSwagger(final Docket docket, final String groupName, final String controllerPackage, final Swagger swag, final String version) { @Bean
docket @ConditionalOnProperty(value = "openaire.exporter.enable.dsm", havingValue = "true")
.groupName(groupName) public GroupedOpenApi dsm() {
.select() return newGroupedOpenApi("Datasource Manager", DsmApiController.class.getPackage().getName());
.apis(basePackage(controllerPackage))
.build()
.directModelSubstitute(LocalDate.class, java.sql.Date.class)
.apiInfo(apiInfo(swag, version));
} }
private ApiInfo apiInfo(final Swagger swag, final String version) { @Bean
return new ApiInfoBuilder() @ConditionalOnProperty(value = "openaire.exporter.enable.project", havingValue = "true")
.title(swag.getApiTitle()) public GroupedOpenApi projects() {
.description(swag.getApiDescription()) return newGroupedOpenApi("OpenAIRE Projects", ProjectsController.class.getPackage().getName());
.license(swag.getApiLicense()) }
.licenseUrl(swag.getApiLicenseUrl())
.termsOfServiceUrl("") @Bean
.version(version) @ConditionalOnProperty(value = "openaire.exporter.enable.funders", havingValue = "true")
.contact(new Contact( public GroupedOpenApi funders() {
swag.getApiContactName(), return newGroupedOpenApi("OpenAIRE Funders", FundersApiController.class.getPackage().getName());
swag.getApiContactUrl(), }
swag.getApiContactEmail()))
@Bean
@ConditionalOnProperty(value = "openaire.exporter.enable.community", havingValue = "true")
public GroupedOpenApi communities() {
return newGroupedOpenApi("OpenAIRE Communities", CommunityApiController.class.getPackage().getName());
}
@Bean
@ConditionalOnProperty(value = "openaire.exporter.enable.context", havingValue = "true")
public GroupedOpenApi contexts() {
return newGroupedOpenApi("OpenAIRE Contexts", ContextApiController.class.getPackage().getName());
}
@Bean
@ConditionalOnProperty(value = "openaire.exporter.enable.info", havingValue = "true")
public GroupedOpenApi info() {
return newGroupedOpenApi("OpenAIRE Info", InfoController.class.getPackage().getName());
}
private GroupedOpenApi newGroupedOpenApi(final String groupName, final String controllerPackage) {
return GroupedOpenApi.builder()
.group(groupName)
.packagesToScan(controllerPackage)
.build(); .build();
} }

View File

@ -40,12 +40,6 @@ public class DnetOpenaireExporterProperties {
private Datasource datasource; private Datasource datasource;
private Project project; private Project project;
private Jdbc jdbc; private Jdbc jdbc;
private Swagger swaggerDsm;
private Swagger swaggerProjects;
private Swagger swaggerFunders;
private Swagger swaggerCommunities;
private Swagger swaggerContexts;
private Swagger swaggerInfo;
private Vocabularies vocabularies; private Vocabularies vocabularies;
@ -485,54 +479,6 @@ public class DnetOpenaireExporterProperties {
this.jdbc = jdbc; this.jdbc = jdbc;
} }
public Swagger getSwaggerDsm() {
return swaggerDsm;
}
public void setSwaggerDsm(final Swagger swaggerDsm) {
this.swaggerDsm = swaggerDsm;
}
public Swagger getSwaggerProjects() {
return swaggerProjects;
}
public void setSwaggerProjects(final Swagger swaggerProjects) {
this.swaggerProjects = swaggerProjects;
}
public Swagger getSwaggerFunders() {
return swaggerFunders;
}
public void setSwaggerFunders(final Swagger swaggerFunders) {
this.swaggerFunders = swaggerFunders;
}
public Swagger getSwaggerCommunities() {
return swaggerCommunities;
}
public void setSwaggerCommunities(final Swagger swaggerCommunities) {
this.swaggerCommunities = swaggerCommunities;
}
public Swagger getSwaggerContexts() {
return swaggerContexts;
}
public void setSwaggerContexts(final Swagger swaggerContexts) {
this.swaggerContexts = swaggerContexts;
}
public Swagger getSwaggerInfo() {
return swaggerInfo;
}
public void setSwaggerInfo(final Swagger swaggerInfo) {
this.swaggerInfo = swaggerInfo;
}
public Vocabularies getVocabularies() { public Vocabularies getVocabularies() {
return vocabularies; return vocabularies;
} }

View File

@ -1,302 +1,345 @@
package eu.dnetlib.openaire.community; package eu.dnetlib.openaire.community;
import static eu.dnetlib.openaire.common.ExporterConstants.C;
import static eu.dnetlib.openaire.common.ExporterConstants.C_CP;
import static eu.dnetlib.openaire.common.ExporterConstants.C_O;
import static eu.dnetlib.openaire.common.ExporterConstants.C_PJ;
import static eu.dnetlib.openaire.common.ExporterConstants.C_ZC;
import static eu.dnetlib.openaire.common.ExporterConstants.R;
import static eu.dnetlib.openaire.common.ExporterConstants.W;
import java.util.List; import java.util.List;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import static eu.dnetlib.openaire.common.ExporterConstants.*; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@CrossOrigin(origins = { "*" }) @CrossOrigin(origins = {
"*"
})
@ConditionalOnProperty(value = "openaire.exporter.enable.community", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.community", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE Communities API", description = "the OpenAIRE Community API") @Tag(name = "OpenAIRE Communities API", description = "the OpenAIRE Community API")
public class CommunityApiController { public class CommunityApiController {
@Autowired @Autowired
private CommunityApiCore communityApiCore; private CommunityApiCore communityApiCore;
@RequestMapping(value = "/community/communities", produces = {
@RequestMapping(value = "/community/communities", produces = { "application/json" }, method = RequestMethod.GET) "application/json"
@ApiOperation( }, method = RequestMethod.GET)
value = "get all community profiles", @Operation(summary = "get all community profiles", description = "get all community profiles", tags = {
notes = "get all community profiles", C, R
tags = { C, R }, })
response = CommunitySummary[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunitySummary[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CommunitySummary> listCommunities() throws CommunityException { public List<CommunitySummary> listCommunities() throws CommunityException {
return communityApiCore.listCommunities(); return communityApiCore.listCommunities();
} }
@RequestMapping(value = "/community/{id}", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/community/{id}", produces = {
@ApiOperation( "application/json"
value = "get community profile", }, method = RequestMethod.GET)
notes = "get community profile", @Operation(summary = "get community profile", description = "get community profile", tags = {
tags = { C, R }, C, R
response = CommunityDetails.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunityDetails.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityDetails getCommunity(@PathVariable final String id) throws CommunityException, CommunityNotFoundException { public CommunityDetails getCommunity(@PathVariable final String id) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getCommunity(id); return communityApiCore.getCommunity(id);
} }
@RequestMapping(value = "/community/{id}", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}", produces = {
@ApiOperation( "application/json"
value = "update community details", }, method = RequestMethod.POST)
notes = "update community details", @Operation(summary = "update community details", description = "update community details", tags = {
tags = { C, R }) C, R
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void setCommunity( public void setCommunity(
@PathVariable final String id, @PathVariable final String id,
@RequestBody CommunityWritableProperties properties) throws CommunityException, CommunityNotFoundException { @RequestBody final CommunityWritableProperties properties) throws CommunityException, CommunityNotFoundException {
communityApiCore.setCommunity(id, properties); communityApiCore.setCommunity(id, properties);
} }
@RequestMapping(value = "/community/{id}/projects", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/community/{id}/projects", produces = {
@ApiOperation( "application/json"
value = "get community projects", }, method = RequestMethod.GET)
notes = "get community projects", @Operation(summary = "get community projects", description = "get community projects", tags = {
tags = { C_PJ, R }, C_PJ, R
response = CommunityProject[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunityProject[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CommunityProject> getCommunityProjects(@PathVariable final String id) throws CommunityException, CommunityNotFoundException { public List<CommunityProject> getCommunityProjects(@PathVariable final String id) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getCommunityProjects(id); return communityApiCore.getCommunityProjects(id);
} }
@RequestMapping(value = "/community/{id}/projects", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}/projects", produces = {
@ApiOperation( "application/json"
value = "associate a project to the community", }, method = RequestMethod.POST)
notes = "associate a project to the community", @Operation(summary = "associate a project to the community", description = "associate a project to the community", tags = {
tags = { C_PJ, W }) C_PJ, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityProject addCommunityProject( public CommunityProject addCommunityProject(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final CommunityProject project) throws CommunityException, CommunityNotFoundException { @RequestBody final CommunityProject project) throws CommunityException, CommunityNotFoundException {
return communityApiCore.addCommunityProject(id, project); return communityApiCore.addCommunityProject(id, project);
} }
@RequestMapping(value = "/community/{id}/projects", produces = { "application/json" }, method = RequestMethod.DELETE) @RequestMapping(value = "/community/{id}/projects", produces = {
@ApiOperation( "application/json"
value = "remove a project from the community", }, method = RequestMethod.DELETE)
notes = "remove a project from the community", @Operation(summary = "remove a project from the community", description = "remove a project from the community", tags = {
tags = { C_PJ, W }) C_PJ, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void deleteCommunityProject( public void deleteCommunityProject(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final Integer projectId) throws CommunityException, CommunityNotFoundException { @RequestBody final Integer projectId) throws CommunityException, CommunityNotFoundException {
communityApiCore.removeCommunityProject(id, projectId); communityApiCore.removeCommunityProject(id, projectId);
} }
@RequestMapping(value = "/community/{id}/contentproviders", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/community/{id}/contentproviders", produces = {
@ApiOperation( "application/json"
value = "get the list of content providers associated to a given community", }, method = RequestMethod.GET)
notes = "get the list of content providers associated to a given community", @Operation(summary = "get the list of content providers associated to a given community", description = "get the list of content providers associated to a given community", tags = {
tags = { C_CP, R }, C_CP, R
response = CommunityContentprovider[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunityContentprovider[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CommunityContentprovider> getCommunityContentproviders(@PathVariable final String id) throws CommunityException, CommunityNotFoundException { public List<CommunityContentprovider> getCommunityContentproviders(@PathVariable final String id) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getCommunityContentproviders(id); return communityApiCore.getCommunityContentproviders(id);
} }
@RequestMapping(value = "/community/{id}/contentproviders", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}/contentproviders", produces = {
@ApiOperation( "application/json"
value = "associate a content provider to the community", }, method = RequestMethod.POST)
notes = "associate a content provider to the community", @Operation(summary = "associate a content provider to the community", description = "associate a content provider to the community", tags = {
tags = { C_CP, W }) C_CP, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityContentprovider addCommunityContentprovider( public CommunityContentprovider addCommunityContentprovider(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final CommunityContentprovider contentprovider) throws CommunityException, CommunityNotFoundException { @RequestBody final CommunityContentprovider contentprovider) throws CommunityException, CommunityNotFoundException {
return communityApiCore.addCommunityContentprovider(id, contentprovider); return communityApiCore.addCommunityContentprovider(id, contentprovider);
} }
@RequestMapping(value = "/community/{id}/contentproviders", produces = { "application/json" }, method = RequestMethod.DELETE) @RequestMapping(value = "/community/{id}/contentproviders", produces = {
@ApiOperation( "application/json"
value = "remove the association between a content provider and the community", }, method = RequestMethod.DELETE)
notes = "remove the association between a content provider and the community", @Operation(summary = "remove the association between a content provider and the community", description = "remove the association between a content provider and the community", tags = {
tags = { C_CP, W }) C_CP, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void removeCommunityContentprovider( public void removeCommunityContentprovider(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final Integer contentproviderId) throws CommunityException, CommunityNotFoundException { @RequestBody final Integer contentproviderId) throws CommunityException, CommunityNotFoundException {
communityApiCore.removeCommunityContentProvider(id, contentproviderId); communityApiCore.removeCommunityContentProvider(id, contentproviderId);
} }
//ADDING CODE FOR COMMUNITY ORGANIZATIONS // ADDING CODE FOR COMMUNITY ORGANIZATIONS
@RequestMapping(value = "/community/{id}/organizations", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/community/{id}/organizations", produces = {
@ApiOperation( "application/json"
value = "get the list of organizations for a given community", }, method = RequestMethod.GET)
notes = "get the list of organizations for a given community", @Operation(summary = "get the list of organizations for a given community", description = "get the list of organizations for a given community", tags = {
tags = { C_O, R }, C_O, R
response = CommunityOrganization[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunityContentprovider[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CommunityOrganization> getCommunityOrganizations(@PathVariable final String id) throws CommunityException, CommunityNotFoundException { public List<CommunityOrganization> getCommunityOrganizations(@PathVariable final String id) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getCommunityOrganizations(id); return communityApiCore.getCommunityOrganizations(id);
} }
@RequestMapping(value = "/community/{id}/organizations", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}/organizations", produces = {
@ApiOperation( "application/json"
value = "associate an organization to the community", }, method = RequestMethod.POST)
notes = "associate an organization to the community", @Operation(summary = "associate an organization to the community", description = "associate an organization to the community", tags = {
tags = { C_O, W }) C_O, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityOrganization addCommunityOrganization( public CommunityOrganization addCommunityOrganization(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final CommunityOrganization organization) throws CommunityException, CommunityNotFoundException { @RequestBody final CommunityOrganization organization) throws CommunityException, CommunityNotFoundException {
return communityApiCore.addCommunityOrganization(id, organization); return communityApiCore.addCommunityOrganization(id, organization);
} }
@RequestMapping(value = "/community/{id}/organizations", produces = { "application/json" }, method = RequestMethod.DELETE) @RequestMapping(value = "/community/{id}/organizations", produces = {
@ApiOperation( "application/json"
value = "remove the association between an organization and the community", }, method = RequestMethod.DELETE)
notes = "remove the association between an organization and the community", @Operation(summary = "remove the association between an organization and the community", description = "remove the association between an organization and the community", tags = {
tags = { C_O, W }) C_O, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void removeCommunityOrganization( public void removeCommunityOrganization(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final Integer organizationId) throws CommunityException, CommunityNotFoundException { @RequestBody final Integer organizationId) throws CommunityException, CommunityNotFoundException {
communityApiCore.removeCommunityOrganization(id, organizationId); communityApiCore.removeCommunityOrganization(id, organizationId);
} }
//********************** // **********************
@RequestMapping(value = "/community/{id}/subjects", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}/subjects", produces = {
@ApiOperation( "application/json"
value = "associate a subject to the community", }, method = RequestMethod.POST)
notes = "associate a subject to the community", @Operation(summary = "associate a subject to the community", description = "associate a subject to the community", tags = {
tags = { C, W }) C, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityDetails addCommunitySubjects( public CommunityDetails addCommunitySubjects(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final List<String> subjects) throws CommunityException, CommunityNotFoundException { @RequestBody final List<String> subjects) throws CommunityException, CommunityNotFoundException {
return communityApiCore.addCommunitySubjects(id, subjects); return communityApiCore.addCommunitySubjects(id, subjects);
} }
@RequestMapping(value = "/community/{id}/subjects", produces = { "application/json" }, method = RequestMethod.DELETE) @RequestMapping(value = "/community/{id}/subjects", produces = {
@ApiOperation( "application/json"
value = "remove subjects from a community", }, method = RequestMethod.DELETE)
notes = "remove subjects from a community", @Operation(summary = "remove subjects from a community", description = "remove subjects from a community", tags = {
tags = { C, W }) C, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityDetails removeCommunitySubjects( public CommunityDetails removeCommunitySubjects(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final List<String> subjects) throws CommunityException, CommunityNotFoundException { @RequestBody final List<String> subjects) throws CommunityException, CommunityNotFoundException {
return communityApiCore.removeCommunitySubjects(id, subjects); return communityApiCore.removeCommunitySubjects(id, subjects);
} }
@RequestMapping(value = "/community/{id}/zenodocommunities", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/community/{id}/zenodocommunities", produces = {
@ApiOperation( "application/json"
value = "get the list of Zenodo communities associated to a given community", }, method = RequestMethod.GET)
notes = "get the list of Zenodo communities associated to a given community", @Operation(summary = "get the list of Zenodo communities associated to a given community", description = "get the list of Zenodo communities associated to a given community", tags = {
tags = { C_ZC, R }, C_ZC, R
response = CommunityZenodoCommunity[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CommunityZenodoCommunity[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CommunityZenodoCommunity> getCommunityZenodoCommunities(@PathVariable final String id) throws CommunityException, CommunityNotFoundException { public List<CommunityZenodoCommunity> getCommunityZenodoCommunities(@PathVariable final String id) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getCommunityZenodoCommunities(id); return communityApiCore.getCommunityZenodoCommunities(id);
} }
@RequestMapping(value = "/community/{id}/zenodocommunities", produces = { "application/json" }, method = RequestMethod.POST) @RequestMapping(value = "/community/{id}/zenodocommunities", produces = {
@ApiOperation( "application/json"
value = "associate a Zenodo community to the community", }, method = RequestMethod.POST)
notes = "associate a Zenodo community to the community", @Operation(summary = "associate a Zenodo community to the community", description = "associate a Zenodo community to the community", tags = {
tags = { C_ZC, W }) C_ZC, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityZenodoCommunity addCommunityZenodoCommunity( public CommunityZenodoCommunity addCommunityZenodoCommunity(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final CommunityZenodoCommunity zenodocommunity) throws CommunityException, CommunityNotFoundException { @RequestBody final CommunityZenodoCommunity zenodocommunity) throws CommunityException, CommunityNotFoundException {
return communityApiCore.addCommunityZenodoCommunity(id, zenodocommunity); return communityApiCore.addCommunityZenodoCommunity(id, zenodocommunity);
} }
@RequestMapping(value = "/community/{id}/zenodocommunities", produces = { "application/json" }, method = RequestMethod.DELETE) @RequestMapping(value = "/community/{id}/zenodocommunities", produces = {
@ApiOperation( "application/json"
value = "remove a Zenodo community from a community", }, method = RequestMethod.DELETE)
notes = "remove a Zenodo community from a community", @Operation(summary = "remove a Zenodo community from a community", description = "remove a Zenodo community from a community", tags = {
tags = { C_ZC, W }) C_ZC, W
})
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void removeCommunityZenodoCommunity( public void removeCommunityZenodoCommunity(
@PathVariable final String id, @PathVariable final String id,
@RequestBody final Integer zenodoCommId) throws CommunityException, CommunityNotFoundException { @RequestBody final Integer zenodoCommId) throws CommunityException, CommunityNotFoundException {
communityApiCore.removeCommunityZenodoCommunity(id, zenodoCommId); communityApiCore.removeCommunityZenodoCommunity(id, zenodoCommId);
} }
@RequestMapping(value = "/community/{zenodoId}/openairecommunities", produces = {
@RequestMapping(value = "/community/{zenodoId}/openairecommunities", produces = { "application/json" }, method = RequestMethod.GET) "application/json"
@ApiOperation( }, method = RequestMethod.GET)
value = "get the list of OpenAIRE communities associated to a given Zenodo community", @Operation(summary = "get the list of OpenAIRE communities associated to a given Zenodo community", description = "get the list of OpenAIRE communities associated to a given Zenodo community", tags = {
notes = "get the list of OpenAIRE communities associated to a given Zenodo community", C_ZC, R
tags = { C_ZC, R }) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 404, message = "not found", response = CommunityNotFoundException.class), @ApiResponse(responseCode = "404", description = "not found"),
@ApiResponse(code = 500, message = "unexpected error", response = CommunityException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public CommunityOpenAIRECommunities getOpenAireCommunities( public CommunityOpenAIRECommunities getOpenAireCommunities(
@PathVariable final String zenodoId) throws CommunityException, CommunityNotFoundException { @PathVariable final String zenodoId) throws CommunityException, CommunityNotFoundException {
return communityApiCore.getOpenAIRECommunities(zenodoId); return communityApiCore.getOpenAIRECommunities(zenodoId);

View File

@ -6,31 +6,31 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.google.gson.Gson; import com.google.gson.Gson;
import eu.dnetlib.openaire.community.selectioncriteria.SelectionCriteria; import eu.dnetlib.openaire.community.selectioncriteria.SelectionCriteria;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunityContentprovider { public class CommunityContentprovider {
@ApiModelProperty(value = "OpenAIRE identifier for this content provider, if available", required = false) @Schema(description = "OpenAIRE identifier for this content provider, if available", required = false)
private String openaireId; private String openaireId;
@NotNull @NotNull
@ApiModelProperty(value = "the community identifier this content provider belongs to", required = true) @Schema(description = "the community identifier this content provider belongs to", required = true)
private String communityId; private String communityId;
@NotNull @NotNull
@ApiModelProperty(value = "identifies this content provider within the context it belongs to", required = true) @Schema(description = "identifies this content provider within the context it belongs to", required = true)
private String id; private String id;
@ApiModelProperty(value = "content provider name", required = false) @Schema(description = "content provider name", required = false)
private String name; private String name;
@NotNull @NotNull
@ApiModelProperty(value = "content provider official name", required = true) @Schema(description = "content provider official name", required = true)
private String officialname; private String officialname;
// @NotNull // @NotNull
@ApiModelProperty(value = "content provider selection criteria", required = false) @Schema(description = "content provider selection criteria", required = false)
private SelectionCriteria selectioncriteria; private SelectionCriteria selectioncriteria;
public String getOpenaireId() { public String getOpenaireId() {

View File

@ -4,31 +4,33 @@ import java.util.Date;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunityDetails extends CommunitySummary { public class CommunityDetails extends CommunitySummary {
@ApiModelProperty("date of creation for this community") @Schema(description = "date of creation for this community")
private Date creationDate; private Date creationDate;
@ApiModelProperty("date of the last update for this communityu") @Schema(description = "date of the last update for this communityu")
private Date lastUpdateDate; private Date lastUpdateDate;
@ApiModelProperty("list of subjects (keywords) that characterise this community") @Schema(description = "list of subjects (keywords) that characterise this community")
private List<String> subjects; private List<String> subjects;
public CommunityDetails() { public CommunityDetails() {}
}
public CommunityDetails(final CommunitySummary summary) { public CommunityDetails(final CommunitySummary summary) {
super(summary); super(summary);
} }
@Override
public Date getCreationDate() { public Date getCreationDate() {
return creationDate; return creationDate;
} }
@Override
public void setCreationDate(final Date creationDate) { public void setCreationDate(final Date creationDate) {
this.creationDate = creationDate; this.creationDate = creationDate;
} }
@ -41,11 +43,13 @@ public class CommunityDetails extends CommunitySummary {
this.subjects = subjects; this.subjects = subjects;
} }
@Override
public Date getLastUpdateDate() { public Date getLastUpdateDate() {
return lastUpdateDate; return lastUpdateDate;
} }
public void setLastUpdateDate(Date lastUpdateDate) { @Override
public void setLastUpdateDate(final Date lastUpdateDate) {
this.lastUpdateDate = lastUpdateDate; this.lastUpdateDate = lastUpdateDate;
} }
} }

View File

@ -1,42 +1,43 @@
package eu.dnetlib.openaire.community; package eu.dnetlib.openaire.community;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotNull;
import io.swagger.v3.oas.annotations.media.Schema;
public class CommunityOpenAIRECommunities { public class CommunityOpenAIRECommunities {
@NotNull @NotNull
@ApiModelProperty(value = "the zenodo community identifier", required = true) @Schema(description = "the zenodo community identifier", required = true)
private String zenodoid; private String zenodoid;
@NotNull @NotNull
@ApiModelProperty(value = "identifies this zenodo community within the context it belongs to", required = true) @Schema(description = "identifies this zenodo community within the context it belongs to", required = true)
private List<String> openAirecommunitylist; private List<String> openAirecommunitylist;
public CommunityOpenAIRECommunities() { public CommunityOpenAIRECommunities() {
this.zenodoid = ""; this.zenodoid = "";
openAirecommunitylist=new ArrayList<>(); openAirecommunitylist = new ArrayList<>();
} }
public List<String> getOpenAirecommunitylist() { public List<String> getOpenAirecommunitylist() {
return openAirecommunitylist; return openAirecommunitylist;
} }
public CommunityOpenAIRECommunities setOpenAirecommunitylist(List<String> openAirecommunitylist) { public CommunityOpenAIRECommunities setOpenAirecommunitylist(final List<String> openAirecommunitylist) {
this.openAirecommunitylist = openAirecommunitylist; this.openAirecommunitylist = openAirecommunitylist;
return this; return this;
} }
public String getZenodoid() { public String getZenodoid() {
return zenodoid; return zenodoid;
} }
public CommunityOpenAIRECommunities setZenodoid(String zenodoid) { public CommunityOpenAIRECommunities setZenodoid(final String zenodoid) {
this.zenodoid = zenodoid; this.zenodoid = zenodoid;
return this; return this;
} }
} }

View File

@ -1,75 +1,76 @@
package eu.dnetlib.openaire.community; package eu.dnetlib.openaire.community;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotNull;
@JsonAutoDetect @JsonAutoDetect
public class CommunityOrganization { public class CommunityOrganization {
@NotNull
@ApiModelProperty(value = "the community identifier this organization belongs to", required = true)
private String communityId;
@NotNull @NotNull
@ApiModelProperty(value = "name of the organization", required = true) @Schema(description = "the community identifier this organization belongs to", required = true)
private String name; private String communityId;
@NotNull @NotNull
@ApiModelProperty(value = "identifies this organization within the context it belongs to", required = true) @Schema(description = "name of the organization", required = true)
private String id; private String name;
@NotNull @NotNull
@ApiModelProperty(value="url of the logo for this organization", required = true) @Schema(description = "identifies this organization within the context it belongs to", required = true)
private String logo_url; private String id;
@NotNull
@Schema(description = "url of the logo for this organization", required = true)
private String logo_url;
@NotNull @NotNull
@ApiModelProperty(value="website url for this organization", required = true) @Schema(description = "website url for this organization", required = true)
private String website_url; private String website_url;
public String getCommunityId() { public String getCommunityId() {
return communityId; return communityId;
} }
public CommunityOrganization setCommunityId(String communityId) { public CommunityOrganization setCommunityId(final String communityId) {
this.communityId = communityId; this.communityId = communityId;
return this; return this;
} }
public String getName() { public String getName() {
return name; return name;
} }
public CommunityOrganization setName(String name) { public CommunityOrganization setName(final String name) {
this.name = name; this.name = name;
return this; return this;
} }
public String getId() { public String getId() {
return id; return id;
} }
public CommunityOrganization setId(String id) { public CommunityOrganization setId(final String id) {
this.id = id; this.id = id;
return this; return this;
} }
public String getLogo_url() { public String getLogo_url() {
return logo_url; return logo_url;
} }
public CommunityOrganization setLogo_url(String logo_url) { public CommunityOrganization setLogo_url(final String logo_url) {
this.logo_url = logo_url; this.logo_url = logo_url;
return this; return this;
} }
public String getWebsite_url() { public String getWebsite_url() {
return website_url; return website_url;
} }
public CommunityOrganization setWebsite_url(String website_url) { public CommunityOrganization setWebsite_url(final String website_url) {
this.website_url = website_url; this.website_url = website_url;
return this; return this;
} }
} }

View File

@ -1,30 +1,31 @@
package eu.dnetlib.openaire.community; package eu.dnetlib.openaire.community;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunityProject { public class CommunityProject {
@ApiModelProperty(value = "OpenAIRE identifier for this project, if available", required = false) @Schema(description = "OpenAIRE identifier for this project, if available", required = false)
private String openaireId; private String openaireId;
@ApiModelProperty(value = "the community identifier this project belongs to", required = true) @Schema(description = "the community identifier this project belongs to", required = true)
private String communityId; private String communityId;
@ApiModelProperty(value = "identifies this project within the context it belongs to", required = true) @Schema(description = "identifies this project within the context it belongs to", required = true)
private String id; private String id;
@ApiModelProperty(value = "project name", required = true) @Schema(description = "project name", required = true)
private String name; private String name;
@ApiModelProperty(value = "project acronym", required = false) @Schema(description = "project acronym", required = false)
private String acronym; private String acronym;
@ApiModelProperty(value = "project funder", required = true) @Schema(description = "project funder", required = true)
private String funder; private String funder;
@ApiModelProperty(value = "project grant id", required = true) @Schema(description = "project grant id", required = true)
private String grantId; private String grantId;
public String getOpenaireId() { public String getOpenaireId() {

View File

@ -1,17 +1,18 @@
package eu.dnetlib.openaire.community; package eu.dnetlib.openaire.community;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public enum CommunityStatus { public enum CommunityStatus {
@ApiModelProperty("restricted visibility") @Schema(description = "restricted visibility")
hidden, hidden,
@ApiModelProperty("visible only to RCD managers") @Schema(description = "visible only to RCD managers")
manager, manager,
@ApiModelProperty("visible to RCD managers and to the community users") @Schema(description = "visible to RCD managers and to the community users")
all all
} }

View File

@ -4,42 +4,42 @@ import java.util.Date;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunitySummary { public class CommunitySummary {
@ApiModelProperty("identifies the community") @Schema(description = "identifies the community")
protected String id; protected String id;
@ApiModelProperty("values for this field reflect the index field _community_ in the index, e.g. 'egi||EGI Federation'") @Schema(description = "values for this field reflect the index field _community_ in the index, e.g. 'egi||EGI Federation'")
protected String queryId; protected String queryId;
@ApiModelProperty("community type") @Schema(description = "community type")
protected String type; protected String type;
@ApiModelProperty("community name") @Schema(description = "community name")
protected String name; protected String name;
@ApiModelProperty("community short name") @Schema(description = "community short name")
protected String shortName; protected String shortName;
@ApiModelProperty("community creation date") @Schema(description = "community creation date")
protected Date creationDate; protected Date creationDate;
@ApiModelProperty("community last update date") @Schema(description = "community last update date")
protected Date lastUpdateDate; protected Date lastUpdateDate;
@ApiModelProperty("community description") @Schema(description = "community description")
protected String description; protected String description;
@ApiModelProperty("http url for the community logo") @Schema(description = "http url for the community logo")
protected String logoUrl; protected String logoUrl;
@ApiModelProperty("status of the community, drives its visibility") @Schema(description = "status of the community, drives its visibility")
protected CommunityStatus status; protected CommunityStatus status;
@ApiModelProperty("Zenodo community associated to this community") @Schema(description = "Zenodo community associated to this community")
protected String zenodoCommunity; protected String zenodoCommunity;
public CommunitySummary() {} public CommunitySummary() {}

View File

@ -3,35 +3,35 @@ package eu.dnetlib.openaire.community;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunityWritableProperties { public class CommunityWritableProperties {
@ApiModelProperty("community name") @Schema(description = "community name")
private String name; private String name;
@ApiModelProperty("community short name") @Schema(description = "community short name")
private String shortName; private String shortName;
@ApiModelProperty("community description") @Schema(description = "community description")
private String description; private String description;
@ApiModelProperty("http url for the community logo") @Schema(description = "http url for the community logo")
private String logoUrl; private String logoUrl;
@ApiModelProperty("list of subjects (keywords) that characterise this community") @Schema(description = "list of subjects (keywords) that characterise this community")
private List<String> subjects; private List<String> subjects;
@ApiModelProperty("status of the community, drives its visibility") @Schema(description = "status of the community, drives its visibility")
private CommunityStatus status; private CommunityStatus status;
@ApiModelProperty("id of the main Zenodo community") @Schema(description = "id of the main Zenodo community")
private String mainZenodoCommunity; private String mainZenodoCommunity;
public static CommunityWritableProperties fromDetails(final CommunityDetails details) { public static CommunityWritableProperties fromDetails(final CommunityDetails details) {
CommunityWritableProperties p = new CommunityWritableProperties(); final CommunityWritableProperties p = new CommunityWritableProperties();
p.setName(details.getName()); p.setName(details.getName());
p.setShortName(details.getShortName()); p.setShortName(details.getShortName());
p.setDescription(details.getDescription()); p.setDescription(details.getDescription());
@ -90,7 +90,11 @@ public class CommunityWritableProperties {
this.status = status; this.status = status;
} }
public String getMainZenodoCommunity() { return mainZenodoCommunity; } public String getMainZenodoCommunity() {
return mainZenodoCommunity;
}
public void setMainZenodoCommunity(String mainZenodoCommunity) { this.mainZenodoCommunity = mainZenodoCommunity; } public void setMainZenodoCommunity(final String mainZenodoCommunity) {
this.mainZenodoCommunity = mainZenodoCommunity;
}
} }

View File

@ -3,45 +3,46 @@ package eu.dnetlib.openaire.community;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class CommunityZenodoCommunity { public class CommunityZenodoCommunity {
@NotNull @NotNull
@ApiModelProperty(value = "the community identifier this zenodo Community belongs to", required = true) @Schema(description = "the community identifier this zenodo Community belongs to", required = true)
private String communityId; private String communityId;
@NotNull @NotNull
@ApiModelProperty(value = "Zenodo identifier for this community", required = true) @Schema(description = "Zenodo identifier for this community", required = true)
private String zenodoid; private String zenodoid;
@NotNull @NotNull
@ApiModelProperty(value = "identifies this zenodo community within the context it belongs to", required = true) @Schema(description = "identifies this zenodo community within the context it belongs to", required = true)
private String id; private String id;
public String getZenodoid() { public String getZenodoid() {
return zenodoid; return zenodoid;
} }
public void setZenodoid(String zenodoid) { public void setZenodoid(final String zenodoid) {
this.zenodoid = zenodoid; this.zenodoid = zenodoid;
} }
public String getId() { public String getId() {
return id; return id;
} }
public void setId(final String id) { public void setId(final String id) {
this.id = id; this.id = id;
} }
public String getCommunityId() { public String getCommunityId() {
return communityId; return communityId;
} }
public void setCommunityId(String communityId) { public void setCommunityId(final String communityId) {
this.communityId = communityId; this.communityId = communityId;
} }
} }

View File

@ -3,83 +3,88 @@ package eu.dnetlib.openaire.context;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@CrossOrigin(origins = { "*" }) @CrossOrigin(origins = {
"*"
})
@ConditionalOnProperty(value = "openaire.exporter.enable.context", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.context", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE Context API", description = "the OpenAIRE Context API") @Tag(name = "OpenAIRE Context API", description = "the OpenAIRE Context API")
public class ContextApiController { public class ContextApiController {
@Autowired @Autowired
private ContextApiCore contextApiCore; private ContextApiCore contextApiCore;
@RequestMapping(value = "/contexts", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/contexts", produces = {
@ApiOperation( "application/json"
value = "list brief information about all the context profiles", }, method = RequestMethod.GET)
notes = "list brief information about all the context profiles.", @Operation(summary = "list brief information about all the context profiles", description = "list brief information about all the context profiles")
tags = { },
response = ContextSummary[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ContextSummary[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ContextException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
public List<ContextSummary> listContexts(@RequestParam(required = false, defaultValue = "") List<String> type) throws ContextException { })
public List<ContextSummary> listContexts(@RequestParam(required = false, defaultValue = "") final List<String> type) throws ContextException {
return contextApiCore.listContexts(type); return contextApiCore.listContexts(type);
} }
@RequestMapping(value = "/context/{contextId}", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/context/{contextId}", produces = {
@ApiOperation( "application/json"
value = "list the categories defined within a context", }, method = RequestMethod.GET)
notes = "list the categories defined within a context", @Operation(summary = "list the categories defined within a context", description = "list the categories defined within a context")
tags = { },
response = CategorySummary[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = CategorySummary[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ContextException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<CategorySummary> listCategories( public List<CategorySummary> listCategories(
@PathVariable final String contextId, @PathVariable final String contextId,
@RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException { @RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException {
Boolean allFilter = Optional.ofNullable(all).orElse(false); final Boolean allFilter = Optional.ofNullable(all).orElse(false);
return contextApiCore.listCategories(contextId, allFilter); return contextApiCore.listCategories(contextId, allFilter);
} }
@RequestMapping(value = "/context/category/{categoryId}", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/context/category/{categoryId}", produces = {
@ApiOperation( "application/json"
value = "list the concepts defined within a category", }, method = RequestMethod.GET)
notes = "list the concepts defined within a category", @Operation(summary = "list the concepts defined within a category", description = "list the concepts defined within a category")
tags = { },
response = ConceptSummary[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ConceptSummary[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ContextException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<ConceptSummary> listConcepts( public List<ConceptSummary> listConcepts(
@PathVariable final String categoryId, @PathVariable final String categoryId,
@RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException { @RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException {
Boolean allFilter = Optional.ofNullable(all).orElse(false); final Boolean allFilter = Optional.ofNullable(all).orElse(false);
return contextApiCore.listConcepts(categoryId, allFilter); return contextApiCore.listConcepts(categoryId, allFilter);
} }
@RequestMapping(value = "/context/category/concept/{conceptId}", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/context/category/concept/{conceptId}", produces = {
@ApiOperation( "application/json"
value = "list the concepts defined within a category", }, method = RequestMethod.GET)
notes = "list the concepts defined within a category", @Operation(summary = "list the concepts defined within a category", description = "list the concepts defined within a category")
tags = { },
response = ConceptSummary[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ConceptSummary[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ContextException.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<ConceptSummary> listSubConcepts( public List<ConceptSummary> listSubConcepts(
@PathVariable final String conceptId, @PathVariable final String conceptId,
@RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException { @RequestParam(required = false, defaultValue = "false") final Boolean all) throws ContextException {
Boolean allFilter = Optional.ofNullable(all).orElse(false); final Boolean allFilter = Optional.ofNullable(all).orElse(false);
return contextApiCore.listSubConcepts(conceptId, allFilter); return contextApiCore.listSubConcepts(conceptId, allFilter);
} }

View File

@ -35,7 +35,6 @@ import eu.dnetlib.openaire.dsm.domain.DatasourceDetailResponse;
import eu.dnetlib.openaire.dsm.domain.DatasourceDetails; import eu.dnetlib.openaire.dsm.domain.DatasourceDetails;
import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsUpdate; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsUpdate;
import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsWithApis; import eu.dnetlib.openaire.dsm.domain.DatasourceDetailsWithApis;
import eu.dnetlib.openaire.dsm.domain.DatasourceResponse;
import eu.dnetlib.openaire.dsm.domain.DatasourceSnippetResponse; import eu.dnetlib.openaire.dsm.domain.DatasourceSnippetResponse;
import eu.dnetlib.openaire.dsm.domain.RequestFilter; import eu.dnetlib.openaire.dsm.domain.RequestFilter;
import eu.dnetlib.openaire.dsm.domain.RequestSort; import eu.dnetlib.openaire.dsm.domain.RequestSort;
@ -43,16 +42,17 @@ import eu.dnetlib.openaire.dsm.domain.RequestSortOrder;
import eu.dnetlib.openaire.dsm.domain.Response; import eu.dnetlib.openaire.dsm.domain.Response;
import eu.dnetlib.openaire.dsm.domain.SimpleResponse; import eu.dnetlib.openaire.dsm.domain.SimpleResponse;
import eu.dnetlib.openaire.vocabularies.Country; import eu.dnetlib.openaire.vocabularies.Country;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@CrossOrigin(origins = { @CrossOrigin(origins = {
"*" "*"
}) })
@ConditionalOnProperty(value = "openaire.exporter.enable.dsm", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.dsm", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE DSM API", description = "the OpenAIRE Datasource Manager API") @Tag(name = "OpenAIRE DSM API", description = "the OpenAIRE Datasource Manager API")
public class DsmApiController extends AbstractExporterController { public class DsmApiController extends AbstractExporterController {
@Autowired @Autowired
@ -61,12 +61,12 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/countries", produces = { @RequestMapping(value = "/ds/countries", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "list the datasource countries", notes = "list the datasource countries", tags = { @Operation(summary = "list the datasource countries", description = "list the datasource countries", tags = {
DS, R DS, R
}, response = Country[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = Country[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public List<Country> listCountries() throws DsmException { public List<Country> listCountries() throws DsmException {
return dsmCore.listCountries(); return dsmCore.listCountries();
@ -75,12 +75,12 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/searchdetails/{page}/{size}", produces = { @RequestMapping(value = "/ds/searchdetails/{page}/{size}", produces = {
"application/json" "application/json"
}, method = RequestMethod.POST) }, method = RequestMethod.POST)
@ApiOperation(value = "search datasources", notes = "Returns list of Datasource details.", tags = { @Operation(summary = "search datasources", description = "Returns list of Datasource details.", tags = {
DS, R DS, R
}, response = DatasourceDetailResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = DatasourceDetailResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public DatasourceDetailResponse searchDsDetails( public DatasourceDetailResponse searchDsDetails(
@RequestParam final RequestSort requestSortBy, @RequestParam final RequestSort requestSortBy,
@ -96,12 +96,12 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/aggregationhistory/{dsId}", produces = { @RequestMapping(value = "/ds/aggregationhistory/{dsId}", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "search datasources", notes = "Returns list of Datasource details.", tags = { @Operation(summary = "search datasources", description = "Returns list of Datasource details.", tags = {
DS, R DS, R
}, response = AggregationHistoryResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = AggregationHistoryResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public AggregationHistoryResponse aggregationHistory(@PathVariable final String dsId) throws DsmException { public AggregationHistoryResponse aggregationHistory(@PathVariable final String dsId) throws DsmException {
final StopWatch stop = StopWatch.createStarted(); final StopWatch stop = StopWatch.createStarted();
@ -112,12 +112,12 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/searchsnippet/{page}/{size}", produces = { @RequestMapping(value = "/ds/searchsnippet/{page}/{size}", produces = {
"application/json" "application/json"
}, method = RequestMethod.POST) }, method = RequestMethod.POST)
@ApiOperation(value = "search datasources", notes = "Returns list of Datasource basic info.", tags = { @Operation(summary = "search datasources", description = "Returns list of Datasource basic info.", tags = {
DS, R DS, R
}, response = DatasourceSnippetResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = DatasourceSnippetResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public DatasourceSnippetResponse searchSnippet( public DatasourceSnippetResponse searchSnippet(
@RequestParam final RequestSort requestSortBy, @RequestParam final RequestSort requestSortBy,
@ -133,13 +133,13 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/searchregistered/{page}/{size}", produces = { @RequestMapping(value = "/ds/searchregistered/{page}/{size}", produces = {
"application/json" "application/json"
}, method = RequestMethod.POST) }, method = RequestMethod.POST)
@ApiOperation(value = "search among registered datasources", notes = "Returns list of Datasource basic info.", tags = { @Operation(summary = "search among registered datasources", description = "Returns list of Datasource basic info.", tags = {
DS, DS,
R R
}, response = DatasourceSnippetResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = DatasourceSnippetResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public DatasourceSnippetResponse searchRegistered( public DatasourceSnippetResponse searchRegistered(
@RequestParam final RequestSort requestSortBy, @RequestParam final RequestSort requestSortBy,
@ -155,13 +155,13 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/recentregistered/{size}", produces = { @RequestMapping(value = "/ds/recentregistered/{size}", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "return the latest datasources that were registered through Provide", notes = "Returns list of Datasource basic info.", tags = { @Operation(summary = "return the latest datasources that were registered through Provide", description = "Returns list of Datasource basic info.", tags = {
DS, DS,
R R
}, response = SimpleResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = DatasourceResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public SimpleResponse<?> recentRegistered(@PathVariable final int size) throws Throwable { public SimpleResponse<?> recentRegistered(@PathVariable final int size) throws Throwable {
final StopWatch stop = StopWatch.createStarted(); final StopWatch stop = StopWatch.createStarted();
@ -172,13 +172,13 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/countregistered", produces = { @RequestMapping(value = "/ds/countregistered", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "return the number of datasources registered after the given date", notes = "Returns a number.", tags = { @Operation(summary = "return the number of datasources registered after the given date", description = "Returns a number.", tags = {
DS, DS,
R R
}, response = Long.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = Long.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public Long countRegistered(@RequestParam final String fromDate, public Long countRegistered(@RequestParam final String fromDate,
@RequestParam(required = false) final String typologyFilter) throws Throwable { @RequestParam(required = false) final String typologyFilter) throws Throwable {
@ -188,13 +188,13 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/ds/api/{dsId}", produces = { @RequestMapping(value = "/ds/api/{dsId}", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "get the list of API for a given datasource", notes = "Returns the list of API for a given datasource.", tags = { @Operation(summary = "get the list of API for a given datasource", description = "Returns the list of API for a given datasource.", tags = {
API, API,
R R
}, response = ApiDetailsResponse.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ApiDetailsResponse.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public ApiDetailsResponse getApi( public ApiDetailsResponse getApi(
@PathVariable final String dsId) throws DsmException { @PathVariable final String dsId) throws DsmException {
@ -207,12 +207,12 @@ public class DsmApiController extends AbstractExporterController {
@RequestMapping(value = "/api/baseurl/{page}/{size}", produces = { @RequestMapping(value = "/api/baseurl/{page}/{size}", produces = {
"application/json" "application/json"
}, method = RequestMethod.POST) }, method = RequestMethod.POST)
@ApiOperation(value = "search for the list of base URLs of Datasource APIs managed by a user", notes = "Returns the list of base URLs of Datasource APIs managed by a user", tags = { @Operation(summary = "search for the list of base URLs of Datasource APIs managed by a user", description = "Returns the list of base URLs of Datasource APIs managed by a user", tags = {
DS, API, R DS, API, R
}, response = String[].class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = String[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public List<String> searchBaseUrls( public List<String> searchBaseUrls(
@RequestBody final RequestFilter requestFilter, @RequestBody final RequestFilter requestFilter,
@ -223,26 +223,26 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/api/{apiId}", method = RequestMethod.DELETE) @RequestMapping(value = "/ds/api/{apiId}", method = RequestMethod.DELETE)
@ApiOperation(value = "delete an API", notes = "delete an API, if removable", tags = { @Operation(summary = "delete an API", description = "delete an API, if removable", tags = {
API, W API, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 400, message = "Api not found", response = ErrorMessage.class), @ApiResponse(responseCode = "400", description = "Api not found"),
@ApiResponse(code = 403, message = "Api not removable", response = ErrorMessage.class), @ApiResponse(responseCode = "403", description = "Api not removable"),
@ApiResponse(code = 500, message = "DSM Server error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "DSM Server error")
}) })
public void deleteApi(@PathVariable final String apiId) throws DsmForbiddenException, DsmNotFoundException { public void deleteApi(@PathVariable final String apiId) throws DsmForbiddenException, DsmNotFoundException {
dsmCore.deleteApi(apiId); dsmCore.deleteApi(apiId);
} }
@RequestMapping(value = "/ds/manage", method = RequestMethod.POST) @RequestMapping(value = "/ds/manage", method = RequestMethod.POST)
@ApiOperation(value = "set the managed status for a given datasource", notes = "set the managed status for a given datasource", tags = { @Operation(summary = "set the managed status for a given datasource", description = "set the managed status for a given datasource", tags = {
DS, W DS, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void setManaged( public void setManaged(
@RequestParam final String id, @RequestParam final String id,
@ -252,25 +252,25 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/managed/{id}", method = RequestMethod.GET) @RequestMapping(value = "/ds/managed/{id}", method = RequestMethod.GET)
@ApiOperation(value = "get the datasource managed status", notes = "get the datasource managed status", tags = { @Operation(summary = "get the datasource managed status", description = "get the datasource managed status", tags = {
DS, R DS, R
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public boolean isManaged(@PathVariable final String id) throws DsmException { public boolean isManaged(@PathVariable final String id) throws DsmException {
return dsmCore.isManaged(id); return dsmCore.isManaged(id);
} }
@RequestMapping(value = "/ds/add", method = RequestMethod.POST) @RequestMapping(value = "/ds/add", method = RequestMethod.POST)
@ApiOperation(value = "add a new Datasource", notes = "add a new Datasource", tags = { @Operation(summary = "add a new Datasource", description = "add a new Datasource", tags = {
DS, W DS, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 400, message = "Malformed request", response = ErrorMessage[].class), @ApiResponse(responseCode = "400", description = "Malformed request"),
@ApiResponse(code = 500, message = "Unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "Unexpected error")
}) })
public void saveDs(@Valid @RequestBody final DatasourceDetails datasource) throws DsmException { public void saveDs(@Valid @RequestBody final DatasourceDetails datasource) throws DsmException {
@ -281,13 +281,13 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/addWithApis", method = RequestMethod.POST) @RequestMapping(value = "/ds/addWithApis", method = RequestMethod.POST)
@ApiOperation(value = "add a new Datasource and its apis", notes = "add a new Datasource and its apis", tags = { @Operation(summary = "add a new Datasource and its apis", description = "add a new Datasource and its apis", tags = {
DS, W DS, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 400, message = "Malformed request", response = ErrorMessage[].class), @ApiResponse(responseCode = "400", description = "Malformed request"),
@ApiResponse(code = 500, message = "Unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "Unexpected error")
}) })
public void saveDsWithApis(@Valid @RequestBody final DatasourceDetailsWithApis d) throws DsmException { public void saveDsWithApis(@Valid @RequestBody final DatasourceDetailsWithApis d) throws DsmException {
if (d.getDatasource() == null) { throw new DsmException(HttpStatus.SC_BAD_REQUEST, "Datasource field is null"); } if (d.getDatasource() == null) { throw new DsmException(HttpStatus.SC_BAD_REQUEST, "Datasource field is null"); }
@ -298,12 +298,12 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/update", method = RequestMethod.POST) @RequestMapping(value = "/ds/update", method = RequestMethod.POST)
@ApiOperation(value = "update Datasource details", notes = "update Datasource details", tags = { @Operation(summary = "update Datasource details", description = "update Datasource details", tags = {
DS, W DS, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void updateDatasource( public void updateDatasource(
@RequestBody final DatasourceDetailsUpdate ds) throws DsmException, DsmNotFoundException { @RequestBody final DatasourceDetailsUpdate ds) throws DsmException, DsmNotFoundException {
@ -312,12 +312,12 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/api/baseurl", method = RequestMethod.POST) @RequestMapping(value = "/ds/api/baseurl", method = RequestMethod.POST)
@ApiOperation(value = "update the base URL of a datasource interface", notes = "update the base URL of a datasource interface", tags = { @Operation(summary = "update the base URL of a datasource interface", description = "update the base URL of a datasource interface", tags = {
API, W API, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void updateBaseUrl( public void updateBaseUrl(
@RequestParam final String dsId, @RequestParam final String dsId,
@ -328,12 +328,12 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/api/compliance", method = RequestMethod.POST) @RequestMapping(value = "/ds/api/compliance", method = RequestMethod.POST)
@ApiOperation(value = "update the compatibility of a datasource interface", notes = "update the compatibility of a datasource interface", tags = { @Operation(summary = "update the compatibility of a datasource interface", description = "update the compatibility of a datasource interface", tags = {
API, W API, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void updateCompliance( public void updateCompliance(
@RequestParam final String dsId, @RequestParam final String dsId,
@ -345,12 +345,12 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/api/oaiset", method = RequestMethod.POST) @RequestMapping(value = "/ds/api/oaiset", method = RequestMethod.POST)
@ApiOperation(value = "update the OAI set of a datasource interface", notes = "update the OAI set of a datasource interface", tags = { @Operation(summary = "update the OAI set of a datasource interface", description = "update the OAI set of a datasource interface", tags = {
API, W API, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void updateOaiSetl( public void updateOaiSetl(
@RequestParam final String dsId, @RequestParam final String dsId,
@ -361,12 +361,12 @@ public class DsmApiController extends AbstractExporterController {
} }
@RequestMapping(value = "/ds/api/add", method = RequestMethod.POST) @RequestMapping(value = "/ds/api/add", method = RequestMethod.POST)
@ApiOperation(value = "adds a new Interface to one Datasource", notes = "adds an Interface to one Datasource", tags = { @Operation(summary = "adds a new Interface to one Datasource", description = "adds an Interface to one Datasource", tags = {
API, W API, W
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void addApi(@RequestBody final ApiDetails api) throws DsmException { public void addApi(@RequestBody final ApiDetails api) throws DsmException {
if (StringUtils.isBlank(api.getDatasource())) { throw new DsmException(HttpStatus.SC_BAD_REQUEST, "missing datasource id"); } if (StringUtils.isBlank(api.getDatasource())) { throw new DsmException(HttpStatus.SC_BAD_REQUEST, "missing datasource id"); }
@ -379,36 +379,36 @@ public class DsmApiController extends AbstractExporterController {
private OperationManager operationManager; private OperationManager operationManager;
@RequestMapping(value = "/dsm/ops", method = RequestMethod.GET) @RequestMapping(value = "/dsm/ops", method = RequestMethod.GET)
@ApiOperation(value = "get the number of pending operations", notes = "get the number of pending operations", tags = { @Operation(summary = "get the number of pending operations", description = "get the number of pending operations", tags = {
R, M R, M
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public int getOps() throws DsmException { public int getOps() throws DsmException {
return operationManager.getOpSize(); return operationManager.getOpSize();
} }
@RequestMapping(value = "/dsm/killops", method = RequestMethod.POST) @RequestMapping(value = "/dsm/killops", method = RequestMethod.POST)
@ApiOperation(value = "interrupts the pending operations", notes = "return the number of interrupted operations", tags = { @Operation(summary = "interrupts the pending operations", description = "return the number of interrupted operations", tags = {
W, M W, M
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public int killOps() throws DsmException { public int killOps() throws DsmException {
return operationManager.dropAll(); return operationManager.dropAll();
} }
@RequestMapping(value = "/dsm/dropcache", method = RequestMethod.POST) @RequestMapping(value = "/dsm/dropcache", method = RequestMethod.POST)
@ApiOperation(value = "drop the caches", notes = "drop the internal caches", tags = { @Operation(summary = "drop the caches", description = "drop the internal caches", tags = {
W, M W, M
}) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK"), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public void dropCache() throws DsmException { public void dropCache() throws DsmException {
dsmCore.dropCaches(); dsmCore.dropCaches();

View File

@ -1,29 +1,26 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.AggregationInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List; import java.util.List;
@ApiModel import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.AggregationInfo;
@JsonAutoDetect @JsonAutoDetect
public class AggregationHistoryResponse extends Response { public class AggregationHistoryResponse extends Response {
@ApiModelProperty(position = 1) private List<AggregationInfo> aggregationInfo;
private List<AggregationInfo> aggregationInfo;
public AggregationHistoryResponse(List<AggregationInfo> aggregationInfo) { public AggregationHistoryResponse(final List<AggregationInfo> aggregationInfo) {
super(); super();
this.aggregationInfo = aggregationInfo; this.aggregationInfo = aggregationInfo;
} }
public List<AggregationInfo> getAggregationInfo() { public List<AggregationInfo> getAggregationInfo() {
return aggregationInfo; return aggregationInfo;
} }
public void setAggregationInfo(List<AggregationInfo> aggregationInfo) { public void setAggregationInfo(final List<AggregationInfo> aggregationInfo) {
this.aggregationInfo = aggregationInfo; this.aggregationInfo = aggregationInfo;
} }
} }

View File

@ -5,65 +5,46 @@ import java.util.Set;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Api model", description = "provides information about the datasource API") @Schema(name = "Api model", description = "provides information about the datasource API")
public class ApiDetails extends ApiIgnoredProperties { public class ApiDetails extends ApiIgnoredProperties {
@ApiModelProperty(position = 0)
private String id = null; private String id = null;
@ApiModelProperty(position = 1)
private String protocol = null; private String protocol = null;
@ApiModelProperty(position = 2)
private String datasource = null; private String datasource = null;
@ApiModelProperty(position = 3)
private String contentdescription = null; private String contentdescription = null;
@ApiModelProperty(position = 4)
private String eoscDatasourceType = null; private String eoscDatasourceType = null;
@ApiModelProperty(position = 5)
private String compatibility; private String compatibility;
@ApiModelProperty(position = 7)
private String compatibilityOverride; private String compatibilityOverride;
@ApiModelProperty(position = 8)
private Integer lastCollectionTotal; private Integer lastCollectionTotal;
@ApiModelProperty(position = 9)
private Date lastCollectionDate; private Date lastCollectionDate;
@ApiModelProperty(position = 10)
private Integer lastAggregationTotal; private Integer lastAggregationTotal;
@ApiModelProperty(position = 11)
private Date lastAggregationDate; private Date lastAggregationDate;
@ApiModelProperty(position = 12)
private Integer lastDownloadTotal; private Integer lastDownloadTotal;
@ApiModelProperty(position = 13)
private Date lastDownloadDate; private Date lastDownloadDate;
@ApiModelProperty(position = 14)
private String baseurl; private String baseurl;
@ApiModelProperty(position = 15)
protected Boolean removable = false; protected Boolean removable = false;
@ApiModelProperty(position = 16)
private Set<ApiParamDetails> apiParams; private Set<ApiParamDetails> apiParams;
@ApiModelProperty(position = 17)
private String metadataIdentifierPath = ""; private String metadataIdentifierPath = "";
@ApiModelProperty(position = 18)
private String typology = null; private String typology = null;
public String getId() { public String getId() {

View File

@ -3,14 +3,13 @@ package eu.dnetlib.openaire.dsm.domain;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
public class ApiDetailsResponse extends Response { public class ApiDetailsResponse extends Response {
@ApiModelProperty(position = 1)
private List<ApiDetails> api; private List<ApiDetails> api;
public List<ApiDetails> getApi() { public List<ApiDetails> getApi() {

View File

@ -3,12 +3,11 @@ package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.AggregationInfo; import eu.dnetlib.enabling.datasources.common.AggregationInfo;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
/** /**
* Created by claudio on 29/11/2016. * Created by claudio on 29/11/2016.
*/ */
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class CollectionInfo extends AggregationInfo { public class CollectionInfo extends AggregationInfo {

View File

@ -1,13 +1,12 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
/** /**
* Created by claudio on 12/09/16. * Created by claudio on 12/09/16.
*/ */
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public enum CollectionMode { public enum CollectionMode {
REFRESH, INCREMENTAL REFRESH,
INCREMENTAL
} }

View File

@ -1,28 +1,24 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List; import java.util.List;
@ApiModel import com.fasterxml.jackson.annotation.JsonAutoDetect;
@JsonAutoDetect @JsonAutoDetect
public class DatasourceDetailResponse extends Response { public class DatasourceDetailResponse extends Response {
@ApiModelProperty(position = 1) private List<DatasourceDetails> datasourceInfo;
private List<DatasourceDetails> datasourceInfo;
public DatasourceDetailResponse(List<DatasourceDetails> datasourceInfo) { public DatasourceDetailResponse(final List<DatasourceDetails> datasourceInfo) {
super(); super();
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
public List<DatasourceDetails> getDatasourceInfo() { public List<DatasourceDetails> getDatasourceInfo() {
return datasourceInfo; return datasourceInfo;
} }
public void setDatasourceInfo(List<DatasourceDetails> datasourceInfo) { public void setDatasourceInfo(final List<DatasourceDetails> datasourceInfo) {
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
} }

View File

@ -9,128 +9,92 @@ import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
/** /**
* Created by claudio on 12/09/16. * Created by claudio on 12/09/16.
*/ */
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource model", description = "provides information about the datasource") @Schema(name = "Datasource model", description = "provides information about the datasource")
public class DatasourceDetails extends DatasourceIgnoredProperties { public class DatasourceDetails extends DatasourceIgnoredProperties {
@NotBlank @NotBlank
@ApiModelProperty(position = 0)
private String id; private String id;
@Transient @Transient
@ApiModelProperty(position = 1)
private String openaireId; private String openaireId;
@NotBlank @NotBlank
@ApiModelProperty(position = 2)
private String officialname; private String officialname;
@NotBlank @NotBlank
@ApiModelProperty(position = 3)
private String englishname; private String englishname;
@ApiModelProperty(position = 4)
private String websiteurl; private String websiteurl;
@ApiModelProperty(position = 5)
private String logourl; private String logourl;
@Email @Email
@ApiModelProperty(position = 6)
private String contactemail; private String contactemail;
@ApiModelProperty(position = 7)
private Double latitude; private Double latitude;
@ApiModelProperty(position = 8)
private Double longitude; private Double longitude;
@ApiModelProperty(position = 9)
private String timezone; private String timezone;
@NotBlank @NotBlank
@ApiModelProperty(position = 10)
private String namespaceprefix; private String namespaceprefix;
@ApiModelProperty(position = 11)
private String languages; private String languages;
@ApiModelProperty(position = 12)
private Date dateofvalidation; private Date dateofvalidation;
@NotBlank @NotBlank
@ApiModelProperty(position = 13)
private String eoscDatasourceType; private String eoscDatasourceType;
@ApiModelProperty(position = 14)
private Date dateofcollection; private Date dateofcollection;
@ApiModelProperty(position = 15)
private String platform; private String platform;
@ApiModelProperty(position = 16)
private String activationId; private String activationId;
@ApiModelProperty(position = 17)
private String description; private String description;
@ApiModelProperty(position = 18)
private String issn; private String issn;
@ApiModelProperty(position = 19)
private String eissn; private String eissn;
@ApiModelProperty(position = 20)
private String lissn; private String lissn;
@Email @Email
@ApiModelProperty(position = 21)
private String registeredby; private String registeredby;
@ApiModelProperty(position = 22)
private String subjects; private String subjects;
@ApiModelProperty(position = 23)
protected String aggregator = "OPENAIRE"; protected String aggregator = "OPENAIRE";
@ApiModelProperty(position = 24)
protected String collectedfrom; protected String collectedfrom;
@ApiModelProperty(position = 25)
private Boolean managed; private Boolean managed;
@ApiModelProperty(position = 28)
private Boolean consentTermsOfUse; private Boolean consentTermsOfUse;
@ApiModelProperty(position = 29)
private Boolean fullTextDownload; private Boolean fullTextDownload;
@ApiModelProperty(position = 30)
private Date consentTermsOfUseDate; private Date consentTermsOfUseDate;
@ApiModelProperty(position = 31)
private Date lastConsentTermsOfUseDate; private Date lastConsentTermsOfUseDate;
@ApiModelProperty(position = 26)
private Set<OrganizationDetails> organizations; private Set<OrganizationDetails> organizations;
@ApiModelProperty(position = 27)
private Set<IdentitiesDetails> identities; private Set<IdentitiesDetails> identities;
@ApiModelProperty(position = 32)
private String status; private String status;
@Deprecated @Deprecated
@ApiModelProperty(position = 33)
private String typology; private String typology;
@ApiModelProperty(position = 34)
private Date registrationdate; private Date registrationdate;
public String getId() { public String getId() {

View File

@ -8,80 +8,59 @@ import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
/** /**
* Created by claudio on 12/09/16. * Created by claudio on 12/09/16.
*/ */
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource updatable fields model", description = "provides information about the datasource field that can be updated") @Schema(name = "Datasource updatable fields model", description = "provides information about the datasource field that can be updated")
public class DatasourceDetailsUpdate { public class DatasourceDetailsUpdate {
@NotBlank @NotBlank
@ApiModelProperty(position = 0)
private String id; private String id;
@NotBlank @NotBlank
@ApiModelProperty(position = 2)
private String officialname; private String officialname;
@NotBlank @NotBlank
@ApiModelProperty(position = 3)
private String englishname; private String englishname;
@ApiModelProperty(position = 4)
private String websiteurl; private String websiteurl;
@ApiModelProperty(position = 5)
private String logourl; private String logourl;
@Email @Email
@ApiModelProperty(position = 6)
private String contactemail; private String contactemail;
@ApiModelProperty(position = 7)
private Double latitude; private Double latitude;
@ApiModelProperty(position = 8)
private Double longitude; private Double longitude;
@ApiModelProperty(position = 9)
private String timezone; private String timezone;
@Deprecated @Deprecated
@ApiModelProperty(position = 12)
private String typology; private String typology;
@ApiModelProperty(position = 13)
private String eoscDatasourceType; private String eoscDatasourceType;
@ApiModelProperty(position = 15)
private String platform; private String platform;
@ApiModelProperty(position = 17)
private String description; private String description;
@Email @Email
@ApiModelProperty(position = 21)
private String registeredby; private String registeredby;
@ApiModelProperty(position = 25)
private Boolean managed; private Boolean managed;
@ApiModelProperty(position = 27)
private Set<IdentitiesDetails> identities; private Set<IdentitiesDetails> identities;
@ApiModelProperty(position = 28)
private Boolean consentTermsOfUse; private Boolean consentTermsOfUse;
@ApiModelProperty(position = 29)
private Date consentTermsOfUseDate; private Date consentTermsOfUseDate;
@ApiModelProperty(position = 29)
private Date lastConsentTermsOfUseDate; private Date lastConsentTermsOfUseDate;
@ApiModelProperty(position = 31)
private Boolean fullTextDownload; private Boolean fullTextDownload;
public String getId() { public String getId() {

View File

@ -5,19 +5,19 @@ import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
/** /**
* Created by claudio on 12/09/16. * Created by claudio on 12/09/16.
*/ */
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource model with apis", description = "provides information about the datasource and its apis") @Schema(name = "Datasource model with apis", description = "provides information about the datasource and its apis")
public class DatasourceDetailsWithApis { public class DatasourceDetailsWithApis {
@ApiModelProperty(position = 1)
private DatasourceDetails datasource; private DatasourceDetails datasource;
private List<ApiDetails> apis = new ArrayList<>();
public DatasourceDetails getDatasource() { public DatasourceDetails getDatasource() {
return datasource; return datasource;
} }
@ -26,9 +26,6 @@ public class DatasourceDetailsWithApis {
this.datasource = datasource; this.datasource = datasource;
} }
@ApiModelProperty(position = 2)
private List<ApiDetails> apis = new ArrayList<>();
public List<ApiDetails> getApis() { public List<ApiDetails> getApis() {
return apis; return apis;
} }

View File

@ -3,39 +3,30 @@ package eu.dnetlib.openaire.dsm.domain;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.AggregationInfo; import eu.dnetlib.enabling.datasources.common.AggregationInfo;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource info model", description = "provides information about the datasource and its aggregation status") @Schema(name = "Datasource info model", description = "provides information about the datasource and its aggregation status")
public class DatasourceInfo { public class DatasourceInfo {
@ApiModelProperty(position = 0)
private long indexRecords; private long indexRecords;
@ApiModelProperty(position = 1)
private long fundedContent; private long fundedContent;
@ApiModelProperty(position = 2)
private long fulltexts; private long fulltexts;
@ApiModelProperty(position = 3)
private String lastIndexingDate; private String lastIndexingDate;
@ApiModelProperty(position = 4)
private String firstHarvestDate; private String firstHarvestDate;
@ApiModelProperty(position = 5)
private DatasourceDetails datasource; private DatasourceDetails datasource;
@ApiModelProperty(position = 6)
private AggregationInfo lastCollection; private AggregationInfo lastCollection;
@ApiModelProperty(position = 7)
private AggregationInfo lastTransformation; private AggregationInfo lastTransformation;
@ApiModelProperty(position = 8)
private List<AggregationInfo> aggregationHistory; private List<AggregationInfo> aggregationHistory;
public DatasourceInfo() { public DatasourceInfo() {

View File

@ -4,9 +4,7 @@ import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class DatasourceResponse<T> extends Response { public class DatasourceResponse<T> extends Response {

View File

@ -1,28 +1,24 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List; import java.util.List;
@ApiModel import com.fasterxml.jackson.annotation.JsonAutoDetect;
@JsonAutoDetect @JsonAutoDetect
public class DatasourceSearchResponse extends Response { public class DatasourceSearchResponse extends Response {
@ApiModelProperty(position = 1) private List<DatasourceInfo> datasourceInfo;
private List<DatasourceInfo> datasourceInfo;
public DatasourceSearchResponse(List<DatasourceInfo> datasourceInfo) { public DatasourceSearchResponse(final List<DatasourceInfo> datasourceInfo) {
super(); super();
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
public List<DatasourceInfo> getDatasourceInfo() { public List<DatasourceInfo> getDatasourceInfo() {
return datasourceInfo; return datasourceInfo;
} }
public void setDatasourceInfo(List<DatasourceInfo> datasourceInfo) { public void setDatasourceInfo(final List<DatasourceInfo> datasourceInfo) {
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
} }

View File

@ -4,23 +4,19 @@ import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource model", description = "provides information about the datasource") @Schema(name = "Datasource model", description = "provides information about the datasource")
public class DatasourceSnippet { public class DatasourceSnippet {
@NotBlank @NotBlank
@ApiModelProperty(position = 0)
private String id; private String id;
@NotBlank @NotBlank
@ApiModelProperty(position = 2)
private String officialname; private String officialname;
@NotBlank @NotBlank
@ApiModelProperty(position = 3)
private String englishname; private String englishname;
public String getId() { public String getId() {

View File

@ -8,61 +8,45 @@ import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Datasource model", description = "provides extended information about the datasource") @Schema(name = "Datasource model", description = "provides extended information about the datasource")
public class DatasourceSnippetExtended { public class DatasourceSnippetExtended {
@NotBlank @NotBlank
@ApiModelProperty(position = 0)
private String id; private String id;
@NotBlank @NotBlank
@ApiModelProperty(position = 2)
private String officialname; private String officialname;
@NotBlank @NotBlank
@ApiModelProperty(position = 3)
private String englishname; private String englishname;
@ApiModelProperty(position = 4)
private String websiteurl; private String websiteurl;
@Email @Email
@ApiModelProperty(position = 5)
private String registeredby; private String registeredby;
@ApiModelProperty(position = 6)
private Date registrationdate; private Date registrationdate;
@ApiModelProperty(position = 7)
private String eoscDatasourceType; private String eoscDatasourceType;
@ApiModelProperty(position = 8)
private String logoUrl; private String logoUrl;
@ApiModelProperty(position = 9)
private String description; private String description;
@ApiModelProperty(position = 10)
private Boolean consentTermsOfUse; private Boolean consentTermsOfUse;
@ApiModelProperty(position = 11)
private Date consentTermsOfUseDate; private Date consentTermsOfUseDate;
@ApiModelProperty(position = 12)
private Date lastConsentTermsOfUseDate; private Date lastConsentTermsOfUseDate;
@ApiModelProperty(position = 13)
private Boolean fullTextDownload; private Boolean fullTextDownload;
@ApiModelProperty(position = 14)
private Set<OrganizationDetails> organizations; private Set<OrganizationDetails> organizations;
@Deprecated @Deprecated
@ApiModelProperty(position = 15)
private String typology; private String typology;
public String getId() { public String getId() {

View File

@ -1,28 +1,24 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List; import java.util.List;
@ApiModel import com.fasterxml.jackson.annotation.JsonAutoDetect;
@JsonAutoDetect @JsonAutoDetect
public class DatasourceSnippetResponse extends Response { public class DatasourceSnippetResponse extends Response {
@ApiModelProperty(position = 1) private List<DatasourceSnippetExtended> datasourceInfo;
private List<DatasourceSnippetExtended> datasourceInfo;
public DatasourceSnippetResponse(List<DatasourceSnippetExtended> datasourceInfo) { public DatasourceSnippetResponse(final List<DatasourceSnippetExtended> datasourceInfo) {
super(); super();
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
public List<DatasourceSnippetExtended> getDatasourceInfo() { public List<DatasourceSnippetExtended> getDatasourceInfo() {
return datasourceInfo; return datasourceInfo;
} }
public void setDatasourceInfo(List<DatasourceSnippetExtended> datasourceInfo) { public void setDatasourceInfo(final List<DatasourceSnippetExtended> datasourceInfo) {
this.datasourceInfo = datasourceInfo; this.datasourceInfo = datasourceInfo;
} }
} }

View File

@ -2,10 +2,10 @@ package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Filter name", description = "List of the field names used to filter datasources") @Schema(name = "Filter name", description = "List of the field names used to filter datasources")
public enum FilterName { public enum FilterName {
id, id,

View File

@ -8,29 +8,20 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class Header { public class Header {
@ApiModelProperty(position = 0)
private long total; private long total;
@ApiModelProperty(position = 1)
private int page; private int page;
@ApiModelProperty(position = 2)
private int size; private int size;
@ApiModelProperty(position = 3)
private long time; private long time;
@ApiModelProperty(position = 4)
private int statusCode; private int statusCode;
@ApiModelProperty(position = 5)
private List<String> errors = Lists.newArrayList(); private List<String> errors = Lists.newArrayList();
@JsonIgnore @JsonIgnore
@ -40,8 +31,7 @@ public class Header {
return new Header(); return new Header();
} }
public Header() { public Header() {}
}
public long getTime() { public long getTime() {
return time; return time;
@ -99,8 +89,8 @@ public class Header {
public List<String> getErrors() { public List<String> getErrors() {
return getExceptions().stream() return getExceptions().stream()
.map(Throwable::getMessage) .map(Throwable::getMessage)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
public Header setErrors(final List<String> errors) { public Header setErrors(final List<String> errors) {

View File

@ -1,9 +1,7 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class IdentitiesDetails { public class IdentitiesDetails {

View File

@ -4,28 +4,22 @@ import javax.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Organization info model", description = "provides information about the organization") @Schema(name = "Organization info model", description = "provides information about the organization")
public class OrganizationDetails extends OrganizationIgnoredProperties { public class OrganizationDetails extends OrganizationIgnoredProperties {
@ApiModelProperty(position = 0)
private String legalshortname; private String legalshortname;
@NotBlank @NotBlank
@ApiModelProperty(position = 1)
private String legalname; private String legalname;
@ApiModelProperty(position = 2)
private String websiteurl; private String websiteurl;
@ApiModelProperty(position = 3)
private String logourl; private String logourl;
@NotBlank @NotBlank
@ApiModelProperty(position = 4)
private String country; private String country;
public String getLegalshortname() { public String getLegalshortname() {

View File

@ -4,10 +4,10 @@ import java.util.HashMap;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
@ApiModel(value = "Request filter", description = "field name and value pairs") @Schema(name = "Request filter", description = "field name and value pairs")
public class RequestFilter extends HashMap<FilterName, Object> { public class RequestFilter extends HashMap<FilterName, Object> {
/** /**

View File

@ -1,16 +1,13 @@
package eu.dnetlib.openaire.dsm.domain; package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
@JsonAutoDetect @JsonAutoDetect
@ApiModel( @Schema(name = "Api response model", description = "Api response model, provides a response header")
value = "Api response model",
description = "Api response model, provides a response header")
public class Response { public class Response {
@ApiModelProperty(position = 0)
private Header header; private Header header;
public Response() { public Response() {

View File

@ -4,14 +4,9 @@ import java.util.List;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class SimpleResponse<T> extends Response { public class SimpleResponse<T> extends Response {
@ApiModelProperty(position = 1)
private List<T> response; private List<T> response;
public List<T> getResponse() { public List<T> getResponse() {

View File

@ -3,12 +3,10 @@ package eu.dnetlib.openaire.dsm.domain;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.AggregationInfo; import eu.dnetlib.enabling.datasources.common.AggregationInfo;
import io.swagger.annotations.ApiModel;
/** /**
* Created by claudio on 29/11/2016. * Created by claudio on 29/11/2016.
*/ */
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class TransformationInfo extends AggregationInfo { public class TransformationInfo extends AggregationInfo {

View File

@ -6,8 +6,9 @@ import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import eu.dnetlib.enabling.datasources.common.ApiParam; import eu.dnetlib.enabling.datasources.common.ApiParam;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
/** /**
* Created by claudio on 13/04/2017. * Created by claudio on 13/04/2017.
@ -15,7 +16,7 @@ import io.swagger.annotations.ApiModel;
@Entity @Entity
@Table(name = "dsm_apiparams") @Table(name = "dsm_apiparams")
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@ApiModel(value = "Datasource Api params model", description = "describes the datasource api params") @Schema(name = "Datasource Api params model", description = "describes the datasource api params")
public class ApiParamDbEntry implements ApiParam { public class ApiParamDbEntry implements ApiParam {
@EmbeddedId @EmbeddedId
@ -35,10 +36,12 @@ public class ApiParamDbEntry implements ApiParam {
return id; return id;
} }
@Override
public String getValue() { public String getValue() {
return value; return value;
} }
@Override
public void setValue(final String value) { public void setValue(final String value) {
this.value = value; this.value = value;
} }

View File

@ -7,14 +7,12 @@ import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import eu.dnetlib.enabling.datasources.common.BrowseTerm; import eu.dnetlib.enabling.datasources.common.BrowseTerm;
import io.swagger.annotations.ApiModel;
/** /**
* Created by claudio on 20/04/2017. * Created by claudio on 20/04/2017.
*/ */
@Entity @Entity
@Table(name = "browse_countries") @Table(name = "browse_countries")
@ApiModel
@JsonAutoDetect @JsonAutoDetect
public class CountryTerm implements Comparable<CountryTerm>, BrowseTerm { public class CountryTerm implements Comparable<CountryTerm>, BrowseTerm {
@ -27,6 +25,7 @@ public class CountryTerm implements Comparable<CountryTerm>, BrowseTerm {
return term; return term;
} }
@Override
public void setTerm(final String term) { public void setTerm(final String term) {
this.term = term; this.term = term;
} }
@ -36,6 +35,7 @@ public class CountryTerm implements Comparable<CountryTerm>, BrowseTerm {
return total; return total;
} }
@Override
public void setTotal(final long total) { public void setTotal(final long total) {
this.total = total; this.total = total;
} }

View File

@ -8,12 +8,12 @@ import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
@Entity @Entity
@JsonAutoDetect @JsonAutoDetect
@Table(name = "dsm_datasource_api") @Table(name = "dsm_datasource_api")
@ApiModel(value = "DatasourceApi model", description = "describes a joint view between datasources and their API (1:N)") @Schema(name = "DatasourceApi model", description = "describes a joint view between datasources and their API (1:N)")
public class DatasourceApiDbEntry { public class DatasourceApiDbEntry {
@Id @Id

View File

@ -2,23 +2,30 @@ package eu.dnetlib.openaire.funders;
import java.util.List; import java.util.List;
import eu.dnetlib.openaire.common.AbstractExporterController;
import eu.dnetlib.openaire.funders.domain.ExtendedFunderDetails;
import eu.dnetlib.openaire.funders.domain.FunderDetails;
import eu.dnetlib.openaire.funders.domain.db.FunderDbEntry;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.openaire.common.AbstractExporterController;
import eu.dnetlib.openaire.funders.domain.ExtendedFunderDetails;
import eu.dnetlib.openaire.funders.domain.FunderDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@CrossOrigin(origins = { "*" }) @CrossOrigin(origins = {
"*"
})
@ConditionalOnProperty(value = "openaire.exporter.enable.funders", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.funders", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE funders API", description = "the OpenAIRE funders API") @Tag(name = "OpenAIRE funders API", description = "the OpenAIRE funders API")
public class FundersApiController extends AbstractExporterController { public class FundersApiController extends AbstractExporterController {
private static final Log log = LogFactory.getLog(FundersApiController.class); private static final Log log = LogFactory.getLog(FundersApiController.class);
@ -26,41 +33,46 @@ public class FundersApiController extends AbstractExporterController {
@Autowired @Autowired
private FunderDao fDao; private FunderDao fDao;
@RequestMapping(value = "/funders", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/funders", produces = {
@ApiOperation( "application/json"
value = "get basic information about funders", }, method = RequestMethod.GET)
notes = "basic information about funders: id, name, shortname, last update date, registration date", @Operation(summary = "get basic information about funders", description = "basic information about funders: id, name, shortname, last update date, registration date")
response = FunderDetails[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = FunderDetails[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<FunderDetails> getFunders( public List<FunderDetails> getFunders(
@PathVariable final int page, @PathVariable final int page,
@PathVariable final int size) throws FundersApiException { @PathVariable final int size) throws FundersApiException {
return fDao.listFunderDetails(page, size); return fDao.listFunderDetails(page, size);
} }
@RequestMapping(value = "/funder/{id}", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/funder/{id}", produces = {
@ApiOperation(value = "get the funder details", notes = "complete funder information", response = FunderDbEntry.class) "application/json"
}, method = RequestMethod.GET)
@Operation(summary = "get the funder details", description = "complete funder information")
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = FunderDbEntry.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public ExtendedFunderDetails getFunderDetails( public ExtendedFunderDetails getFunderDetails(
@PathVariable final String id) throws FundersApiException { @PathVariable final String id) throws FundersApiException {
return fDao.getExtendedFunderDetails(id); return fDao.getExtendedFunderDetails(id);
} }
@RequestMapping(value = "/funder/ids", produces = { "application/json" }, method = RequestMethod.GET) @RequestMapping(value = "/funder/ids", produces = {
@ApiOperation(value = "get the list of funder ids", notes = "get the list of funder ids", response = String[].class) "application/json"
}, method = RequestMethod.GET)
@Operation(summary = "get the list of funder ids", description = "get the list of funder ids")
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = String[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public List<String> getFunderIds( public List<String> getFunderIds(
@PathVariable final int page, @PathVariable final int page,
@PathVariable final int size @PathVariable final int size) throws FundersApiException {
) throws FundersApiException {
return fDao.listFunderIds(page, size); return fDao.listFunderIds(page, size);
} }

View File

@ -19,16 +19,17 @@ import com.google.common.collect.Maps;
import eu.dnetlib.openaire.common.AbstractExporterController; import eu.dnetlib.openaire.common.AbstractExporterController;
import eu.dnetlib.openaire.common.ExporterConstants; import eu.dnetlib.openaire.common.ExporterConstants;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@CrossOrigin(origins = { @CrossOrigin(origins = {
"*" "*"
}) })
@ConditionalOnProperty(value = "openaire.exporter.enable.info", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.info", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE Info API", description = "the OpenAIRE info API") @Tag(name = "OpenAIRE Info API", description = "the OpenAIRE info API")
public class InfoController extends AbstractExporterController { public class InfoController extends AbstractExporterController {
private static final Log log = LogFactory.getLog(InfoController.class); // NOPMD by marko on 11/24/08 5:02 PM private static final Log log = LogFactory.getLog(InfoController.class); // NOPMD by marko on 11/24/08 5:02 PM
@ -41,12 +42,12 @@ public class InfoController extends AbstractExporterController {
@RequestMapping(value = "/info/{infoKey}", produces = { @RequestMapping(value = "/info/{infoKey}", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "get info date", notes = "get info date", tags = { @Operation(summary = "get info date", description = "get info date", tags = {
ExporterConstants.R ExporterConstants.R
}, response = LocalDate.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = LocalDate.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public LocalDate getDate(@PathVariable final String infoKey) { public LocalDate getDate(@PathVariable final String infoKey) {
final JdbcInfoDao.DATE_INFO info = JdbcInfoDao.DATE_INFO.valueOf(infoKey); final JdbcInfoDao.DATE_INFO info = JdbcInfoDao.DATE_INFO.valueOf(infoKey);
@ -57,12 +58,12 @@ public class InfoController extends AbstractExporterController {
@RequestMapping(value = "/info", produces = { @RequestMapping(value = "/info", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "get all the info date", notes = "get all the info date", tags = { @Operation(summary = "get all the info date", description = "get all the info date", tags = {
ExporterConstants.R ExporterConstants.R
}, response = Map.class) })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = LocalDate.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public Map<String, LocalDate> listInfo() { public Map<String, LocalDate> listInfo() {
final Map<String, LocalDate> map = Maps.newHashMap(); final Map<String, LocalDate> map = Maps.newHashMap();
@ -75,12 +76,12 @@ public class InfoController extends AbstractExporterController {
@RequestMapping(value = "/info/keys", produces = { @RequestMapping(value = "/info/keys", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "get the available keys", notes = "get the available keys", tags = { @Operation(summary = "get the available keys", description = "get the available keys", tags = {
ExporterConstants.R ExporterConstants.R
}, response = String.class, responseContainer = "List") })
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = LocalDate.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) @ApiResponse(responseCode = "500", description = "unexpected error")
}) })
public List<String> listInfoKeys() { public List<String> listInfoKeys() {
final List<String> keys = Lists.newArrayList(); final List<String> keys = Lists.newArrayList();
@ -93,7 +94,7 @@ public class InfoController extends AbstractExporterController {
@RequestMapping(value = "/info/dropCache", produces = { @RequestMapping(value = "/info/dropCache", produces = {
"application/json" "application/json"
}, method = RequestMethod.GET) }, method = RequestMethod.GET)
@ApiOperation(value = "Drops the info cache", notes = "Drops the info cache", tags = { @Operation(summary = "Drops the info cache", description = "Drops the info cache", tags = {
ExporterConstants.R ExporterConstants.R
}) })
public void dropCache() { public void dropCache() {

View File

@ -8,22 +8,11 @@ import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.google.common.xml.XmlEscapers;
import eu.dnetlib.DnetOpenaireExporterProperties;
import eu.dnetlib.DnetOpenaireExporterProperties.Project;
import eu.dnetlib.openaire.common.AbstractExporterController;
import eu.dnetlib.openaire.common.ExporterConstants;
import eu.dnetlib.openaire.project.domain.db.ProjectTsv;
import eu.dnetlib.openaire.project.domain.db.ProjectDetails;
import eu.dnetlib.openaire.project.dao.JdbcApiDao;
import eu.dnetlib.openaire.project.dao.ValueCleaner;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.antlr.stringtemplate.StringTemplate; import org.antlr.stringtemplate.StringTemplate;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -38,10 +27,25 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import com.google.common.xml.XmlEscapers;
import eu.dnetlib.DnetOpenaireExporterProperties;
import eu.dnetlib.DnetOpenaireExporterProperties.Project;
import eu.dnetlib.openaire.common.AbstractExporterController;
import eu.dnetlib.openaire.common.ExporterConstants;
import eu.dnetlib.openaire.project.dao.JdbcApiDao;
import eu.dnetlib.openaire.project.dao.ValueCleaner;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@CrossOrigin(origins = { "*" }) @CrossOrigin(origins = {
"*"
})
@ConditionalOnProperty(value = "openaire.exporter.enable.project", havingValue = "true") @ConditionalOnProperty(value = "openaire.exporter.enable.project", havingValue = "true")
@io.swagger.annotations.Api(tags = "OpenAIRE projects API", description = "the OpenAIRE projects API") @Tag(name = "OpenAIRE projects API", description = "the OpenAIRE projects API")
public class ProjectsController extends AbstractExporterController { public class ProjectsController extends AbstractExporterController {
private static final Log log = LogFactory.getLog(ProjectsController.class); // NOPMD by marko on 11/24/08 5:02 PM private static final Log log = LogFactory.getLog(ProjectsController.class); // NOPMD by marko on 11/24/08 5:02 PM
@ -58,19 +62,19 @@ public class ProjectsController extends AbstractExporterController {
private ProjectQueryParamsFactory projectQueryParamsFactory; private ProjectQueryParamsFactory projectQueryParamsFactory;
@RequestMapping(value = "/export/**/project/dspace.do", method = RequestMethod.GET) @RequestMapping(value = "/export/**/project/dspace.do", method = RequestMethod.GET)
@ApiOperation( @Operation(summary = "DSpace", description = "return project information in compatible with the OpenAIRE plugin for DSpace", tags = {
value = "DSpace", ExporterConstants.DSPACE
notes = "return project information in compatible with the OpenAIRE plugin for DSpace", })
tags = { ExporterConstants.DSPACE },
response = String.class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = String.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
public void processDspace(final HttpServletRequest request, final ServletResponse response, })
@RequestParam(value = "startFrom", required = false) final String startFrom, public void processDspace(final HttpServletRequest request,
@RequestParam(value = "startUntil", required = false) final String startUntil, final ServletResponse response,
@RequestParam(value = "endFrom", required = false) final String endFrom, @RequestParam(value = "startFrom", required = false) final String startFrom,
@RequestParam(value = "endUntil", required = false) final String endUntil) throws Exception { @RequestParam(value = "startUntil", required = false) final String startUntil,
@RequestParam(value = "endFrom", required = false) final String endFrom,
@RequestParam(value = "endUntil", required = false) final String endUntil) throws Exception {
final Project conf = config.getProject(); final Project conf = config.getProject();
@ -86,19 +90,19 @@ public class ProjectsController extends AbstractExporterController {
} }
@RequestMapping(value = "/export/**/project/eprints.do", method = RequestMethod.GET) @RequestMapping(value = "/export/**/project/eprints.do", method = RequestMethod.GET)
@ApiOperation( @Operation(summary = "EPrints", description = "return project information in compatible with the OpenAIRE plugin for Eprints", tags = {
value = "EPrints", ExporterConstants.EPRINT
notes = "return project information in compatible with the OpenAIRE plugin for Eprints", })
tags = { ExporterConstants.EPRINT },
response = String.class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = String.class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
public void processEprints(final HttpServletRequest request, final ServletResponse response, })
@RequestParam(value = "startFrom", required = false) final String startFrom, public void processEprints(final HttpServletRequest request,
@RequestParam(value = "startUntil", required = false) final String startUntil, final ServletResponse response,
@RequestParam(value = "endFrom", required = false) final String endFrom, @RequestParam(value = "startFrom", required = false) final String startFrom,
@RequestParam(value = "endUntil", required = false) final String endUntil) throws Exception { @RequestParam(value = "startUntil", required = false) final String startUntil,
@RequestParam(value = "endFrom", required = false) final String endFrom,
@RequestParam(value = "endUntil", required = false) final String endUntil) throws Exception {
final ProjectQueryParams params = projectQueryParamsFactory.generateParams(request, startFrom, startUntil, endFrom, endUntil); final ProjectQueryParams params = projectQueryParamsFactory.generateParams(request, startFrom, startUntil, endFrom, endUntil);
response.setContentType("text/html"); response.setContentType("text/html");
@ -110,29 +114,30 @@ public class ProjectsController extends AbstractExporterController {
} }
private void doProcess( private void doProcess(
final ServletResponse response, final ServletResponse response,
final ProjectQueryParams params, final ProjectQueryParams params,
final String head, final Resource projectTemplate, final String tail, final String head,
final ValueCleaner cleaner) throws IOException, SQLException { final Resource projectTemplate,
final String tail,
final ValueCleaner cleaner) throws IOException, SQLException {
final StringTemplate st = new StringTemplate(IOUtils.toString(projectTemplate.getInputStream(), UTF8)); final StringTemplate st = new StringTemplate(IOUtils.toString(projectTemplate.getInputStream(), UTF8));
try(final OutputStream out = new BufferedOutputStream(response.getOutputStream())) { try (final OutputStream out = new BufferedOutputStream(response.getOutputStream())) {
dao.streamProjects(obtainQuery(params), out, head, st, tail, cleaner); dao.streamProjects(obtainQuery(params), out, head, st, tail, cleaner);
} }
} }
@RequestMapping(value = "/noads/project2tsv.do", method = RequestMethod.GET) @RequestMapping(value = "/noads/project2tsv.do", method = RequestMethod.GET)
@ApiOperation( @Operation(summary = "TSV", description = "download project information in TSV format", tags = {
value = "TSV", ExporterConstants.TSV
notes = "download project information in TSV format", })
tags = { ExporterConstants.TSV },
response = ProjectTsv[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ProjectTsv[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void processTsv(final HttpServletResponse response, public void processTsv(final HttpServletResponse response,
@RequestParam(value = "funding", required = true) final String funding, @RequestParam(value = "funding", required = true) final String funding,
@RequestParam(value = "article293", required = false) final Boolean article293) throws Exception { @RequestParam(value = "article293", required = false) final Boolean article293) throws Exception {
final String fundingPrefix = getFundingPrefix(funding, null); final String fundingPrefix = getFundingPrefix(funding, null);
@ -140,37 +145,37 @@ public class ProjectsController extends AbstractExporterController {
final String filename = "projects_" + funding + "_" + date + ".tsv"; final String filename = "projects_" + funding + "_" + date + ".tsv";
response.setContentType("text/tab-separated-values"); response.setContentType("text/tab-separated-values");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".zip\""); response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + ".zip\"");
try(final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))) { try (final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))) {
dao.processTsvRequest(out, article293, fundingPrefix, filename); dao.processTsvRequest(out, article293, fundingPrefix, filename);
} catch (Throwable e) { } catch (final Throwable e) {
throw new RuntimeException("Error processing the request", e); throw new RuntimeException("Error processing the request", e);
} }
} }
@RequestMapping(value = "/export/streamProjectDetails.do", method = RequestMethod.GET) @RequestMapping(value = "/export/streamProjectDetails.do", method = RequestMethod.GET)
@ApiOperation( @Operation(summary = "Stream projects", description = "stream project information", tags = {
value = "Stream projects", ExporterConstants.STREAMING
notes = "stream project information", })
tags = { ExporterConstants.STREAMING },
response = ProjectDetails[].class)
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = ProjectDetails[].class), @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(code = 500, message = "unexpected error", response = ErrorMessage.class) }) @ApiResponse(responseCode = "500", description = "unexpected error")
})
public void streamProjectDetails(final HttpServletResponse response, public void streamProjectDetails(final HttpServletResponse response,
@RequestParam(value = "format", required = true) final String format, @RequestParam(value = "format", required = true) final String format,
@RequestParam(value = "compress", required = false) final Boolean compress) throws IOException, SQLException { @RequestParam(value = "compress", required = false) final Boolean compress) throws IOException, SQLException {
if (compress != null && compress) { if (compress != null && compress) {
response.setHeader("Content-Encoding", "gzip"); response.setHeader("Content-Encoding", "gzip");
} }
switch (format) { switch (format) {
case "csv": case "csv":
response.setContentType("text/csv"); response.setContentType("text/csv");
break; break;
case "json": case "json":
response.setContentType("text/plain"); response.setContentType("text/plain");
break; break;
default: throw new IllegalArgumentException("unsupported format: " + format); default:
throw new IllegalArgumentException("unsupported format: " + format);
} }
dao.processProjectDetails(response.getOutputStream(), format, compress); dao.processProjectDetails(response.getOutputStream(), format, compress);
@ -190,22 +195,20 @@ public class ProjectsController extends AbstractExporterController {
* if the funding program is not recognized * if the funding program is not recognized
*/ */
protected String obtainQuery(final ProjectQueryParams params) throws IllegalArgumentException, IOException { protected String obtainQuery(final ProjectQueryParams params) throws IllegalArgumentException, IOException {
String funding = params.getFundingProgramme(); final String funding = params.getFundingProgramme();
String suffix = params.getFundingPath(); final String suffix = params.getFundingPath();
final StringTemplate st = new StringTemplate(IOUtils.toString(config.getProject().getProjectsFundingQueryTemplate().getInputStream(), UTF8)); final StringTemplate st = new StringTemplate(IOUtils.toString(config.getProject().getProjectsFundingQueryTemplate().getInputStream(), UTF8));
st.setAttribute("fundingprefix", getFundingPrefix(funding, suffix)); st.setAttribute("fundingprefix", getFundingPrefix(funding, suffix));
String theQuery = setDateParameters(st.toString(), params); final String theQuery = setDateParameters(st.toString(), params);
log.debug("Generated query: " + theQuery); log.debug("Generated query: " + theQuery);
return theQuery; return theQuery;
} }
private String getFundingPrefix(final String funding, final String suffix) { private String getFundingPrefix(final String funding, final String suffix) {
final Map<String, String> fundingIds = dao.readFundingpathIds(); final Map<String, String> fundingIds = dao.readFundingpathIds();
if (!fundingIds.containsKey(funding.toUpperCase())) { if (!fundingIds.containsKey(funding.toUpperCase())) { throw new IllegalArgumentException("invalid funding " + funding); }
throw new IllegalArgumentException("invalid funding " + funding); final String fundingPrefix = fundingIds.get(funding.toUpperCase());
}
String fundingPrefix = fundingIds.get(funding.toUpperCase());
return StringUtils.isBlank(suffix) ? fundingPrefix : fundingPrefix + "::" + suffix.toUpperCase(); return StringUtils.isBlank(suffix) ? fundingPrefix : fundingPrefix + "::" + suffix.toUpperCase();
} }

View File

@ -2,22 +2,25 @@ package eu.dnetlib.openaire.project.domain.db;
import java.sql.Date; import java.sql.Date;
import java.util.ArrayList; import java.util.ArrayList;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
import org.apache.commons.lang3.StringUtils; import io.swagger.v3.oas.annotations.media.Schema;
/** /**
* Created by claudio on 20/09/16. * Created by claudio on 20/09/16.
*/ */
@Entity @Entity
@Table(name = "projects_api") @Table(name = "projects_api")
@ApiModel(value = "Project api model", description = "Project api model used by DSpace and Eprints exporter") @Schema(name = "Project api model", description = "Project api model used by DSpace and Eprints exporter")
public class ProjectApi { public class ProjectApi {
public static final String INFO_EU_REPO_GRANT_AGREEMENT = "info:eu-repo/grantAgreement/"; public static final String INFO_EU_REPO_GRANT_AGREEMENT = "info:eu-repo/grantAgreement/";
@ -35,10 +38,10 @@ public class ProjectApi {
private Date enddate; private Date enddate;
private String fundingpathid; private String fundingpathid;
public ProjectApi() { } public ProjectApi() {}
public String getIdnamespace() { public String getIdnamespace() {
String res = INFO_EU_REPO_GRANT_AGREEMENT + getFunder()+"/"; String res = INFO_EU_REPO_GRANT_AGREEMENT + getFunder() + "/";
final String fundingProgram = asFundingProgram(getFundingpathid()); final String fundingProgram = asFundingProgram(getFundingpathid());
if (StringUtils.isNotBlank(fundingProgram)) { if (StringUtils.isNotBlank(fundingProgram)) {
res += fundingProgram; res += fundingProgram;
@ -69,9 +72,12 @@ public class ProjectApi {
private String asFundingProgram(final String fundingpathid) { private String asFundingProgram(final String fundingpathid) {
final ArrayList<String> strings = Lists.newArrayList(Splitter.on("::").split(fundingpathid)); final ArrayList<String> strings = Lists.newArrayList(Splitter.on("::").split(fundingpathid));
if(strings.size() <= 1) throw new IllegalStateException("Unexpected funding id: "+fundingpathid); if (strings.size() <= 1) { throw new IllegalStateException("Unexpected funding id: " + fundingpathid); }
if(strings.size() == 2) return ""; if (strings.size() == 2) {
else return replaceSlash(strings.get(2)); return "";
} else {
return replaceSlash(strings.get(2));
}
} }
private String replaceSlash(final String s) { private String replaceSlash(final String s) {

View File

@ -6,15 +6,16 @@ import java.io.StringWriter;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import javax.persistence.*;
import com.fasterxml.jackson.annotation.JsonIgnore; import javax.persistence.Column;
import com.google.gson.Gson; import javax.persistence.Entity;
import io.swagger.annotations.ApiModel; import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.hibernate.annotations.Type; import org.hibernate.annotations.Type;
import org.supercsv.cellprocessor.Optional; import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ift.CellProcessor; import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.io.CsvBeanReader; import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.CsvBeanWriter;
import org.supercsv.io.ICsvBeanReader; import org.supercsv.io.ICsvBeanReader;
@ -22,21 +23,26 @@ import org.supercsv.io.ICsvBeanWriter;
import org.supercsv.prefs.CsvPreference; import org.supercsv.prefs.CsvPreference;
import org.supercsv.util.CsvContext; import org.supercsv.util.CsvContext;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.gson.Gson;
import io.swagger.v3.oas.annotations.media.Schema;
/** /**
* Created by claudio on 04/07/2017. * Created by claudio on 04/07/2017.
*/ */
@Entity @Entity
@Table(name = "project_details") @Table(name = "project_details")
@ApiModel(value = "Project details model", description = "provides project details") @Schema(name = "Project details model", description = "provides project details")
public class ProjectDetails { public class ProjectDetails {
@Transient @Transient
@JsonIgnore @JsonIgnore
private transient static final String[] FIELDS = Arrays.stream(ProjectDetails.class.getDeclaredFields()) private transient static final String[] FIELDS = Arrays.stream(ProjectDetails.class.getDeclaredFields())
.map(Field::getName) .map(Field::getName)
.filter(s -> !s.equals("FIELDS")) .filter(s -> !s.equals("FIELDS"))
.filter(s -> !s.startsWith("optional")) .filter(s -> !s.startsWith("optional"))
.toArray(String[]::new); .toArray(String[]::new);
@Id @Id
@Column(name = "projectid") @Column(name = "projectid")
@ -50,8 +56,7 @@ public class ProjectDetails {
@Column(name = "fundingpath", columnDefinition = "text[]") @Column(name = "fundingpath", columnDefinition = "text[]")
private String[] fundingPath; private String[] fundingPath;
public ProjectDetails() { public ProjectDetails() {}
}
public String getProjectId() { public String getProjectId() {
return projectId; return projectId;
@ -74,7 +79,7 @@ public class ProjectDetails {
} }
public void setFundingPath(final List<String> fundingPath) { public void setFundingPath(final List<String> fundingPath) {
if(fundingPath != null && !fundingPath.isEmpty()) { if (fundingPath != null && !fundingPath.isEmpty()) {
this.fundingPath = fundingPath.toArray(new String[fundingPath.size()]); this.fundingPath = fundingPath.toArray(new String[fundingPath.size()]);
} }
} }
@ -85,28 +90,32 @@ public class ProjectDetails {
public static ProjectDetails fromCSV(final String csv) throws IOException { public static ProjectDetails fromCSV(final String csv) throws IOException {
try (ICsvBeanReader beanReader = new CsvBeanReader(new StringReader(csv), CsvPreference.STANDARD_PREFERENCE)) { try (ICsvBeanReader beanReader = new CsvBeanReader(new StringReader(csv), CsvPreference.STANDARD_PREFERENCE)) {
return beanReader.read(ProjectDetails.class, FIELDS, getProcessors(new StringCellProcessor() { final CellProcessor cp = new CellProcessor() {
@SuppressWarnings("unchecked")
@Override @Override
public Object execute(final Object value, final CsvContext context) { public <T> T execute(final Object value, final CsvContext context) {
return new Gson().fromJson(value.toString(), List.class); return (T) new Gson().fromJson(value.toString(), List.class);
} }
})); };
return beanReader.read(ProjectDetails.class, FIELDS, getProcessors(cp));
} }
} }
/** /**
* Sets up the processors used for the examples. There are 10 CSV columns, so 10 processors are defined. Empty * Sets up the processors used for the examples. There are 10 CSV columns, so 10 processors are defined. Empty columns are read as null
* columns are read as null (hence the NotNull() for mandatory columns). * (hence the NotNull() for mandatory columns).
* *
* @return the cell processors * @return the cell processors
*/ */
private static CellProcessor[] getProcessors(final CellProcessor fundingPathProcessor) { private static CellProcessor[] getProcessors(final CellProcessor fundingPathProcessor) {
return new CellProcessor[] { return new CellProcessor[] {
new Optional(), // projectId new Optional(), // projectId
new Optional(), // acronym new Optional(), // acronym
new Optional(), // code new Optional(), // code
new Optional(), // jsonextrainfo new Optional(), // jsonextrainfo
fundingPathProcessor fundingPathProcessor
}; };
} }
@ -117,12 +126,15 @@ public class ProjectDetails {
public String asCSV() throws IOException { public String asCSV() throws IOException {
final StringWriter sb = new StringWriter(); final StringWriter sb = new StringWriter();
try (ICsvBeanWriter beanWriter = new CsvBeanWriter(sb, CsvPreference.STANDARD_PREFERENCE)) { try (ICsvBeanWriter beanWriter = new CsvBeanWriter(sb, CsvPreference.STANDARD_PREFERENCE)) {
beanWriter.write(this, FIELDS, getProcessors(new StringCellProcessor() { final CellProcessor cp = new CellProcessor() {
@SuppressWarnings("unchecked")
@Override @Override
public Object execute(final Object value, final CsvContext context) { public <T> T execute(final Object value, final CsvContext context) {
return new Gson().toJson(value); return (T) new Gson().toJson(value);
} }
})); };
beanWriter.write(this, FIELDS, getProcessors(cp));
beanWriter.flush(); beanWriter.flush();
} }

View File

@ -2,22 +2,25 @@ package eu.dnetlib.openaire.project.domain.db;
import java.sql.Date; import java.sql.Date;
import java.util.List; import java.util.List;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModel;
import org.apache.commons.lang3.StringUtils; import io.swagger.v3.oas.annotations.media.Schema;
/** /**
* Created by claudio on 05/07/2017. * Created by claudio on 05/07/2017.
*/ */
@Entity @Entity
@Table(name = "projects_tsv") @Table(name = "projects_tsv")
@ApiModel(value = "Project TSV model", description = "project TSV model description") @Schema(name = "Project TSV model", description = "project TSV model description")
public class ProjectTsv { public class ProjectTsv {
@Id @Id
@ -51,25 +54,14 @@ public class ProjectTsv {
public ProjectTsv() {} public ProjectTsv() {}
public List<String> asList() { public List<String> asList() {
return Lists.newArrayList( return Lists.newArrayList(clean(getCode()), clean(getAcronym()), clean(getTitle()), clean(getCallIdentifier()), clean(getStartdate() != null
clean(getCode()), ? getStartdate().toString()
clean(getAcronym()), : ""), clean(getEnddate() != null ? getEnddate().toString() : ""), clean(String.valueOf(isOaMandateForPublications())), clean(String
clean(getTitle()), .valueOf(isOaMandateForDatasets())), clean(getDescription()), clean(getOrgLegalname()), clean(getOrgCountry()), clean(getOrgRole()), clean(getContactfullname()), clean(getContactemail()));
clean(getCallIdentifier()),
clean(getStartdate() != null ? getStartdate().toString() : ""),
clean(getEnddate() != null ? getEnddate().toString() : ""),
clean(String.valueOf(isOaMandateForPublications())),
clean(String.valueOf(isOaMandateForDatasets())),
clean(getDescription()),
clean(getOrgLegalname()),
clean(getOrgCountry()),
clean(getOrgRole()),
clean(getContactfullname()),
clean(getContactemail()));
} }
private String clean(final String s) { private String clean(final String s) {
return StringUtils.isNotBlank(s) ? "\"" + s.replaceAll("\\n|\\t|\\s+", " ").replace("\"","\"\"").trim() + "\"" : ""; return StringUtils.isNotBlank(s) ? "\"" + s.replaceAll("\\n|\\t|\\s+", " ").replace("\"", "\"\"").trim() + "\"" : "";
} }
public long getRowid() { public long getRowid() {

View File

@ -1,20 +1,16 @@
package eu.dnetlib.organizations; package eu.dnetlib.organizations;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication @SpringBootApplication
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@ComponentScan(basePackages = "eu.dnetlib") @ComponentScan(basePackages = "eu.dnetlib")
@ -24,20 +20,16 @@ public class MainApplication extends AbstractDnetApp {
SpringApplication.run(MainApplication.class, args); SpringApplication.run(MainApplication.class, args);
} }
@Override @Bean
protected void configSwagger(final Docket docket) { public GroupedOpenApi publicApi() {
docket.select() return GroupedOpenApi.builder()
.apis(RequestHandlerSelectors.any()) .group("D-Net Organizations Service APIs")
.paths(p -> p.startsWith("/api/") || p.startsWith("/oa_api")) .pathsToMatch("/api/**", "/oa_api/**")
.build() .build();
.apiInfo(new ApiInfoBuilder()
.title("D-Net Organizations Service APIs")
.description("APIs documentation")
.version("1.1")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
} }
@Override
protected String swaggerTitle() {
return "D-Net Organizations Service APIs";
}
} }

View File

@ -81,10 +81,10 @@ public class HomeController extends AbstractDnetController {
} }
@GetMapping({ @GetMapping({
"/doc", "/swagger" "apidoc", "api-doc", "/doc", "/swagger"
}) })
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
} }

View File

@ -1,10 +1,6 @@
package eu.dnetlib.scholix.api; package eu.dnetlib.scholix.api;
import eu.dnetlib.common.app.AbstractDnetApp; import org.springdoc.core.GroupedOpenApi;
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.*;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -12,29 +8,25 @@ import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.time.Duration; import eu.dnetlib.common.app.AbstractDnetApp;
import java.util.Arrays; import io.micrometer.core.aop.TimedAspect;
import java.util.List; import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
@SpringBootApplication @SpringBootApplication
@EnableSwagger2
@EnableCaching @EnableCaching
@EnableScheduling @EnableScheduling
@ComponentScan(basePackages = "eu.dnetlib") @ComponentScan(basePackages = "eu.dnetlib")
public class MainApplication extends AbstractDnetApp { public class MainApplication extends AbstractDnetApp {
private double scale = 1000000000; private final double scale = 1000000000;
private double[] histogramValues =new double[]{.005 * scale, .01 * scale, .25 * scale, .5 * scale, .75 * scale, scale, 2.5 * scale, 5.0 * scale, 7.5 * scale, 10.0 * scale};
private final double[] histogramValues = new double[] {
.005 * scale, .01 * scale, .25 * scale, .5 * scale, .75 * scale, scale, 2.5 * scale, 5.0 * scale, 7.5 * scale, 10.0 * scale
};
@Value("${dhp.swagger.api.host}") @Value("${dhp.swagger.api.host}")
private String swaggetHost; private String swaggetHost;
@ -42,31 +34,29 @@ public class MainApplication extends AbstractDnetApp {
@Value("${dhp.swagger.api.basePath}") @Value("${dhp.swagger.api.basePath}")
private String swaggerPath; private String swaggerPath;
public static void main(final String[] args) { public static void main(final String[] args) {
SpringApplication.run(MainApplication.class, args); SpringApplication.run(MainApplication.class, args);
} }
@Bean @Bean
public TaggedCounter myCounter(MeterRegistry meterRegistry) { public TaggedCounter myCounter(final MeterRegistry meterRegistry) {
return new TaggedCounter(ScholixAPIConstants.SCHOLIX_MANAGER_COUNTER_NAME, ScholixAPIConstants.SCHOLIX_MANAGER_TAG_NAME,meterRegistry); return new TaggedCounter(ScholixAPIConstants.SCHOLIX_MANAGER_COUNTER_NAME, ScholixAPIConstants.SCHOLIX_MANAGER_TAG_NAME, meterRegistry);
} }
@Bean @Bean
public TimedAspect timedAspect(MeterRegistry meterRegistry) { public TimedAspect timedAspect(final MeterRegistry meterRegistry) {
MeterFilter mf = new MeterFilter() { final MeterFilter mf = new MeterFilter() {
@Override @Override
public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) { public DistributionStatisticConfig configure(final Meter.Id id, final DistributionStatisticConfig config) {
if (id.getName().startsWith(ScholixAPIConstants.SCHOLIX_COUNTER_PREFIX)) { if (id.getName().startsWith(ScholixAPIConstants.SCHOLIX_COUNTER_PREFIX)) {
return DistributionStatisticConfig.builder() return DistributionStatisticConfig.builder()
.percentilesHistogram(false) .percentilesHistogram(false)
.serviceLevelObjectives( histogramValues) .serviceLevelObjectives(histogramValues)
.build() .build()
.merge(config); .merge(config);
} }
return config; return config;
} }
@ -75,50 +65,30 @@ public class MainApplication extends AbstractDnetApp {
return new TimedAspect(meterRegistry); return new TimedAspect(meterRegistry);
} }
@Bean
@Override public GroupedOpenApi publicApiV1() {
protected void configSwagger(final Docket docket) { return GroupedOpenApi.builder()
docket .group(ScholixAPIConstants.API_V1_NAME)
.host(swaggetHost) .pathsToMatch("/v1/**")
.pathMapping(swaggerPath) .build();
.groupName(ScholixAPIConstants.API_V1_NAME)
.select()
.apis(RequestHandlerSelectors.any())
.paths(p -> p.startsWith("/v1"))
.build()
.apiInfo(new ApiInfoBuilder()
.title(ScholixAPIConstants.API_V1_NAME)
.description(ScholixAPIConstants.API_DESCRIPTION)
.version("1.0")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
} }
@Bean
public GroupedOpenApi publicApiV2() {
return GroupedOpenApi.builder()
.group(ScholixAPIConstants.API_V2_NAME)
.pathsToMatch("/v2/**")
.build();
}
@Override
protected String swaggerTitle() {
return "ScholeExplorer APIs";
}
@Bean (name = "SpringDocketv2") @Override
public Docket v2Docket() { protected String swaggerDesc() {
final Docket docket = new Docket(DocumentationType.SWAGGER_2); return ScholixAPIConstants.API_DESCRIPTION;
docket
.host(swaggetHost)
.pathMapping(swaggerPath)
.groupName(ScholixAPIConstants.API_V2_NAME)
.select()
.apis(RequestHandlerSelectors.any())
.paths(p -> p.startsWith("/v2"))
.build()
.apiInfo(new ApiInfoBuilder()
.title(ScholixAPIConstants.API_V2_NAME)
.description(ScholixAPIConstants.API_DESCRIPTION)
.version("2.0")
.contact(ApiInfo.DEFAULT_CONTACT)
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
.build());
return docket;
} }
} }

View File

@ -1,50 +1,41 @@
package eu.dnetlib.scholix.api.controller; package eu.dnetlib.scholix.api.controller;
import eu.dnetlib.common.controller.AbstractDnetController; import java.util.ArrayList;
import eu.dnetlib.dhp.schema.sx.api.model.v1.LinkPublisher; import java.util.List;
import eu.dnetlib.scholix.api.ScholixException; import java.util.stream.Collectors;
import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.micrometer.core.annotation.Timed;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Operation;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import eu.dnetlib.common.controller.AbstractDnetController;
import java.util.Arrays; import eu.dnetlib.dhp.schema.sx.api.model.v1.LinkPublisher;
import java.util.List; import eu.dnetlib.scholix.api.ScholixException;
import java.util.stream.Collectors; import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.micrometer.core.annotation.Timed;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/v1") @RequestMapping("/v1")
@Api(tags = { @Tag(name = "Datasources")
"Datasources" public class DatasourceV1 extends AbstractDnetController {
})
public class DatasourceV1 extends AbstractDnetController {
@Autowired @Autowired
private ScholixIndexManager manager; private ScholixIndexManager manager;
@Timed(value = "scholix.v1.datasources", description = "Time taken to return all datasources on Version 1.0 of Scholix") @Timed(value = "scholix.v1.datasources", description = "Time taken to return all datasources on Version 1.0 of Scholix")
@Operation( @Operation(summary = "Get all Datasources", description = "returns a list of all datasources")
summary = "Get all Datasources", @GetMapping("/listDatasources")
description = "returns a list of all datasources") public List<LinkPublisher> getDatasources() throws ScholixException {
@GetMapping("/listDatasources")
public List<LinkPublisher> getDatasources() throws ScholixException {
final List<Pair<String, Long>> result = manager.totalLinksByProvider(null);
final List<Pair<String, Long>> result = manager.totalLinksByProvider(null); if (result == null) { return new ArrayList<>(); }
if (result == null) return result.stream().map(p -> new LinkPublisher().name(p.getKey()).totalRelationships(p.getValue().intValue())).collect(Collectors.toList());
return new ArrayList<>();
return result.stream().map(p -> new LinkPublisher().name(p.getKey()).totalRelationships(p.getValue().intValue())).collect(Collectors.toList()); }
}
} }

View File

@ -12,14 +12,14 @@ public class HomeController extends AbstractDnetController {
"/doc", "/swagger" "/doc", "/swagger"
}) })
public String apiDoc() { public String apiDoc() {
return "redirect:swagger-ui/"; return "redirect:swagger-ui/index.html";
} }
@GetMapping({ @GetMapping({
"/v1/ui" "/v1/ui"
}) })
public String v1Doc() { public String v1Doc() {
return "redirect:/swagger-ui/?urls.primaryName=Scholexplorer%20API%20V1.0"; return "redirect:/swagger-ui/index.html?urls.primaryName=Scholexplorer%20API%20V1.0";
} }
@ -27,7 +27,7 @@ public class HomeController extends AbstractDnetController {
"/v2/ui" "/v2/ui"
}) })
public String v2Doc() { public String v2Doc() {
return "redirect:/swagger-ui/?urls.primaryName=Scholexplorer%20API%20V2.0"; return "redirect:/swagger-ui/index.html?urls.primaryName=Scholexplorer%20API%20V2.0";
} }

View File

@ -1,11 +1,9 @@
package eu.dnetlib.scholix.api.controller; package eu.dnetlib.scholix.api.controller;
import eu.dnetlib.scholix.api.ScholixException;
import eu.dnetlib.scholix.api.index.ScholixIndexManager; import java.util.ArrayList;
import eu.dnetlib.dhp.schema.sx.api.model.v2.LinkProviderType; import java.util.List;
import io.swagger.annotations.Api; import java.util.stream.Collectors;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -13,36 +11,33 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import eu.dnetlib.dhp.schema.sx.api.model.v2.LinkProviderType;
import java.util.List; import eu.dnetlib.scholix.api.ScholixException;
import java.util.stream.Collectors; import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/v2") @RequestMapping("/v2")
@Api(tags = { @Tag(name = "LinkProvider : Operation related to the Link Provider")
"LinkProvider : Operation related to the Link Provider"
})
public class LinkProviderV2 { public class LinkProviderV2 {
@Autowired @Autowired
ScholixIndexManager manager; ScholixIndexManager manager;
@Operation( @Operation(summary = "Get all Link Providers", description = "Return a list of link provider and relative number of relations")
summary = "Get all Link Providers", @GetMapping("/LinkProvider")
description = "Return a list of link provider and relative number of relations") public List<LinkProviderType> getLinkProviders(
@GetMapping("/LinkProvider") @Parameter(in = ParameterIn.QUERY, description = "Filter the link provider name") @RequestParam(required = false) final String name)
public List<LinkProviderType> getLinkProviders( throws ScholixException {
@Parameter(in = ParameterIn.QUERY, description = "Filter the link provider name") @RequestParam(required = false) String name
) throws ScholixException {
List<Pair<String, Long>> result = manager.totalLinksByProvider(name); final List<Pair<String, Long>> result = manager.totalLinksByProvider(name);
if (result==null) if (result == null) { return new ArrayList<>(); }
return new ArrayList<>();
return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList()); return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList());
}
}
} }

View File

@ -1,11 +1,9 @@
package eu.dnetlib.scholix.api.controller; package eu.dnetlib.scholix.api.controller;
import eu.dnetlib.scholix.api.ScholixException;
import eu.dnetlib.scholix.api.index.ScholixIndexManager; import java.util.ArrayList;
import eu.dnetlib.dhp.schema.sx.api.model.v2.LinkProviderType; import java.util.List;
import io.swagger.annotations.Api; import java.util.stream.Collectors;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
@ -13,49 +11,47 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import eu.dnetlib.dhp.schema.sx.api.model.v2.LinkProviderType;
import java.util.List; import eu.dnetlib.scholix.api.ScholixException;
import java.util.stream.Collectors; import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/v2/LinkPublisher") @RequestMapping("/v2/LinkPublisher")
@Api(tags = { @Tag(name = "LinkPublisher : Operation related to the Link Publisher")
"LinkPublisher : Operation related to the Link Publisher"
})
public class LinkPublisherV2 { public class LinkPublisherV2 {
@Autowired @Autowired
ScholixIndexManager manager; ScholixIndexManager manager;
@Operation( @Operation(summary = "Get All Publishers that provide source object", description = "Return a List of all Publishers that provide source objects in Scholix "
summary = "Get All Publishers that provide source object", +
description = "Return a List of all Publishers that provide source objects in Scholix " + "links and the total number of links where the source object comes from this publisher")
"links and the total number of links where the source object comes from this publisher") @GetMapping("/inSource")
@GetMapping("/inSource") public List<LinkProviderType> getInSource(
public List<LinkProviderType> getInSource( @Parameter(in = ParameterIn.QUERY, description = "Filter the link publisher name") @RequestParam(required = false) final String name)
@Parameter(in = ParameterIn.QUERY, description = "Filter the link publisher name") @RequestParam(required = false) String name throws ScholixException {
) throws ScholixException { final List<Pair<String, Long>> result = manager.totalLinksPublisher(ScholixIndexManager.RelationPrefix.source, name);
List<Pair<String, Long>> result = manager.totalLinksPublisher(ScholixIndexManager.RelationPrefix.source,name);
if (result==null) if (result == null) { return new ArrayList<>(); }
return new ArrayList<>();
return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList()); return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList());
} }
@Operation( @Operation(summary = "Get All Publishers that provide target object", description = "Return a List of all Publishers that provide source objects in Scholix "
summary = "Get All Publishers that provide target object", +
description = "Return a List of all Publishers that provide source objects in Scholix " + "links and the total number of links where the target object comes from this publisher")
"links and the total number of links where the target object comes from this publisher") @GetMapping("/inTarget")
@GetMapping("/inTarget") public List<LinkProviderType> getInTarget(
public List<LinkProviderType> getInTarget( @Parameter(in = ParameterIn.QUERY, description = "Filter the link publisher name") @RequestParam(required = false) final String name)
@Parameter(in = ParameterIn.QUERY, description = "Filter the link publisher name") @RequestParam(required = false) String name throws ScholixException {
) throws ScholixException { final List<Pair<String, Long>> result = manager.totalLinksPublisher(ScholixIndexManager.RelationPrefix.target, name);
List<Pair<String, Long>> result = manager.totalLinksPublisher(ScholixIndexManager.RelationPrefix.target,name);
if (result==null) if (result == null) { return new ArrayList<>(); }
return new ArrayList<>();
return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList()); return result.stream().map(s -> new LinkProviderType().name(s.getLeft()).totalRelationships(s.getValue().intValue())).collect(Collectors.toList());
} }
} }

View File

@ -1,16 +1,10 @@
package eu.dnetlib.scholix.api.controller; package eu.dnetlib.scholix.api.controller;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.dhp.schema.sx.scholix.Scholix;
import eu.dnetlib.scholix.api.ScholixException;
import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import eu.dnetlib.dhp.schema.sx.api.model.v1.ScholixV1;
import io.micrometer.core.annotation.Timed;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -18,97 +12,73 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.dhp.schema.sx.api.model.v1.ScholixV1;
import eu.dnetlib.dhp.schema.sx.scholix.Scholix;
import eu.dnetlib.scholix.api.ScholixException;
import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.micrometer.core.annotation.Timed;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
@RestController @RestController
@RequestMapping("/v1") @RequestMapping("/v1")
@Api(tags = {"Scholix"}) @Tag(name = "Scholix")
public class ScholixControllerV1 extends AbstractDnetController { public class ScholixControllerV1 extends AbstractDnetController {
@Autowired @Autowired
ScholixIndexManager manager; ScholixIndexManager manager;
@Operation( @Operation(summary = "Get all Scholix relation collected from a publisher", description = "return a list of scholix object published from a specific publisher")
summary = "Get all Scholix relation collected from a publisher", @GetMapping("/linksFromPublisher")
description = "return a list of scholix object published from a specific publisher" @Timed(value = "scholix.v1.linksFromPublisher", description = "Time taken to return links on Version 1.0 of Scholix collected from a publisher")
) public List<ScholixV1> linksFromPublisher(
@GetMapping("/linksFromPublisher") @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships collected from a publisher", required = true) final String publisher,
@Timed(value = "scholix.v1.linksFromPublisher", description = "Time taken to return links on Version 1.0 of Scholix collected from a publisher") @Parameter(in = ParameterIn.QUERY, description = "The page number") @RequestParam(required = false) final Integer page) throws ScholixException {
public List<ScholixV1> linksFromPublisher(
@Parameter(
in = ParameterIn.QUERY,
description = "Filter Scholix relationships collected from a publisher",
schema = @Schema(), required = true) String publisher,
@Parameter(in = ParameterIn.QUERY,
description = "The page number") @RequestParam(required = false) Integer page
) throws ScholixException {
final int currentPage = page != null ? page : 0; final int currentPage = page != null ? page : 0;
Pair<Long, List<Scholix>> scholixResult =manager.linksFromPid(null,null,null,publisher, final Pair<Long, List<Scholix>> scholixResult = manager.linksFromPid(null, null, null, publisher, null, null, null, null, null, currentPage);
null,null,null,null,null, currentPage final List<Scholix> scholixData = scholixResult.getValue();
); if (scholixData == null) { return null; }
List<Scholix> scholixData = scholixResult.getValue(); return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
if (scholixData== null) }
return null;
return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
}
@Operation( @Operation(summary = "Get all Scholix relation collected from a datasource", description = "return a list of scholix object collected from a specific datasource")
summary = "Get all Scholix relation collected from a datasource", @GetMapping("/linksFromDatasource")
description = "return a list of scholix object collected from a specific datasource" @Timed(value = "scholix.v1.linksFromDatasource", description = "Time taken to return links on Version 1.0 of Scholix collected from a LinkProvider")
) public List<ScholixV1> linksFromDatasource(
@GetMapping("/linksFromDatasource") @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships collected from a LinkProvider") @NotNull final String datasource,
@Timed(value = "scholix.v1.linksFromDatasource", description = "Time taken to return links on Version 1.0 of Scholix collected from a LinkProvider") @Parameter(in = ParameterIn.QUERY, description = "The page number") @RequestParam(required = false) final Integer page) throws ScholixException {
public List<ScholixV1> linksFromDatasource(
@Parameter(
in = ParameterIn.QUERY,
description = "Filter Scholix relationships collected from a LinkProvider",
schema = @Schema()) @NotNull String datasource,
@Parameter(in = ParameterIn.QUERY,
description = "The page number") @RequestParam(required = false) Integer page
) throws ScholixException {
final int currentPage = page != null ? page : 0; final int currentPage = page != null ? page : 0;
Pair<Long, List<Scholix>> scholixResult =manager.linksFromPid(datasource,null,null,null, final Pair<Long, List<Scholix>> scholixResult = manager.linksFromPid(datasource, null, null, null, null, null, null, null, null, currentPage);
null,null,null,null,null, currentPage final List<Scholix> scholixData = scholixResult.getValue();
); if (scholixData == null) { return null; }
List<Scholix> scholixData = scholixResult.getValue(); return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
if (scholixData== null) }
return null;
return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
}
@Operation(
summary = "Retrieve all scholix links from a persistent identifier",
description = "The linksFromPid endpoint returns a list of scholix object related from a specific persistent identifier"
)
@GetMapping("/linksFromPid")
@Timed(value = "scholix.v1.linksFromPid", description = "Time taken to return links on Version 1.0 of Scholix related from a specific persistent identifier")
public List<ScholixV1> linksFromPid(
@Parameter(in = ParameterIn.QUERY, description = "persistent Identifier") @NotNull String pid,
@Parameter(in = ParameterIn.QUERY, description = "Persistent Identifier Type") @RequestParam(required = false) String pidType,
@Parameter(in = ParameterIn.QUERY, description = "typology target filter should be publication, dataset or unknown") @RequestParam(required = false) String typologyTarget,
@Parameter(in = ParameterIn.QUERY, description = "a datasource provenance filter of the target relation") @RequestParam(required = false) String datasourceTarget,
@Parameter(in = ParameterIn.QUERY,
description = "The page number") @RequestParam(required = false) Integer page
) throws ScholixException {
final int currentPage = page != null ? page : 0;
Pair<Long, List<Scholix>> scholixResult =manager.linksFromPid(datasourceTarget,null,null,null,
typologyTarget,pid,pidType,null,null, currentPage
);
List<Scholix> scholixData = scholixResult.getValue();
if (scholixData== null)
return null;
return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
}
@Operation(summary = "Retrieve all scholix links from a persistent identifier", description = "The linksFromPid endpoint returns a list of scholix object related from a specific persistent identifier")
@GetMapping("/linksFromPid")
@Timed(value = "scholix.v1.linksFromPid", description = "Time taken to return links on Version 1.0 of Scholix related from a specific persistent identifier")
public List<ScholixV1> linksFromPid(
@Parameter(in = ParameterIn.QUERY, description = "persistent Identifier") @NotNull final String pid,
@Parameter(in = ParameterIn.QUERY, description = "Persistent Identifier Type") @RequestParam(required = false) final String pidType,
@Parameter(in = ParameterIn.QUERY, description = "typology target filter should be publication, dataset or unknown") @RequestParam(required = false) final String typologyTarget,
@Parameter(in = ParameterIn.QUERY, description = "a datasource provenance filter of the target relation") @RequestParam(required = false) final String datasourceTarget,
@Parameter(in = ParameterIn.QUERY, description = "The page number") @RequestParam(required = false) final Integer page) throws ScholixException {
final int currentPage = page != null ? page : 0;
final Pair<Long, List<Scholix>> scholixResult =
manager.linksFromPid(datasourceTarget, null, null, null, typologyTarget, pid, pidType, null, null, currentPage);
final List<Scholix> scholixData = scholixResult.getValue();
if (scholixData == null) { return null; }
return scholixData.stream().map(ScholixV1::fromScholix).collect(Collectors.toList());
}
} }

View File

@ -1,5 +1,14 @@
package eu.dnetlib.scholix.api.controller; package eu.dnetlib.scholix.api.controller;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.common.controller.AbstractDnetController; import eu.dnetlib.common.controller.AbstractDnetController;
import eu.dnetlib.dhp.schema.sx.api.model.v2.PageResultType; import eu.dnetlib.dhp.schema.sx.api.model.v2.PageResultType;
@ -8,70 +17,53 @@ import eu.dnetlib.dhp.schema.sx.scholix.Scholix;
import eu.dnetlib.scholix.api.ScholixException; import eu.dnetlib.scholix.api.ScholixException;
import eu.dnetlib.scholix.api.index.ScholixIndexManager; import eu.dnetlib.scholix.api.index.ScholixIndexManager;
import io.micrometer.core.annotation.Timed; import io.micrometer.core.annotation.Timed;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.enums.ParameterIn;
import org.apache.commons.lang3.StringUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping("/v2") @RequestMapping("/v2")
@Api(tags = { @Tag(name = "Links : Operation related to the Scholix Links")
"Links : Operation related to the Scholix Links"
})
public class ScholixControllerV2 extends AbstractDnetController { public class ScholixControllerV2 extends AbstractDnetController {
@Autowired @Autowired
private ScholixIndexManager manager; private ScholixIndexManager manager;
@Timed(value = "scholix.v2.links", description = "Time taken to return links on Version 2.0 of Scholix") @Timed(value = "scholix.v2.links", description = "Time taken to return links on Version 2.0 of Scholix")
@ApiOperation("Get Scholix Links") @Operation(summary = "Get Scholix Links")
@GetMapping("/Links") @GetMapping("/Links")
public PageResultType links( public PageResultType links(
@Parameter(in = ParameterIn.QUERY, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships collected from a LinkProvider") final String linkProvider,
description = "Filter Scholix relationships collected from a LinkProvider") String linkProvider, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a target pid") final String targetPid,
@Parameter(in = ParameterIn.QUERY, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a target pid type") final String targetPidType,
description = "Filter Scholix relationships having a target pid") String targetPid, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a target published in a Publisher named targetPublisher") final String targetPublisher,
@Parameter(in = ParameterIn.QUERY, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a target type (literature, dataset, unknown)") final String targetType,
description = "Filter Scholix relationships having a target pid type") String targetPidType, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a source pid") final String sourcePid,
@Parameter(in = ParameterIn.QUERY, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a source pid type") final String sourcePidType,
description = "Filter Scholix relationships having a target published in a Publisher named targetPublisher") String targetPublisher, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a source published in a Publisher named sourcePublisher") final String sourcePublisher,
@Parameter(in = ParameterIn.QUERY, @Parameter(in = ParameterIn.QUERY, description = "Filter Scholix relationships having a source type (literature, dataset, unknown)") final String sourceType,
description = "Filter Scholix relationships having a target type (literature, dataset, unknown)") String targetType, // @Parameter(in = ParameterIn.QUERY,
@Parameter(in = ParameterIn.QUERY, // description = "Filter scholix Links having collected after this date") String harvestedAfter,
description = "Filter Scholix relationships having a source pid") String sourcePid, @Parameter(in = ParameterIn.QUERY, description = "select page of result") final Integer page) throws Exception {
@Parameter(in = ParameterIn.QUERY,
description = "Filter Scholix relationships having a source pid type") String sourcePidType,
@Parameter(in = ParameterIn.QUERY,
description = "Filter Scholix relationships having a source published in a Publisher named sourcePublisher") String sourcePublisher,
@Parameter(in = ParameterIn.QUERY,
description = "Filter Scholix relationships having a source type (literature, dataset, unknown)") String sourceType,
// @Parameter(in = ParameterIn.QUERY,
// description = "Filter scholix Links having collected after this date") String harvestedAfter,
@Parameter(in = ParameterIn.QUERY,
description = "select page of result") Integer page) throws Exception {
if (StringUtils.isEmpty(sourcePid) && StringUtils.isEmpty(targetPid) && StringUtils.isEmpty(sourcePublisher)&& StringUtils.isEmpty(targetPublisher)&& StringUtils.isEmpty(linkProvider)) if (StringUtils.isEmpty(sourcePid) && StringUtils.isEmpty(targetPid) && StringUtils.isEmpty(sourcePublisher) && StringUtils.isEmpty(targetPublisher)
throw new ScholixException("The method requires one of the following parameters: sourcePid, targetPid, sourcePublisher, targetPublisher, linkProvider"); && StringUtils.isEmpty(linkProvider)) {
throw new ScholixException(
"The method requires one of the following parameters: sourcePid, targetPid, sourcePublisher, targetPublisher, linkProvider");
}
try { try {
final int currentPage = page != null ? page : 0; final int currentPage = page != null ? page : 0;
Pair<Long, List<Scholix>> scholixResult = manager.linksFromPid( linkProvider, targetPid, targetPidType, targetPublisher, targetType, sourcePid, sourcePidType, sourcePublisher, sourceType, currentPage); final Pair<Long, List<Scholix>> scholixResult = manager
final PageResultType pageResult = new PageResultType(); .linksFromPid(linkProvider, targetPid, targetPidType, targetPublisher, targetType, sourcePid, sourcePidType, sourcePublisher, sourceType, currentPage);
pageResult.setTotalPages(scholixResult.getLeft().intValue() / 10); final PageResultType pageResult = new PageResultType();
pageResult.setTotalLinks(scholixResult.getLeft().intValue()); pageResult.setTotalPages(scholixResult.getLeft().intValue() / 10);
pageResult.setResult(scholixResult.getRight().stream().map(ScholixType::fromScholix).collect(Collectors.toList())); pageResult.setTotalLinks(scholixResult.getLeft().intValue());
return pageResult; pageResult.setResult(scholixResult.getRight().stream().map(ScholixType::fromScholix).collect(Collectors.toList()));
} catch (Throwable e) { return pageResult;
throw new ScholixException("Error on requesting url ", e); } catch (final Throwable e) {
} throw new ScholixException("Error on requesting url ", e);
} }
}
} }

View File

@ -22,8 +22,11 @@ management.metrics.distribution.percentiles.http.server.requests=0.5, 0.9, 0.95,
scholix.elastic.clusterNodes = 10.19.65.51:9200,10.19.65.52:9200,10.19.65.53:9200,10.19.65.54:9200 #scholix.elastic.clusterNodes = 10.19.65.51:9200,10.19.65.52:9200,10.19.65.53:9200,10.19.65.54:9200
#scholix.elastic.clusterNodes = localhost:9200 scholix.elastic.clusterNodes = localhost:9200
scholix.elastic.indexName = dli_scholix scholix.elastic.indexName = dli_scholix
scholix.elastic.socketTimeout = 60000 scholix.elastic.socketTimeout = 60000
scholix.elastic.connectionTimeout= 60000 scholix.elastic.connectionTimeout= 60000

View File

@ -41,8 +41,8 @@
<!-- Swagger --> <!-- Swagger -->
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>org.springdoc</groupId>
<artifactId>springfox-boot-starter</artifactId> <artifactId>springdoc-openapi-ui</artifactId>
</dependency> </dependency>
<!-- for /metrics and /health controllers --> <!-- for /metrics and /health controllers -->

View File

@ -2,7 +2,9 @@ package eu.dnetlib.common.app;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@ -17,11 +19,19 @@ import org.springframework.core.io.ClassPathResource;
import io.micrometer.core.instrument.ImmutableTag; import io.micrometer.core.instrument.ImmutableTag;
import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Metrics;
import springfox.documentation.spi.DocumentationType; import io.swagger.v3.oas.models.OpenAPI;
import springfox.documentation.spring.web.plugins.Docket; import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.tags.Tag;
public abstract class AbstractDnetApp { public abstract class AbstractDnetApp {
private static final String DEFAULT_VERSION = "1.1";
private static final String DEFAULT_DESC = "APIs documentation";
private static final License APACHE_2_LICENSE = new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0");
@Value("${maven.pom.path}") @Value("${maven.pom.path}")
private ClassPathResource pom; private ClassPathResource pom;
@ -46,16 +56,36 @@ public abstract class AbstractDnetApp {
} }
@Bean @Bean
public Docket newSwaggerDocket() { public OpenAPI newSwaggerDocket() {
log.info("Initializing SWAGGER..."); return new OpenAPI()
.info(getSwaggerInfo())
final Docket docket = new Docket(DocumentationType.SWAGGER_2); .tags(swaggerTags());
configSwagger(docket);
return docket;
} }
protected abstract void configSwagger(final Docket docket); private Info getSwaggerInfo() {
return new Info()
.title(swaggerTitle())
.description(swaggerDesc())
.version(swaggerVersion())
.license(swaggerLicense());
}
protected abstract String swaggerTitle();
protected String swaggerDesc() {
return DEFAULT_DESC;
}
protected String swaggerVersion() {
return DEFAULT_VERSION;
}
protected License swaggerLicense() {
return APACHE_2_LICENSE;
}
protected List<Tag> swaggerTags() {
return new ArrayList<>();
}
} }

View File

@ -66,8 +66,8 @@
<!-- Swagger --> <!-- Swagger -->
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>org.springdoc</groupId>
<artifactId>springfox-boot-starter</artifactId> <artifactId>springdoc-openapi-ui</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>

10
pom.xml
View File

@ -247,12 +247,11 @@
<!-- Swagger --> <!-- Swagger -->
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>org.springdoc</groupId>
<artifactId>springfox-boot-starter</artifactId> <artifactId>springdoc-openapi-ui</artifactId>
<version>3.0.0</version> <version>1.6.10</version>
</dependency> </dependency>
<!-- Hadoop --> <!-- Hadoop -->
<dependency> <dependency>
<groupId>org.apache.hadoop</groupId> <groupId>org.apache.hadoop</groupId>
@ -447,10 +446,9 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.plugin.version>3.6.0</maven.compiler.plugin.version> <maven.compiler.plugin.version>3.6.0</maven.compiler.plugin.version>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<dhp-schemas-version>2.11.33</dhp-schemas-version> <dhp-schemas-version>2.14.0</dhp-schemas-version>
<apache.solr.version>7.1.0</apache.solr.version> <apache.solr.version>7.1.0</apache.solr.version>
<mongodb.driver.version>3.4.2</mongodb.driver.version> <mongodb.driver.version>3.4.2</mongodb.driver.version>
<springfox-version>2.8.0</springfox-version>
<prometheus.version>0.10.0</prometheus.version> <prometheus.version>0.10.0</prometheus.version>
<javamelody.version>1.71.0</javamelody.version> <javamelody.version>1.71.0</javamelody.version>
<maven.javadoc.failOnError>false</maven.javadoc.failOnError> <maven.javadoc.failOnError>false</maven.javadoc.failOnError>