📄 cmssearchmanager.java
字号:
}
}
return null;
}
/**
* Returns the seconds to wait for an index lock during an update operation.<p>
*
* @return the seconds to wait for an index lock during an update operation
*/
public int getIndexLockMaxWaitSeconds() {
return m_indexLockMaxWaitSeconds;
}
/**
* Returns the names of all configured indexes.<p>
*
* @return list of names
*/
public List getIndexNames() {
List indexNames = new ArrayList();
for (int i = 0, n = m_indexes.size(); i < n; i++) {
indexNames.add(((CmsSearchIndex)m_indexes.get(i)).getName());
}
return indexNames;
}
/**
* Returns a search index source for a specified source name.<p>
*
* @param sourceName the name of the index source
* @return a search index source
*/
public CmsSearchIndexSource getIndexSource(String sourceName) {
return (CmsSearchIndexSource)m_indexSources.get(sourceName);
}
/**
* Returns the max. excerpt length.<p>
*
* @return the max excerpt length
*/
public int getMaxExcerptLength() {
return m_maxExcerptLength;
}
/**
* Returns the result cache size.<p>
*
* @return the result cache size
*/
public String getResultCacheSize() {
return m_resultCacheSize;
}
/**
* Returns an unmodifiable list of all configured <code>{@link CmsSearchIndex}</code> instances.<p>
*
* @return an unmodifiable list of all configured <code>{@link CmsSearchIndex}</code> instances
*/
public List getSearchIndexes() {
return Collections.unmodifiableList(m_indexes);
}
/**
* Returns an unmodifiable view (read-only) of the SearchIndexSources Map.<p>
*
* @return an unmodifiable view (read-only) of the SearchIndexSources Map
*/
public Map getSearchIndexSources() {
return Collections.unmodifiableMap(m_indexSources);
}
/**
* Returns the timeout to abandon threads indexing a resource.<p>
*
* @return the timeout to abandon threads indexing a resource
*/
public String getTimeout() {
return m_timeout;
}
/**
* Initializes the search manager.<p>
*
* @param cms the cms object
*
* @throws CmsRoleViolationException in case the given opencms object does not have <code>{@link CmsRole#SEARCH_MANAGER}</code> permissions
*/
public void initialize(CmsObject cms) throws CmsRoleViolationException {
cms.checkRole(CmsRole.SEARCH_MANAGER);
try {
// store the Admin cms to index Cms resources
m_adminCms = OpenCms.initCmsObject(cms);
} catch (CmsException e) {
// this should never happen
}
// make sure the site root is the root site
m_adminCms.getRequestContext().setSiteRoot("/");
// init. the search result cache
LRUMap hashMap = new LRUMap(Integer.parseInt(m_resultCacheSize));
m_resultCache = Collections.synchronizedMap(hashMap);
if (OpenCms.getMemoryMonitor().enabled()) {
OpenCms.getMemoryMonitor().register(getClass().getName() + ".m_resultCache", hashMap);
}
initializeIndexes();
// register the modified default similarity implementation
Similarity.setDefault(new CmsSearchSimilarity());
// register this object as event listener
OpenCms.addCmsEventListener(this, new int[] {
I_CmsEventListener.EVENT_CLEAR_CACHES,
I_CmsEventListener.EVENT_PUBLISH_PROJECT});
}
/**
* Initializes all configured document types and search indexes.<p>
*
* This methods needs to be called if after a change in the index configuration has been made.
*/
public void initializeIndexes() {
initAvailableDocumentTypes();
initSearchIndexes();
}
/**
* Updates the indexes from as a scheduled job.<p>
*
* @param cms the OpenCms user context to use when reading resources from the VFS
* @param parameters the parameters for the scheduled job
*
* @throws Exception if something goes wrong
*
* @return the String to write in the scheduler log
*
* @see org.opencms.scheduler.I_CmsScheduledJob#launch(org.opencms.file.CmsObject, java.util.Map)
*/
public final String launch(CmsObject cms, Map parameters) throws Exception {
CmsSearchManager manager = OpenCms.getSearchManager();
I_CmsReport report = null;
boolean writeLog = Boolean.valueOf((String)parameters.get(JOB_PARAM_WRITELOG)).booleanValue();
if (writeLog) {
report = new CmsLogReport(cms.getRequestContext().getLocale(), CmsSearchManager.class);
}
List updateList = null;
String indexList = (String)parameters.get(JOB_PARAM_INDEXLIST);
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(indexList)) {
// index list has been provided as job parameter
updateList = new ArrayList();
String[] indexNames = CmsStringUtil.splitAsArray(indexList, '|');
for (int i = 0; i < indexNames.length; i++) {
// check if the index actually exists
if (manager.getIndex(indexNames[i]) != null) {
updateList.add(indexNames[i]);
} else {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_NO_INDEX_WITH_NAME_1, indexNames[i]));
}
}
}
}
long startTime = System.currentTimeMillis();
if (updateList == null) {
// all indexes need to be updated
manager.rebuildAllIndexes(report);
} else {
// rebuild only the selected indexes
manager.rebuildIndexes(updateList, report);
}
long runTime = System.currentTimeMillis() - startTime;
String finishMessage = Messages.get().getBundle().key(
Messages.LOG_REBUILD_INDEXES_FINISHED_1,
CmsStringUtil.formatRuntime(runTime));
if (LOG.isInfoEnabled()) {
LOG.info(finishMessage);
}
return finishMessage;
}
/**
* Rebuilds (if required creates) all configured indexes.<p>
*
* @param report the report object to write messages (or <code>null</code>)
*
* @throws CmsException if something goes wrong
*/
public void rebuildAllIndexes(I_CmsReport report) throws CmsException {
rebuildAllIndexes(report, false);
}
/**
* Rebuilds (if required creates) all configured indexes.<p>
*
* @param report the report object to write messages (or <code>null</code>)
* @param wait signals to wait until all the indexing threads are finished
*
* @throws CmsException if something goes wrong
*/
public void rebuildAllIndexes(I_CmsReport report, boolean wait) throws CmsException {
CmsMessageContainer container = null;
for (int i = 0, n = m_indexes.size(); i < n; i++) {
// iterate all configured seach indexes
CmsSearchIndex searchIndex = (CmsSearchIndex)m_indexes.get(i);
try {
// update the index
updateIndex(searchIndex, report, wait, null, null);
} catch (CmsException e) {
container = new CmsMessageContainer(
Messages.get(),
Messages.ERR_INDEX_REBUILD_ALL_1,
new Object[] {searchIndex.getName()});
LOG.error(Messages.get().getBundle().key(Messages.ERR_INDEX_REBUILD_ALL_1, searchIndex.getName()), e);
}
}
if (container != null) {
// throw stored exception
throw new CmsSearchException(container);
}
}
/**
* Rebuilds (if required creates) the index with the given name.<p>
*
* @param indexName the name of the index to rebuild
* @param report the report object to write messages (or <code>null</code>)
*
* @throws CmsException if something goes wrong
*/
public void rebuildIndex(String indexName, I_CmsReport report) throws CmsException {
// get the search index by name
CmsSearchIndex index = getIndex(indexName);
// update the index
updateIndex(index, report, false, null, null);
}
/**
* Rebuilds (if required creates) the List of indexes with the given name.<p>
*
* @param indexNames the names (String) of the index to rebuild
* @param report the report object to write messages (or <code>null</code>)
*
* @throws CmsException if something goes wrong
*/
public void rebuildIndexes(List indexNames, I_CmsReport report) throws CmsException {
Iterator i = indexNames.iterator();
while (i.hasNext()) {
String indexName = (String)i.next();
// get the search index by name
CmsSearchIndex index = getIndex(indexName);
if (index != null) {
// update the index
updateIndex(index, report, false, null, null);
} else {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_NO_INDEX_WITH_NAME_1, indexName));
}
}
}
}
/**
* Removes a search index from the configuration.<p>
*
* @param searchIndex the search index to remove
*/
public void removeSearchIndex(CmsSearchIndex searchIndex) {
m_indexes.remove(searchIndex);
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_REMOVE_SEARCH_INDEX_2,
searchIndex.getName(),
searchIndex.getProject()));
}
}
/**
* Removes all indexes included in the given list (which must contain the name of an index to remove).<p>
*
* @param indexNames the names of the index to remove
*/
public void removeSearchIndexes(List indexNames) {
Iterator i = indexNames.iterator();
while (i.hasNext()) {
String indexName = (String)i.next();
// get the search index by name
CmsSearchIndex index = getIndex(indexName);
if (index != null) {
// remove the index
removeSearchIndex(index);
} else {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_NO_INDEX_WITH_NAME_1, indexName));
}
}
}
}
/**
* Removes this indexsource from the OpenCms configuration (if it is not used any more).<p>
*
*
*
* @param indexsource the indexsource to remove from the configuration
*
* @return true if remove was successful, false if preconditions for removal are ok but the given
* searchindex was unknown to the manager.
*
* @throws CmsIllegalStateException if the given indexsource is still used by at least one
* <code>{@link CmsSearchIndex}</code>.
*
*/
public boolean removeSearchIndexSource(CmsSearchIndexSource indexsource) throws CmsIllegalStateException {
// validation if removal will be granted
Iterator itIndexes = m_indexes.iterator();
CmsSearchIndex idx;
// the list for collecting indexes that use the given indexdsource
List referrers = new LinkedList();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -