Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.lang.op;
 
 
 
 
 public class OperationLogger extends OperationObserver implements IOperationLogger {
 	protected ListStruct entries = new ListStruct();
 	protected ListStruct replaces = new ListStruct();
 	protected Path logfile = null;
 	protected BufferedWriter bw = null;
 
 	public void setLogFile(Path v) {
 		this. = v;
 		this.setField("LogFile"v);
 	}
 	
 	public OperationLogger() {
 		this.setField("Entries"this.);
 		this.setField("Replaces"this.);
 	}
 	
 	public void addReplace(String oldValueString newValue) {
 						new FieldStruct("Old"oldValue),
 						new FieldStruct("New"newValue)
 				)
 		);
 	}
 	
 	public Struct deepCopy() {
 		this.doCopy(cp);
 		return cp;
 	}
 
 	public String logToString() {
 		
 		for (Struct s : this..getItems()) {
 			String line = this.formatLogEntry((RecordStruct)s);
 			
 			if (StringUtil.isNotEmpty(line))
 				sb.append(line + "\n");
 		}
 		
 		return sb.toString();
 	}
 	
 	public String formatMessage(String msg) {
 		for (Struct s : this..getItems()) { 
 			RecordStruct re = (RecordStructs;
 			
 			msg = msg.replace(re.getFieldAsString("Old"), re.getFieldAsString("New"));
 		}
 		
 		return msg;
 	}
 	
 	public String formatLogEntry(RecordStruct entry) {
 		DateTime occured = entry.getFieldAsDateTime("Occurred");
 		
 		String lvl = entry.getFieldAsString("Level");
 		
		lvl = StringUtil.alignLeft(lvl' ', 6);
		String msg = this.formatMessage(entry.getFieldAsString("Message"));
		// return null if msg was filtered
		if (StringUtil.isEmpty(msg))
			return null;
		return occured + " " + lvl + msg;
	}
	public void log(OperationContext ctxRecordStruct entry) {
		String lvl = entry.getFieldAsString("Level");
		// only log the correct level, unlike context which keeps them all
		if (ctx.getLevel().getCode() < DebugLevel.valueOf(lvl).getCode()) 
			return;
		this..addItem(entry);
		if (this. == null)
			return;
		try {
			String line = this.formatLogEntry((RecordStruct)entry);
			if (StringUtil.isNotEmpty(line)) {
				this..append(line);
				this..newLine();
				this..flush();
			}
		}
		catch (Exception x) {
			// life is bad if we get here, don't think we should do anything
			// but let the system melt down
		}
	}
	public void start(OperationContext ctx) {
		// super class might already set logfile, but if not see if we need to
		if ((this. == null) && !this.isFieldEmpty("LogFile")) 
			this. = Paths.get(this.getFieldAsString("LogFile"));
		TaskRun run = ctx.getTaskRun();
		RecordStruct params = (run != null) ? run.getTask().getParams() : null;
		// if temp folder is set then we will log into there
		String tempfolder = ((params != null) && !params.isFieldEmpty("_TempFolder"))  
params.getFieldAsString("_TempFolder")
null;
		if ((this. == null) && StringUtil.isNotEmpty(tempfolder)) {
			String fname = !this.isFieldEmpty("LogFileName")  
this.getFieldAsString("LogFileName")
					: DateTimeFormat.forPattern("yyyyMMdd'_'HHmmss").print(new DateTime(.)) + ".log";
    		this. = Paths.get(tempfolderfname);
		}
		// if we do have a log file try to open it
		if (this. != null) {
			try {
				this. = Files.newBufferedWriter(this., Charset.forName("UTF-8"));
			}
			catch (Exception x) {
				ctx.errorTr(181, x);
			}
		}
		// automatically clean references to the temp folder in log file
		if (StringUtil.isNotEmpty(tempfolder)) {
			this.addReplace(tempfolder"");
			this.addReplace(tempfolder.replace('\\''/'), "");
		}
	}
	public void stop(OperationContext ctx) {
		if (this. == null)
			return;
		try {
			this..flush();
			this..close();
			// automatically rename .tmp to .log
			if (fn.endsWith(".tmp")) {
				fn = fn.substring(0, fn.length() - 4) + ".log";
				Path finallog = this..resolveSibling(fn);
				// if there happens to be a log already there, replace it
				this. = finallog;
			}
		}
		catch (Exception x) {
			// don't care, nothing we can do
			..println("Error copying log file: " + x);
		}
	}
New to GrepCode? Check out our FAQ X