/**
* 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 $";
}
}