/* * To change this template, choose Tools | Templates and open the template in * the editor. */ package com.wordpress.salaboy.services; import com.wordpress.salaboy.model.FireTruck; import com.wordpress.salaboy.model.Vehicle; import com.wordpress.salaboy.model.events.EmergencyVehicleEvent; import com.wordpress.salaboy.model.events.FireTruckDecreaseWaterLevelEvent; import com.wordpress.salaboy.model.events.FireTruckWaterRefilledEvent; import com.wordpress.salaboy.model.persistence.PersistenceServiceProvider; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseConfiguration; import org.drools.KnowledgeBaseFactory; import org.drools.builder.*; import org.drools.conf.EventProcessingOption; import org.drools.io.impl.ClassPathResource; import org.drools.logger.KnowledgeRuntimeLoggerFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; /** * @author esteban */ public class FireTruckMonitorService implements VehicleMonitorService{ private StatefulKnowledgeSession session; private Thread sessionThread; private FactHandle truckFactHandle; public FireTruckMonitorService(String vehicleId) { try { this.session = createFireTruckMonitorSession(vehicleId); } catch (IOException ex) { Logger.getLogger(FireTruckMonitorService.class.getName()).log(Level.SEVERE, null, ex); } } @Override public void newVehicleDispatched(final String emergencyId, final String vehicleId) { Vehicle vehicle = PersistenceServiceProvider.getPersistenceService().loadVehicle(vehicleId); if (vehicle == null){ throw new IllegalArgumentException("Unknown Vehicle "+vehicleId); } session.setGlobal("emergencyId", emergencyId); truckFactHandle = session.insert(vehicle); sessionThread = new Thread(new Runnable() { @Override public void run() { session.fireUntilHalt(); } }); sessionThread.start(); } @Override public void processEvent(EmergencyVehicleEvent event){ if (event instanceof FireTruckDecreaseWaterLevelEvent){ this.processFireTruckDecreaseWaterLevelEvent((FireTruckDecreaseWaterLevelEvent)event); }else if (event instanceof FireTruckWaterRefilledEvent){ this.processFireTruckWaterRefilledEvent((FireTruckWaterRefilledEvent)event); } } @Override public void vehicleRemoved() { session.dispose(); sessionThread.stop(); } public void processFireTruckDecreaseWaterLevelEvent(FireTruckDecreaseWaterLevelEvent event){ session.insert(event); } private StatefulKnowledgeSession createFireTruckMonitorSession(String vehicleId) throws IOException { // Map<String, GridServiceDescription> coreServicesMap = new HashMap<String, GridServiceDescription>(); // GridServiceDescriptionImpl gsd = new GridServiceDescriptionImpl(WhitePages.class.getName()); // Address addr = gsd.addAddress("socket"); // addr.setObject(new InetSocketAddress[]{new InetSocketAddress("localhost", 8000)}); // coreServicesMap.put(WhitePages.class.getCanonicalName(), gsd); // // GridImpl grid = new GridImpl(new ConcurrentHashMap<String, Object>()); // // GridPeerConfiguration conf = new GridPeerConfiguration(); // GridPeerServiceConfiguration coreSeviceConf = new CoreServicesLookupConfiguration(coreServicesMap); // conf.addConfiguration(coreSeviceConf); // // GridPeerServiceConfiguration wprConf = new WhitePagesRemoteConfiguration(); // conf.addConfiguration(wprConf); // // conf.configure(grid); // // GridServiceDescription<GridNode> n1Gsd = grid.get(WhitePages.class).lookup("n1"); // GridConnection<GridNode> conn = grid.get(ConnectionFactoryService.class).createConnection(n1Gsd); // GridNode remoteN1 = conn.connect(); // // // KnowledgeBuilder kbuilder = remoteN1.get(KnowledgeBuilderFactoryService.class).newKnowledgeBuilder(); // // kbuilder.add(new ByteArrayResource(IOUtils.toByteArray(new ClassPathResource("rules/fireTruck.drl").getInputStream())), ResourceType.DRL); // // KnowledgeBuilderErrors errors = kbuilder.getErrors(); // if (errors != null && errors.size() > 0) { // for (KnowledgeBuilderError error : errors) { // System.out.println(">>>>>>> Error: " + error.getMessage()); // // } // throw new IllegalStateException("Failed to parse knowledge!"); // } // KnowledgeBaseConfiguration kbaseConf = remoteN1.get(KnowledgeBaseFactoryService.class).newKnowledgeBaseConfiguration(); // kbaseConf.setOption(EventProcessingOption.STREAM); // KnowledgeBase kbase = remoteN1.get(KnowledgeBaseFactoryService.class).newKnowledgeBase(kbaseConf); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(new ClassPathResource("rules/fireTruck.drl"), ResourceType.DRL); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors != null && errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.out.println(">>>>>>> Error: " + error.getMessage()); } throw new IllegalStateException("Failed to parse knowledge!"); } KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbaseConf.setOption(EventProcessingOption.STREAM); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConf); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLoggerFactory.newConsoleLogger(session); //remoteN1.set("FireTruckMonitorSession" + vehicleId, session); return session; } private void processFireTruckWaterRefilledEvent(FireTruckWaterRefilledEvent fireTruckWaterRefilledEvent) { System.out.println(">>>>Updating Truck Water Refilled!!!"); FireTruck truck = (FireTruck)PersistenceServiceProvider.getPersistenceService().loadVehicle(fireTruckWaterRefilledEvent.getVehicleId()); session.update(truckFactHandle, truck); } }