package org.atomnuke.examples.source;
import java.util.concurrent.atomic.AtomicLong;
import org.atomnuke.atom.model.Entry;
import org.atomnuke.atom.model.Feed;
import org.atomnuke.atom.model.builder.AuthorBuilder;
import org.atomnuke.atom.model.builder.CategoryBuilder;
import org.atomnuke.atom.model.builder.EntryBuilder;
import org.atomnuke.atom.model.builder.FeedBuilder;
import org.atomnuke.atom.model.builder.IdBuilder;
import org.atomnuke.atom.model.builder.TitleBuilder;
import org.atomnuke.lifecycle.DestructionException;
import org.atomnuke.lifecycle.InitializationException;
import org.atomnuke.source.AtomSource;
import org.atomnuke.source.AtomSourceException;
import org.atomnuke.source.result.AtomSourceResult;
import org.atomnuke.source.result.AtomSourceResultImpl;
import org.atomnuke.task.context.AtomTaskContext;
/**
*
* @author zinic
*/
public class EventGenerator implements AtomSource {
private final boolean generateFeed, generateForever;
private final String generatorPrefix;
private final AtomicLong remainingEvents;
public EventGenerator() {
this(0, "", true, true);
}
public EventGenerator(String generatorPrefix, boolean generateFeed) {
this(0, generatorPrefix, generateFeed, true);
}
public EventGenerator(long remainingEvents, String generatorPrefix, boolean generateFeed) {
this(0, generatorPrefix, generateFeed, false);
}
private EventGenerator(long remainingEvents, String generatorPrefix, boolean generateFeed, boolean generateForever) {
this.remainingEvents = new AtomicLong(remainingEvents);
this.generatorPrefix = generatorPrefix;
this.generateFeed = generateFeed;
this.generateForever = generateForever;
}
@Override
public void init(AtomTaskContext tc) throws InitializationException {
}
@Override
public void destroy() {
}
private Entry buildEntry(String id) {
final EntryBuilder entry = new EntryBuilder();
final IdBuilder idBuilder = new IdBuilder();
idBuilder.appendValue(id);
entry.setId(idBuilder.build());
final CategoryBuilder testCat = new CategoryBuilder();
testCat.setTerm("test");
entry.addCategory(testCat.build());
if (Math.random() > 0.5) {
final CategoryBuilder otherCat = new CategoryBuilder();
otherCat.setTerm("other-cat");
entry.addCategory(otherCat.build());
}
return entry.build();
}
private Feed buildFeed() {
final FeedBuilder feed = new FeedBuilder();
final TitleBuilder title = new TitleBuilder();
title.appendValue(generatorPrefix).appendValue(" Example Feed");
feed.setTitle(title.build());
final AuthorBuilder author = new AuthorBuilder();
author.setName("Author");
feed.addAuthor(author.build());
final CategoryBuilder category = new CategoryBuilder();
category.setTerm("test");
feed.addCategory(category.build());
for (int entryNum = 1; entryNum <= 50; entryNum++) {
feed.addEntry(buildEntry("urn:entryid:" + generatorPrefix + "-" + entryNum));
}
return feed.build();
}
@Override
public AtomSourceResult poll() throws AtomSourceException {
if (!generateForever && remainingEvents.decrementAndGet() < 0) {
throw new AtomSourceException("Out of messages!");
}
if (generateFeed) {
return new AtomSourceResultImpl(buildFeed());
} else {
return new AtomSourceResultImpl(buildEntry("urn:entryid:" + generatorPrefix + "-0"));
}
}
}