blob: 8311f362840ba68e88671a585677d6d104566203 [file] [log] [blame]
/*
* 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";
}