package project.core.mbeans.crawlers;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
import javax.ejb.Stateful;
import org.jboss.annotation.ejb.RemoteBinding;
import org.jboss.annotation.ejb.SerializedConcurrentAccess;
import org.jboss.annotation.ejb.cache.simple.CacheConfig;
import project.core.mbeans.database.ConnectionManagerMysqlImpl;
import project.utils.statistics.ObjectLooseProperties;
@Stateful
@RemoteBinding(jndiBinding="ThreadCrawler")
@SerializedConcurrentAccess
@CacheConfig(removalTimeoutSeconds=18000L)
public class ThreadCrawler extends ConnectionManagerMysqlImpl implements ThreadCrawlerMBean {
private transient Connection connection = null;
private Map<String,CrawlerSettingsData> settings;
private Map<String,CrawlerData> crawlers;
private transient List<IMessageThreadRunnable> runnables = new LinkedList<IMessageThreadRunnable> ();
@PostConstruct
public void start() {
System.out.println ("ThreadCrawler started");
try {
this.setConnectionParams("ebas", "gwtebas", "bachelor_project");
connection = this.getConnection();
settings = new HashMap<String, CrawlerSettingsData> ();
crawlers = new HashMap<String, CrawlerData> ();
this.setup();
//setJndiName(this.getClass().getSimpleName());
} catch (Exception e) {
e.printStackTrace();
}
}
@PrePassivate
public void passivate () {
System.out.println ("ThreadCrawler prepassivate");
}
@PostActivate
public void activate () {
System.out.println ("ThreadCrawler activate");
}
@PreDestroy
public void stop() {
//saveSettings();
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
/*
//
// terminate all runnables
Iterator<IMessageThreadRunnable> i = runnables.iterator();
while (i.hasNext()) {
IMessageThreadRunnable runnable = i.next();
runnable.stop(true);
}
runnables.clear();
*/
System.out.println ("ThreadCrawler stopped");
}
public void addCrawler (
String crawlerName,
String crawlerType,
String url,
int minSleepPerPage, int maxSleepPerPage,
int minSleepPerThread, int maxSleepPerThread,
int startPage,
int maxPage,
boolean roundRobin,
boolean startNow) {
CrawlerData data = new CrawlerData ();
data.setName(crawlerName);
data.setType(crawlerType);
data.setUrl(url);
data.setMinSleepSecsPage(minSleepPerPage);
data.setMaxSleepSecsPage(maxSleepPerPage);
data.setMinSleepSecsThread(minSleepPerThread);
data.setMaxSleepSecsThread(maxSleepPerThread);
data.setStartPage(startPage);
data.setCurrentPage(startPage);
data.setEndPage(maxPage);
data.setRoundRobin(roundRobin);
data.setActive(startNow);
//
// Find out the settings
//
Iterator<String> i = settings.keySet().iterator();
while (i.hasNext()) {
String key = i.next();
CrawlerSettingsData set = settings.get(key);
if (data.getType().equals(set.getType())) {
data.setSettings(set);
break;
}
}
crawlers.put("" + (crawlers.size() + 1), data);
this.saveSettings();
try {
this.setup(crawlers.size());
} catch (SQLException e) {
e.printStackTrace();
}
}
private void setup ()
throws SQLException {
this.loadSettings();
//
// Load the crawlers
//
for (int i = 1; i <= crawlers.size(); i++) {
//this.setup (i);
}
}
private void setup (int index)
throws SQLException {
this.loadSettings();
//
// Load the crawlers
//
int numCrawlers = crawlers.size();
if (index <= 0 || index > numCrawlers)
return;
//
// find out the thread and message board classes
//
CrawlerData c = this.crawlers.get("" + index);
IMessageThreadRunnable runnable = new CMessageThreadRunnable (c, index);
runnables.add(runnable);
new Thread (runnable).start();
}
private synchronized void loadSettings () {
//
// load the settings from database
//
try {
this.settings.clear();
ObjectLooseProperties props = new ObjectLooseProperties ("Crawlers-settings");
int count = props.getNumEntries (connection, CrawlerSettingsData.getPropertyCount());
for (int i = 1; i <= count; i++) {
//
// load each property
//
props.getProperties().clear();
props.setId(i);
props.loadFromDatabase(connection);
CrawlerSettingsData data = new CrawlerSettingsData ();
data.setData(props.getProperties());
this.settings.put("" + i, data);
}
this.crawlers.clear();
props = new ObjectLooseProperties ("Crawlers");
count = props.getNumEntries (connection, CrawlerData.getPropertyCount());
for (int i = 1; i <= count; i++) {
//
// load each property
//
props.getProperties().clear();
props.setId(i);
props.loadFromDatabase(connection);
CrawlerData data = new CrawlerData ();
data.setData(props.getProperties());
Iterator<String> j = settings.keySet().iterator();
while (j.hasNext()) {
String key = j.next();
CrawlerSettingsData set = settings.get(key);
if (set.getType().equals(data.getType())) {
data.setSettings(set);
break;
}
}
this.crawlers.put("" + i, data);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private synchronized void saveSettings () {
//
// save the settings to database
//
try {
ObjectLooseProperties props = new ObjectLooseProperties ();
props.setTable("Crawlers-settings");
for (int i = 1; i <= settings.size(); i++) {
//
// save each property
//
props.getProperties().clear();
props.setId(i);
props.setProperties(settings.get("" + i).getData());
props.saveToDatabase(connection);
}
props.setTable("Crawlers");
for (int i = 1; i <= crawlers.size (); i++) {
//
// load each property
//
props.getProperties().clear();
props.setId(i);
props.setProperties(crawlers.get("" + i).getData());
props.saveToDatabase(connection);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Map<String, Map<String, String>> getCrawlers() {
this.loadSettings();
Map<String,Map<String,String>> map = new HashMap<String, Map<String,String>> ();
Iterator<String> i = crawlers.keySet().iterator();
while (i.hasNext()) {
String name = i.next();
map.put(name, crawlers.get(name).getData());
}
return map;
}
public Map<String, Map<String, String>> getCrawlerSettings (String name) {
this.loadSettings();
Map<String,Map<String,String>> map = new HashMap<String, Map<String,String>> ();
Iterator<String> i = settings.keySet().iterator();
while (i.hasNext()) {
String key = i.next();
map.put(key, settings.get(key).getData());
}
if (name != null) {
i = map.keySet().iterator();
while (i.hasNext()) {
String key = i.next();
if (!key.equals(name))
i.remove();
}
}
return map;
}
}