package pikater; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.Calendar; import java.util.LinkedList; import java.util.Vector; import java.util.regex.Pattern; import org.apache.commons.codec.digest.DigestUtils; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; import com.sun.org.apache.bcel.internal.classfile.InnerClass; import pikater.agents.computing.Agent_ComputingAgent; import pikater.agents.computing.Agent_ComputingAgent.states; import pikater.ontology.messages.Execute; import pikater.ontology.messages.GetAllMetadata; import pikater.ontology.messages.GetFileInfo; import pikater.ontology.messages.GetFiles; import pikater.ontology.messages.GetSavedAgents; import pikater.ontology.messages.GetTheBestAgent; import pikater.ontology.messages.ImportFile; import pikater.ontology.messages.LoadAgent; import pikater.ontology.messages.MessagesOntology; import pikater.ontology.messages.Metadata; import pikater.ontology.messages.SaveAgent; import pikater.ontology.messages.SaveMetadata; import pikater.ontology.messages.SaveResults; import pikater.ontology.messages.Task; import pikater.ontology.messages.TranslateFilename; import pikater.ontology.messages.UpdateMetadata; import weka.classifiers.Classifier; import weka.core.Instances; import jade.content.lang.Codec; import jade.content.lang.Codec.CodecException; import jade.content.lang.sl.SLCodec; import jade.content.onto.Ontology; import jade.content.onto.OntologyException; import jade.content.onto.basic.Action; import jade.content.onto.basic.Result; import jade.core.AID; import jade.core.Agent; import jade.core.AgentContainer; import jade.core.LifeCycle; import jade.domain.AMSService; import jade.domain.FIPAException; import jade.domain.FIPANames; import jade.domain.FIPAService; import jade.domain.FIPAAgentManagement.NotUnderstoodException; import jade.domain.FIPAAgentManagement.RefuseException; import jade.domain.persistence.*; import jade.lang.acl.ACLMessage; import jade.lang.acl.MessageTemplate; import jade.proto.AchieveREResponder; import jade.proto.SimpleAchieveREInitiator; import jade.util.leap.ArrayList; import jade.util.leap.List; import jade.wrapper.AgentController; import jade.wrapper.ContainerController; import jade.wrapper.ControllerException; import jade.wrapper.PlatformController; import jade.wrapper.StaleProxyException; public class Agent_AgentManager extends Agent { Connection db; Logger log; Codec codec = new SLCodec(); Ontology ontology = MessagesOntology.getInstance(); public Agent_AgentManager() { super(); try { db = DriverManager.getConnection( "jdbc:hsqldb:file:data/db/pikaterdb", "", ""); Logger.getRootLogger() .addAppender( new FileAppender(new PatternLayout( "%r [%t] %-5p %c - %m%n"), "log")); log = Logger.getLogger(Agent_AgentManager.class); log.setLevel(Level.TRACE); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void setup() { super.setup(); getContentManager().registerLanguage(codec); getContentManager().registerOntology(ontology); MessageTemplate mt = MessageTemplate.and(MessageTemplate .MatchOntology(ontology.getName()), MessageTemplate .MatchPerformative(ACLMessage.REQUEST)); addBehaviour(new AchieveREResponder(this, mt) { private static final long serialVersionUID = 7L; @Override protected ACLMessage handleRequest(ACLMessage request) throws NotUnderstoodException, RefuseException { log.info("Agent " + getLocalName() + " received request: " + request.getContent()); try { Action a = (Action) getContentManager().extractContent( request); if (a.getAction() instanceof LoadAgent) { LoadAgent la = (LoadAgent) a.getAction(); Action fa = la.getFirst_action(); Agent newAgent = null; if (la.getObject() != null){ newAgent = (Agent) toObject(la.getObject()); } else { // read agent from file String filename = "saved" + System.getProperty("file.separator") + la.getFilename() + ".model"; System.out.println(filename); //Construct the ObjectInputStream object ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filename)); newAgent = (Agent) inputStream.readObject(); } System.out.print("Ozivenej: "+newAgent); // TODO kdyz se ozivuje 2x ten samej -> chyba if (newAgent != null){ // get a container controller for creating new agents ContainerController container = getContainerController(); AgentController controller = container.acceptNewAgent(la.getFilename(), newAgent); controller.start(); } else { throw new ControllerException("Agent not created."); } log.info("Loaded agent: " + la.getFilename()); ACLMessage reply = null; if (fa != null){ // send message with fa action to the loaded agent Action ac = new Action(); ac.setAction(fa); ac.setActor(request.getSender()); ACLMessage first_message = new ACLMessage(ACLMessage.REQUEST); first_message.setLanguage(codec.getName()); first_message.setOntology(ontology.getName()); first_message.addReceiver(new AID(la.getFilename(), AID.ISLOCALNAME)); first_message.clearAllReplyTo(); first_message.addReplyTo(request.getSender()); first_message.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST); first_message.setConversationId(request.getConversationId()); getContentManager().fillContent(first_message, ac); send(first_message); } else{ reply = request.createReply(); reply.setContent("Agent "+newAgent.getLocalName()+" resurected."); reply.setPerformative(ACLMessage.INFORM); } return reply; } if (a.getAction() instanceof SaveAgent) { // write it into database SaveAgent sa = (SaveAgent) a.getAction(); int userID = sa.getUserID(); // pikater.ontology.messages.Data data = sa.getData(); pikater.ontology.messages.Agent agent = sa.getAgent(); String name = agent.getName(); // TODO - zajistit unikatni pro konkretniho uzivatele Timestamp currentTimestamp = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()); String filename = userID + "_" + name + "_" + currentTimestamp.toString().replace(":", "-").replace(" ", "_"); // save serialized object to file byte [] object = sa.getAgent().getObject(); ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("saved" + System.getProperty("file.separator") + filename + ".model")); Agent newAgent = (Agent) (toObject(object)); oos.writeObject(toObject(object)); oos.flush(); oos.close(); log.info("Agent "+ name +" saved to file" + filename + ".model"); /* String query = "UPDATE results SET (finish, objectFilename) " + "VALUES (" + "\'" + currentTimestamp + "\'," + "\'" + filename + "\')"; Statement stmt = db.createStatement(); log.info("Executing query: " + query); stmt.executeUpdate(query); */ ACLMessage reply = request.createReply(); reply.setContent(filename); reply.setPerformative(ACLMessage.INFORM); return reply; } // end of SaveAgent /* if (a.getAction() instanceof GetSavedAgents){ GetSavedAgents gsa = (GetSavedAgents) a.getAction(); int userID = gsa.getUserID(); String query = "SELECT * FROM results WHERE userID = " + userID; log.info("Executing query " + query); Statement stmt = db.createStatement(); ResultSet rs = stmt.executeQuery(query); List agents = new ArrayList(); while( rs.next() ){ pikater.ontology.messages.Agent agent = new pikater.ontology.messages.Agent(); agent.setName(rs.getString("name")); agent.setSaved_timestamp(rs.getString("finish")); agent.setSaved_object_filename(rs.getString("objectFilename")); agent.setType(rs.getString("type")); agent.setSaved_train_filename(rs.getString("trainFilename")); agents.add(agent); } stmt.close(); ACLMessage reply = request.createReply(); reply.setPerformative(ACLMessage.INFORM); Result r = new Result(a.getAction(), agents); getContentManager().fillContent(reply, r); return reply; } */ } catch (OntologyException e) { e.printStackTrace(); log.error("Problem extracting content: " + e.getMessage()); } catch (CodecException e) { e.printStackTrace(); log.error("Codec problem: " + e.getMessage()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (StaleProxyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ControllerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); // } catch (FIPAException e) { // TODO Auto-generated catch block // e.printStackTrace(); } ACLMessage failure = request.createReply(); failure.setPerformative(ACLMessage.FAILURE); log.error("Failure responding to request: " + request.getContent()); return failure; } }); } public static byte[] getBytesFromFile(File file) throws IOException { InputStream is = new FileInputStream(file); // Get the size of the file long length = file.length(); if (length > Integer.MAX_VALUE) { // File is too large } // Create the byte array to hold the data byte[] bytes = new byte[(int)length]; // Read in the bytes int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } // Ensure all the bytes have been read in if (offset < bytes.length) { throw new IOException("Could not completely read file "+file.getName()); } // Close the input stream and return bytes is.close(); return bytes; } public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException{ Object object = null; object = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(bytes)).readObject(); return object; } private String getDateTime() { DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HH.mm.ss"); Date date = new Date(); return dateFormat.format(date); } }