/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.solr.handler; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.ContentStreamBase; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.XML; import org.apache.solr.common.util.XMLErrorLogger; import org.apache.solr.core.SolrCore; import org.apache.solr.request.LocalSolrQueryRequest; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.update.processor.UpdateRequestProcessor; import org.apache.solr.update.processor.UpdateRequestProcessorChain; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import java.io.InputStream; import java.io.Writer; import java.util.HashMap; /** * Add documents to solr using the STAX XML parser. */ public class XmlUpdateRequestHandler extends ContentStreamHandlerBase { public static Logger log = LoggerFactory.getLogger(XmlUpdateRequestHandler.class); private static final XMLErrorLogger xmllog = new XMLErrorLogger(log); public static final String UPDATE_PROCESSOR = "update.processor"; // XML Constants public static final String ADD = "add"; public static final String DELETE = "delete"; public static final String OPTIMIZE = "optimize"; public static final String COMMIT = "commit"; public static final String ROLLBACK = "rollback"; public static final String WAIT_SEARCHER = "waitSearcher"; public static final String WAIT_FLUSH = "waitFlush"; public static final String OVERWRITE = "overwrite"; //NOTE: This constant is for use with the <add> XML tag, not the HTTP param with same name public static final String COMMIT_WITHIN = "commitWithin"; /** * @deprecated use {@link #OVERWRITE} */ @Deprecated public static final String OVERWRITE_COMMITTED = "overwriteCommitted"; /** * @deprecated use {@link #OVERWRITE} */ @Deprecated public static final String OVERWRITE_PENDING = "overwritePending"; /** * @deprecated use {@link #OVERWRITE} */ @Deprecated public static final String ALLOW_DUPS = "allowDups"; XMLInputFactory inputFactory; @Override public void init(NamedList args) { super.init(args); inputFactory = XMLInputFactory.newInstance(); try { // The java 1.6 bundled stax parser (sjsxp) does not currently have a thread-safe // XMLInputFactory, as that implementation tries to cache and reuse the // XMLStreamReader. Setting the parser-specific "reuse-instance" property to false // prevents this. // All other known open-source stax parsers (and the bea ref impl) // have thread-safe factories. inputFactory.setProperty("reuse-instance", Boolean.FALSE); } catch (IllegalArgumentException ex) { // Other implementations will likely throw this exception since "reuse-instance" // isimplementation specific. log.debug("Unable to set the 'reuse-instance' property for the input chain: " + inputFactory); } inputFactory.setXMLReporter(xmllog); } @Override protected ContentStreamLoader newLoader(SolrQueryRequest req, UpdateRequestProcessor processor) { return new XMLLoader(processor, inputFactory); } /** * A Convenience method for getting back a simple XML string indicating * success or failure from an XML formated Update (from the Reader) * * @since solr 1.2 * @deprecated Direct updates from a Servlet, as well as the response * format produced by this method, have been deprecated * and will be removed in future versions. Any code using * this method should be changed to use {@link #handleRequest} * method with a ContentStream. */ @Deprecated public void doLegacyUpdate(InputStream input, String inputContentType, Writer output) { // SolrCore core = SolrCore.getSolrCore(); // SolrQueryRequest req = new LocalSolrQueryRequest(core, new HashMap<String,String[]>()); // try { // // Old style requests do not choose a custom handler // UpdateRequestProcessorChain processorFactory = core.getUpdateProcessingChain(null); // SolrQueryResponse rsp = new SolrQueryResponse(); // ignored // final String charset = ContentStreamBase.getCharsetFromContentType(inputContentType); // final XMLStreamReader parser = (charset == null) ? // inputFactory.createXMLStreamReader(input) : inputFactory.createXMLStreamReader(input, charset); // UpdateRequestProcessor processor = processorFactory.createProcessor(req, rsp); // XMLLoader loader = (XMLLoader) newLoader(req, processor); // loader.processUpdate(processor, parser); // processor.finish(); // output.write("<result status=\"0\"></result>"); // } // catch (Exception ex) { // try { // SolrException.logOnce(log, "Error processing \"legacy\" update command", ex); // XML.writeXML(output, "result", SolrException.toStr(ex), "status", "1"); // } catch (Exception ee) { // log.error("Error writing to output stream: " + ee); // } // } // finally { // req.close(); // } } //////////////////////// SolrInfoMBeans methods ////////////////////// @Override public String getDescription() { return "Add documents with XML"; } @Override public String getVersion() { return "$Revision: 1165749 $"; } @Override public String getSourceId() { return "$Id: XmlUpdateRequestHandler.java 1165749 2011-09-06 16:20:07Z janhoy $"; } @Override public String getSource() { return "$URL: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene_solr_3_5/solr/core/src/java/org/apache/solr/handler/XmlUpdateRequestHandler.java $"; } }