/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (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 GmbH, 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.setup.xml.v8;
import org.opencms.configuration.CmsConfigurationManager;
import org.opencms.configuration.CmsSearchConfiguration;
import org.opencms.configuration.I_CmsXmlConfiguration;
import org.opencms.search.CmsVfsIndexer;
import org.opencms.search.fields.CmsSearchField;
import org.opencms.search.fields.CmsSearchFieldConfiguration;
import org.opencms.search.fields.CmsSearchFieldMapping;
import org.opencms.search.galleries.CmsGallerySearchAnalyzer;
import org.opencms.search.galleries.CmsGallerySearchFieldConfiguration;
import org.opencms.search.galleries.CmsGallerySearchFieldMapping;
import org.opencms.search.galleries.CmsGallerySearchIndex;
import org.opencms.setup.xml.A_CmsXmlSearch;
import org.opencms.setup.xml.CmsSetupXmlHelper;
import org.opencms.setup.xml.CmsXmlUpdateAction;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* Adds the gallery search nodes.<p>
*
* @since 8.0.0
*/
public class CmsXmlAddADESearch extends A_CmsXmlSearch {
/**
* Action to add the gallery modules index source.<p>
*/
public static class CmsAddGalleryModuleIndexSourceAction extends CmsXmlUpdateAction {
/**
* @see org.opencms.setup.xml.CmsXmlUpdateAction#executeUpdate(org.dom4j.Document, java.lang.String, boolean)
*/
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Element node = (Element)doc.selectSingleNode("/opencms/search/indexsources");
if (!node.selectNodes("indexsource[name='gallery_modules_source']").isEmpty()) {
return false;
}
String galleryModulesSource = " <indexsource>\n"
+ " <name>gallery_modules_source</name>\n"
+ " <indexer class=\"org.opencms.search.CmsVfsIndexer\" />\n"
+ " <resources>\n"
+ " <resource>/system/modules/</resource>\n"
+ " </resources>\n"
+ " <documenttypes-indexed>\n"
+ " <name>xmlcontent-galleries</name>\n"
+ " </documenttypes-indexed> \n"
+ " </indexsource> \n";
try {
Element sourceElem = createElementFromXml(galleryModulesSource);
node.add(sourceElem);
return true;
} catch (DocumentException e) {
System.err.println("Failed to add gallery_modules_source");
return false;
}
}
}
/**
* An XML update action which adds the /system/galleries folder to the gallery index source.
*/
public static class CmsAddIndexSourceResourceAction extends CmsXmlUpdateAction {
/**
* @see org.opencms.setup.xml.CmsXmlUpdateAction#executeUpdate(org.dom4j.Document, java.lang.String, boolean)
*/
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
if (!forReal) {
CmsSetupXmlHelper.setValue(
doc,
"/opencms/search/indexsources/indexsource[name='gallery_source']/resources/resource[text()='/system/galleries/']",
"/system/galleries/");
return true;
}
Element indexSourceResources = (Element)doc.selectSingleNode("/opencms/search/indexsources/indexsource[name='gallery_source']/resources");
if (indexSourceResources == null) {
return false;
}
Element source = (Element)indexSourceResources.selectSingleNode("resource[text()='/system/galleries/']");
if (source != null) {
return false;
}
Element resourceElement = indexSourceResources.addElement("resource");
resourceElement.addText("/system/galleries/");
return true;
}
}
/**
* Action for updating the office document types in the index sources.<p>
*/
public static final class CmsIndexSourceTypeUpdateAction extends CmsXmlUpdateAction {
/**
* @see org.opencms.setup.xml.CmsXmlUpdateAction#executeUpdate(org.dom4j.Document, java.lang.String, boolean)
*/
@SuppressWarnings("unchecked")
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
List<Node> nodes = doc.selectNodes("/opencms/search/indexsources/indexsource");
boolean result = false;
for (Node node : nodes) {
if (containsOldType(node)) {
result = true;
removeTypes(node);
addNewTypes(node);
}
}
return result;
}
/**
* Adds new office document types.<p>
*
* @param node the node to add the document types to
*/
protected void addNewTypes(Node node) {
Element element = (Element)(node.selectSingleNode("documenttypes-indexed"));
for (String type : new String[] {"openoffice", "msoffice-ole2", "msoffice-ooxml"}) {
element.addElement("name").addText(type);
}
}
/**
* Checks whether a node contains the old office document types.<p>
*
* @param node the node which should be checked
*
* @return true if the node contains old office document types
*/
protected boolean containsOldType(Node node) {
@SuppressWarnings("unchecked")
List<Node> nodes = node.selectNodes("documenttypes-indexed/name[text()='msword' or text()='msexcel' or text()='mspowerpoint']");
return !nodes.isEmpty();
}
/**
* Removes the office document types from a node.<p>
*
* @param node the node from which to remove the document types
*/
protected void removeTypes(Node node) {
@SuppressWarnings("unchecked")
List<Node> nodes = node.selectNodes("documenttypes-indexed/name[text()='msword' or text()='msexcel' or text()='mspowerpoint' or text()='msoffice-ooxml' or text()='openoffice' or text()='msoffice-ole2']");
for (Node nodeToRemove : nodes) {
nodeToRemove.detach();
}
}
}
/**
* An XML update action which replaces an element given by an XPath with some other XML element.
*/
class ElementReplaceAction extends CmsXmlUpdateAction {
/**
* The XML which should be used as a replacement (as a string).
*/
private String m_replacementXml;
/**
* The xpath of the element to replace.
*/
private String m_xpath;
/**
* Creates a new instance.<p>
*
* @param xpath the xpath of the element to replace
* @param replacementXml the replacement xml
*/
public ElementReplaceAction(String xpath, String replacementXml) {
m_xpath = xpath;
m_replacementXml = replacementXml;
}
/**
* @see org.opencms.setup.xml.CmsXmlUpdateAction#executeUpdate(org.dom4j.Document, java.lang.String, boolean)
*/
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
if (!forReal) {
return true;
}
Node node = doc.selectSingleNode(m_xpath);
if (node != null) {
Element parent = node.getParent();
node.detach();
try {
Element element = createElementFromXml(m_replacementXml);
parent.add(element);
return true;
} catch (DocumentException e) {
e.printStackTrace(System.out);
return false;
}
} else {
return false;
}
}
}
/** A map from xpaths to XML update actions.<p> */
private Map<String, CmsXmlUpdateAction> m_actions;
/**
* Creates a dom4j element from an XML string.<p>
*
* @param xml the xml string
* @return the dom4j element
*
* @throws DocumentException if the XML parsing fails
*/
public static org.dom4j.Element createElementFromXml(String xml) throws DocumentException {
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(xml));
return newNodeDocument.getRootElement();
}
/**
* @see org.opencms.setup.xml.I_CmsSetupXmlUpdate#getName()
*/
public String getName() {
return "Add the ADE containerpage and gallery search nodes";
}
/**
* @see org.opencms.setup.xml.A_CmsSetupXmlUpdate#executeUpdate(org.dom4j.Document, java.lang.String, boolean)
*/
@Override
protected boolean executeUpdate(Document document, String xpath, boolean forReal) {
CmsXmlUpdateAction action = m_actions.get(xpath);
if (action == null) {
return false;
}
return action.executeUpdate(document, xpath, forReal);
}
/**
* @see org.opencms.setup.xml.A_CmsSetupXmlUpdate#getCommonPath()
*/
@Override
protected String getCommonPath() {
// /opencms/search
return new StringBuffer("/").append(CmsConfigurationManager.N_ROOT).append("/").append(
CmsSearchConfiguration.N_SEARCH).toString();
}
/**
* @see org.opencms.setup.xml.A_CmsSetupXmlUpdate#getXPathsToUpdate()
*/
@Override
protected List<String> getXPathsToUpdate() {
if (m_actions == null) {
initActions();
}
return new ArrayList<String>(m_actions.keySet());
}
/**
* Builds the xpath for the documenttypes node.<p>
*
* @return the xpath for the documenttypes node
*/
private String buildXpathForDoctypes() {
return getCommonPath() + "/" + CmsSearchConfiguration.N_DOCUMENTTYPES;
}
/**
* Builds an xpath for a document type node in an index source.<p>
*
* @param source the name of the index source
* @param doctype the document type
*
* @return the xpath
*/
private String buildXpathForIndexedDocumentType(String source, String doctype) {
StringBuffer xp = new StringBuffer(256);
xp.append(getCommonPath());
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEXSOURCES);
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEXSOURCE);
xp.append("[");
xp.append(I_CmsXmlConfiguration.N_NAME);
xp.append("='" + source + "']");
xp.append("/");
xp.append(CmsSearchConfiguration.N_DOCUMENTTYPES_INDEXED);
xp.append("/");
xp.append(I_CmsXmlConfiguration.N_NAME);
xp.append("[text()='" + doctype + "']");
return xp.toString();
}
/**
* Creates an action which adds an indexed type to an index source.<p>
*
* @param type the type which should be indexed
*
* @return the update action
*/
private CmsXmlUpdateAction createIndexedTypeAction(final String type) {
return new CmsXmlUpdateAction() {
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Node node = doc.selectSingleNode(xpath);
if (node != null) {
return false;
}
CmsSetupXmlHelper.setValue(doc, xpath + "/text()", type);
return true;
}
};
}
/**
* Initializes the map of XML update actions.<p>
*/
private void initActions() {
m_actions = new LinkedHashMap<String, CmsXmlUpdateAction>();
StringBuffer xp;
CmsXmlUpdateAction action0 = new CmsXmlUpdateAction() {
@SuppressWarnings("unchecked")
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Node node = doc.selectSingleNode(xpath);
org.dom4j.Element parent = node.getParent();
int position = parent.indexOf(node);
parent.remove(node);
try {
parent.elements().add(
position,
createElementFromXml(" <documenttypes> \n"
+ " <documenttype>\n"
+ " <name>generic</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentGeneric</class>\n"
+ " <mimetypes/>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>*</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>html</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentHtml</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>text/html</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype>\n"
+ " <documenttype>\n"
+ " <name>image</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentGeneric</class>\n"
+ " <mimetypes/>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>image</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>jsp</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentPlainText</class>\n"
+ " <mimetypes/>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>jsp</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>pdf</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentPdf</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>application/pdf</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>binary</resourcetype>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype>\n"
+ " <documenttype>\n"
+ " <name>rtf</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentRtf</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>text/rtf</mimetype>\n"
+ " <mimetype>application/rtf</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>binary</resourcetype>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>text</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentPlainText</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>text/html</mimetype>\n"
+ " <mimetype>text/plain</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>xmlcontent</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentXmlContent</class>\n"
+ " <mimetypes/>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>*</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype>\n"
+ " <documenttype>\n"
+ " <name>containerpage</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentContainerPage</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>text/html</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>containerpage</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>xmlpage</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentXmlPage</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>text/html</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>xmlpage</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype>\n"
+ " <documenttype>\n"
+ " <name>xmlcontent-galleries</name>\n"
+ " <class>org.opencms.search.galleries.CmsGalleryDocumentXmlContent</class>\n"
+ " <mimetypes/>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>xmlcontent-galleries</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>xmlpage-galleries</name>\n"
+ " <class>org.opencms.search.galleries.CmsGalleryDocumentXmlPage</class>\n"
+ " <mimetypes />\n"
+ " <resourcetypes>\n"
+ " <resourcetype>xmlpage-galleries</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>msoffice-ole2</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentMsOfficeOLE2</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>application/vnd.ms-powerpoint</mimetype>\n"
+ " <mimetype>application/msword</mimetype> \n"
+ " <mimetype>application/vnd.ms-excel</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>binary</resourcetype>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>msoffice-ooxml</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentMsOfficeOOXML</class>\n"
+ " <mimetypes> \n"
+ " <mimetype>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mimetype>\n"
+ " <mimetype>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mimetype>\n"
+ " <mimetype>application/vnd.openxmlformats-officedocument.presentationml.presentation</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>binary</resourcetype>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype> \n"
+ " <documenttype>\n"
+ " <name>openoffice</name>\n"
+ " <class>org.opencms.search.documents.CmsDocumentOpenOffice</class>\n"
+ " <mimetypes>\n"
+ " <mimetype>application/vnd.oasis.opendocument.text</mimetype>\n"
+ " <mimetype>application/vnd.oasis.opendocument.spreadsheet</mimetype>\n"
+ " </mimetypes>\n"
+ " <resourcetypes>\n"
+ " <resourcetype>binary</resourcetype>\n"
+ " <resourcetype>plain</resourcetype>\n"
+ " </resourcetypes>\n"
+ " </documenttype>\n"
+ " </documenttypes>\n"));
} catch (DocumentException e) {
System.out.println("failed to update document types.");
}
return true;
}
};
m_actions.put(buildXpathForDoctypes(), action0);
//
//=============================================================================================================
//
CmsXmlUpdateAction action1 = new CmsXmlUpdateAction() {
@SuppressWarnings("synthetic-access")
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Node node = doc.selectSingleNode(xpath);
if (node == null) {
createAnalyzer(doc, xpath, CmsGallerySearchAnalyzer.class, "all");
return true;
}
return false;
}
};
xp = new StringBuffer(256);
xp.append(getCommonPath());
xp.append("/");
xp.append(CmsSearchConfiguration.N_ANALYZERS);
xp.append("/");
xp.append(CmsSearchConfiguration.N_ANALYZER);
xp.append("[");
xp.append(CmsSearchConfiguration.N_CLASS);
xp.append("='").append(CmsGallerySearchAnalyzer.class.getName()).append("']");
m_actions.put(xp.toString(), action1);
//
//=============================================================================================================
//
CmsXmlUpdateAction action2 = new CmsXmlUpdateAction() {
@SuppressWarnings("synthetic-access")
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Node node = doc.selectSingleNode(xpath);
if (node != null) {
node.detach();
}
createIndex(
doc,
xpath,
CmsGallerySearchIndex.class,
CmsGallerySearchIndex.GALLERY_INDEX_NAME,
"offline",
"Offline",
"all",
"gallery_fields",
new String[] {"gallery_source", "gallery_modules_source"});
return true;
}
};
xp = new StringBuffer(256);
xp.append(getCommonPath());
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEXES);
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEX);
xp.append("[");
xp.append(I_CmsXmlConfiguration.N_NAME);
xp.append("='").append(CmsGallerySearchIndex.GALLERY_INDEX_NAME).append("']");
m_actions.put(xp.toString(), action2);
//
//=============================================================================================================
//
CmsXmlUpdateAction action3 = new CmsXmlUpdateAction() {
@SuppressWarnings("synthetic-access")
@Override
public boolean executeUpdate(Document doc, String xpath, boolean forReal) {
Node node = doc.selectSingleNode(xpath);
if (node != null) {
return false;
}
// create doc type
createIndexSource(doc, xpath, "gallery_source", CmsVfsIndexer.class, new String[] {
"/sites/",
"/shared/",
"/system/galleries/"}, new String[] {
"xmlpage-galleries",
"xmlcontent-galleries",
"jsp",
"text",
"pdf",
"rtf",
"html",
"image",
"generic",
"openoffice",
"msoffice-ole2",
"msoffice-ooxml"});
return true;
}
};
xp = new StringBuffer(256);
xp.append(getCommonPath());
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEXSOURCES);
xp.append("/");
xp.append(CmsSearchConfiguration.N_INDEXSOURCE);
xp.append("[");
xp.append(I_CmsXmlConfiguration.N_NAME);
xp.append("='gallery_source']");
m_actions.put(xp.toString(), action3);
//
//=============================================================================================================
//
CmsXmlUpdateAction action4 = new CmsXmlUpdateAction() {
@Override
public boolean executeUpdate(Document document, String xpath, boolean forReal) {
Node node = document.selectSingleNode(xpath);
if (node != null) {
node.detach();
}
// create field config
CmsSearchFieldConfiguration fieldConf = new CmsSearchFieldConfiguration();
fieldConf.setName("gallery_fields");
fieldConf.setDescription("The standard OpenCms search index field configuration.");
CmsSearchField field = new CmsSearchField();
// <field name="content" store="compress" index="true" excerpt="true">
field.setName("content");
field.setStored("compress");
field.setIndexed("true");
field.setInExcerpt("true");
field.setDisplayNameForConfiguration("%(key.field.content)");
// <mapping type="content" />
CmsSearchFieldMapping mapping = new CmsSearchFieldMapping();
mapping.setType("content");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="title-key" store="true" index="untokenized" boost="0.0">
field = new CmsSearchField();
field.setName("title-key");
field.setStored("true");
field.setIndexed("untokenized");
field.setBoost("0.0");
// <mapping type="property">Title</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("property");
mapping.setParam("Title");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="title" store="false" index="true">
field = new CmsSearchField();
field.setName("title");
field.setStored("false");
field.setIndexed("true");
field.setDisplayNameForConfiguration("%(key.field.title)");
// <mapping type="property">Title</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("property");
mapping.setParam("Title");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="description" store="true" index="true">
field = new CmsSearchField();
field.setName("description");
field.setStored("true");
field.setIndexed("true");
field.setDisplayNameForConfiguration("%(key.field.description)");
// <mapping type="property">Description</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("property");
mapping.setParam("Description");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="meta" store="false" index="true">
field = new CmsSearchField();
field.setName("meta");
field.setStored("false");
field.setIndexed("true");
// <mapping type="property">Title</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("property");
mapping.setParam("Title");
field.addMapping(mapping);
// <mapping type="property">Description</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("property");
mapping.setParam("Description");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_dateExpired" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_dateExpired");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">dateExpired</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("dateExpired");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_dateReleased" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_dateReleased");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">dateReleased</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("dateReleased");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_length" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_length");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">length</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("length");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_state" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_state");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">state</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("state");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_structureId" store="true" index="false">
field = new CmsSearchField();
field.setName("res_structureId");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">structureId</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("structureId");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_userCreated" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_userCreated");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">userCreated</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("userCreated");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_userLastModified" store="true" index="untokenized">
field = new CmsSearchField();
field.setName("res_userLastModified");
field.setStored("true");
field.setIndexed("untokenized");
// <mapping type="attribute">userLastModified</mapping>
mapping = new CmsSearchFieldMapping();
mapping.setType("attribute");
mapping.setParam("userLastModified");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="res_locales" store="true" index="true" analyzer="WhitespaceAnalyzer">
field = new CmsSearchField();
field.setName("res_locales");
field.setStored("true");
field.setIndexed("true");
try {
field.setAnalyzer("WhitespaceAnalyzer");
} catch (Exception e) {
// ignore
e.printStackTrace();
}
// <mapping type="dynamic" class="org.opencms.search.galleries.CmsGallerySearchFieldMapping">res_locales</mapping>
mapping = new CmsGallerySearchFieldMapping();
mapping.setType("dynamic");
mapping.setParam("res_locales");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="additional_info" store="true" index="false">
field = new CmsSearchField();
field.setName("additional_info");
field.setStored("true");
field.setIndexed("false");
// <mapping type="dynamic" class="org.opencms.search.galleries.CmsGallerySearchFieldMapping">additional_info</mapping>
mapping = new CmsGallerySearchFieldMapping();
mapping.setType("dynamic");
mapping.setParam("additional_info");
field.addMapping(mapping);
fieldConf.addField(field);
// <field name="container_types" store="true" index="true" analyzer="WhitespaceAnalyzer">
field = new CmsSearchField();
field.setName("container_types");
field.setStored("true");
field.setIndexed("true");
try {
field.setAnalyzer("WhitespaceAnalyzer");
} catch (Exception e) {
// ignore
e.printStackTrace();
}
// <mapping type="dynamic" class="org.opencms.search.galleries.CmsGallerySearchFieldMapping">container_types</mapping>
mapping = new CmsGallerySearchFieldMapping();
mapping.setType("dynamic");
mapping.setParam("container_types");
field.addMapping(mapping);
fieldConf.addField(field);
createFieldConfig(document, xpath, fieldConf, CmsGallerySearchFieldConfiguration.class);
return true;
}
};
xp = new StringBuffer(256);
xp.append(getCommonPath());
xp.append("/");
xp.append(CmsSearchConfiguration.N_FIELDCONFIGURATIONS);
xp.append("/");
xp.append(CmsSearchConfiguration.N_FIELDCONFIGURATION);
xp.append("[");
xp.append(I_CmsXmlConfiguration.N_NAME);
xp.append("='gallery_fields']");
m_actions.put(xp.toString(), action4);
//
//=============================================================================================================
//
m_actions.put("/opencms/search/indexsources", new CmsIndexSourceTypeUpdateAction());
// use dummy check [1=1] to make the xpaths unique
m_actions.put("/opencms/search/indexsources[1=1]", new CmsAddGalleryModuleIndexSourceAction());
m_actions.put(
buildXpathForIndexedDocumentType("source1", "containerpage"),
createIndexedTypeAction("containerpage"));
//=============================================================================================================
String analyzerEnPath = "/opencms/search/analyzers/analyzer[class='org.apache.lucene.analysis.standard.StandardAnalyzer'][locale='en']";
m_actions.put(analyzerEnPath, new ElementReplaceAction(analyzerEnPath, "<analyzer>\n"
+ " <class>org.apache.lucene.analysis.en.EnglishAnalyzer</class>\n"
+ " <locale>en</locale>\n"
+ " </analyzer>"));
String analyzerItPath = "/opencms/search/analyzers/analyzer[class='org.apache.lucene.analysis.snowball.SnowballAnalyzer'][stemmer='Italian']";
m_actions.put(analyzerItPath, new ElementReplaceAction(analyzerItPath, "<analyzer>\n"
+ " <class>org.apache.lucene.analysis.it.ItalianAnalyzer</class>\n"
+ " <locale>it</locale>\n"
+ " </analyzer>"));
m_actions.put(
"/opencms/search/indexsources/indexsource[name='gallery_source']/resources['systemgalleries'='systemgalleries']",
new CmsAddIndexSourceResourceAction());
}
}