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.admincentral.findbar.sniff;
35
36 import static info.magnolia.periscope.operation.OperationResult.successfulResult;
37
38 import info.magnolia.admincentral.findbar.PeriscopeAppDetailCreator;
39 import info.magnolia.admincentral.findbar.PeriscopeAppDetailCreator.AppDetail;
40 import info.magnolia.cms.util.QueryUtil;
41 import info.magnolia.periscope.operation.OperationResult;
42 import info.magnolia.periscope.sniff.PatternCommandSniffer;
43 import info.magnolia.ui.api.location.LocationController;
44 import info.magnolia.ui.contentapp.detail.DetailLocation;
45 import info.magnolia.ui.contentapp.detail.DetailView;
46
47 import java.util.Optional;
48 import java.util.regex.Matcher;
49 import java.util.regex.Pattern;
50
51 import javax.jcr.Node;
52 import javax.jcr.NodeIterator;
53 import javax.jcr.RepositoryException;
54 import javax.jcr.query.Query;
55
56
57
58
59
60
61
62
63 public abstract class AbstractFindCommandSniffer extends PatternCommandSniffer {
64
65 private final LocationController locationController;
66 private final PeriscopeAppDetailCreator periscopeAppDetailCreator;
67 private final Pattern commandPattern;
68
69 public AbstractFindCommandSniffer(LocationController locationController, PeriscopeAppDetailCreator periscopeAppDetailCreator, Pattern commandPattern) {
70 this.locationController = locationController;
71 this.periscopeAppDetailCreator = periscopeAppDetailCreator;
72 this.commandPattern = commandPattern;
73 }
74
75 protected abstract String buildQuery(String content);
76
77 @Override
78 protected Pattern getPattern() {
79 return commandPattern;
80 }
81
82 @Override
83 protected OperationResult execute(Matcher matcher) {
84
85
86 String appName = matcher.group("appName").toLowerCase();
87 String nodeName = matcher.group("content").toLowerCase();
88
89 Optional<AppDetail> appDetailOptional = periscopeAppDetailCreator.createAppDetail(appName);
90 if (!appDetailOptional.isPresent()) {
91 return new OperationResult(false, String.format("App configuration cannot be found for app: '%s'.", appName));
92 }
93
94 String searchQuery = buildQuery(nodeName);
95
96 try {
97 AppDetail appDetail = appDetailOptional.get();
98 String workspaceName = appDetail.getWorkspace();
99 NodeIterator searchResults = QueryUtil.search(workspaceName, searchQuery, Query.JCR_SQL2);
100 if (!searchResults.hasNext()) {
101 return new OperationResult(false, "No matching node found.");
102 }
103
104 Node matchingNode = searchResults.nextNode();
105 String path = matchingNode.getPath();
106
107 DetailLocation location = new DetailLocation(appDetail.getAppName(), appDetail.getSubAppName(), DetailView.ViewType.VIEW, path, null);
108 locationController.goTo(location);
109 return successfulResult();
110 } catch (RepositoryException e) {
111 return new OperationResult(false, e.getMessage());
112 }
113 }
114 }