Skip to content
Snippets Groups Projects
Commit aac0f0ba authored by Lars Erik Blümke's avatar Lars Erik Blümke
Browse files

New class to merge TeeTime filter with Kieker IAnalysisComponent Interface - (first solution)

parent 07167d3d
No related branches found
No related tags found
No related merge requests found
package kieker.analysis.plugin.filter;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import kieker.analysis.AnalysisController;
import kieker.analysis.IProjectContext;
import kieker.analysis.analysisComponent.AbstractAnalysisComponent;
import kieker.analysis.analysisComponent.IAnalysisComponent;
import kieker.analysis.exception.InvalidProjectContextException;
import kieker.analysis.plugin.annotation.Plugin;
import kieker.analysis.plugin.annotation.Property;
import kieker.common.configuration.Configuration;
import kieker.common.logging.Log;
import kieker.common.logging.LogFactory;
import teetime.stage.basic.AbstractFilter;
public abstract class AbstractKiekerFilter<E> extends AbstractFilter<E> implements IAnalysisComponent {
/** The name of the property for the name. This should normally only be used by Kieker. */
public static final String CONFIG_NAME = "name-hiddenAndNeverExportedProperty";
protected static final Log LOG = LogFactory.getLog(AbstractAnalysisComponent.class); // NOPMD (logger for inheriting classes)
private static final AtomicInteger UNNAMED_COUNTER = new AtomicInteger(0);
/** The project context (usually the analysis controller) of this component. */
protected final IProjectContext projectContext;
/** The current configuration of this component. */
protected final Configuration configuration;
/** The log for this component. */
protected final Log log; // NOPMD (logger for inheriting classes)
/** The record time unit as provided by the project context. */
protected final TimeUnit recordsTimeUnitFromProjectContext;
private final String name;
/**
* Each AnalysisComponent requires a constructor with a Configuration object and a IProjectContext.
*
* @param configuration
* The configuration for this component.
* @param projectContext
* The project context for this component. The component will be registered.
*
* @throws NullPointerException
* If configuration or projectContext null
*/
public AbstractKiekerFilter(final Configuration configuration, final IProjectContext projectContext) throws NullPointerException {
super();
if (null == projectContext) {
throw new NullPointerException("Missing projectContext");
}
if (null == configuration) {
throw new NullPointerException("Missing configuration");
}
this.projectContext = projectContext;
// somewhat dirty hack...
configuration.setDefaultConfiguration(this.getDefaultConfiguration());
this.configuration = configuration;
// Get the controller, as we have to register the name
final AnalysisController ac;
if (projectContext instanceof AnalysisController) {
ac = (AnalysisController) projectContext;
} else {
throw new InvalidProjectContextException("Invalid analysis controller in constructor");
}
// Try to determine the name
String tmpName = configuration.getStringProperty(CONFIG_NAME);
while ((tmpName.length() == 0) || !ac.tryRegisterComponentName(tmpName)) {
tmpName = this.getClass().getSimpleName() + '-' + UNNAMED_COUNTER.incrementAndGet();
}
this.name = tmpName;
// As we have now a name, we can create our logger
this.log = LogFactory.getLog(this.getClass().getName() + " (" + this.name + ")");
// Try the record time unit
final String recordTimeunitProperty = projectContext.getProperty(IProjectContext.CONFIG_PROPERTY_NAME_RECORDS_TIME_UNIT);
TimeUnit recordTimeunit;
try {
recordTimeunit = TimeUnit.valueOf(recordTimeunitProperty);
} catch (final IllegalArgumentException ex) { // already caught in AnalysisController, should never happen
this.log.warn(recordTimeunitProperty + " is no valid TimeUnit! Using NANOSECONDS instead.");
recordTimeunit = TimeUnit.NANOSECONDS;
}
this.recordsTimeUnitFromProjectContext = recordTimeunit;
}
@Override
protected void execute(final E element) {
super.execute();
}
/**
* This method delivers an instance of {@code Configuration} containing the default properties for this class.
*
* @return The default properties.
*/
protected final Configuration getDefaultConfiguration() {
final Configuration defaultConfiguration = new Configuration();
// Get the annotation from the class
final Plugin pluginAnnotation = this.getClass().getAnnotation(Plugin.class);
final Property[] propertyAnnotations = pluginAnnotation.configuration();
// Run through all properties within the annotation and add them to the configuration object
for (final Property property : propertyAnnotations) {
defaultConfiguration.setProperty(property.name(), property.defaultValue());
}
return defaultConfiguration;
}
/**
* {@inheritDoc}
*/
@Override
public abstract Configuration getCurrentConfiguration();
/**
* {@inheritDoc}
*/
@Override
public final String getName() {
return this.name;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment