📄 cmssearchmanager.java
字号:
// the current list of referred indexsources of the iterated index
List refsources;
while (itIndexes.hasNext()) {
idx = (CmsSearchIndex)itIndexes.next();
refsources = idx.getSources();
if (refsources != null) {
if (refsources.contains(indexsource)) {
referrers.add(idx);
}
}
}
if (referrers.size() > 0) {
throw new CmsIllegalStateException(Messages.get().container(
Messages.ERR_INDEX_SOURCE_DELETE_2,
indexsource.getName(),
referrers.toString()));
}
// remove operation (no exception)
return m_indexSources.remove(indexsource.getName()) != null;
}
/**
* Sets the name of the directory below WEB-INF/ where the search indexes are stored.<p>
*
* @param value the name of the directory below WEB-INF/ where the search indexes are stored
*/
public void setDirectory(String value) {
m_path = value;
}
/**
* Sets the highlighter.<p>
*
* A highlighter is a class implementing org.opencms.search.documents.I_TermHighlighter.<p>
*
* @param highlighter the package/class name of the highlighter
*/
public void setHighlighter(String highlighter) {
try {
m_highlighter = (I_CmsTermHighlighter)Class.forName(highlighter).newInstance();
} catch (Exception exc) {
m_highlighter = null;
}
}
/**
* Sets the seconds to wait for an index lock during an update operation.<p>
*
* @param value the seconds to wait for an index lock during an update operation
*/
public void setIndexLockMaxWaitSeconds(int value) {
m_indexLockMaxWaitSeconds = value;
}
/**
* Sets the max. excerpt length.<p>
*
* @param maxExcerptLength the max. excerpt length to set
*/
public void setMaxExcerptLength(String maxExcerptLength) {
try {
m_maxExcerptLength = Integer.parseInt(maxExcerptLength);
} catch (Exception e) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_PARSE_EXCERPT_LENGTH_FAILED_1, maxExcerptLength), e);
m_maxExcerptLength = 1024;
}
}
/**
* Sets the result cache size.<p>
*
* @param value the result cache size
*/
public void setResultCacheSize(String value) {
m_resultCacheSize = value;
}
/**
* Sets the timeout to abandon threads indexing a resource.<p>
*
* @param value the timeout in milliseconds
*/
public void setTimeout(String value) {
m_timeout = value;
}
/**
* Checks is a given index is locked, if so waits for a numer of seconds and checks again,
* until either the index is unlocked or a limit of seconds set by <code>{@link #setIndexLockMaxWaitSeconds(int)}</code>
* is reached.<p>
*
* @param index the index to check the lock for
* @param report the report to write error messages on
*
* @return <code>true</code> if the index is locked
*/
protected boolean checkIndexLock(CmsSearchIndex index, I_CmsReport report) {
File indexPath = new File(index.getPath());
// check if the target index path already exists
if (!indexPath.exists()) {
// if the folder does not yet exist it is also not locked
return false;
}
// check if the index is locked
boolean indexLocked = true;
try {
int lockSecs = 0;
while (indexLocked && (lockSecs < m_indexLockMaxWaitSeconds)) {
indexLocked = IndexReader.isLocked(index.getPath());
if (indexLocked) {
// index is still locked, wait one second
report.println(Messages.get().container(
Messages.RPT_SEARCH_INDEXING_LOCK_WAIT_2,
index.getName(),
new Integer(m_indexLockMaxWaitSeconds - lockSecs)), I_CmsReport.FORMAT_ERROR);
// sleep one second
Thread.sleep(1000);
lockSecs++;
}
}
} catch (Exception e) {
LOG.error(Messages.get().getBundle().key(
Messages.LOG_IO_INDEX_READER_OPEN_2,
index.getPath(),
index.getName()), e);
}
return indexLocked;
}
/**
* Returns an analyzer for the given language.<p>
* The analyzer is selected according to the analyzer configuration.
*
* @param locale a language id, i.e. de, en, it
* @return the appropriate lucene analyzer
* @throws CmsIndexException if something goes wrong
*/
protected Analyzer getAnalyzer(String locale) throws CmsIndexException {
Analyzer analyzer = null;
String className = null;
CmsSearchAnalyzer analyzerConf = (CmsSearchAnalyzer)m_analyzers.get(locale);
if (analyzerConf == null) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_ANALYZER_NOT_FOUND_1, locale));
}
try {
className = analyzerConf.getClassName();
Class analyzerClass = Class.forName(className);
// added param for snowball analyzer
String stemmerAlgorithm = analyzerConf.getStemmerAlgorithm();
if (stemmerAlgorithm != null) {
analyzer = (Analyzer)analyzerClass.getDeclaredConstructor(new Class[] {String.class}).newInstance(
new Object[] {stemmerAlgorithm});
} else {
analyzer = (Analyzer)analyzerClass.newInstance();
}
} catch (Exception e) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_LOAD_ANALYZER_1, className), e);
}
return analyzer;
}
/**
* Returns a lucene document factory for given resource.<p>
* The type of the document factory is selected by the type of the resource
* and the mimetype of the resource content according to the documenttype configuration.
*
* @param resource a cms resource
* @return a lucene document factory or null
*/
protected I_CmsDocumentFactory getDocumentFactory(A_CmsIndexResource resource) {
String documentTypeKey = resource.getDocumentKey(true);
I_CmsDocumentFactory factory = (I_CmsDocumentFactory)m_documentTypes.get(documentTypeKey);
if (factory == null) {
factory = (I_CmsDocumentFactory)m_documentTypes.get(resource.getDocumentKey(false));
}
return factory;
}
/**
* Returns the set of names of all configured documenttypes.<p>
*
* @return the set of names of all configured documenttypes
*/
protected List getDocumentTypes() {
List names = new ArrayList();
for (Iterator i = m_documentTypes.values().iterator(); i.hasNext();) {
I_CmsDocumentFactory factory = (I_CmsDocumentFactory)i.next();
names.add(factory.getName());
}
return names;
}
/**
* Returns the common cache for buffering search results.<p>
*
* @return the cache
*/
protected Map getResultCache() {
return m_resultCache;
}
/**
* Initializes the available Cms resource types to be indexed.<p>
*
* A map stores document factories keyed by a string representing
* a colon separated list of Cms resource types and/or mimetypes.<p>
*
* The keys of this map are used to trigger a document factory to convert
* a Cms resource into a Lucene index document.<p>
*
* A document factory is a class implementing the interface
* {@link org.opencms.search.documents.I_CmsDocumentFactory}.<p>
*/
protected void initAvailableDocumentTypes() {
CmsSearchDocumentType documenttype = null;
String className = null;
String name = null;
I_CmsDocumentFactory documentFactory = null;
List resourceTypes = null;
List mimeTypes = null;
Class c = null;
m_documentTypes = new HashMap();
List keys = new ArrayList(m_documentTypeConfigs.keySet());
for (int i = 0, n = keys.size(); i < n; i++) {
documenttype = (CmsSearchDocumentType)(m_documentTypeConfigs.get(keys.get(i)));
name = documenttype.getName();
try {
className = documenttype.getClassName();
resourceTypes = documenttype.getResourceTypes();
mimeTypes = documenttype.getMimeTypes();
if (name == null) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_DOCTYPE_NO_NAME_0));
}
if (className == null) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_DOCTYPE_NO_CLASS_DEF_0));
}
if (resourceTypes.size() == 0) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_DOCTYPE_NO_RESOURCETYPE_DEF_0));
}
try {
c = Class.forName(className);
documentFactory = (I_CmsDocumentFactory)c.getConstructor(new Class[] {String.class}).newInstance(
new Object[] {name});
} catch (ClassNotFoundException exc) {
throw new CmsIndexException(
Messages.get().container(Messages.ERR_DOCCLASS_NOT_FOUND_1, className),
exc);
} catch (Exception exc) {
throw new CmsIndexException(Messages.get().container(Messages.ERR_DOCCLASS_INIT_1, className), exc);
}
for (Iterator key = documentFactory.getDocumentKeys(resourceTypes, mimeTypes).iterator(); key.hasNext();) {
m_documentTypes.put(key.next(), documentFactory);
}
} catch (CmsException e) {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_DOCTYPE_CONFIG_FAILED_1, name), e);
}
}
}
}
/**
* Initializes the configured search indexes.<p>
*
* This initializes also the list of Cms resources types
* to be indexed by an index source.<p>
*/
protected void initSearchIndexes() {
CmsSearchIndex index = null;
for (int i = 0, n = m_indexes.size(); i < n; i++) {
index = (CmsSearchIndex)m_indexes.get(i);
// reset disabled flag
index.setEnabled(true);
// check if the index has been configured correctly
if (index.checkConfiguration(m_adminCms)) {
// the index is configured correctly
try {
index.initialize();
} catch (CmsException e) {
// in this case the index will be disabled
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_SEARCH_INIT_FAILED_1,
index.getName()), e);
}
}
}
if (CmsLog.INIT.isInfoEnabled()) {
// output a log message if the index was successfully configured or not
if (index.isEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_INDEX_CONFIGURED_2,
index.getName(),
index.getProject()));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_INDEX_NOT_CONFIGURED_2,
index.getName(),
index.getProject()));
}
}
}
}
/**
* Incrementally updates all indexes that have their rebuild mode set to <code>"auto"</code>
* after resources have been published.<p>
*
* @param adminCms an OpenCms user context with Admin permissions
* @param publishHistoryId the history ID of the published project
* @param report the report to write the output to
*/
protected synchronized void updateAllIndexes(CmsObject adminCms, CmsUUID publishHistoryId, I_CmsReport report) {
List publishedResources;
try {
// read the list of all published resources
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -