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.resources.app.data;
35
36 import info.magnolia.config.registry.DefinitionMetadata;
37 import info.magnolia.config.registry.DefinitionProvider;
38 import info.magnolia.config.registry.RegistryFacade;
39 import info.magnolia.module.ModuleRegistry;
40 import info.magnolia.objectfactory.Components;
41 import info.magnolia.resourceloader.Resource;
42 import info.magnolia.resourceloader.ResourceOrigin;
43 import info.magnolia.resourceloader.classpath.ClasspathResource;
44 import info.magnolia.ui.filter.DataFilter;
45
46 import java.util.Collection;
47 import java.util.HashSet;
48 import java.util.stream.Stream;
49
50 import javax.inject.Inject;
51
52 import com.vaadin.data.provider.AbstractBackEndHierarchicalDataProvider;
53 import com.vaadin.data.provider.HierarchicalQuery;
54
55
56
57
58 public class ResourceDataProvider extends AbstractBackEndHierarchicalDataProvider<Resource, DataFilter> implements ResourceHelper {
59
60 private final ResourceOrigin<?> resourceOrigin;
61 private final Collection<String> moduleFolders;
62
63 @Inject
64 ResourceDataProvider(ResourceOrigin<?> resourceOrigin, ModuleRegistry moduleRegistry, RegistryFacade registryFacade) {
65 this.resourceOrigin = resourceOrigin;
66 this.moduleFolders = new HashSet<>(moduleRegistry.getModuleNames());
67 final Collection<DefinitionProvider<?>> definitionProviders = registryFacade.query().findMultiple();
68 definitionProviders
69 .stream()
70 .map(DefinitionProvider::getMetadata)
71 .map(DefinitionMetadata::getModule)
72 .forEach(moduleFolders::add);
73 }
74
75
76
77
78 @Deprecated
79 public ResourceDataProvider(ResourceOrigin<?> resourceOrigin, ModuleRegistry moduleRegistry) {
80 this(resourceOrigin, moduleRegistry, Components.getComponent(RegistryFacade.class));
81 }
82
83 @Override
84 public Object getId(Resource item) {
85 return item.getPath();
86 }
87
88 @Override
89 protected Stream<Resource> fetchChildrenFromBackEnd(HierarchicalQuery<Resource, DataFilter> query) {
90 boolean isRoot = query.getParent() == null;
91 Stream<Resource> children = getChildren(isRoot ? resourceOrigin.getRoot() : query.getParent());
92 if (isRoot) {
93 children = children.filter(resource -> {
94 boolean isClasspathOnlyResource = getFirstResource(resource)
95 .map(ClasspathResource.class::isInstance)
96 .orElse(false);
97
98 return !isClasspathOnlyResource || moduleFolders.contains(resource.getName());
99 });
100 }
101 return children
102 .skip(query.getOffset())
103 .limit(query.getLimit());
104 }
105
106 @Override
107 public int getChildCount(HierarchicalQuery<Resource, DataFilter> query) {
108 return (int) fetchChildrenFromBackEnd(query).count();
109 }
110
111 @Override
112 public boolean hasChildren(Resource item) {
113 return getChildren(item).findFirst().isPresent();
114 }
115
116 private Stream<Resource> getChildren(Resource parent) {
117 return !parent.isDirectory() ? Stream.empty() : parent.listChildren().stream();
118 }
119 }
120