///** //* //* \file IRCClientData.java //* //* copyright (c) 2009-2010, Danny Arends //* last modified May, 2011 //* first written May, 2011 //* //* This program is free software; you can redistribute it and/or //* modify it under the terms of the GNU General Public License, //* version 3, as published by the Free Software Foundation. //* //* This program is distributed in the hope that it will be useful, //* but without any warranty; without even the implied warranty of //* merchantability or fitness for a particular purpose. See the GNU //* General Public License, version 3, for more details. //* //* A copy of the GNU General Public License, version 3, is available //* at http://www.r-project.org/Licenses/GPL-3 //* //*/ // //package ircbot; // //import java.text.DateFormat; //import java.text.SimpleDateFormat; //import java.util.ArrayList; //import java.util.Date; // //import generic.CommandExecutor; //import generic.Utils; // //import org.jibble.pircbot.PircBot; // ///** // * \brief Data structure holding data from all the clients<br> // * // * Data structure holding data from all the clients (could be generated) // * bugs: none found<br> // */ //public class IRCClientData implements Runnable{ // private String myname; // private int myid; // private Date start_time; // private String hostname; // private ArrayList<IRCClientData> otherClients = new ArrayList<IRCClientData>(); // private ArrayList<IRCJobStruct> jobQueue = new ArrayList<IRCJobStruct>(); // CommandExecutor cmd = new CommandExecutor(); // boolean verbose = false; // PircBot server; // private String date_format = "dd/MM/yyyy k:mm:ss:S"; // // IRCClientData(PircBot s,String name,int id,Date time){ // server = s; // myname = name; // myid = id; // start_time = time; // } // // IRCClientData(PircBot s,String host,String name,int id,Date time){ // this(s,name,id,time); // hostname=host; // } // // public void setHostName(String host){ // hostname=host; // } // // public String getIDString(){ // return "bot;" + getMyid() + ";" + hostname + ";" + getStart_time(); // } // // public String getHTMLString(){ // return "<td valign='top'><a href='?bot=" + getMyid() + "'><b>" + hostname + "</b></a></td><td valign='top'>" + getStart_time() + "</td>"; // } // // public String getFullName() { // return myname + "_" + getMyid(); // } // // public String getMyname() { // return myname; // } // // public int getMyid() { // return myid; // } // // public void removeClient(String sender, String hostname){ // if(verbose) System.out.println(sender + " leaving / left "); // boolean found = false; // for(int x = 0; x < getOther_clients().size();x++){ // if(getOther_clients().get(x).getFullName().equals(sender)){ // getOther_clients().remove(x); // if(verbose) System.out.println("Found in clients and removed: " + sender); // found=true; // } // } // if(found) removeJobsFromHost(hostname); // } // // private void removeJobsFromHost(String sender) { // int cnt = 0; // for(int x = 0; x < getJobQueue().size();x++){ // if(getJobQueue().get(x).host.equalsIgnoreCase(sender)){ // getJobQueue().remove(x); // cnt++; // } // } // if(verbose) System.out.println("Removed " + cnt + " jobs from " + sender); // } // // public void sendInformation(String sender){ // server.sendMessage(sender,"--Molgenis Compute Network--"); // server.sendMessage(sender,"Worker node: " + getMyid()); // server.sendMessage(sender,"CPUs: " + Runtime.getRuntime().availableProcessors()); // server.sendMessage(sender,"Memory free: " + (Runtime.getRuntime().freeMemory()/(1024*1024)) + " M"); // server.sendMessage(sender,"Memory available: " + (Runtime.getRuntime().totalMemory()/(1024*1024)) + " M"); // server.sendMessage(sender,"Location: " + server.getInetAddress().getHostName()); // server.sendMessage(sender,"Online since: " + getStart_time()); // server.sendMessage(sender,"Other nodes: " + getOther_clients().size()); // } // // public void sendSupportedCommands(String sender){ // server.sendMessage(sender,"--Supported commands--"); // server.sendMessage(sender,"info - Prints out information"); // server.sendMessage(sender,"known - Print out known other nodes"); // server.sendMessage(sender,"dojob - Do the job available at location"); // server.sendMessage(sender,"joblist - Print the joblist"); // server.sendMessage(sender,"bot - Add a new bot to the network"); // server.sendMessage(sender,"job - Add/Update jobs in the network"); // } // // public void sendKnownClients(String sender){ // for(IRCClientData c : getOther_clients()){ // server.sendMessage(sender, c.getIDString()); // } // } // // public void sendJobOverview(String sender){ // server.sendMessage(sender, "--Job Queue (" + getJobQueue().size() + ")--"); // for(int x = 0; x < getJobQueue().size();x++){ // server.sendMessage(sender, ""+x + getJobQueue().get(x).printStatus(myid)); // } // } // // public String getStart_time() { // DateFormat formatter = new SimpleDateFormat(date_format); // return formatter.format(start_time); // } // // public void setOther_clients(ArrayList<IRCClientData> other_clients) { // this.otherClients = other_clients; // } // // public ArrayList<IRCClientData> getOther_clients() { // return otherClients; // } // // public void getJob(String sender, String message) { // if(verbose) System.out.println(sender + " has a job"); // try{ // String[] t = message.split(";"); // String command = t[1]; // int jobid = Integer.parseInt(t[2]); // for(int x = 0; x < getJobQueue().size();x++){ // if(getJobQueue().get(x).id == jobid && getJobQueue().get(x).host.equalsIgnoreCase(sender)){ // server.sendMessage(sender, "Job " + jobid + " already in queue at " + x + ""); // return; // } // } // getJobQueue().add(new IRCJobStruct(sender,command,jobid)); // server.sendMessage(sender, "Job " + jobid + " in queue (" + getJobQueue().size() + ")"); // for(IRCClientData c : otherClients){ // server.sendMessage(c.getFullName(), "job;new;"+jobid + ";" + myid + ";" + sender + ";"+command); // } // if(verbose) System.out.println(sender + " job accepted"); // }catch(Exception e){ // sendSupportedCommands(sender); // System.err.println("Unknown job: " + message); // } // } // // public void setJobQueue(ArrayList<IRCJobStruct> jobQueue) { // this.jobQueue = jobQueue; // } // // public ArrayList<IRCJobStruct> getJobQueue() { // return jobQueue; // } // // public int getFirstQueuedJob() { // for(int x = 0; x < getJobQueue().size();x++){ // if(getJobQueue().get(x).queued) return x; // } // return -1; // } // // boolean client_know(int id){ // for(IRCClientData c : getOther_clients()){ // if(c.getMyid() == id) return true; // } // return false; // } // // int client_index(int id){ // int cnt=0; // for(IRCClientData c : getOther_clients()){ // if(c.getMyid() == id){ // return cnt; // } // cnt++; // } // return 0; // } // // public void handleBotCommand(String message,String sender){ // try{ // String[] t = message.split(";"); // if(!client_know(Integer.parseInt(t[1]))){ // DateFormat formatter = new SimpleDateFormat(date_format); // getOther_clients().add(new IRCClientData(server,t[2],sender.split("_")[0],Integer.parseInt(t[1]),formatter.parse(t[3]))); // if(verbose) System.out.println("New client: "+sender+ " from "+t[2]+" since " + t[3]); // } // }catch(Exception e){ // System.err.println(" Unknown Bot command" + message); // e.printStackTrace(); // } // } // // public void handleJobCommand(String message,String sender){ // try{ // String[] t = message.split(";"); // int jobid = Integer.parseInt(t[2]); // int clientid = Integer.parseInt(t[3]); // if(t[1].equals("update")){ // int jobindex=0; // ArrayList<IRCJobStruct> queue = getOther_clients().get(client_index(clientid)).getJobQueue(); // for(IRCJobStruct j : queue){ // if(j.id == jobid){ // if(t[4].equals("running")){ // queue.get(jobindex).queued=false; // queue.get(jobindex).running=true; // if(verbose) System.out.println("Client: "+sender+ " updated a job "+ jobid); // getOther_clients().get(client_index(clientid)).setJobQueue(queue); // } // if(t[4].equals("finished")){ // queue.get(jobindex).running=false; // queue.get(jobindex).finished=true; // if(t[5].equals("suc6")){ // queue.get(jobindex).suc6=true; // } // if(verbose) System.out.println("Client: "+sender+ " updated a job "+ jobid); // getOther_clients().get(client_index(clientid)).setJobQueue(queue); // } // } // jobindex++; // } // } // if(t[1].equals("old")){ // IRCJobStruct s = new IRCJobStruct(t[4],t[5],jobid); // s.queued = Boolean.parseBoolean(t[6]); // s.running = Boolean.parseBoolean(t[7]); // s.finished = Boolean.parseBoolean(t[8]); // s.suc6 = t[9].equals("suc6"); // getOther_clients().get(client_index(clientid)).getJobQueue().add(s); // if(verbose) System.out.println("Client: "+sender+ " reports an old job " + jobid+ t[4]); // } // if(t[1].equals("new")){ // IRCJobStruct s = new IRCJobStruct(t[4],t[5],jobid); // getOther_clients().get(client_index(clientid)).getJobQueue().add(s); // if(verbose) System.out.println("Client: "+sender+ " reports a new job " + jobid+ t[4]); // } // }catch(Exception e){ // System.err.println(message + " Unknown Job command"); // } // // } // // @Override // public void run() { // while(true){ // int jobindex; // if(jobQueue.size() > 0 && (jobindex = getFirstQueuedJob()) >= 0){ // IRCJobStruct job = jobQueue.get(jobindex); // cmd.clearCommands(); // cmd.addCommand(job.command); // Thread t = new Thread(cmd); // t.start(); // jobQueue.get(jobindex).queued=false; // jobQueue.get(jobindex).running=true; // jobQueue.get(jobindex).finished=false; // jobQueue.get(jobindex).start_time = new Date(); // for(IRCClientData c : otherClients){ // server.sendMessage(c.getFullName(), "job;update;"+ job.id + ";" + myid + ";running"); // } // try{ // while(t.isAlive()){ // Utils.idle(2000); // } // }catch (Exception e){ // e.printStackTrace(); // } // cmd.getResult(); // jobQueue.get(jobindex).queued=false; // jobQueue.get(jobindex).running=false; // jobQueue.get(jobindex).finished=true; // jobQueue.get(jobindex).suc6=!(cmd.failed_commands>0); // jobQueue.get(jobindex).end_time = new Date(); // for(IRCClientData c : otherClients){ // String updatecmd = "job;update;"+ job.id + ";" + myid + ";finished"; // updatecmd+= ((cmd.failed_commands>0)?";fail":";suc6"); // server.sendMessage(c.getFullName(),updatecmd); // } // }else{ // Utils.idle(2000); // } // } // } // }