/**
* Copyright 2015 Otto (GmbH & Co KG)
*
* Licensed 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 com.ottogroup.bi.spqr.pipeline.component.source;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.ottogroup.bi.spqr.exception.ComponentInitializationFailedException;
import com.ottogroup.bi.spqr.exception.RequiredInputMissingException;
import com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponentType;
import com.ottogroup.bi.spqr.pipeline.message.StreamingDataMessage;
/**
* Generates random numbers until it is stopped or it reaches a max of generated numbers as configured
* @author mnxfst
* @since Mar 6, 2015
*/
public class RandomNumberTestSource implements Source {
private static final Logger logger = Logger.getLogger(RandomNumberTestSource.class);
public static final String CFG_MAX_NUM_GENERATED = "maxNumGenerated";
public static final String CFG_SEED = "seed";
public static final String CFG_CONTENT = "content";
private String id = null;
private int maxNumGenerated = 0;
private long seed = 0;
private boolean running = false;
private IncomingMessageCallback callback;
private byte[] content = null;
/**
* @see com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponent#initialize(java.util.Properties)
*/
public void initialize(Properties properties) throws RequiredInputMissingException, ComponentInitializationFailedException {
this.maxNumGenerated = Integer.parseInt(StringUtils.trim(properties.getProperty(CFG_MAX_NUM_GENERATED)));
try {
this.seed = Long.parseLong(StringUtils.trim(properties.getProperty(CFG_SEED)));
} catch(Exception e) {
//
}
this.content = (properties.containsKey(CFG_CONTENT) ? properties.getProperty(CFG_CONTENT).getBytes() : new byte[0]);
this.running = true;
}
/**
* @see java.lang.Runnable#run()
*/
public void run() {
logger.info("Starting random number generator");
// Random rnd = null;
// if(seed > 0)
// rnd = new Random(seed);
// else
// rnd = new Random();
int count = 0;
long s1 = System.currentTimeMillis();
while(running && maxNumGenerated != 0) {
count ++;
this.callback.onMessage(new StreamingDataMessage(this.content, System.currentTimeMillis())); // string conversion takes too long!
maxNumGenerated--;
}
logger.info(count + " numbers generated in: " + (System.currentTimeMillis()-s1)+"ms");
}
/**
* @see com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponent#setId(java.lang.String)
*/
public void setId(String id) {
this.id = id;
}
/**
* @see com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponent#shutdown()
*/
public boolean shutdown() {
this.running = false;
return true;
}
/**
* @see com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponent#getId()
*/
public String getId() {
return this.id;
}
/**
* @see com.ottogroup.bi.spqr.pipeline.component.source.Source#setIncomingMessageCallback(com.ottogroup.bi.spqr.pipeline.component.source.IncomingMessageCallback)
*/
public void setIncomingMessageCallback(IncomingMessageCallback incomingMessageCallback) {
this.callback = incomingMessageCallback;
}
/**
* @see com.ottogroup.bi.spqr.pipeline.component.MicroPipelineComponent#getType()
*/
public MicroPipelineComponentType getType() {
return MicroPipelineComponentType.SOURCE;
}
public long getSeed() {
return seed;
}
public void setSeed(long seed) {
this.seed = seed;
}
}