package ru.codeinside.gws.api.impl; import ru.codeinside.gws.api.Packet; import ru.codeinside.gws.api.Packet.Status; import ru.codeinside.gws.log.format.Metadata; import java.io.File; import java.io.FileNotFoundException; import java.io.OutputStream; import java.util.UUID; import java.util.logging.Level; class FileLog { final Metadata metadata = new Metadata(); final String dirName = UUID.randomUUID().toString().replace("-", ""); private final boolean isLogEnabled; private final boolean logErrors; private final String status; private OutputStream httpOut; private OutputStream httpIn; FileLog(boolean isLogEnabled, boolean logErrors, String status) { this.isLogEnabled = isLogEnabled; this.logErrors = logErrors; this.status = status; } public final String getDirName() { return dirName; } public final void log(Throwable e) { Files.logFailure(metadata, e, dirName); } public final OutputStream getHttpOutStream() { if (httpOut == null) { try { File file = Files.createSpoolFile(Metadata.HTTP_SEND, dirName); httpOut = Files.fileOut(file); } catch (FileNotFoundException e) { LogServiceFileImpl.LOGGER.log(Level.WARNING, "create spool file fail", e); httpOut = new NullOutputStream(); } } return httpOut; } public final OutputStream getHttpInStream() { if (httpIn == null) { try { File file = Files.createSpoolFile(Metadata.HTTP_RECEIVE, dirName); httpIn = Files.fileOut(file); } catch (FileNotFoundException e) { LogServiceFileImpl.LOGGER.log(Level.WARNING, "create spool file fail", e); httpIn = new NullOutputStream(); } } return httpIn; } public final void close() { Files.close(httpOut, httpIn); boolean hit = false; if (logErrors) { hit = metadata.error != null; if (!hit) { // учтём ошибки идентификации статуса: hit = metadata.send == null || metadata.send.status == null || metadata.receive == null || metadata.receive.status == null; } if (!hit) { // ошибки исполнения: String invalid = Status.INVALID.name(); String failure = Status.FAILURE.name(); hit = invalid.equals(metadata.send.status) || failure.equals(metadata.send.status) || invalid.equals(metadata.receive.status) || failure.equals(metadata.receive.status); } } if (!hit && isLogEnabled) { hit = status == null; if (!hit) { hit = (metadata.send != null && metadata.send.status != null && status.contains(metadata.send.status)) || (metadata.receive != null && metadata.receive.status != null && status.contains(metadata.receive.status)); } } if (hit) { Files.moveFromSpool(dirName); } else { Files.deleteFromSpool(dirName); } } final void logSendPacket(Packet packet) { metadata.send = Files.getPack(packet); Files.writeMetadataToSpool(metadata, dirName); } final void logReceivePacket(Packet packet) { metadata.receive = Files.getPack(packet); Files.writeMetadataToSpool(metadata, dirName); } }