| /* |
| * 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.dataimport; |
| |
| import org.apache.solr.common.SolrException; |
| |
| import static org.apache.solr.handler.dataimport.DataImportHandlerException.*; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| import java.lang.invoke.MethodHandles; |
| import java.util.*; |
| |
| /** |
| * <p> Base class for all implementations of {@link EntityProcessor} </p> <p> Most implementations of {@link EntityProcessor} |
| * extend this base class which provides common functionality. </p> |
| * <p> |
| * <b>This API is experimental and subject to change</b> |
| * |
| * @since solr 1.3 |
| */ |
| public class EntityProcessorBase extends EntityProcessor { |
| private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); |
| |
| protected boolean isFirstInit = true; |
| |
| protected String entityName; |
| |
| protected Context context; |
| |
| protected Iterator<Map<String, Object>> rowIterator; |
| |
| protected String query; |
| |
| protected String onError = ABORT; |
| |
| protected DIHCacheSupport cacheSupport = null; |
| |
| private Zipper zipper; |
| |
| |
| @Override |
| public void init(Context context) { |
| this.context = context; |
| if (isFirstInit) { |
| firstInit(context); |
| } |
| if(zipper!=null){ |
| zipper.onNewParent(context); |
| }else{ |
| if(cacheSupport!=null) { |
| cacheSupport.initNewParent(context); |
| } |
| } |
| } |
| |
| /** |
| * first time init call. do one-time operations here |
| * it's necessary to call it from the overridden method, |
| * otherwise it throws NPE on accessing zipper from nextRow() |
| */ |
| protected void firstInit(Context context) { |
| entityName = context.getEntityAttribute("name"); |
| String s = context.getEntityAttribute(ON_ERROR); |
| if (s != null) onError = s; |
| |
| zipper = Zipper.createOrNull(context); |
| |
| if(zipper==null){ |
| initCache(context); |
| } |
| isFirstInit = false; |
| } |
| |
| protected void initCache(Context context) { |
| String cacheImplName = context |
| .getResolvedEntityAttribute(DIHCacheSupport.CACHE_IMPL); |
| |
| if (cacheImplName != null ) { |
| cacheSupport = new DIHCacheSupport(context, cacheImplName); |
| } |
| } |
| |
| @Override |
| public Map<String, Object> nextModifiedRowKey() { |
| return null; |
| } |
| |
| @Override |
| public Map<String, Object> nextDeletedRowKey() { |
| return null; |
| } |
| |
| @Override |
| public Map<String, Object> nextModifiedParentRowKey() { |
| return null; |
| } |
| |
| /** |
| * For a simple implementation, this is the only method that the sub-class should implement. This is intended to |
| * stream rows one-by-one. Return null to signal end of rows |
| * |
| * @return a row where the key is the name of the field and value can be any Object or a Collection of objects. Return |
| * null to signal end of rows |
| */ |
| @Override |
| public Map<String, Object> nextRow() { |
| return null;// do not do anything |
| } |
| |
| protected Map<String, Object> getNext() { |
| if(zipper!=null){ |
| return zipper.supplyNextChild(rowIterator); |
| }else{ |
| if(cacheSupport==null) { |
| try { |
| if (rowIterator == null) |
| return null; |
| if (rowIterator.hasNext()) |
| return rowIterator.next(); |
| query = null; |
| rowIterator = null; |
| return null; |
| } catch (Exception e) { |
| SolrException.log(log, "getNext() failed for query '" + query + "'", e); |
| query = null; |
| rowIterator = null; |
| wrapAndThrow(DataImportHandlerException.WARN, e); |
| return null; |
| } |
| } else { |
| return cacheSupport.getCacheData(context, query, rowIterator); |
| } |
| } |
| } |
| |
| |
| @Override |
| public void destroy() { |
| query = null; |
| if(cacheSupport!=null){ |
| cacheSupport.destroyAll(); |
| } |
| cacheSupport = null; |
| } |
| |
| |
| |
| public static final String TRANSFORMER = "transformer"; |
| |
| public static final String TRANSFORM_ROW = "transformRow"; |
| |
| public static final String ON_ERROR = "onError"; |
| |
| public static final String ABORT = "abort"; |
| |
| public static final String CONTINUE = "continue"; |
| |
| public static final String SKIP = "skip"; |
| } |