/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
/**
*
*/
package org.jabylon.rest.ui.wicket.panels;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.eclipse.emf.common.util.URI;
import org.jabylon.cdo.server.ServerConstants;
import org.jabylon.index.properties.QueryService;
import org.jabylon.index.properties.SearchResult;
import org.jabylon.properties.ProjectLocale;
import org.jabylon.properties.ProjectVersion;
import org.jabylon.properties.PropertiesPackage;
import org.jabylon.rest.ui.security.CDOAuthenticatedSession;
import org.jabylon.rest.ui.util.WicketUtil;
import org.jabylon.rest.ui.wicket.pages.ResourcePage;
import org.jabylon.security.CommonPermissions;
import org.jabylon.users.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
public class SearchResultPanel<T> extends GenericPanel<T> {
private static final long serialVersionUID = 1L;
@Inject
private QueryService queryService;
private static final Logger logger = LoggerFactory.getLogger(SearchResultPanel.class);
public SearchResultPanel(String id, final SearchResult result, PageParameters parameters) {
super(id);
List<ScoreDoc> list = Arrays.asList(result.getTopDocs().scoreDocs);
ListView<ScoreDoc> repeater = new ListView<ScoreDoc>("results", list) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<ScoreDoc> item) {
ScoreDoc doc = item.getModelObject();
Document document;
try {
document = result.getSearcher().doc(doc.doc);
item.add(new Label("value", document.get(QueryService.FIELD_VALUE)));
String projectLabel = "{0} ({1})";
String projectName = document.get(QueryService.FIELD_PROJECT);
Session session = getSession();
User user = null;
if (session instanceof CDOAuthenticatedSession) {
CDOAuthenticatedSession authSession = (CDOAuthenticatedSession) session;
user = authSession.getUser();
}
if(user==null || !CommonPermissions.hasPermission(user,CommonPermissions.constructPermissionName(PropertiesPackage.Literals.PROJECT.getName(), projectName, CommonPermissions.ACTION_VIEW)))
item.setVisible(false);
String projectVersion = document.get(QueryService.FIELD_VERSION);
String projectLocale = document.get(QueryService.FIELD_LOCALE);
String descriptorURI = document.get(QueryService.FIELD_URI);
PageParameters params = new PageParameters();
int startParam = 0;
params.set(startParam++, ServerConstants.WORKSPACE_RESOURCE);
params.set(startParam++, projectName);
params.set(startParam++, projectVersion);
params.set(startParam++, projectLocale);
URI uri = URI.createURI(descriptorURI);
for (int i = startParam; i < uri.segmentCount()+startParam; i++) {
params.set(i, uri.segment(i-startParam));
}
BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>("link", ResourcePage.class, params);
link.add(new Label("title", uri.lastSegment()));
item.add(link);
projectLabel = MessageFormat.format(projectLabel, projectName, projectVersion);
BookmarkablePageLink<ResourcePage<ProjectVersion>> projectVersionLink = new BookmarkablePageLink<ResourcePage<ProjectVersion>>("project-link", ResourcePage.class, createPageParams(ServerConstants.WORKSPACE_RESOURCE,projectName,projectVersion));
projectVersionLink.add(new Label("project", projectLabel));
item.add(projectVersionLink);
String key = document.get(QueryService.FIELD_KEY);
BookmarkablePageLink<ResourcePage<ProjectVersion>> projectVersionKeyLink = new BookmarkablePageLink<ResourcePage<ProjectVersion>>("key-link", ResourcePage.class, params.set("key", key));
projectVersionKeyLink.add(new Label("key", key));
item.add(projectVersionKeyLink);
item.add(new Label("comment", document.get(QueryService.FIELD_COMMENT)));
item.add(new Label("mastervalue", document.get(QueryService.FIELD_MASTER_VALUE)));
item.add(new Label("mastercomment", document.get(QueryService.FIELD_MASTER_COMMENT)));
Locale locale = WicketUtil.getLocaleFromString(projectLocale);
String localeLabel = locale.getDisplayName(WicketUtil.getUserLocale());
item.add(new Label("language", localeLabel));
if(locale==null || locale.equals(ProjectLocale.TEMPLATE_LOCALE)) {
WebMarkupContainer markupContainer = new WebMarkupContainer("flag-icon");
item.add(markupContainer);
markupContainer.add(new AttributeModifier("class", "icon-book"));
}
else {
item.add(new Image("flag-icon", WicketUtil.getIconForLocale(locale)));
}
} catch (CorruptIndexException e) {
error(e.getMessage());
logger.error("Search failed", e);
} catch (IOException e) {
error(e.getMessage());
logger.error("Search failed", e);
}
}
};
add(repeater);
}
public QueryService getQueryService() {
return queryService;
}
protected PageParameters createPageParams(String... segments)
{
PageParameters params = new PageParameters();
for (int i = 0; i < segments.length; i++) {
params.set(i, segments[i]);
}
return params;
}
}