Skip to content
Snippets Groups Projects
Commit ee219505 authored by Nelson Tavares de Sousa's avatar Nelson Tavares de Sousa
Browse files

Merge remote-tracking branch 'origin/master' into site

parents 1f780213 31c4ba40
No related branches found
No related tags found
No related merge requests found
Showing
with 119 additions and 130 deletions
#FindBugs User Preferences #FindBugs User Preferences
#Tue Nov 18 10:57:28 CET 2014 #Tue Nov 25 12:10:00 CET 2014
detector_threshold=3 detector_threshold=3
effort=max effort=max
excludefilter0=.fbExcludeFilterFile|true excludefilter0=.fbExcludeFilterFile|true
......
package teetime.framework.pipe; package teetime.framework;
import java.util.Queue; import java.util.Queue;
...@@ -7,15 +7,14 @@ import org.jctools.queues.spec.ConcurrentQueueSpec; ...@@ -7,15 +7,14 @@ import org.jctools.queues.spec.ConcurrentQueueSpec;
import org.jctools.queues.spec.Ordering; import org.jctools.queues.spec.Ordering;
import org.jctools.queues.spec.Preference; import org.jctools.queues.spec.Preference;
import teetime.framework.InputPort; import teetime.framework.pipe.AbstractPipe;
import teetime.framework.OutputPort;
import teetime.framework.signal.ISignal; import teetime.framework.signal.ISignal;
public abstract class AbstractInterThreadPipe extends AbstractPipe { public abstract class AbstractInterThreadPipe extends AbstractPipe {
private final Queue<ISignal> signalQueue = QueueFactory.newQueue(new ConcurrentQueueSpec(1, 1, 0, Ordering.FIFO, Preference.THROUGHPUT)); private final Queue<ISignal> signalQueue = QueueFactory.newQueue(new ConcurrentQueueSpec(1, 1, 0, Ordering.FIFO, Preference.THROUGHPUT));
<T> AbstractInterThreadPipe(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) { protected <T> AbstractInterThreadPipe(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
super(sourcePort, targetPort); super(sourcePort, targetPort);
} }
......
package teetime.framework.pipe; package teetime.framework;
import teetime.framework.InputPort; import teetime.framework.pipe.AbstractPipe;
import teetime.framework.OutputPort;
import teetime.framework.signal.ISignal; import teetime.framework.signal.ISignal;
public abstract class AbstractIntraThreadPipe extends AbstractPipe { public abstract class AbstractIntraThreadPipe extends AbstractPipe {
protected <T> AbstractIntraThreadPipe(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
<T> AbstractIntraThreadPipe(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
super(sourcePort, targetPort); super(sourcePort, targetPort);
} }
@Override @Override
public void sendSignal(final ISignal signal) { public final void sendSignal(final ISignal signal) {
if (this.getTargetPort() != null) { // BETTER remove this check since there are DummyPorts // if (this.getTargetPort() != null) { // BETTER remove this check since there are DummyPorts
this.cachedTargetStage.onSignal(signal, this.getTargetPort()); this.cachedTargetStage.onSignal(signal, this.getTargetPort());
} // }
} }
@Override @Override
......
...@@ -9,7 +9,7 @@ package teetime.framework; ...@@ -9,7 +9,7 @@ package teetime.framework;
* the type of the default output port * the type of the default output port
* *
*/ */
public abstract class AbstractProducerStage<O> extends AbstractStage implements IStage { public abstract class AbstractProducerStage<O> extends AbstractStage {
protected final OutputPort<O> outputPort = this.createOutputPort(); protected final OutputPort<O> outputPort = this.createOutputPort();
......
package teetime.framework; package teetime.framework;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Set;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import teetime.framework.pipe.DummyPipe; import teetime.framework.pipe.DummyPipe;
import teetime.framework.pipe.IPipe; import teetime.framework.pipe.IPipe;
import teetime.framework.signal.ISignal; import teetime.framework.signal.ISignal;
import teetime.framework.validation.InvalidPortConnection; import teetime.framework.validation.InvalidPortConnection;
public abstract class AbstractStage implements IStage { public abstract class AbstractStage extends Stage {
private final String id;
/**
* A unique logger instance per stage instance
*/
protected final Logger logger; // NOPMD
private IStage parentStage;
private final List<InputPort<?>> inputPortList = new ArrayList<InputPort<?>>(); private final List<InputPort<?>> inputPortList = new ArrayList<InputPort<?>>();
private final List<OutputPort<?>> outputPortList = new ArrayList<OutputPort<?>>(); private final List<OutputPort<?>> outputPortList = new ArrayList<OutputPort<?>>();
...@@ -32,31 +20,9 @@ public abstract class AbstractStage implements IStage { ...@@ -32,31 +20,9 @@ public abstract class AbstractStage implements IStage {
/** A cached instance of <code>outputPortList</code> to avoid creating an iterator each time iterating it */ /** A cached instance of <code>outputPortList</code> to avoid creating an iterator each time iterating it */
protected OutputPort<?>[] cachedOutputPorts; protected OutputPort<?>[] cachedOutputPorts;
private final Map<ISignal, Void> visited = new HashMap<ISignal, Void>(); private final Set<ISignal> triggeredSignals = new HashSet<ISignal>();
private boolean shouldTerminate; private boolean shouldTerminate;
public AbstractStage() {
this.id = UUID.randomUUID().toString(); // the id should only be represented by a UUID, not additionally by the class name
this.logger = LoggerFactory.getLogger(this.getClass().getName() + "(" + this.id + ")");
}
/**
* Sends the given <code>element</code> using the default output port
*
* @param element
* @return <code>true</code> iff the given element could be sent, <code>false</code> otherwise (then use a re-try strategy)
*/
protected final <O> boolean send(final OutputPort<O> outputPort, final O element) {
if (!outputPort.send(element)) {
return false;
}
outputPort.reportNewElement();
return true;
// return outputPort.send(element);
}
private void connectUnconnectedOutputPorts() { private void connectUnconnectedOutputPorts() {
for (OutputPort<?> outputPort : this.cachedOutputPorts) { for (OutputPort<?> outputPort : this.cachedOutputPorts) {
if (null == outputPort.getPipe()) { // if port is unconnected if (null == outputPort.getPipe()) { // if port is unconnected
...@@ -74,21 +40,6 @@ public abstract class AbstractStage implements IStage { ...@@ -74,21 +40,6 @@ public abstract class AbstractStage implements IStage {
return this.cachedOutputPorts; return this.cachedOutputPorts;
} }
@Override
public IStage getParentStage() {
return this.parentStage;
}
@Override
public void setParentStage(final IStage parentStage, final int index) {
this.parentStage = parentStage;
}
@Override
public String getId() {
return this.id;
}
/** /**
* May not be invoked outside of IPipe implementations * May not be invoked outside of IPipe implementations
*/ */
...@@ -104,12 +55,12 @@ public abstract class AbstractStage implements IStage { ...@@ -104,12 +55,12 @@ public abstract class AbstractStage implements IStage {
} }
protected boolean alreadyVisited(final ISignal signal, final InputPort<?> inputPort) { protected boolean alreadyVisited(final ISignal signal, final InputPort<?> inputPort) {
if (this.visited.containsKey(signal)) { if (this.triggeredSignals.contains(signal)) {
this.logger.trace("Got signal: " + signal + " again from input port: " + inputPort); this.logger.trace("Got signal: " + signal + " again from input port: " + inputPort);
return true; return true;
} else { } else {
this.logger.trace("Got signal: " + signal + " from input port: " + inputPort); this.logger.trace("Got signal: " + signal + " from input port: " + inputPort);
this.visited.put(signal, null); this.triggeredSignals.add(signal);
return false; return false;
} }
} }
...@@ -158,11 +109,6 @@ public abstract class AbstractStage implements IStage { ...@@ -158,11 +109,6 @@ public abstract class AbstractStage implements IStage {
} }
} }
@Override
public String toString() {
return this.getClass().getName() + ": " + this.id;
}
@Override @Override
public void terminate() { public void terminate() {
this.shouldTerminate = true; this.shouldTerminate = true;
......
...@@ -28,8 +28,8 @@ public class Analysis implements UncaughtExceptionHandler { ...@@ -28,8 +28,8 @@ public class Analysis implements UncaughtExceptionHandler {
} }
public void init() { public void init() {
final List<IStage> threadableStageJobs = this.configuration.getThreadableStageJobs(); final List<Stage> threadableStageJobs = this.configuration.getThreadableStageJobs();
for (IStage stage : threadableStageJobs) { for (Stage stage : threadableStageJobs) {
final Thread thread = new Thread(new RunnableStage(stage)); final Thread thread = new Thread(new RunnableStage(stage));
switch (stage.getTerminationStrategy()) { switch (stage.getTerminationStrategy()) {
case BY_SIGNAL: case BY_SIGNAL:
......
...@@ -8,15 +8,15 @@ import teetime.framework.pipe.PipeFactoryRegistry; ...@@ -8,15 +8,15 @@ import teetime.framework.pipe.PipeFactoryRegistry;
public class AnalysisConfiguration { public class AnalysisConfiguration {
protected static final PipeFactoryRegistry PIPE_FACTORY_REGISTRY = PipeFactoryRegistry.INSTANCE; protected static final PipeFactoryRegistry PIPE_FACTORY_REGISTRY = PipeFactoryRegistry.INSTANCE;
private final List<IStage> threadableStageJobs = new LinkedList<IStage>(); private final List<Stage> threadableStageJobs = new LinkedList<Stage>();
public AnalysisConfiguration() {} public AnalysisConfiguration() {}
List<IStage> getThreadableStageJobs() { List<Stage> getThreadableStageJobs() {
return this.threadableStageJobs; return this.threadableStageJobs;
} }
public void addThreadableStage(final IStage stage) { public void addThreadableStage(final Stage stage) {
this.threadableStageJobs.add(stage); this.threadableStageJobs.add(stage);
} }
......
package teetime.framework;
import java.util.List;
import teetime.framework.signal.ISignal;
import teetime.framework.validation.InvalidPortConnection;
public interface IStage extends ITerminable {
String getId();
void executeWithPorts();
IStage getParentStage();
void setParentStage(IStage parentStage, int index);
void onSignal(ISignal signal, InputPort<?> inputPort);
/**
*
* @param invalidPortConnections
* <i>(Passed as parameter for performance reasons)</i>
*/
void validateOutputPorts(List<InvalidPortConnection> invalidPortConnections);
}
package teetime.framework;
interface ITerminable {
TerminationStrategy getTerminationStrategy();
void terminate();
boolean shouldBeTerminated();
}
...@@ -4,9 +4,9 @@ import teetime.framework.pipe.IPipe; ...@@ -4,9 +4,9 @@ import teetime.framework.pipe.IPipe;
public class InputPort<T> extends AbstractPort<T> { public class InputPort<T> extends AbstractPort<T> {
private final IStage owningStage; private final Stage owningStage;
InputPort(final IStage owningStage) { InputPort(final Stage owningStage) {
super(); super();
this.owningStage = owningStage; this.owningStage = owningStage;
} }
...@@ -33,7 +33,7 @@ public class InputPort<T> extends AbstractPort<T> { ...@@ -33,7 +33,7 @@ public class InputPort<T> extends AbstractPort<T> {
this.pipe = pipe; this.pipe = pipe;
} }
public IStage getOwningStage() { public Stage getOwningStage() {
return this.owningStage; return this.owningStage;
} }
......
...@@ -9,20 +9,22 @@ public final class OutputPort<T> extends AbstractPort<T> { ...@@ -9,20 +9,22 @@ public final class OutputPort<T> extends AbstractPort<T> {
} }
/** /**
*
* @param element * @param element
* @return <code>true</code> iff the given <code>element</code> could be sent, <code>false</code> otherwise (then use a re-try strategy) * to be sent
*/ */
public boolean send(final T element) { public void send(final T element) {
return this.pipe.add(element); if (this.pipe.add(element)) {
this.pipe.reportNewElement();
}
} }
/**
*
* @param signal
* to be sent
*/
public void sendSignal(final ISignal signal) { public void sendSignal(final ISignal signal) {
this.pipe.sendSignal(signal); this.pipe.sendSignal(signal);
} }
public void reportNewElement() {
this.pipe.reportNewElement();
}
} }
...@@ -8,14 +8,13 @@ import teetime.framework.signal.TerminatingSignal; ...@@ -8,14 +8,13 @@ import teetime.framework.signal.TerminatingSignal;
import teetime.framework.signal.ValidatingSignal; import teetime.framework.signal.ValidatingSignal;
import teetime.framework.validation.AnalysisNotValidException; import teetime.framework.validation.AnalysisNotValidException;
@SuppressWarnings("PMD.BeanMembersShouldSerialize")
public class RunnableStage implements Runnable { public class RunnableStage implements Runnable {
private final IStage stage; private final Stage stage;
private final Logger logger; // NOPMD private final Logger logger; // NOPMD
private boolean validationEnabled; private boolean validationEnabled;
public RunnableStage(final IStage stage) { public RunnableStage(final Stage stage) {
this.stage = stage; this.stage = stage;
this.logger = LoggerFactory.getLogger(stage.getClass()); this.logger = LoggerFactory.getLogger(stage.getClass());
} }
......
package teetime.framework;
import java.util.List;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import teetime.framework.signal.ISignal;
import teetime.framework.validation.InvalidPortConnection;
public abstract class Stage {
private final String id;
/**
* A unique logger instance per stage instance
*/
protected final Logger logger; // NOPMD
protected Stage() {
this.id = UUID.randomUUID().toString(); // the id should only be represented by a UUID, not additionally by the class name
this.logger = LoggerFactory.getLogger(this.getClass().getName() + "(" + this.id + ")");
}
public String getId() {
return this.id;
}
@Override
public String toString() {
return this.getClass().getName() + ": " + this.getId();
}
// public abstract Stage getParentStage();
//
// public abstract void setParentStage(Stage parentStage, int index);
/**
*
* @param invalidPortConnections
* <i>(Passed as parameter for performance reasons)</i>
*/
public abstract void validateOutputPorts(List<InvalidPortConnection> invalidPortConnections);
protected abstract void executeWithPorts();
protected abstract void onSignal(ISignal signal, InputPort<?> inputPort);
protected abstract TerminationStrategy getTerminationStrategy();
protected abstract void terminate();
protected abstract boolean shouldBeTerminated();
}
package teetime.framework.pipe; package teetime.framework.pipe;
import teetime.framework.IStage; import teetime.framework.Stage;
import teetime.framework.InputPort; import teetime.framework.InputPort;
import teetime.framework.OutputPort; import teetime.framework.OutputPort;
...@@ -13,7 +13,7 @@ public abstract class AbstractPipe implements IPipe { ...@@ -13,7 +13,7 @@ public abstract class AbstractPipe implements IPipe {
* this.getPipe().getTargetPort().getOwningStage() * this.getPipe().getTargetPort().getOwningStage()
* </pre> * </pre>
*/ */
protected IStage cachedTargetStage; protected Stage cachedTargetStage;
private InputPort<?> targetPort; private InputPort<?> targetPort;
......
package teetime.framework.pipe; package teetime.framework.pipe;
import teetime.framework.AbstractIntraThreadPipe;
import teetime.framework.InputPort; import teetime.framework.InputPort;
import teetime.framework.OutputPort; import teetime.framework.OutputPort;
import teetime.util.list.CommittableResizableArrayQueue; import teetime.util.list.CommittableResizableArrayQueue;
......
package teetime.framework.pipe; package teetime.framework.pipe;
import teetime.framework.AbstractIntraThreadPipe;
import teetime.framework.InputPort; import teetime.framework.InputPort;
import teetime.framework.OutputPort; import teetime.framework.OutputPort;
import teetime.util.concurrent.workstealing.CircularArray; import teetime.util.concurrent.workstealing.CircularArray;
......
...@@ -7,8 +7,6 @@ import teetime.framework.pipe.PipeFactoryRegistry.ThreadCommunication; ...@@ -7,8 +7,6 @@ import teetime.framework.pipe.PipeFactoryRegistry.ThreadCommunication;
public class OrderedGrowableArrayPipeFactory implements IPipeFactory { public class OrderedGrowableArrayPipeFactory implements IPipeFactory {
public OrderedGrowableArrayPipeFactory() {}
@Override @Override
public <T> IPipe create(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) { public <T> IPipe create(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
return this.create(sourcePort, targetPort, 4); return this.create(sourcePort, targetPort, 4);
......
...@@ -2,6 +2,7 @@ package teetime.framework.pipe; ...@@ -2,6 +2,7 @@ package teetime.framework.pipe;
import java.util.LinkedList; import java.util.LinkedList;
import teetime.framework.AbstractIntraThreadPipe;
import teetime.framework.InputPort; import teetime.framework.InputPort;
import teetime.framework.OutputPort; import teetime.framework.OutputPort;
......
...@@ -12,7 +12,7 @@ import java.util.List; ...@@ -12,7 +12,7 @@ import java.util.List;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import teetime.framework.FileSearcher; import teetime.util.classpath.FileSearcher;
public final class PipeFactoryLoader { public final class PipeFactoryLoader {
......
package teetime.framework.pipe; package teetime.framework.pipe;
import teetime.framework.AbstractInterThreadPipe;
import teetime.util.ConstructorClosure; import teetime.util.ConstructorClosure;
public final class RelayTestPipe<T> extends AbstractInterThreadPipe { public final class RelayTestPipe<T> extends AbstractInterThreadPipe {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment