View Javadoc
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  		// MainLayout
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  //				String mimeType = ConnectJcrUtils.get((Node) element, Property.JCR_MIMETYPE);
85  				// TODO icons
86  				return super.getImage(element);
87  			}
88  
89  			@Override
90  			public String getToolTipText(Object element) {
91  //				try {
92  //					Row row = (Row) element;
93  //					String excerpt = getExcerpt(row.getNode().getIdentifier(), "*software*");
94  //					return "... " + excerpt + " ...";
95  //				} catch (RepositoryException e) {
96  //					return e.getMessage();
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 //					Query query = session.getWorkspace().getQueryManager().createQuery(
125 //							"select * from [nt:resource] as s" + " where contains(s.*, '" + searchPattern + "')",
126 //							Query.JCR_SQL2);
127 					// we have to use SQL for excerpt
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 //					String[] columnNames = result.getColumnNames();
133 //					for (int i = 0; i < columnNames.length; i++) {
134 //						System.out.println(i + "\t" + columnNames[i]);
135 //					}
136 
137 					for (RowIterator it = result.getRows(); it.hasNext();) {
138 						Row r = it.nextRow();
139 						// Value excerpt = r.getValue("rep:excerpt(.)");
140 						// log.debug(excerpt.getString());
141 //						log.debug(r.getScore());
142 //						log.debug(r.getNode());
143 //						for (int i = 0; i < columnNames.length; i++) {
144 //							log.debug(columnNames[i] + "=" + r.getValue(columnNames[i]).getString());
145 //						}
146 						lst.add(r);
147 					}
148 
149 //					NodeIterator nit = query.execute().getNodes();
150 //					while (nit.hasNext()) {
151 //						lst.add(nit.nextNode().getParent());
152 //					}
153 				} catch (RepositoryException e1) {
154 					// TODO Auto-generated catch block
155 					e1.printStackTrace();
156 				}
157 				viewer.setInput(lst);
158 				if (lst.size() > 0)
159 					viewer.setSelection(new StructuredSelection(lst.get(0)));
160 				// viewer.refresh();
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 					// String excerpt = "... " + getExcerpt(row.getNode().getIdentifier(),
180 					// "*software*") ;
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 			// Remove div tag
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 }