View Javadoc
1   /**************************************************************************
2    *
3    * Copyright (c) 2016-2020 Yawg project contributors.
4    *
5    **************************************************************************/
6   
7   package com.varmateo.yawg.core;
8   
9   import java.util.Optional;
10  import java.util.function.Function;
11  
12  import io.vavr.collection.Seq;
13  import io.vavr.control.Option;
14  
15  import com.varmateo.yawg.api.YawgException;
16  import com.varmateo.yawg.spi.Template;
17  import com.varmateo.yawg.spi.TemplateService;
18  
19  
20  /**
21   * 
22   */
23  /* default */ final class CollectiveTemplateService
24          implements TemplateService {
25  
26  
27      private final Function<String, Optional<Template>> _templateFetcher;
28  
29  
30      private CollectiveTemplateService(final Seq<TemplateService> services) {
31  
32          if ( services.isEmpty() ) {
33              _templateFetcher = name -> Optional.empty();
34          } else {
35              _templateFetcher = name -> prepareTemplateFromServices(services, name);
36          }
37      }
38  
39  
40      /**
41       *
42       */
43      public static TemplateService create(final Seq<TemplateService> services) {
44          return new CollectiveTemplateService(services);
45      }
46  
47  
48      /**
49       * {@inheritDoc}
50       */
51      @Override
52      public Optional<Template> prepareTemplate(final String name) {
53  
54          return _templateFetcher.apply(name);
55      }
56  
57  
58      /**
59       *
60       */
61      private static Optional<Template> prepareTemplateFromServices(
62              final Seq<TemplateService> services,
63              final String name) {
64  
65          final Option<Template> result = services
66                  .map(service -> service.prepareTemplate(name))
67                  .map(Option::ofOptional)
68                  .filter(Option::isDefined)
69                  .map(Option::get)
70                  .headOption();
71  
72          if ( !result.isDefined() ) {
73              throw CollectiveTemplateServiceException.unsupportedTemplateFormat(name);
74          }
75  
76          return result.toJavaOptional();
77      }
78  
79  
80  }