1 package org.argeo.documents.e4.parts;
2
3 import java.nio.file.spi.FileSystemProvider;
4 import java.util.ArrayList;
5
6 import javax.annotation.PostConstruct;
7 import javax.inject.Inject;
8 import javax.inject.Named;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12 import javax.jcr.query.Query;
13 import javax.jcr.query.QueryResult;
14 import javax.jcr.query.Row;
15 import javax.jcr.query.RowIterator;
16
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19 import org.argeo.cms.util.CmsUtils;
20 import org.argeo.connect.ui.SystemWorkbenchService;
21 import org.argeo.connect.util.ConnectJcrUtils;
22 import org.argeo.documents.DocumentsService;
23 import org.argeo.eclipse.ui.specific.EclipseUiSpecificUtils;
24 import org.eclipse.jface.viewers.ArrayContentProvider;
25 import org.eclipse.jface.viewers.ColumnLabelProvider;
26 import org.eclipse.jface.viewers.ISelectionChangedListener;
27 import org.eclipse.jface.viewers.IStructuredSelection;
28 import org.eclipse.jface.viewers.SelectionChangedEvent;
29 import org.eclipse.jface.viewers.StructuredSelection;
30 import org.eclipse.jface.viewers.TableViewer;
31 import org.eclipse.jface.viewers.TableViewerColumn;
32 import org.eclipse.rap.rwt.RWT;
33 import org.eclipse.swt.SWT;
34 import org.eclipse.swt.browser.Browser;
35 import org.eclipse.swt.events.SelectionAdapter;
36 import org.eclipse.swt.events.SelectionEvent;
37 import org.eclipse.swt.graphics.Image;
38 import org.eclipse.swt.layout.GridData;
39 import org.eclipse.swt.layout.GridLayout;
40 import org.eclipse.swt.widgets.Composite;
41 import org.eclipse.swt.widgets.Text;
42
43 public class SearchDocumentsView {
44 private final static Log log = LogFactory.getLog(SearchDocumentsView.class);
45
46 @Inject
47 @Named("(cn=home)")
48 private Repository repository;
49
50 private Session session;
51
52 @PostConstruct
53 public void createPartControl(Composite parent) {
54 session = ConnectJcrUtils.login(repository);
55
56 parent.setLayout(new GridLayout());
57
58 Text searchTxt = new Text(parent, SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL);
59 searchTxt.setLayoutData(CmsUtils.fillWidth());
60
61 TableViewer viewer = new TableViewer(parent);
62 viewer.getTable().setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
63 viewer.getTable().setData(RWT.TOOLTIP_MARKUP_ENABLED, Boolean.TRUE);
64 EclipseUiSpecificUtils.enableToolTipSupport(viewer);
65 viewer.getTable().setLayoutData(CmsUtils.fillAll());
66 viewer.setContentProvider(new ArrayContentProvider());
67 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
68 column.getColumn().setWidth(400);
69 column.getColumn().setText("Name");
70 column.setLabelProvider(new ColumnLabelProvider() {
71
72 @Override
73 public String getText(Object element) {
74 try {
75 Row row = (Row) element;
76 return row.getNode().getParent().getName();
77 } catch (RepositoryException e) {
78 return e.getMessage();
79 }
80 }
81
82 @Override
83 public Image getImage(Object element) {
84
85
86 return super.getImage(element);
87 }
88
89 @Override
90 public String getToolTipText(Object element) {
91
92
93
94
95
96
97
98 try {
99 return ConnectJcrUtils.getPath(((Row) element).getNode().getParent());
100 } catch (RepositoryException e) {
101 return e.getMessage();
102 }
103 }
104
105 });
106
107 Browser browser = new Browser(parent, SWT.NONE);
108 GridData gd = CmsUtils.fillWidth();
109 gd.heightHint = 200;
110 browser.setLayoutData(gd);
111
112 searchTxt.addSelectionListener(new SelectionAdapter() {
113
114 @Override
115 public void widgetDefaultSelected(SelectionEvent e) {
116 String searchTerm = searchTxt.getText().trim();
117 if ("".equals(searchTerm)) {
118 viewer.setInput(new ArrayList<>());
119 return;
120 }
121 String searchPattern = "*" + searchTerm + "*";
122 ArrayList<Row> lst = new ArrayList<>();
123 try {
124
125
126
127
128 Query query = session.getWorkspace().getQueryManager().createQuery(
129 "select excerpt(.) from nt:resource" + " where contains(., '" + searchPattern + "')",
130 Query.SQL);
131 QueryResult result = query.execute();
132
133
134
135
136
137 for (RowIterator it = result.getRows(); it.hasNext();) {
138 Row r = it.nextRow();
139
140
141
142
143
144
145
146 lst.add(r);
147 }
148
149
150
151
152
153 } catch (RepositoryException e1) {
154
155 e1.printStackTrace();
156 }
157 viewer.setInput(lst);
158 if (lst.size() > 0)
159 viewer.setSelection(new StructuredSelection(lst.get(0)));
160
161 }
162
163 });
164
165 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
166
167 @Override
168 public void selectionChanged(SelectionChangedEvent event) {
169 Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
170 if (element == null) {
171 browser.setText("");
172 return;
173 }
174
175 try {
176 Row row = (Row) element;
177 String excerpt = row.getValue("rep:excerpt(.)").getString();
178 excerpt = "<div style='font-family: sans-serif'>" + excerpt + "</div>";
179
180
181 browser.setText(excerpt);
182 } catch (RepositoryException e) {
183 e.printStackTrace();
184 }
185
186 }
187 });
188
189 viewer.setInput(new ArrayList<>());
190 }
191
192 private String getExcerpt(String uuid, String searchTerm) {
193 try {
194 Query query = session.getWorkspace().getQueryManager().createQuery("select excerpt(.) from nt:resource"
195 + " where jcr:uuid = '" + uuid + "' AND contains(., '" + searchTerm + "')", Query.SQL);
196 String excerpt = query.execute().getRows().nextRow().getValue("rep:excerpt(.)").getString();
197
198 excerpt = excerpt.substring(5, excerpt.length() - 6);
199 System.out.print(excerpt);
200 return excerpt;
201 } catch (RepositoryException e) {
202 e.printStackTrace();
203 return "";
204 }
205 }
206 }