content: /**
   * 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.params.SolrParams;
  import org.apache.solr.common.util.NamedList;
  import org.apache.solr.common.util.XMLErrorLogger;
  import org.apache.solr.request.SolrQueryRequest;
  import org.apache.solr.update.processor.UpdateRequestProcessor;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import javax.xml.stream.XMLInputFactory;
  
  /**
   * Add documents to solr using the STAX XML parser, transforming it with XSLT first
   */
  public class XsltUpdateRequestHandler extends ContentStreamHandlerBase {
    public static Logger log = LoggerFactory.getLogger(XsltUpdateRequestHandler.class);
    public static final XMLErrorLogger xmllog = new XMLErrorLogger(log);
  
    public static final String UPDATE_PROCESSOR = "update.processor";
  
  
    public static final int XSLT_CACHE_DEFAULT = 60;
    private static final String XSLT_CACHE_PARAM = "xsltCacheLifetimeSeconds"; 
  
    XMLInputFactory inputFactory;
    private Integer xsltCacheLifetimeSeconds;
  
    @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);
      
      final SolrParams p = SolrParams.toSolrParams(args);
      this.xsltCacheLifetimeSeconds = p.getInt(XSLT_CACHE_PARAM,XSLT_CACHE_DEFAULT);
      log.info("xsltCacheLifetimeSeconds=" + xsltCacheLifetimeSeconds);
    }
  
    @Override
    protected ContentStreamLoader newLoader(SolrQueryRequest req, UpdateRequestProcessor processor) {
      return new XsltXMLLoader(processor, inputFactory, xsltCacheLifetimeSeconds);
    }
  
    //////////////////////// SolrInfoMBeans methods //////////////////////
  
    @Override
    public String getDescription() {
      return "Add documents with XML, transforming with XSLT first";
    }
  
    @Override
    public String getVersion() {
      return "$Revision: 1142003 $";
    }
  
    @Override
    public String getSourceId() {
      return "$Id: XsltUpdateRequestHandler.java 1142003 2011-07-01 17:37:17Z uschindler $";
    }
  
    @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/XsltUpdateRequestHandler.java $";
    }
  
  
  }
  