You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
8.7 KiB
233 lines
8.7 KiB
package com.fr.design.mainframe.alphafine.search.manager.impl; |
|
|
|
import com.fr.base.FRContext; |
|
import com.fr.base.extension.FileExtension; |
|
import com.fr.design.DesignerEnvManager; |
|
import com.fr.design.actions.help.alphafine.AlphaFineConstants; |
|
import com.fr.design.mainframe.alphafine.AlphaFineHelper; |
|
import com.fr.design.mainframe.alphafine.CellType; |
|
import com.fr.design.mainframe.alphafine.cell.model.FileModel; |
|
import com.fr.design.mainframe.alphafine.cell.model.MoreModel; |
|
import com.fr.design.mainframe.alphafine.model.SearchResult; |
|
import com.fr.design.mainframe.alphafine.search.SearchTextBean; |
|
import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; |
|
import com.fr.file.filetree.FileNode; |
|
import com.fr.file.filetree.FileNodes; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.json.JSONObject; |
|
import com.fr.rpc.ExceptionHandler; |
|
import com.fr.rpc.RPCInvokerExceptionInfo; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.stable.project.ProjectConstants; |
|
import com.fr.workspace.WorkContext; |
|
|
|
import java.util.List; |
|
|
|
|
|
/** |
|
* Created by XiaXiang on 2017/3/27. |
|
*/ |
|
public class FileSearchManager implements AlphaFineSearchProvider { |
|
private static final int MARK_LENGTH = 6; |
|
private static final String DS_NAME = "dsname=\""; |
|
private static final String FRM_PREFIX = "k:frm "; |
|
private static final String CPT_PREFIX = "k:cpt "; |
|
private static volatile FileSearchManager instance; |
|
private SearchResult filterModelList; |
|
private SearchResult lessModelList; |
|
private SearchResult defaultModelList; |
|
private SearchResult moreModelList; |
|
private String searchText; |
|
private FileNode[] fileNodes = null; |
|
private static final int DEFAULT_LIST_SIZE = 10; |
|
|
|
//停止搜索 |
|
//隐藏的搜索功能,可根据特殊的字符标记判断搜索分类 |
|
private boolean isContainCpt = true; |
|
private boolean isContainFrm = true; |
|
|
|
public static FileSearchManager getInstance() { |
|
if (instance == null) { |
|
synchronized (FileSearchManager.class) { |
|
if (instance == null) { |
|
instance = new FileSearchManager(); |
|
} |
|
} |
|
} |
|
return instance; |
|
} |
|
|
|
|
|
/** |
|
* 根据文件路径获取文件模型 |
|
* |
|
* @param object |
|
* @return |
|
*/ |
|
public static FileModel getModelFromCloud(JSONObject object) { |
|
String filePath = object.optString("filePath"); |
|
int searchCount = object.optInt("searchCount"); |
|
String name = AlphaFineHelper.findFileName(filePath); |
|
return new FileModel(name, filePath, searchCount); |
|
} |
|
|
|
|
|
public SearchResult getLessSearchResult(String searchStr, String[] searchText) { |
|
this.filterModelList = new SearchResult(); |
|
this.lessModelList = new SearchResult(); |
|
this.moreModelList = new SearchResult(); |
|
for (int j = 0; j < searchText.length; j++) { |
|
this.searchText = dealWithSearchText(searchText[j]); |
|
if (StringUtils.isBlank(this.searchText) || ComparatorUtils.equals(this.searchText, DS_NAME)) { |
|
lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates"))); |
|
return lessModelList; |
|
} |
|
AlphaFineHelper.checkCancel(); |
|
fileNodes = WorkContext.getCurrent().get(FileNodes.class, new ExceptionHandler() { |
|
@Override |
|
public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { |
|
return FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true); |
|
} |
|
}).list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true, false); |
|
isContainCpt = true; |
|
isContainFrm = true; |
|
doSearch(this.searchText); |
|
} |
|
doFileContentSearch(searchStr); |
|
|
|
if (filterModelList.isEmpty()) { |
|
return new SearchResult(); |
|
} else if (filterModelList.size() < AlphaFineConstants.SHOW_SIZE + 1) { |
|
lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates"))); |
|
lessModelList.addAll(filterModelList); |
|
} else { |
|
lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.FILE)); |
|
lessModelList.addAll(filterModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); |
|
moreModelList.addAll(filterModelList.subList(AlphaFineConstants.SHOW_SIZE, filterModelList.size())); |
|
|
|
} |
|
return lessModelList; |
|
} |
|
|
|
@Override |
|
public SearchResult getLessSearchResult(String[] searchText) { |
|
return null; |
|
} |
|
|
|
@Override |
|
public SearchResult getMoreSearchResult(String searchText) { |
|
return moreModelList; |
|
} |
|
|
|
@Override |
|
public SearchResult getSearchResult(SearchTextBean searchTextBean) { |
|
getLessSearchResult(searchTextBean.getSearchText(), searchTextBean.getSegmentation()); |
|
return filterModelList; |
|
} |
|
|
|
private void doSearch(String searchText) { |
|
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainTemplate()) { |
|
for (FileNode node : fileNodes) { |
|
String name = node.getName().toLowerCase(); |
|
name = name.replaceAll(StringUtils.BLANK, StringUtils.EMPTY); |
|
if (name.contains(searchText)) { |
|
FileModel model = new FileModel(node.getName(), node.getEnvPath()); |
|
if (!AlphaFineHelper.getFilterResult().contains(model) && !filterModelList.contains(model)) { |
|
AlphaFineHelper.checkCancel(); |
|
filterModelList.add(model); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
@Override |
|
public SearchResult getDefaultResult() { |
|
List<String> list = DesignerEnvManager.getEnvManager().getRecentOpenedFilePathList(); |
|
defaultModelList = new SearchResult(); |
|
for (int i = 0; i < Math.min(DEFAULT_LIST_SIZE, list.size()); i++) { |
|
String name = list.get(i).toLowerCase(); |
|
name = name.replaceAll(StringUtils.BLANK, StringUtils.EMPTY); |
|
FileModel model = new FileModel(name, name); |
|
defaultModelList.add(model); |
|
} |
|
return defaultModelList; |
|
} |
|
|
|
/** |
|
* 搜索模板内容 |
|
* |
|
* @param searchText |
|
*/ |
|
private void doFileContentSearch(String searchText) { |
|
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainFileContent()) { |
|
FileNode[] fileNodes = WorkContext.getCurrent().get(FileNodes.class, new ExceptionHandler() { |
|
@Override |
|
public Object callHandler(RPCInvokerExceptionInfo exceptionInfo) { |
|
return FRContext.getFileNodes().filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); |
|
} |
|
}).filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true, false); |
|
for (FileNode node : fileNodes) { |
|
FileModel model = new FileModel(node.getName(), node.getEnvPath()); |
|
if (!AlphaFineHelper.getFilterResult().contains(model) && !filterModelList.contains(model)) { |
|
AlphaFineHelper.checkCancel(); |
|
filterModelList.add(model); |
|
} |
|
} |
|
} |
|
} |
|
|
|
private String dealWithSearchText(String searchText) { |
|
if (searchText.startsWith(FRM_PREFIX)) { |
|
isContainCpt = false; |
|
searchText = searchText.substring(MARK_LENGTH); |
|
} else if (searchText.startsWith(CPT_PREFIX)) { |
|
isContainFrm = false; |
|
searchText = searchText.substring(MARK_LENGTH); |
|
} |
|
return searchText; |
|
} |
|
|
|
|
|
/** |
|
* 是否包含cpt |
|
* |
|
* @return |
|
*/ |
|
public boolean isContainCpt() { |
|
return isContainCpt; |
|
} |
|
|
|
public void setContainCpt(boolean containCpt) { |
|
isContainCpt = containCpt; |
|
} |
|
|
|
/** |
|
* 是否包含frm |
|
* |
|
* @return |
|
*/ |
|
public boolean isContainFrm() { |
|
return isContainFrm; |
|
} |
|
|
|
public void setContainFrm(boolean containFrm) { |
|
isContainFrm = containFrm; |
|
} |
|
|
|
public SearchResult getMoreModelList() { |
|
return moreModelList; |
|
} |
|
|
|
public void setMoreModelList(SearchResult moreModelList) { |
|
this.moreModelList = moreModelList; |
|
} |
|
|
|
public String getSearchText() { |
|
return searchText; |
|
} |
|
|
|
public void setSearchText(String searchText) { |
|
this.searchText = searchText; |
|
} |
|
}
|
|
|