/* * Copyright 2004-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.compass.core.config.builder; import java.io.File; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.compass.core.config.CompassConfiguration; import org.compass.core.config.CompassEnvironment; import org.compass.core.config.CompassSettings; import org.compass.core.config.ConfigurationException; import org.compass.core.lucene.LuceneEnvironment; import org.compass.core.util.ClassUtils; import org.compass.core.util.DomUtils; import org.compass.core.util.SystemPropertyUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; /** * @author kimchy */ public class SchemaConfigurationBuilder extends AbstractXmlConfigurationBuilder { protected void doProcess(Document doc, CompassConfiguration config) throws ConfigurationException { Element root = doc.getDocumentElement(); // the root is the compass element NodeList nl = root.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { if ("compass".equals(node.getLocalName())) { processCompass((Element) node, config); } } } } public void processCompass(Element compassElement, CompassConfiguration config) { config.getSettings().setSetting(CompassEnvironment.NAME, DomUtils.getElementAttribute(compassElement, "name")); NodeList nl = compassElement.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; String nodeName = ele.getLocalName(); String methodName = "bind" + Character.toUpperCase(nodeName.charAt(0)) + nodeName.substring(1, nodeName.length()); Method method; try { method = SchemaConfigurationBuilder.class.getMethod(methodName, new Class[]{Element.class, CompassConfiguration.class}); } catch (NoSuchMethodException e) { throw new ConfigurationException("Compass failed to process node [" + nodeName + "], this is " + "either a mailformed xml configuration (not validated against the xsd), or an internal" + " bug in compass"); } try { method.invoke(this, new Object[]{ele, config}); } catch (InvocationTargetException e) { throw new ConfigurationException("Failed to invoke binding metod for node [" + nodeName + "]", e.getTargetException()); } catch (IllegalAccessException e) { throw new ConfigurationException("Failed to access binding metod for node [" + nodeName + "]", e); } } } } private String getElementAttribute(Element ele, String name) { return SystemPropertyUtils.resolvePlaceholders(DomUtils.getElementAttribute(ele, name)); } private String getElementAttribute(Element ele, String name, String defaultValue) { return SystemPropertyUtils.resolvePlaceholders(DomUtils.getElementAttribute(ele, name, defaultValue)); } private boolean getElementAttributeAsBoolean(Element ele, String name, boolean defaultValue) { String sValue = getElementAttribute(ele, name); if (sValue == null) { return defaultValue; } return Boolean.valueOf(sValue).booleanValue(); } public void bindOsem(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); settings.setSetting(CompassEnvironment.Osem.MANAGED_ID_INDEX, getElementAttribute(ele, "managedIdIndex")); settings.setSetting(CompassEnvironment.Osem.SUPPORT_UNMARSHALL, getElementAttribute(ele, "supportUnmarshall")); } public void bindConverters(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); List convertersEle = DomUtils.getChildElementsByTagName(ele, "converter", true); for (Iterator it = convertersEle.iterator(); it.hasNext();) { Element converterEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(converterEle); settingsHolder.names.add(CompassEnvironment.Converter.TYPE); settingsHolder.values.add(getElementAttribute(converterEle, "type")); settings.setGroupSettings(CompassEnvironment.Converter.PREFIX, getElementAttribute(converterEle, "name"), settingsHolder.names(), settingsHolder.values()); } } public void bindPropertyAccessors(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); List propertyAccessorsEle = DomUtils.getChildElementsByTagName(ele, "propertyAccessor", true); for (Iterator it = propertyAccessorsEle.iterator(); it.hasNext();) { Element propertyAccessorEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(propertyAccessorEle); settingsHolder.names.add(CompassEnvironment.PropertyAccessor.TYPE); settingsHolder.values.add(getElementAttribute(propertyAccessorEle, "type")); settings.setGroupSettings(CompassEnvironment.PropertyAccessor.PREFIX, getElementAttribute(propertyAccessorEle, "name"), settingsHolder.names(), settingsHolder.values()); } } public void bindPropertyNamingStrategy(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); String type = getElementAttribute(ele, "type"); if (type == null) { type = getElementAttribute(ele, "typeClass"); } settings.setSetting(CompassEnvironment.NamingStrategy.TYPE, type); } public void bindSearchEngine(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); settings.setSetting(LuceneEnvironment.SearchEngineIndex.USE_COMPOUND_FILE, getElementAttribute(ele, "useCompoundFile")); settings.setSetting(LuceneEnvironment.SearchEngineIndex.MAX_FIELD_LENGTH, getElementAttribute(ele, "maxFieldLength")); settings.setSetting(LuceneEnvironment.SearchEngineIndex.CACHE_INTERVAL_INVALIDATION, getElementAttribute(ele, "cacheInvalidationInterval")); settings.setSetting(LuceneEnvironment.SearchEngineIndex.CACHE_ASYNC_INVALIDATION, getElementAttribute(ele, "cacheAsyncInvalidation")); settings.setSetting(LuceneEnvironment.SearchEngineIndex.INDEX_MANAGER_SCHEDULE_INTERVAL, getElementAttribute(ele, "indexManagerScheduleInterval")); settings.setSetting(LuceneEnvironment.SearchEngineIndex.WAIT_FOR_CACHE_INVALIDATION_ON_INDEX_OPERATION, getElementAttribute(ele, "waitForCacheInvalidationOnIndexOperation")); settings.setSetting(LuceneEnvironment.DEFAULT_SEARCH, getElementAttribute(ele, "defaultSearch")); List child = DomUtils.getChildElementsByTagName(ele, "aliasProperty", true); if (child.size() == 1) { Element aliasPropertyEle = (Element) child.get(0); settings.setSetting(CompassEnvironment.Alias.NAME, getElementAttribute(aliasPropertyEle, "name")); } child = DomUtils.getChildElementsByTagName(ele, "allProperty", true); if (child.size() == 1) { Element allPropertyEle = (Element) child.get(0); settings.setSetting(CompassEnvironment.All.NAME, getElementAttribute(allPropertyEle, "name")); settings.setSetting(CompassEnvironment.All.TERM_VECTOR, getElementAttribute(allPropertyEle, "termVector")); settings.setSetting(CompassEnvironment.All.ENABLED, getElementAttribute(allPropertyEle, "enabled")); settings.setSetting(CompassEnvironment.All.BOOST_SUPPORT, getElementAttribute(allPropertyEle, "boostSupport")); settings.setSetting(CompassEnvironment.All.INCLUDE_UNMAPPED_PROPERTIES, getElementAttribute(allPropertyEle, "includeUnmappedProperties")); } child = DomUtils.getChildElementsByTagName(ele, "optimizer", true); if (child.size() == 1) { Element optimizerEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.Optimizer.TYPE, getElementAttribute(optimizerEle, "type")); settings.setSetting(LuceneEnvironment.Optimizer.SCHEDULE, getElementAttribute(optimizerEle, "schedule")); settings.setSetting(LuceneEnvironment.Optimizer.SCHEDULE_PERIOD, getElementAttribute(optimizerEle, "scheduleInterval")); settings.setSetting(LuceneEnvironment.Optimizer.MAX_NUMBER_OF_SEGMENTS, getElementAttribute(optimizerEle, "maxNumberOfSegments")); } child = DomUtils.getChildElementsByTagName(ele, "highlighter", true); for (Iterator it = child.iterator(); it.hasNext();) { Element highlighterEle = (Element) it.next(); String highlighterName = getElementAttribute(highlighterEle, "name"); SettingsHolder settingsHolder = processSettings(highlighterEle); settingsHolder.names.add(LuceneEnvironment.Highlighter.TEXT_TOKENIZER); settingsHolder.values.add(getElementAttribute(highlighterEle, "textTokenizer")); settingsHolder.names.add(LuceneEnvironment.Highlighter.REWRITE_QUERY); settingsHolder.values.add(getElementAttribute(highlighterEle, "rewriteQuery")); settingsHolder.names.add(LuceneEnvironment.Highlighter.COMPUTE_IDF); settingsHolder.values.add(getElementAttribute(highlighterEle, "computeIdf")); settingsHolder.names.add(LuceneEnvironment.Highlighter.MAX_NUM_FRAGMENTS); settingsHolder.values.add(getElementAttribute(highlighterEle, "maxNumFragments")); settingsHolder.names.add(LuceneEnvironment.Highlighter.SEPARATOR); settingsHolder.values.add(getElementAttribute(highlighterEle, "separator")); settingsHolder.names.add(LuceneEnvironment.Highlighter.MAX_BYTES_TO_ANALYZE); settingsHolder.values.add(getElementAttribute(highlighterEle, "maxBytesToAnalyze")); List fragmenterList = DomUtils.getChildElementsByTagName(highlighterEle, "fragmenter", true); if (fragmenterList.size() == 1) { Element fragmenterEle = (Element) fragmenterList.get(0); String type = getElementAttribute(fragmenterEle, "type"); if ("custom".equals(type)) { type = getElementAttribute(fragmenterEle, "class"); } settingsHolder.names.add(LuceneEnvironment.Highlighter.Fragmenter.TYPE); settingsHolder.values.add(type); settingsHolder.names.add(LuceneEnvironment.Highlighter.Fragmenter.SIMPLE_SIZE); settingsHolder.values.add(getElementAttribute(fragmenterEle, "size")); } List encoderList = DomUtils.getChildElementsByTagName(highlighterEle, "encoder", true); if (encoderList.size() == 1) { Element encoderEle = (Element) encoderList.get(0); String type = getElementAttribute(encoderEle, "type"); if ("custom".equals(type)) { type = getElementAttribute(encoderEle, "class"); } settingsHolder.names.add(LuceneEnvironment.Highlighter.Encoder.TYPE); settingsHolder.values.add(type); } List formatterList = DomUtils.getChildElementsByTagName(highlighterEle, "simpleFormatter", true); if (formatterList.size() == 1) { Element formatterEle = (Element) formatterList.get(0); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.TYPE); settingsHolder.values.add(LuceneEnvironment.Highlighter.Formatter.SIMPLE); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.SIMPLE_PRE_HIGHLIGHT); settingsHolder.values.add(getElementAttribute(formatterEle, "pre")); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.SIMPLE_POST_HIGHLIGHT); settingsHolder.values.add(getElementAttribute(formatterEle, "post")); } formatterList = DomUtils.getChildElementsByTagName(highlighterEle, "htmlSpanGradientFormatter", true); if (formatterList.size() == 1) { Element formatterEle = (Element) formatterList.get(0); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.TYPE); settingsHolder.values.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT_MAX_SCORE); settingsHolder.values.add(getElementAttribute(formatterEle, "maxScore")); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT_MIN_FOREGROUND_COLOR); settingsHolder.values.add(getElementAttribute(formatterEle, "minForegroundColor")); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT_MAX_FOREGROUND_COLOR); settingsHolder.values.add(getElementAttribute(formatterEle, "maxForegroundColor")); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT_MIN_BACKGROUND_COLOR); settingsHolder.values.add(getElementAttribute(formatterEle, "minBackgroundColor")); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.HTML_SPAN_GRADIENT_MAX_BACKGROUND_COLOR); settingsHolder.values.add(getElementAttribute(formatterEle, "maxBackgroundColor")); } formatterList = DomUtils.getChildElementsByTagName(highlighterEle, "customFormatter", true); if (formatterList.size() == 1) { Element formatterEle = (Element) formatterList.get(0); settingsHolder.names.add(LuceneEnvironment.Highlighter.Formatter.TYPE); settingsHolder.values.add(getElementAttribute(formatterEle, "class")); } settings.setGroupSettings(LuceneEnvironment.Highlighter.PREFIX, highlighterName, settingsHolder.names(), settingsHolder.values()); } child = DomUtils.getChildElementsByTagName(ele, "analyzer", true); for (Iterator it = child.iterator(); it.hasNext();) { Element analyzerEle = (Element) it.next(); String analyzerName = getElementAttribute(analyzerEle, "name"); SettingsHolder settingsHolder = processSettings(analyzerEle); String analyzerType = getElementAttribute(analyzerEle, "type"); if (analyzerType != null) { if (analyzerType.equals("CustomAnalyzer")) { analyzerType = getElementAttribute(analyzerEle, "analyzerClass"); if (analyzerType == null) { throw new ConfigurationException("Analyzer [" + analyzerName + "] has " + "type of [CustomAnalyzer] but does not set analyzerClass"); } } settingsHolder.names.add(LuceneEnvironment.Analyzer.TYPE); settingsHolder.values.add(analyzerType); if (analyzerType.equals("Snowball")) { settingsHolder.names.add(LuceneEnvironment.Analyzer.Snowball.NAME_TYPE); settingsHolder.values.add(getElementAttribute(analyzerEle, "snowballType")); } } settingsHolder.names.add(LuceneEnvironment.Analyzer.FILTERS); settingsHolder.values.add(getElementAttribute(analyzerEle, "filters")); List stopWordsList = DomUtils.getChildElementsByTagName(analyzerEle, "stopWords", true); if (stopWordsList.size() == 1) { Element stopWordsEle = (Element) stopWordsList.get(0); StringBuffer sb = new StringBuffer(); boolean replace = getElementAttributeAsBoolean(stopWordsEle, "replace", false); if (!replace) { sb.append("+"); } List stopWords = DomUtils.getChildElementsByTagName(stopWordsEle, "stopWord", true); for (Iterator swIt = stopWords.iterator(); swIt.hasNext();) { Element stopWordEle = (Element) swIt.next(); sb.append(getElementAttribute(stopWordEle, "value")).append(","); } settingsHolder.names.add(LuceneEnvironment.Analyzer.STOPWORDS); settingsHolder.values.add(sb.toString()); } settings.setGroupSettings(LuceneEnvironment.Analyzer.PREFIX, analyzerName, settingsHolder.names(), settingsHolder.values()); } child = DomUtils.getChildElementsByTagName(ele, "analyzerFilter", true); for (Iterator it = child.iterator(); it.hasNext();) { Element analyzerFilterEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(analyzerFilterEle); settingsHolder.names.add(LuceneEnvironment.AnalyzerFilter.TYPE); settingsHolder.values.add(getElementAttribute(analyzerFilterEle, "type")); settings.setGroupSettings(LuceneEnvironment.AnalyzerFilter.PREFIX, getElementAttribute(analyzerFilterEle, "name"), settingsHolder.names(), settingsHolder.values()); } child = DomUtils.getChildElementsByTagName(ele, "queryParser", true); for (Iterator it = child.iterator(); it.hasNext();) { Element queryParserEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(queryParserEle); settingsHolder.names.add(LuceneEnvironment.QueryParser.TYPE); settingsHolder.values.add(getElementAttribute(queryParserEle, "type")); settings.setGroupSettings(LuceneEnvironment.QueryParser.PREFIX, getElementAttribute(queryParserEle, "name"), settingsHolder.names(), settingsHolder.values()); } child = DomUtils.getChildElementsByTagName(ele, "indexDeletionPolicy", true); if (child.size() == 1) { Element indexDeletionPolicyEle = (Element) child.get(0); child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "keepLastCommit", true); if (child.size() == 1) { settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, LuceneEnvironment.IndexDeletionPolicy.KeepLastCommit.NAME); } child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "keepAll", true); if (child.size() == 1) { settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, LuceneEnvironment.IndexDeletionPolicy.KeepAll.NAME); } child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "keepLastN", true); if (child.size() == 1) { settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, LuceneEnvironment.IndexDeletionPolicy.KeepLastN.NAME); settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.KeepLastN.NUM_TO_KEEP, ((Element) child.get(0)).getAttribute("numToKeep")); } child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "keepNoneOnInit", true); if (child.size() == 1) { settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, LuceneEnvironment.IndexDeletionPolicy.KeepNoneOnInit.NAME); } child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "expirationTime", true); if (child.size() == 1) { settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, LuceneEnvironment.IndexDeletionPolicy.ExpirationTime.NAME); settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.ExpirationTime.EXPIRATION_TIME_IN_SECONDS, ((Element) child.get(0)).getAttribute("expirationTimeSeconds")); } child = DomUtils.getChildElementsByTagName(indexDeletionPolicyEle, "custom", true); if (child.size() == 1) { Element customEle = ((Element) child.get(0)); settings.setSetting(LuceneEnvironment.IndexDeletionPolicy.TYPE, customEle.getAttribute("type")); bindSettings(customEle, config); } } } public void bindCache(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); List child = DomUtils.getChildElementsByTagName(ele, "firstLevel", true); if (child.size() == 1) { Element firstLevelCacheEle = (Element) child.get(0); settings.setSetting(CompassEnvironment.Cache.FirstLevel.TYPE, getElementAttribute(firstLevelCacheEle, "type")); } } public void bindTransaction(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); settings.setSetting(LuceneEnvironment.Transaction.Processor.TYPE, getElementAttribute(ele, "processor")); settings.setSetting(CompassEnvironment.Transaction.FACTORY, getElementAttribute(ele, "factory")); settings.setSetting(CompassEnvironment.Transaction.COMMIT_BEFORE_COMPLETION, getElementAttribute(ele, "commitBeforeCompletion")); settings.setSetting(LuceneEnvironment.Transaction.LOCK_TIMEOUT, getElementAttribute(ele, "lockTimeout")); settings.setSetting(LuceneEnvironment.Transaction.LOCK_POLL_INTERVAL, getElementAttribute(ele, "lockPollInterval")); settings.setSetting(CompassEnvironment.Transaction.DISABLE_AUTO_JOIN_SESSION, getElementAttribute(ele, "disableAutoJoinSession")); List child = DomUtils.getChildElementsByTagName(ele, "jtaSettings", true); if (child.size() == 1) { Element jtaSettingsEle = (Element) child.get(0); settings.setSetting(CompassEnvironment.Transaction.USER_TRANSACTION, getElementAttribute(jtaSettingsEle, "userTransactionName")); settings.setSetting(CompassEnvironment.Transaction.CACHE_USER_TRANSACTION, getElementAttribute(jtaSettingsEle, "cacheUserTransaction")); settings.setSetting(CompassEnvironment.Transaction.MANAGER_LOOKUP, getElementAttribute(jtaSettingsEle, "managerLookup")); settings.setSetting(CompassEnvironment.Transaction.MANAGER_LOOKUP, getElementAttribute(jtaSettingsEle, "managerLookupClass")); } child = DomUtils.getChildElementsByTagName(ele, "processors", true); for (Iterator it = child.iterator(); it.hasNext();) { Element prEle = (Element) it.next(); List child1 = DomUtils.getChildElementsByTagName(prEle, "readCommitted", true); if (child1.size() == 1) { Element readCommittedSettingsEle = (Element) child1.get(0); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.TransLog.CONNECTION, getElementAttribute(readCommittedSettingsEle, "transLog")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.TransLog.OPTIMIZE_TRANS_LOG, getElementAttribute(readCommittedSettingsEle, "optimizeTransLog")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.CONCURRENT_OPERATIONS, getElementAttribute(readCommittedSettingsEle, "concurrentOperations")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.CONCURRENCY_LEVEL, getElementAttribute(readCommittedSettingsEle, "concurrencyLevel")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.HASHING, getElementAttribute(readCommittedSettingsEle, "hashing")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.ADD_TIMEOUT, getElementAttribute(readCommittedSettingsEle, "addTimeout")); settings.setSetting(LuceneEnvironment.Transaction.Processor.ReadCommitted.BACKLOG, getElementAttribute(readCommittedSettingsEle, "backlog")); } child1 = DomUtils.getChildElementsByTagName(prEle, "lucene", true); if (child1.size() == 1) { Element luceneSettingsEle = (Element) child1.get(0); settings.setSetting(LuceneEnvironment.Transaction.Processor.Lucene.CONCURRENT_OPERATIONS, getElementAttribute(luceneSettingsEle, "concurrentOperations")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Lucene.CONCURRENCY_LEVEL, getElementAttribute(luceneSettingsEle, "concurrencyLevel")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Lucene.HASHING, getElementAttribute(luceneSettingsEle, "hashing")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Lucene.ADD_TIMEOUT, getElementAttribute(luceneSettingsEle, "addTimeout")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Lucene.BACKLOG, getElementAttribute(luceneSettingsEle, "backlog")); } child1 = DomUtils.getChildElementsByTagName(prEle, "async", true); if (child1.size() == 1) { Element asyncSettingsEle = (Element) child1.get(0); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.ADD_TIMEOUT, getElementAttribute(asyncSettingsEle, "addTimeout")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.BACKLOG, getElementAttribute(asyncSettingsEle, "backlog")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.BATCH_JOBS_SIZE, getElementAttribute(asyncSettingsEle, "batchJobSize")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.BATCH_JOBS_TIMEOUT, getElementAttribute(asyncSettingsEle, "batchJobTimeout")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.CONCURRENCY_LEVEL, getElementAttribute(asyncSettingsEle, "concurrencyLevel")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.HASHING, getElementAttribute(asyncSettingsEle, "hashing")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.NON_BLOCKING_BATCH_JOBS_SIZE, getElementAttribute(asyncSettingsEle, "nonBlockingBatchJobSize")); settings.setSetting(LuceneEnvironment.Transaction.Processor.Async.PROCESS_BEFORE_CLOSE, getElementAttribute(asyncSettingsEle, "processBeforeClose")); } } } public void bindConnection(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); // directory wrapper providers List child = DomUtils.getChildElementsByTagName(ele, "directoryWrapperProvider", true); for (Iterator it = child.iterator(); it.hasNext();) { Element dwEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(dwEle); settingsHolder.names.add(LuceneEnvironment.DirectoryWrapper.TYPE); settingsHolder.values.add(getElementAttribute(dwEle, "type")); settings.setGroupSettings(LuceneEnvironment.DirectoryWrapper.PREFIX, getElementAttribute(dwEle, "name"), settingsHolder.names(), settingsHolder.values()); } child = DomUtils.getChildElementsByTagName(ele, "localCache", true); for (Iterator it = child.iterator(); it.hasNext();) { Element localCacheEle = (Element) it.next(); String subIndex = localCacheEle.getAttribute("subIndex"); String connection = localCacheEle.getAttribute("connection"); settings.setGroupSettings(LuceneEnvironment.LocalCache.PREFIX, subIndex, new String[]{LuceneEnvironment.LocalCache.CONNECTION}, new String[]{connection}); } child = DomUtils.getChildElementsByTagName(ele, "lockFactory", true); if (child.size() == 1) { Element lockFactoryEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.LockFactory.TYPE, getElementAttribute(lockFactoryEle, "type")); settings.setSetting(LuceneEnvironment.LockFactory.PATH, getElementAttribute(lockFactoryEle, "path")); } child = DomUtils.getChildElementsByTagName(ele, "file", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String path = getElementAttribute(connEle, "path"); if (!path.startsWith("file://")) { path = "file://" + path; } settings.setSetting(CompassEnvironment.CONNECTION, path); return; } child = DomUtils.getChildElementsByTagName(ele, "mmap", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String path = getElementAttribute(connEle, "path"); if (!path.startsWith("mmap://")) { path = "mmap://" + path; } settings.setSetting(CompassEnvironment.CONNECTION, path); return; } child = DomUtils.getChildElementsByTagName(ele, "niofs", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String path = getElementAttribute(connEle, "path"); if (!path.startsWith("niofs://")) { path = "niofs://" + path; } settings.setSetting(CompassEnvironment.CONNECTION, path); return; } // --- RAM Connection --- child = DomUtils.getChildElementsByTagName(ele, "ram", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String path = getElementAttribute(connEle, "path"); if (!path.startsWith("ram://")) { path = "ram://" + path; } settings.setSetting(CompassEnvironment.CONNECTION, path); return; } // --- Space Connection --- child = DomUtils.getChildElementsByTagName(ele, "space", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String url = getElementAttribute(connEle, "url"); String indexName = getElementAttribute(connEle, "indexName"); settings.setSetting(CompassEnvironment.CONNECTION, "space://" + indexName + ":" + url); // we don't use the static constant so we don't create dependency on GigaSpaces settings.setSetting("compass.engine.store.space.bucketSize", getElementAttribute(connEle, "bucketSize")); settings.setSetting("compass.engine.store.space.flushRate", getElementAttribute(connEle, "flushRate")); return; } // --- Terracota Connection --- child = DomUtils.getChildElementsByTagName(ele, "tc", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String indexName = getElementAttribute(connEle, "indexName"); settings.setSetting(CompassEnvironment.CONNECTION, "tc://" + indexName); settings.setSetting("compass.engine.store.tc.bufferSize", getElementAttribute(connEle, "bufferSize")); settings.setSetting("compass.engine.store.tc.type", getElementAttribute(connEle, "type")); settings.setSetting("compass.engine.store.tc.flushRate", getElementAttribute(connEle, "flushRate")); settings.setSetting("compass.engine.store.tc.chm.initialCapacity", getElementAttribute(connEle, "chmInitialCapacity")); settings.setSetting("compass.engine.store.tc.chm.loadFactor", getElementAttribute(connEle, "chmLoadFactor")); settings.setSetting("compass.engine.store.tc.chm.concurrencyLevel", getElementAttribute(connEle, "chmConcurrencyLevel")); return; } // --- Coherence Connection --- child = DomUtils.getChildElementsByTagName(ele, "coherence", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String indexName = getElementAttribute(connEle, "indexName"); String cacheName = getElementAttribute(connEle, "cacheName"); String type = getElementAttribute(connEle, "type", "invocable"); if ("invocable".equals(type)) { settings.setSetting(CompassEnvironment.CONNECTION, "coherence://" + indexName + ":" + cacheName); } else { settings.setSetting(CompassEnvironment.CONNECTION, "coherence-dg://" + indexName + ":" + cacheName); } // we don't use the static constant so we don't create dependency on GigaSpaces settings.setSetting("compass.engine.store.coherence.bucketSize", getElementAttribute(connEle, "bucketSize")); settings.setSetting("compass.engine.store.coherence.flushRate", getElementAttribute(connEle, "flushRate")); return; } // --- Custom Connection --- child = DomUtils.getChildElementsByTagName(ele, "custom", true); if (child.size() == 1) { Element connEle = (Element) child.get(0); String url = getElementAttribute(connEle, "url"); settings.setSetting(CompassEnvironment.CONNECTION, url); return; } // --- JDBC Connection -- child = DomUtils.getChildElementsByTagName(ele, "jdbc", true); Element connEle = (Element) child.get(0); // managed settings.setSetting(LuceneEnvironment.JdbcStore.MANAGED, getElementAttribute(connEle, "managed", "false")); // disable schema operations settings.setSetting(LuceneEnvironment.JdbcStore.DISABLE_SCHEMA_OPERATIONS, getElementAttribute(connEle, "disableSchemaOperations", "false")); // dialect settings.setSetting(LuceneEnvironment.JdbcStore.DIALECT, getElementAttribute(connEle, "dialect")); settings.setSetting(LuceneEnvironment.JdbcStore.DIALECT, getElementAttribute(connEle, "dialectClass")); // delete mark deleted settings.setSetting(LuceneEnvironment.JdbcStore.DELETE_MARK_DELETED_DELTA, getElementAttribute(connEle, "deleteMarkDeletedDelta")); // lock settings.setSetting(LuceneEnvironment.JdbcStore.LOCK_TYPE, getElementAttribute(connEle, "lock")); settings.setSetting(LuceneEnvironment.JdbcStore.LOCK_TYPE, getElementAttribute(connEle, "lockClass")); // configure file entries child = DomUtils.getChildElementsByTagName(connEle, "fileEntries", true); if (child.size() == 1) { Element fileEntriesEle = (Element) child.get(0); child = DomUtils.getChildElementsByTagName(fileEntriesEle, "fileEntry", true); for (Iterator it = child.iterator(); it.hasNext();) { Element fileEntryEle = (Element) it.next(); SettingsHolder settingsHolder = processSettings(fileEntryEle); // --- File Entry Index Input --- child = DomUtils.getChildElementsByTagName(fileEntryEle, "indexInput", true); if (child.size() == 1) { Element indexInputEle = (Element) child.get(0); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_INPUT_TYPE); settingsHolder.values.add(getElementAttribute(indexInputEle, "type")); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_INPUT_TYPE); settingsHolder.values.add(getElementAttribute(indexInputEle, "typeClass")); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_INPUT_BUFFER_SIZE); settingsHolder.values.add(getElementAttribute(indexInputEle, "bufferSize")); } // --- File Entry Index Input --- child = DomUtils.getChildElementsByTagName(fileEntryEle, "indexOutput", true); if (child.size() == 1) { Element indexOutputEle = (Element) child.get(0); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_OUTPUT_TYPE); settingsHolder.values.add(getElementAttribute(indexOutputEle, "type")); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_OUTPUT_TYPE); settingsHolder.values.add(getElementAttribute(indexOutputEle, "typeClass")); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_OUTPUT_BUFFER_SIZE); settingsHolder.values.add(getElementAttribute(indexOutputEle, "bufferSize")); settingsHolder.names.add(LuceneEnvironment.JdbcStore.FileEntry.INDEX_OUTPUT_THRESHOLD); settingsHolder.values.add(getElementAttribute(indexOutputEle, "threshold")); } settings.setGroupSettings(LuceneEnvironment.JdbcStore.FileEntry.PREFIX, getElementAttribute(fileEntryEle, "name"), settingsHolder.names(), settingsHolder.values()); } } // configure ddl child = DomUtils.getChildElementsByTagName(connEle, "ddl", true); if (child.size() == 1) { Element ddlEle = (Element) child.get(0); child = DomUtils.getChildElementsByTagName(ddlEle, "nameColumn", true); if (child.size() == 1) { Element nameColumnEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.NAME_NAME, getElementAttribute(nameColumnEle, "name")); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.NAME_LENGTH, getElementAttribute(nameColumnEle, "length")); } child = DomUtils.getChildElementsByTagName(ddlEle, "valueColumn", true); if (child.size() == 1) { Element valueColumnEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.VALUE_NAME, getElementAttribute(valueColumnEle, "name")); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.VALUE_LENGTH, getElementAttribute(valueColumnEle, "length")); } child = DomUtils.getChildElementsByTagName(ddlEle, "sizeColumn", true); if (child.size() == 1) { Element sizeColumnEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.SIZE_NAME, getElementAttribute(sizeColumnEle, "name")); } child = DomUtils.getChildElementsByTagName(ddlEle, "lastModifiedColumn", true); if (child.size() == 1) { Element lastModifiedEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.LAST_MODIFIED_NAME, getElementAttribute(lastModifiedEle, "name")); } child = DomUtils.getChildElementsByTagName(ddlEle, "deletedColumn", true); if (child.size() == 1) { Element deletedEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DDL.DELETED_NAME, getElementAttribute(deletedEle, "name")); } } // configure the data source provider child = DomUtils.getChildElementsByTagName(connEle, "dataSourceProvider", true); Element dataSourceProviderEle = (Element) child.get(0); // --- driverManager child = DomUtils.getChildElementsByTagName(dataSourceProviderEle, "driverManager", true); if (child.size() == 1) { Element driverManagerEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.CLASS, "org.compass.core.lucene.engine.store.jdbc.DriverManagerDataSourceProvider"); settings.setSetting(CompassEnvironment.CONNECTION, "jdbc://" + getElementAttribute(driverManagerEle, "url")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.USERNAME, getElementAttribute(driverManagerEle, "username")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.PASSWORD, getElementAttribute(driverManagerEle, "password")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.DRIVER_CLASS, getElementAttribute(driverManagerEle, "driverClass")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.AUTO_COMMIT, getElementAttribute(driverManagerEle, "autoCommit", "false")); } child = DomUtils.getChildElementsByTagName(dataSourceProviderEle, "c3p0", true); if (child.size() == 1) { Element driverManagerEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.CLASS, "org.compass.core.lucene.engine.store.jdbc.C3P0DataSourceProvider"); settings.setSetting(CompassEnvironment.CONNECTION, "jdbc://" + getElementAttribute(driverManagerEle, "url")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.USERNAME, getElementAttribute(driverManagerEle, "username")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.PASSWORD, getElementAttribute(driverManagerEle, "password")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.DRIVER_CLASS, getElementAttribute(driverManagerEle, "driverClass")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.AUTO_COMMIT, getElementAttribute(driverManagerEle, "autoCommit", "false")); } child = DomUtils.getChildElementsByTagName(dataSourceProviderEle, "jndi", true); if (child.size() == 1) { Element jndiEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.CLASS, "org.compass.core.lucene.engine.store.jdbc.JndiDataSourceProvider"); settings.setSetting(CompassEnvironment.CONNECTION, "jdbc://" + getElementAttribute(jndiEle, "lookup")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.USERNAME, getElementAttribute(jndiEle, "username")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.PASSWORD, getElementAttribute(jndiEle, "password")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.AUTO_COMMIT, getElementAttribute(jndiEle, "autoCommit", "false")); } child = DomUtils.getChildElementsByTagName(dataSourceProviderEle, "dbcp", true); if (child.size() == 1) { Element dbcpEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.CLASS, "org.compass.core.lucene.engine.store.jdbc.DbcpDataSourceProvider"); settings.setSetting(CompassEnvironment.CONNECTION, "jdbc://" + getElementAttribute(dbcpEle, "url")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.USERNAME, getElementAttribute(dbcpEle, "username")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.PASSWORD, getElementAttribute(dbcpEle, "password")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.DRIVER_CLASS, getElementAttribute(dbcpEle, "driverClass")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.AUTO_COMMIT, getElementAttribute(dbcpEle, "autoCommit", "false")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.DEFAULT_TRANSACTION_ISOLATION, getElementAttribute(dbcpEle, "defaultTransacitonIsolation")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.INITIAL_SIZE, getElementAttribute(dbcpEle, "initialSize")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.MAX_ACTIVE, getElementAttribute(dbcpEle, "maxActive")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.MAX_IDLE, getElementAttribute(dbcpEle, "maxIdle")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.MIN_IDLE, getElementAttribute(dbcpEle, "minIdle")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.MAX_WAIT, getElementAttribute(dbcpEle, "maxWait")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.MAX_OPEN_PREPARED_STATEMENTS, getElementAttribute(dbcpEle, "maxOpenPreparedStatements")); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.Dbcp.POOL_PREPARED_STATEMENTS, getElementAttribute(dbcpEle, "poolPreparedStatements")); } child = DomUtils.getChildElementsByTagName(dataSourceProviderEle, "external", true); if (child.size() == 1) { Element externalEle = (Element) child.get(0); settings.setSetting(LuceneEnvironment.JdbcStore.DataSourceProvider.CLASS, "org.compass.core.lucene.engine.store.jdbc.ExternalDataSourceProvider"); settings.setSetting(CompassEnvironment.CONNECTION, "jdbc://"); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.USERNAME, getElementAttribute(externalEle, "username")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.PASSWORD, getElementAttribute(externalEle, "password")); settings.setSetting(LuceneEnvironment.JdbcStore.Connection.AUTO_COMMIT, getElementAttribute(externalEle, "autoCommit", "false")); } } public void bindJndi(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); settings.setSetting(CompassEnvironment.Jndi.ENABLE, getElementAttribute(ele, "register", "false")); settings.setSetting(CompassEnvironment.Jndi.CLASS, getElementAttribute(ele, "class")); settings.setSetting(CompassEnvironment.Jndi.URL, getElementAttribute(ele, "url")); List environments = DomUtils.getChildElementsByTagName(ele, "environment", true); if (environments.size() == 1) { Element environment = (Element) environments.get(0); List properties = DomUtils.getChildElementsByTagName(environment, "property", true); for (Iterator it = properties.iterator(); it.hasNext();) { Element property = (Element) it.next(); String propertyName = CompassEnvironment.Jndi.PREFIX + "." + getElementAttribute(property, "name"); String propertyValue = getElementAttribute(property, "value"); settings.setSetting(propertyName, propertyValue); } } } public void bindSettings(Element ele, CompassConfiguration config) { CompassSettings settings = config.getSettings(); List domSettings = DomUtils.getChildElementsByTagName(ele, "setting", true); for (Iterator it = domSettings.iterator(); it.hasNext();) { Element eleSetting = (Element) it.next(); settings.setSetting(getElementAttribute(eleSetting, "name"), getElementAttribute(eleSetting, "value")); } } public void bindMappings(Element ele, CompassConfiguration config) throws Exception { NodeList nl = ele.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element mappingEle = (Element) node; String nodeName = mappingEle.getLocalName(); if ("resource".equals(nodeName)) { config.addResource(getElementAttribute(mappingEle, "location")); } else if ("class".equals(nodeName)) { config.addClass(ClassUtils.forName(getElementAttribute(mappingEle, "name"), config.getClassLoader())); } else if ("jar".equals(nodeName)) { config.addJar(new File(getElementAttribute(mappingEle, "path"))); } else if ("file".equals(nodeName)) { config.addFile(new File(getElementAttribute(mappingEle, "path"))); } else if ("dir".equals(nodeName)) { config.addDirectory(new File(getElementAttribute(mappingEle, "path"))); } else if ("package".equals(nodeName)) { config.addPackage(getElementAttribute(mappingEle, "name")); } else if ("scan".equals(nodeName)) { config.addScan(getElementAttribute(mappingEle, "basePackage"), getElementAttribute(mappingEle, "pattern")); } } } } private SettingsHolder processSettings(Element ele) { SettingsHolder settingsHolder = new SettingsHolder(); List settings = DomUtils.getChildElementsByTagName(ele, "setting", true); for (Iterator it = settings.iterator(); it.hasNext();) { Element settingEle = (Element) it.next(); settingsHolder.names.add(getElementAttribute(settingEle, "name")); settingsHolder.values.add(getElementAttribute(settingEle, "value")); } return settingsHolder; } private class SettingsHolder { public ArrayList names = new ArrayList(); public ArrayList values = new ArrayList(); public String[] names() { return (String[]) names.toArray(new String[names.size()]); } public String[] values() { return (String[]) values.toArray(new String[values.size()]); } } protected EntityResolver doGetEntityResolver() { return new EntityResolver() { private static final String URL = "http://www.compass-project.org/schema/"; public InputSource resolveEntity(String publicId, String systemId) { if (systemId != null && systemId.startsWith("http://www.opensymphony.com/compass/schema/")) { throw new IllegalArgumentException("Using old format for schema, please use the url [" + URL + "]"); } if (systemId != null && systemId.startsWith(URL)) { // Search for DTD String location = "/org/compass/core/" + systemId.substring(URL.length()); InputStream is = getClass().getResourceAsStream(location); if (is == null) { throw new ConfigurationException("Schema system id [" + systemId + "] not found at [" + location + "], " + "please check it has the correct location. Have you included compass in your class path?"); } InputSource source = new InputSource(is); source.setPublicId(publicId); source.setSystemId(systemId); return source; } else { throw new ConfigurationException("Schema system id [" + systemId + "] not found, please check it has the " + "correct location"); } } }; } protected DocumentBuilderFactory createDocumentBuilderFactory() throws ParserConfigurationException { DocumentBuilderFactory factory = super.createDocumentBuilderFactory(); factory.setNamespaceAware(true); try { factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); } catch (IllegalArgumentException ex) { throw new ConfigurationException( "Unable to validate using XSD: Your JAXP provider [" + factory + "] does not support XML Schema. " + "Are you running on Java 1.4 or below with Apache Crimson? " + "Upgrade to Apache Xerces (or Java 1.5) for full XSD support."); } return factory; } }