1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.rest.registry;
35
36 import info.magnolia.cms.util.ModuleConfigurationObservingManager;
37 import info.magnolia.jcr.node2bean.Node2BeanException;
38 import info.magnolia.jcr.predicate.NodeTypePredicate;
39 import info.magnolia.jcr.util.NodeTypes;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.jcr.util.NodeVisitor;
42 import info.magnolia.module.ModuleRegistry;
43
44 import java.util.ArrayList;
45 import java.util.Collections;
46 import java.util.HashSet;
47 import java.util.List;
48 import java.util.Set;
49
50 import javax.inject.Inject;
51 import javax.inject.Singleton;
52 import javax.jcr.Node;
53 import javax.jcr.RepositoryException;
54
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58
59
60
61 @Singleton
62 public class ConfiguredEndpointDefinitionManager extends ModuleConfigurationObservingManager {
63
64 public static final String REST_ENDPOINTS_CONFIG_NODE_NAME = "rest-endpoints";
65
66 private final Logger log = LoggerFactory.getLogger(getClass());
67
68 private Set<String> registeredEndpoints = Collections.synchronizedSet(new HashSet<String>());
69 private final EndpointDefinitionRegistry endpointDefinitionRegistry;
70
71 @Inject
72 public ConfiguredEndpointDefinitionManager(ModuleRegistry moduleRegistry, EndpointDefinitionRegistry endpointDefinitionRegistry) {
73 super(REST_ENDPOINTS_CONFIG_NODE_NAME, moduleRegistry);
74 this.endpointDefinitionRegistry = endpointDefinitionRegistry;
75 }
76
77 @Override
78 protected void reload(List<Node> nodes) throws RepositoryException {
79 final List<EndpointDefinitionProvider> providers = new ArrayList<EndpointDefinitionProvider>();
80
81 for (Node node : nodes) {
82 NodeUtil.visit(node, new NodeVisitor() {
83 @Override
84 public void visit(Node current) throws RepositoryException {
85 for (Node endpointNode : NodeUtil.getNodes(current, NodeTypes.ContentNode.NAME)) {
86 if (isEndpoint(endpointNode)) {
87 EndpointDefinitionProvider provider = createProvider(endpointNode);
88 if (provider != null) {
89 providers.add(provider);
90 }
91 }
92 }
93 }
94 }, new NodeTypePredicate(NodeTypes.Content.NAME));
95 }
96
97 this.registeredEndpoints = endpointDefinitionRegistry.unregisterAndRegister(registeredEndpoints, providers);
98 }
99
100
101
102
103 private boolean isEndpoint(Node endpointNode) throws RepositoryException {
104 return endpointNode.hasProperty(ConfiguredEndpointDefinition.PROPERTY_NAME_IMPLEMENTATION_CLASS);
105 }
106
107 protected EndpointDefinitionProvider createProvider(Node endpointNode) throws RepositoryException {
108 final String name = endpointNode.getName();
109
110 try {
111 return new ConfiguredEndpointDefinitionProvider(name, endpointNode);
112 } catch (Node2BeanException e) {
113 log.error("Unable to create provider for endpoint [" + name + "]", e);
114 }
115
116 return null;
117 }
118 }