/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.cms.applications.contenttool.actions;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.infoglue.cms.applications.common.actions.InfoGlueAbstractAction;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentController;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController;
import org.infoglue.cms.controllers.kernel.impl.simple.LanguageController;
import org.infoglue.cms.controllers.kernel.impl.simple.RepositoryController;
import org.infoglue.cms.controllers.kernel.impl.simple.SearchController;
import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import org.infoglue.cms.entities.kernel.BaseEntityVO;
import org.infoglue.cms.entities.management.LanguageVO;
import org.infoglue.cms.util.CmsPropertyHandler;
import webwork.action.Action;
/**
* Action class for usecase SearchContentAction. Was better before but due to wanted support for multiple
* databases and lack of time I had to cut down on functionality - sorry Magnus.
*
* @author Magnus G�venal
* @author Mattias Bogeblad
*/
public class SearchContentAction extends InfoGlueAbstractAction
{
private SearchController searchController = new SearchController();
private final static Logger logger = Logger.getLogger(SearchContentAction.class.getName());
private static final long serialVersionUID = 1L;
private List contentVersionVOList = new ArrayList();
private List<BaseEntityVO> baseEntityVOList = new ArrayList<BaseEntityVO>();
private Set contentVOSet;
private List<DigitalAssetVO> digitalAssetVOList = null;
private Integer repositoryId;
private String searchString;
private String name;
private Integer languageId;
private Integer contentTypeDefinitionId;
private Integer caseSensitive;
private boolean includeAssets = false;
private boolean onlyIDSearch = false;
private Integer inverseSearch;
private Integer stateId;
private boolean advancedEnabled = false;
private List selectedRepositoryIdList = new ArrayList();
private String[] allowedContentTypeIds = null;
private int maxRows = 0;
//This is for advanced search
private List principals = null;
private List availableLanguages = null;
private List contentTypeDefinitions = null;
private List repositories = null;
//This is for replace
private String replaceString = null;
//private String[] contentVersionId = null;
private String assetTypeFilter = "*";
private boolean allowCaseSensitive = true;
private Boolean enableInlineButtons = false;
public boolean getAllowCaseSensitive()
{
return allowCaseSensitive;
}
public void setSearchString(String s)
{
this.searchString = s;
//this.searchString = s.replaceAll("'","");
}
public String getSearchString()
{
return this.searchString;
}
public void setMaxRows(int r)
{
this.maxRows = r;
}
public int getMaxRows()
{
if(maxRows == 0)
maxRows=100;
return this.maxRows;
}
public List getContentVersionVOList()
{
return this.contentVersionVOList;
}
public String doExecute() throws Exception
{
int maxRows = 100;
try
{
maxRows = Integer.parseInt(CmsPropertyHandler.getMaxRows());
}
catch(Exception e)
{
}
String[] repositoryIdToSearch = this.getRequest().getParameterValues("repositoryIdToSearch");
if(onlyIDSearch)
{
try
{
this.baseEntityVOList = searchController.getBaseEntityVOListFromCastor(new Integer(this.getSearchString()));
}
catch (Exception e)
{
logger.warn("Not a valid id:" + e.getMessage());
}
}
else
{
if(repositoryIdToSearch != null)
{
Integer[] repositoryIdAsIntegerToSearch = new Integer[repositoryIdToSearch.length];
for(int i=0; i < repositoryIdToSearch.length; i++)
{
repositoryIdAsIntegerToSearch[i] = new Integer(repositoryIdToSearch[i]);
selectedRepositoryIdList.add(repositoryIdToSearch[i]);
}
contentVersionVOList = searchController.getContentVersionVOList(repositoryIdAsIntegerToSearch, this.getSearchString(), maxRows, name, languageId, new Integer[]{contentTypeDefinitionId}, null, caseSensitive, stateId, includeAssets);
}
else
{
contentVersionVOList = searchController.getContentVersionVOList(this.repositoryId, this.getSearchString(), maxRows, name, languageId, new Integer[]{contentTypeDefinitionId}, caseSensitive, stateId, includeAssets);
selectedRepositoryIdList.add("" + this.repositoryId);
}
}
if(CmsPropertyHandler.getInternalSearchEngine().equalsIgnoreCase("lucene"))
{
allowCaseSensitive = false;
}
this.principals = UserControllerProxy.getController().getAllUsers();
this.availableLanguages = LanguageController.getController().getLanguageVOList(this.repositoryId);
this.contentTypeDefinitions = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList();
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), false);
return "success";
}
public String doBindingResult() throws Exception
{
Integer[] allowedContentTypeId = new Integer[0];
if(allowedContentTypeIds != null && allowedContentTypeIds.length != 0)
{
allowedContentTypeId = new Integer[allowedContentTypeIds.length];
for(int i=0; i<allowedContentTypeIds.length; i++)
allowedContentTypeId[i] = new Integer(allowedContentTypeIds[i]);
}
int maxRows = 100;
try
{
maxRows = Integer.parseInt(CmsPropertyHandler.getMaxRows());
}
catch(Exception e)
{
}
String[] repositoryIdToSearch = this.getRequest().getParameterValues("repositoryIdToSearch");
if(repositoryIdToSearch != null)
{
Integer[] repositoryIdAsIntegerToSearch = new Integer[repositoryIdToSearch.length];
for(int i=0; i < repositoryIdToSearch.length; i++)
{
repositoryIdAsIntegerToSearch[i] = new Integer(repositoryIdToSearch[i]);
selectedRepositoryIdList.add(repositoryIdToSearch[i]);
}
contentVOSet = searchController.getContents(repositoryIdAsIntegerToSearch, this.getSearchString(), maxRows, name, languageId, allowedContentTypeId, caseSensitive, stateId);
}
else
{
contentVOSet = searchController.getContents(this.repositoryId, this.getSearchString(), maxRows, name, languageId, allowedContentTypeId, caseSensitive, stateId);
selectedRepositoryIdList.add("" + this.repositoryId);
}
return "successBindingResult";
}
public String doInlineAssetResult() throws Exception
{
Integer[] allowedContentTypeId = new Integer[0];
if(allowedContentTypeIds != null && allowedContentTypeIds.length != 0)
{
allowedContentTypeId = new Integer[allowedContentTypeIds.length];
for(int i=0; i<allowedContentTypeIds.length; i++)
allowedContentTypeId[i] = new Integer(allowedContentTypeIds[i]);
}
int maxRows = 100;
try
{
maxRows = Integer.parseInt(CmsPropertyHandler.getMaxRows());
}
catch(Exception e)
{
}
String[] repositoryIdToSearch = this.getRequest().getParameterValues("repositoryIdToSearch");
if(repositoryIdToSearch != null)
{
Integer[] repositoryIdAsIntegerToSearch = new Integer[repositoryIdToSearch.length];
for(int i=0; i < repositoryIdToSearch.length; i++)
{
repositoryIdAsIntegerToSearch[i] = new Integer(repositoryIdToSearch[i]);
selectedRepositoryIdList.add(repositoryIdToSearch[i]);
}
contentVOSet = searchController.getContents(repositoryIdAsIntegerToSearch, this.getSearchString(), maxRows, name, languageId, allowedContentTypeId, caseSensitive, stateId, true);
}
else
{
contentVOSet = searchController.getContents(this.repositoryId, this.getSearchString(), maxRows, name, languageId, allowedContentTypeId, caseSensitive, stateId, true);
selectedRepositoryIdList.add("" + this.repositoryId);
}
return "successInlineAssetResult";
}
public String doInlineAssetSearchV3() throws Exception
{
int maxRows = 100;
try
{
maxRows = Integer.parseInt(CmsPropertyHandler.getMaxRows());
}
catch(Exception e)
{
}
String[] repositoryIdToSearch = this.getRequest().getParameterValues("repositoryIdToSearch");
if(repositoryIdToSearch != null)
{
Integer[] repositoryIdAsIntegerToSearch = new Integer[repositoryIdToSearch.length];
for(int i=0; i < repositoryIdToSearch.length; i++)
{
repositoryIdAsIntegerToSearch[i] = new Integer(repositoryIdToSearch[i]);
selectedRepositoryIdList.add(repositoryIdToSearch[i]);
}
digitalAssetVOList = SearchController.getController().getDigitalAssets(repositoryIdAsIntegerToSearch, this.getSearchString(), assetTypeFilter, maxRows, new HashMap<String,Integer>(), languageId, caseSensitive, stateId);
}
else
{
digitalAssetVOList = SearchController.getController().getDigitalAssets(new Integer[]{this.repositoryId}, this.getSearchString(), assetTypeFilter, maxRows, new HashMap<String,Integer>(), languageId, caseSensitive, stateId);
selectedRepositoryIdList.add("" + this.repositoryId);
}
return "successInlineAssetSearchV3";
}
public String doLatestInlineAssetsV3() throws Exception
{
int maxRows = 20;
/*
try
{
maxRows = Integer.parseInt(CmsPropertyHandler.getMaxRows());
if(maxRows > 50)
maxRows = 30;
}
catch(Exception e)
{
}
*/
String[] repositoryIdToSearch = this.getRequest().getParameterValues("repositoryIdToSearch");
if(repositoryIdToSearch != null)
{
Integer[] repositoryIdAsIntegerToSearch = new Integer[repositoryIdToSearch.length];
for(int i=0; i < repositoryIdToSearch.length; i++)
{
repositoryIdAsIntegerToSearch[i] = new Integer(repositoryIdToSearch[i]);
selectedRepositoryIdList.add(repositoryIdToSearch[i]);
}
digitalAssetVOList = SearchController.getLatestDigitalAssets(repositoryIdAsIntegerToSearch, assetTypeFilter, maxRows);
}
else
{
digitalAssetVOList = SearchController.getLatestDigitalAssets(new Integer[]{this.repositoryId}, assetTypeFilter, maxRows);
selectedRepositoryIdList.add("" + this.repositoryId);
}
return "successLatestInlineAssetsV3";
}
/**
* This method returns the advanced search interface to the user.
*/
public String doInput() throws Exception
{
if(CmsPropertyHandler.getInternalSearchEngine().equalsIgnoreCase("lucene"))
{
includeAssets = true;
allowCaseSensitive = false;
}
this.principals = UserControllerProxy.getController().getAllUsers();
this.availableLanguages = LanguageController.getController().getLanguageVOList(this.repositoryId);
this.contentTypeDefinitions = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList();
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), false);
selectedRepositoryIdList.add("" + this.repositoryId);
return Action.INPUT;
}
/**
* This method returns the binding search interface to the user.
*/
public String doInputBinding() throws Exception
{
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), false);
return Action.INPUT + "Binding";
}
/**
* This method returns the binding search interface to the user.
*/
public String doInputInlineAsset() throws Exception
{
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), false);
return Action.INPUT + "InlineAsset";
}
/**
* This method returns the binding search interface to the user.
*/
public String doInputInlineAssetV3() throws Exception
{
this.repositories = RepositoryController.getController().getAuthorizedRepositoryVOList(this.getInfoGluePrincipal(), false);
return Action.INPUT + "InlineAssetV3";
}
public ContentVO getContentVO(Integer contentId)
{
ContentVO contentVO = null;
try
{
if(contentId != null)
{
contentVO = ContentController.getContentController().getContentVOWithId(contentId);
}
}
catch(Exception e)
{
logger.error("An error occurred when we tried to get the content for this version:" + e.getMessage(), e);
}
return contentVO;
}
public LanguageVO getLanguageVO(Integer languageId)
{
LanguageVO languageVO = null;
try
{
if(languageId != null)
{
languageVO = LanguageController.getController().getLanguageVOWithId(languageId);
}
}
catch(Exception e)
{
logger.error("An error occurred when we tried to get the language for this version:" + e.getMessage(), e);
}
return languageVO;
}
public Integer getRepositoryId()
{
return repositoryId;
}
public void setRepositoryId(Integer integer)
{
repositoryId = integer;
}
public List getAvailableLanguages()
{
return availableLanguages;
}
public List getContentTypeDefinitions()
{
return contentTypeDefinitions;
}
public List getRepositories()
{
return repositories;
}
public List getPrincipals()
{
return principals;
}
/*
public String[] getContentVersionId()
{
return contentVersionId;
}
public void setContentVersionIds(String[] contentVersionId)
{
this.contentVersionId = contentVersionId;
}
*/
public String getReplaceString()
{
return replaceString;
}
public void setReplaceString(String replaceString)
{
this.replaceString = replaceString;
}
public Integer getCaseSensitive()
{
return caseSensitive;
}
public void setCaseSensitive(Integer caseSensitive)
{
this.caseSensitive = caseSensitive;
}
public Integer getContentTypeDefinitionId()
{
return contentTypeDefinitionId;
}
public void setContentTypeDefinitionId(Integer contentTypeDefinitionId)
{
this.contentTypeDefinitionId = contentTypeDefinitionId;
}
public Integer getInverseSearch()
{
return inverseSearch;
}
public void setInverseSearch(Integer inverseSearch)
{
this.inverseSearch = inverseSearch;
}
public Integer getLanguageId()
{
return languageId;
}
public void setLanguageId(Integer languageId)
{
this.languageId = languageId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getStateId()
{
return stateId;
}
public void setStateId(Integer stateId)
{
this.stateId = stateId;
}
public boolean isAdvancedEnabled()
{
return advancedEnabled;
}
public void setAdvancedEnabled(boolean advancedEnabled)
{
this.advancedEnabled = advancedEnabled;
}
public List getSelectedRepositoryIdList()
{
return selectedRepositoryIdList;
}
public void setAllowedContentTypeIds(String[] allowedContentTypeIds)
{
this.allowedContentTypeIds = allowedContentTypeIds;
}
public String getAllowedContentTypeIdsAsUrlEncodedString() throws Exception
{
StringBuffer sb = new StringBuffer();
for(int i=0; i<allowedContentTypeIds.length; i++)
{
if(i > 0)
sb.append("&");
sb.append("allowedContentTypeIds=" + URLEncoder.encode(allowedContentTypeIds[i], "UTF-8"));
}
return sb.toString();
}
public Set getContentVOSet()
{
return contentVOSet;
}
public String[] getAllowedContentTypeIds()
{
return allowedContentTypeIds;
}
public boolean getIncludeAssets()
{
return includeAssets;
}
public void setIncludeAssets(boolean includeAssets)
{
this.includeAssets = includeAssets;
}
public boolean getOnlyIDSearch()
{
return onlyIDSearch;
}
public void setOnlyIDSearch(boolean onlyIDSearch)
{
this.onlyIDSearch = onlyIDSearch;
}
public String getAssetTypeFilter()
{
return assetTypeFilter;
}
public void setAssetTypeFilter(String assetTypeFilter)
{
this.assetTypeFilter = assetTypeFilter;
}
public void setEnableInlineButtons(Boolean enableInlineButtons)
{
this.enableInlineButtons = enableInlineButtons;
}
public Boolean getEnableInlineButtons()
{
return enableInlineButtons;
}
public List<DigitalAssetVO> getDigitalAssetVOList()
{
return digitalAssetVOList;
}
public List<BaseEntityVO> getBaseEntityVOList()
{
return baseEntityVOList;
}
}