package art.servers.gost.access.controller; import art.library.interop.serialization.Serialization; import art.library.model.devices.DeviceStatus; import art.library.model.devices.gost.access.AccessEnforcement; import art.library.model.devices.gost.access.AccessEnforcementInformation; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_Image; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State_Discarded; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_State_Vehicle; import art.servers.gost.access.Shared; import art.servers.gost.access.configuration.Configuration; import art.servers.gost.access.configuration.ConfigurationDetail; import art.servers.gost.access.types.DatabasePoolConnection; import art.servers.gost.access.utils.OSD; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.text.SimpleDateFormat; import java.util.ArrayList; public class Controller_ACCESS_QuercusSpeed_Oviedo extends Controller_ACCESS { private ConfigurationDetail configuration = null; public Controller_ACCESS_QuercusSpeed_Oviedo(AccessEnforcement access, DatabasePoolConnection database) { super(access, database); this.configuration = ((Configuration)Shared.configuration).detail; this.setName(Shared.getMessage("Controller access") + " " + access.information.name); } public AccessEnforcement getAccessEnforcement() { return (AccessEnforcement)getDevice(); } public void run() { Shared.traceInformation(getName(),Shared.getMessage("Starting")); initialise(); // Status { AccessEnforcement access = getAccessEnforcement(); AccessEnforcement clon = Serialization.clone(access); clon.getDeviceStatus().status = DeviceStatus.STATUS_ONLINE; clon.getDeviceAlarms().clear(); Shared.model.updateDevice(access, clon); } while ((isInterrupted() == false) && (exit == false)) { long lastTimestampUpdate = System.currentTimeMillis(); try { if (Shared.isServerEnabled() == true) { update(); } } catch (Exception exception) { } AccessEnforcement red = getAccessEnforcement(); long timetowait = (red.getDeviceInformation().polling * 1000) - (System.currentTimeMillis() - lastTimestampUpdate); timetowait = Math.min(timetowait, red.getDeviceInformation().polling * 1000); if (timetowait > 0) { try { sleep(timetowait); } catch (Exception e) { } } if (Shared.model.existsDevice(getAccessEnforcement().getIdentifier()) == false) { Shared.traceInformation(getName(),Shared.getMessage("Device no longer exists")); exit = true; } } Shared.traceInformation(getName(),Shared.getMessage("Finishing")); } // private void update() { AccessEnforcement access = getAccessEnforcement(); AccessEnforcementInformation information = access.getDeviceInformation(); try { // Read files File rootFolder = new File(information.oviedo.detectionsFolder); if (rootFolder.exists() == true) { File folders[] = rootFolder.listFiles(); // Wait all files to finish copy try { sleep(60000); } catch (Exception exception) { } for (File folder : folders) { if (folder.getName().indexOf(information.oviedo.identifier) == 0) { try { update(folder); } catch (Exception exception) { } } } } } catch (Exception exception) { Shared.traceError(getName(),Shared.getMessage("Update"), exception); } } private void update(File folder) { SimpleDateFormat formato1 = new SimpleDateFormat(Shared.getMessage("ddMMyyyyHHmmss")); SimpleDateFormat formato2 = new SimpleDateFormat(Shared.getMessage("dd/MM/yyyy HH:mm:ss.SSS")); AccessEnforcement access = getAccessEnforcement(); AccessEnforcementInformation information = access.getDeviceInformation(); BufferedReader reader = null; int totalDetections = 0; int processedDetections = 0; try { File idx = getFile(folder, ".idx"); File txt = getFile(folder, ".txt"); reader = new BufferedReader(new FileReader(txt)); String line = reader.readLine(); while ((line != null) && (line.trim().length()> 0)) { totalDetections = totalDetections + 1; String[] tokens = line.split("\\s+"); try { int number = Integer.parseInt(tokens[0]); AccessEnforcement_Detection detection = new AccessEnforcement_Detection(); detection.states = new ArrayList<>(); detection.timestamp = formato1.parse(tokens[1]).getTime(); detection.device = information; updateImages(detection, idx, number); AccessEnforcement_Detection_State detectionState = new AccessEnforcement_Detection_State(); detectionState.vehicle = new AccessEnforcement_Detection_State_Vehicle(); detectionState.vehicle.plate = tokens[2].toUpperCase(); detectionState.vehicle.confidence = (float)Math.min(Integer.parseInt(tokens[3]), Integer.parseInt(tokens[4])); if ((detection.images != null) && (detection.images.size() == information.oviedo.numberImages)) { if (Shared.controllerDetections.hasPermission(detection, detectionState.vehicle.plate) != null) { detectionState.state = AccessEnforcement_Detection_State.STATE_DISCARDED; detectionState.discarded = new AccessEnforcement_Detection_State_Discarded(); detectionState.discarded.code = AccessEnforcement_Detection_State_Discarded.DISCARDED_ALLOWED; detectionState.discarded.timestamp = System.currentTimeMillis(); detectionState.discarded.user = Shared.getApplicationName(); Shared.printcorrect(getName(),Shared.getMessage("Successful (allowed), plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp)); } else { detectionState.state = AccessEnforcement_Detection_State.STATE_REVISION_PENDING; detectionState.timestamp = System.currentTimeMillis(); Shared.printcorrect(getName(),Shared.getMessage("Successful (revision pending), plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp)); } } else { detectionState.state = AccessEnforcement_Detection_State.STATE_DISCARDED; detectionState.discarded = new AccessEnforcement_Detection_State_Discarded(); detectionState.discarded.code = AccessEnforcement_Detection_State_Discarded.DISCARDED_MISSING_PICTURES; detectionState.discarded.timestamp = System.currentTimeMillis(); detectionState.discarded.description = detectionState.discarded.getDescription(detectionState.discarded.code); // Shared.printerr(getName(),Shared.getMessage("Missing images, plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp)); } detection.states.add(detectionState); if (updateDatabaseDetection(information, detection) == 0) { Shared.printwarning(getName(),Shared.getMessage("Already imported, plate") + " = " + detectionState.vehicle.plate + ", " + Shared.getMessage("date") + " = " + formato2.format(detection.timestamp)); } processedDetections = processedDetections + 1; } catch (NumberFormatException exception) { // Error al leer la linea Shared.printerr(getName(),Shared.getMessage("Line error") + " = " + txt.getAbsolutePath() + ", '" + line + "'"); Shared.traceError(getName(),Shared.getMessage("Update"), folder.getAbsolutePath(), exception); } line = reader.readLine(); } reader.close(); if (totalDetections > 0) { String message = folder.getAbsolutePath() + " : " + processedDetections + " " + Shared.getMessage("of") + " " + totalDetections; Shared.traceInformation(getName(),Shared.getMessage("Update"), message); if (reader != null) reader.close(); delete(folder); } } catch (Exception exception) { try { if (reader != null) reader.close(); File fileerror = new File(information.storage.errorFolder + "/" + folder.getName()); fileerror.getParentFile().mkdirs(); Files.move(folder.toPath(), fileerror.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) { } Shared.traceError(getName(),Shared.getMessage("Update"), folder.getAbsolutePath(), exception); } finally { try { if (reader != null) reader.close(); } catch (Exception exception) {}; } } private void updateImages(AccessEnforcement_Detection detection, File idx, int number) { BufferedReader reader = null; AccessEnforcement access = getDevice(); try { int currentOvreview = 0; reader = new BufferedReader(new FileReader(idx)); String line = reader.readLine(); while ((line != null) && (line.trim().length()> 0)) { String[] tokens = line.split("\\s+"); int detectionNumber = Integer.parseInt(tokens[1]); if (detectionNumber == number) { int fileNumber = Integer.parseInt(tokens[0]); int imageNumber = Integer.parseInt(tokens[2]); int imageType = Integer.parseInt(tokens[3]); AccessEnforcement_Detection_Image image = new AccessEnforcement_Detection_Image(); image.data = Files.readAllBytes(new File(idx.getParentFile().getAbsolutePath() + "/" + String.format("%07d", fileNumber) + ".jpg").toPath()); image.format = AccessEnforcement_Detection_Image.FORMAT_JPG; switch(imageType) { case 1: image.name = AccessEnforcement_Detection_Image.NAME_OVERVIEW + " " + (++currentOvreview); OSD.osd(detection, image, access.getDeviceInformation().getOSD(image.name)); break; case 2: image.name = AccessEnforcement_Detection_Image.NAME_PLATE; OSD.osd(detection, image, access.getDeviceInformation().getOSD(image.name)); break; case 3: image.name = AccessEnforcement_Detection_Image.NAME_PLATE_CLIP; break; } if (detection.images == null) { detection.images = new ArrayList(); } detection.images.add(image); } line = reader.readLine(); } } catch (Exception exception) { Shared.traceError(getName(),Shared.getMessage("Update images"), idx.getAbsolutePath(), exception); } finally { try { if (reader != null) reader.close(); } catch (Exception exception) {}; } } private File getFile(File folder, String extension) throws Exception { for (File file : folder.listFiles()) { if (file.getName().toLowerCase().endsWith(extension) == true) { return file; } } throw new Exception(Shared.getMessage("File with extension does no exists") + " : " + extension); } }