org.opencms.ui.apps.search.CmsSourceSearchApp Maven / Gradle / Ivy
Show all versions of opencms-test Show documentation
/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.ui.apps.search;
import org.opencms.file.CmsResource;
import org.opencms.ui.A_CmsUI;
import org.opencms.ui.CmsVaadinUtils;
import org.opencms.ui.FontOpenCms;
import org.opencms.ui.I_CmsDialogContext;
import org.opencms.ui.I_CmsDialogContext.ContextType;
import org.opencms.ui.apps.A_CmsWorkplaceApp;
import org.opencms.ui.apps.CmsAppWorkplaceUi;
import org.opencms.ui.apps.CmsFileExplorer;
import org.opencms.ui.apps.I_CmsCachableApp;
import org.opencms.ui.apps.I_CmsContextProvider;
import org.opencms.ui.apps.Messages;
import org.opencms.ui.apps.projects.CmsProjectManagerConfiguration;
import org.opencms.ui.apps.search.CmsSourceSearchForm.SearchType;
import org.opencms.ui.components.CmsFileTable;
import org.opencms.ui.components.CmsFileTableDialogContext;
import org.opencms.ui.report.CmsReportOverlay;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.server.Sizeable.Unit;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalSplitPanel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.themes.ValoTheme;
/**
* The source search app.
*/
public class CmsSourceSearchApp extends A_CmsWorkplaceApp implements I_CmsCachableApp {
/** The folder key. */
public static final String FOLDER = "folder";
/** The index key. */
public static final String INDEX = "index";
/** The locale key. */
public static final String LOCALE = "locale";
/** The project ley. */
public static final String PROJECT = "project";
/** The query key. */
public static final String QUERY = "query";
/** The replace pattern key. */
public static final String REPLACE_PATTERN = "rpattern";
/** The resource type key. */
public static final String RESOURCE_TYPE = "rtype";
/** The search pattern key. */
public static final String SEARCH_PATTERN = "spattern";
/** The type key. */
public static final String SEARCH_TYPE = "type";
/** The XPath key. */
public static final String XPATH = "xpath";
/** The serial version id. */
private static final long serialVersionUID = 4675966043824229258L;
/** The results file table. */
CmsFileTable m_resultTable;
/** The currently selected result list resources. */
private List m_currentResources;
/** The current state string. */
private String m_currentState;
/** The current search report. */
private CmsReportOverlay m_report;
/** The result table filter input. */
private TextField m_resultTableFilter;
/** The search form. */
private CmsSourceSearchForm m_searchForm;
/** The search and replace thread. */
private CmsSearchReplaceThread m_thread;
/**
* Generates the state string for the given search settings.
*
* @param settings the search settings
*
* @return the state string
*/
static String generateState(CmsSearchReplaceSettings settings) {
String state = "";
state = A_CmsWorkplaceApp.addParamToState(state, SEARCH_TYPE, settings.getType().name());
state = A_CmsWorkplaceApp.addParamToState(state, SEARCH_PATTERN, settings.getSearchpattern());
if (!settings.getPaths().isEmpty()) {
state = A_CmsWorkplaceApp.addParamToState(state, FOLDER, settings.getPaths().get(0));
}
state = A_CmsWorkplaceApp.addParamToState(state, RESOURCE_TYPE, settings.getTypes());
state = A_CmsWorkplaceApp.addParamToState(state, LOCALE, settings.getLocale());
state = A_CmsWorkplaceApp.addParamToState(state, QUERY, settings.getQuery());
state = A_CmsWorkplaceApp.addParamToState(state, INDEX, settings.getSource());
state = A_CmsWorkplaceApp.addParamToState(state, XPATH, settings.getXpath());
return state;
}
/**
* Returns the settings for the given state.
*
* @param state the state
*
* @return the search settings
*/
static CmsSearchReplaceSettings getSettingsFromState(String state) {
CmsSearchReplaceSettings settings = null;
String typeString = A_CmsWorkplaceApp.getParamFromState(state, SEARCH_TYPE);
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(typeString)) {
SearchType type = SearchType.valueOf(typeString);
settings = new CmsSearchReplaceSettings();
settings.setType(type);
settings.setPaths(Collections.singletonList(A_CmsWorkplaceApp.getParamFromState(state, FOLDER)));
String resType = A_CmsWorkplaceApp.getParamFromState(state, RESOURCE_TYPE);
if (resType != null) {
settings.setTypes(typeString);
}
String project = A_CmsWorkplaceApp.getParamFromState(state, PROJECT);
if (project != null) {
settings.setProject(project);
}
settings.setSearchpattern(A_CmsWorkplaceApp.getParamFromState(state, SEARCH_PATTERN));
if (type.isContentValuesOnly()) {
settings.setOnlyContentValues(true);
String locale = A_CmsWorkplaceApp.getParamFromState(state, LOCALE);
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(locale)) {
settings.setLocale(locale);
}
settings.setXpath(A_CmsWorkplaceApp.getParamFromState(state, XPATH));
}
if (type.isSolrSearch()) {
settings.setQuery(A_CmsWorkplaceApp.getParamFromState(state, QUERY));
settings.setSource(A_CmsWorkplaceApp.getParamFromState(state, INDEX));
}
}
return settings;
}
/**
* @see org.opencms.ui.apps.I_CmsCachableApp#isCachable()
*/
public boolean isCachable() {
return true;
}
/**
* @see org.opencms.ui.apps.I_CmsCachableApp#onRestoreFromCache()
*/
public void onRestoreFromCache() {
if (m_resultTable.getItemCount() < CmsFileExplorer.UPDATE_FOLDER_THRESHOLD) {
for (CmsUUID id : m_resultTable.getAllIds()) {
m_resultTable.update(id, false);
}
} else {
if (m_currentResources != null) {
for (CmsResource res : m_currentResources) {
m_resultTable.update(res.getStructureId(), false);
}
}
}
}
/**
* @see org.opencms.ui.apps.A_CmsWorkplaceApp#onStateChange(java.lang.String)
*/
@Override
public void onStateChange(String state) {
if ((m_currentState == null) || !m_currentState.equals(state)) {
super.onStateChange(state);
}
}
/**
* Displays the search result.
*/
protected void displayResult() {
m_resultTable.fillTable(A_CmsUI.getCmsObject(), m_thread.getMatchedResources());
m_searchForm.removeComponent(m_report);
m_report = null;
}
/**
* @see org.opencms.ui.apps.A_CmsWorkplaceApp#getBreadCrumbForState(java.lang.String)
*/
@Override
protected LinkedHashMap getBreadCrumbForState(String state) {
return null;
}
/**
* @see org.opencms.ui.apps.A_CmsWorkplaceApp#getComponentForState(java.lang.String)
*/
@Override
protected Component getComponentForState(String state) {
m_rootLayout.setMainHeightFull(true);
HorizontalSplitPanel sp = new HorizontalSplitPanel();
sp.setSizeFull();
m_searchForm = new CmsSourceSearchForm(this);
sp.setFirstComponent(m_searchForm);
m_resultTable = new CmsFileTable(null);
m_resultTable.applyWorkplaceAppSettings();
m_resultTable.setContextProvider(new I_CmsContextProvider() {
/**
* @see org.opencms.ui.apps.I_CmsContextProvider#getDialogContext()
*/
public I_CmsDialogContext getDialogContext() {
CmsFileTableDialogContext context = new CmsFileTableDialogContext(
CmsProjectManagerConfiguration.APP_ID,
ContextType.fileTable,
m_resultTable,
m_resultTable.getSelectedResources());
storeCurrentFileSelection(m_resultTable.getSelectedResources());
context.setEditableProperties(CmsFileExplorer.INLINE_EDIT_PROPERTIES);
return context;
}
});
m_resultTable.setSizeFull();
m_resultTableFilter = new TextField();
m_resultTableFilter.setIcon(FontOpenCms.FILTER);
m_resultTableFilter.setInputPrompt(
Messages.get().getBundle(UI.getCurrent().getLocale()).key(Messages.GUI_EXPLORER_FILTER_0));
m_resultTableFilter.addStyleName(ValoTheme.TEXTFIELD_INLINE_ICON);
m_resultTableFilter.setWidth("200px");
m_resultTableFilter.addTextChangeListener(new TextChangeListener() {
private static final long serialVersionUID = 1L;
public void textChange(TextChangeEvent event) {
m_resultTable.filterTable(event.getText());
}
});
m_infoLayout.addComponent(m_resultTableFilter);
sp.setSecondComponent(m_resultTable);
sp.setSplitPosition(CmsFileExplorer.LAYOUT_SPLIT_POSITION, Unit.PIXELS);
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(state)) {
CmsSearchReplaceSettings settings = getSettingsFromState(state);
if (settings != null) {
m_currentState = state;
m_searchForm.initFormValues(settings);
search(settings, false);
}
}
return sp;
}
/**
* @see org.opencms.ui.apps.A_CmsWorkplaceApp#getSubNavEntries(java.lang.String)
*/
@Override
protected List getSubNavEntries(String state) {
return null;
}
/**
* Executes the search.
*
* @param settings the search settings
* @param updateState true
to create a new history entry
*/
protected void search(CmsSearchReplaceSettings settings, boolean updateState) {
if (updateState) {
String state = generateState(settings);
CmsAppWorkplaceUi.get().changeCurrentAppState(state);
m_currentState = state;
}
m_thread = new CmsSearchReplaceThread(A_CmsUI.get().getHttpSession(), A_CmsUI.getCmsObject(), settings);
if (m_report != null) {
m_searchForm.removeComponent(m_report);
}
m_report = new CmsReportOverlay(m_thread);
m_report.addReportFinishedHandler(new Runnable() {
public void run() {
displayResult();
}
});
m_searchForm.addComponent(m_report);
m_report.setTitle(CmsVaadinUtils.getMessageText(Messages.GUI_SOURCESEARCH_REPORT_TITLE_0));
m_thread.start();
m_resultTableFilter.clear();
}
/**
* Stores the currently selected resources list.
*
* @param resources the currently selected resources
*/
void storeCurrentFileSelection(List resources) {
m_currentResources = resources;
}
}