blob: 8e135b687203ae4a5724c55c93d10f952ef01476 [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.stanbol.enhancer.jobmanager.impl;
import static org.apache.stanbol.enhancer.servicesapi.helper.EnhancementEngineHelper.EXECUTION_ORDER_COMPARATOR;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.stanbol.enhancer.servicesapi.Chain;
import org.apache.stanbol.enhancer.servicesapi.ContentItem;
import org.apache.stanbol.enhancer.servicesapi.EngineException;
import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
import org.apache.stanbol.enhancer.servicesapi.EnhancementException;
import org.apache.stanbol.enhancer.servicesapi.EnhancementJobManager;
import org.apache.stanbol.enhancer.servicesapi.ServiceProperties;
import org.apache.stanbol.enhancer.servicesapi.helper.EnhancementEngineHelper;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Naive EnhancementJobManager implementation that keeps its request queue in
* memory.
*
* @scr.component immediate="true"
* @scr.service
* @scr.reference name="EnhancementEngine"
* interface="org.apache.stanbol.enhancer.servicesapi.EnhancementEngine"
* cardinality="0..n" policy="dynamic"
* @scr.property name="service.ranking"
* value="-1000"
* type="Integer"
*/
public class WeightedJobManager implements EnhancementJobManager {
private static final Logger log = LoggerFactory.getLogger(WeightedJobManager.class);
// handle thread safety efficiently when traversals (e.g. when calling
// #enhanceContent) are expected to be much more frequent than mutable
// operations (binding or unbinding engines).
//NITE CopyOnWriteArrayList can no longer be used, becuase,
// Iterators over CopyOnWriteArrayList do not support add/remove ...
// Therefore this implementation can not be used for Collections.sort
// Therefore a new ArrayList is generated each time an add/reomve
// operation is performed
private List<EnhancementEngine> sortedEngineList = new ArrayList<EnhancementEngine>();
@Override
public void enhanceContent(ContentItem ci) throws EngineException {
log.debug("enhanceContent({}), {} engines available", ci, sortedEngineList.size());
Iterator<EnhancementEngine> engines;
//changes in the sortedEngineList do creates new Lists. Therefore we need
//only sync the creation of the Iterator. Calls to the iterator will
//not trigger ConcurrentModificationExceptions
//however the remove Method will not have any affect if the list was
//changed.
synchronized (sortedEngineList) {
engines = sortedEngineList.iterator();
}
long start = System.currentTimeMillis();
while (engines.hasNext()) {
EnhancementEngine engine = engines.next();
long startEngine = System.currentTimeMillis();
if (engine.canEnhance(ci) == EnhancementEngine.CANNOT_ENHANCE) {
log.debug("[{}] cannot be enhanced by engine [{}], skipping",
ci.getUri().getUnicodeString(), engine);
} else {
// TODO should handle sync/async enhancing. All sync for now.
engine.computeEnhancements(ci);
log.debug("ContentItem [{}] enhanced by engine [{}] in {}ms",
new Object[]{ci.getUri().getUnicodeString(), engine,System.currentTimeMillis()-startEngine});
}
}
log.debug("ContentItem [{}] enhanced in {}ms",ci.getUri().getUnicodeString(),(System.currentTimeMillis()-start));
}
@Override
public void enhanceContent(ContentItem ci, Chain chain) throws EngineException {
if(chain != null){
log.error("This EnhancementJobManager implementation does not yet" +
"support Enhancement Chains");
}
//This implementation don't take "chain" in account.
enhanceContent(ci);
}
public void bindEnhancementEngine(EnhancementEngine e) {
synchronized (sortedEngineList) {
List<EnhancementEngine> newList = new ArrayList<EnhancementEngine>(sortedEngineList);
newList.add(e);
Collections.sort(newList,EXECUTION_ORDER_COMPARATOR);
sortedEngineList = newList;
}
log.info("EnhancementEngine {} added to our list: {}", e, sortedEngineList);
}
public void unbindEnhancementEngine(EnhancementEngine e) {
synchronized (sortedEngineList) {
List<EnhancementEngine> newList = new ArrayList<EnhancementEngine>(sortedEngineList);
newList.remove(e);
sortedEngineList = newList;
}
log.info("EnhancementEngine {} removed from our list: {}", e, sortedEngineList);
}
public List<EnhancementEngine> getActiveEngines() {
return Collections.unmodifiableList(sortedEngineList);
}
}