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.script;
 
 import java.io.File;
 import java.util.Map;
 import java.util.Set;
 
 
 
 // TODO global variables need to be pushed by Collab to all activities, those vars get stored in Activity
 // level variables (so be sure to use a good naming convention for globals - all start with "gbl"
 
 // note that Activity, not Main is the root function block, little different but means exit codes are with Activity
 public class Activity implements ISmartWorkIInstructionCallback {
     protected ActivityManager manager = null;
     protected boolean debugmode = false;
     protected boolean inDebugger = false;
     protected boolean exitFlag = false;
     protected IDebugger debugger = null;
     
     // error handler
     protected ErrorMode errorMode = .;
     protected long errorCode = 0;
     protected String errorMessage = null;
     
 	protected Script script = null;
 	protected StackFunctionEntry stack = null;
 	protected Instruction inst = null;
 	protected long starttime = 0;
 	protected long runtime = 0;
 	protected AtomicLong runCount = new AtomicLong();		// useful flag to let us know that another instruction has completed
 	protected AtomicLong varnames = new AtomicLong();
 	
 	protected Map<StringStructglobals = new HashMap<StringStruct>();
 	
 	protected TaskRun taskRun = null;
 	protected IOperationObserver taskObserver = null;
 	protected boolean hasErrored = false;
 
     public Activity() {
     	this. = ..getActivityManager();
     }
 
 	public OperationResult getLog() {
 		return this.;
 	}
 
     public ExecuteState getState() {
         return (this. != null) ? this..getState() : .;
     }
     
     public void setState(ExecuteState v) {
     	if (this. != null
     		this..setState(v);
     }
     
     public boolean hasErrored() {
 		return this.;
 	}
    
    public void clearErrored() {
		this. = false;
	}
    
    public Long getExitCode() {
        return (this. != null) ? this..getLastCode() : 0;
    }
    
    public Struct getExitResult() {
        return (this. != null) ? this..getLastResult() : null;
    }
    public void setExitFlag(boolean v) {
		this. = v;
	}
    
    public boolean isExitFlag() {
		return this.;
	}
    
    public void setDebugMode(boolean v) {
		this. = v;
	}
    
    /*
     * has the code signaled that it wants to debug?
     */
    public boolean isDebugMode() {
		return this.;
	}
    
    public void setInDebugger(boolean v) {
		this. = v;
	}
    
    public void setDebugger(IDebugger v) {
		this. = v;
	}
    
    public IDebugger getDebugger() {
		return this.;
	}
    
    public void setErrorMode(ErrorMode errorModelong errorCodeString errorMessage) {
		this. = errorMode;
		this. = errorCode;
		this. = errorMessage;
	}
    
    /*
     * is the code already managed by a debugger
     */
    public boolean isInDebugger() {
		return this.;
	}
    
	public String getTitle() {
		if (this. == null)
			return null;
		return this..getTitle(); 
	}
	public long getRuntime() {
		return this.;
	}
	public long getRunCount() {
		return this..get();
	}
		return this.;
	}
	public TaskRun getTaskRun() {
		return this.;
	}
    
	public void run(TaskRun scriptrun) {
		// TODO not cool - circular refs, try to cleanup someday by passing trun to everyone in stack?
		if (this. == null) {
			this. = scriptrun;
				// lock is too expensive, this is a flag just too keep us from calling ourself again, not for thread safety
				// worse case is we get a few more log messages than we wanted, should be very rare (task killed same time script makes error)
				protected boolean inHandler = false;
				public void log(OperationResult orRecordStruct entry) {
					if ("Error".equals(entry.getFieldAsString("Level"))) {
						if (this.)
							return;
						this. = true;
						Activity.this. = true;
						long lcode = entry.getFieldAsInteger("Code", 1);
						if (lcode > 0) {
							if (se != null)
								se.setLastCode(lcode);
						}
						if (r != null) {
							if (StringUtil.isNotEmpty(Activity.this.) && (Activity.this. > 0)) 
							else if (StringUtil.isNotEmpty(Activity.this.)) 
							else if (Activity.this. > 0) 
						}
						if (Activity.this. == .) {
							if (r != null)
						}
						else if (Activity.this. == .) {
						}
						else {
							if (r != null)
						}
						this. = false;
					}					
				}
			};
		}
    	if (this. == null) { 
			this. = true;
    	}
    	else if (this. == null) {
			this. = System.currentTimeMillis();
       		this. = (StackFunctionEntry)this..createStack(thisnull);
       		this..setParameter(scriptrun.getTask().getParams());
    	}
		if (this.) {
			scriptrun.complete();
			return;
		}
       	this..run(this);
	}
	public void resume() {
		TaskRun run = this.;
		if (run == null) {
			..println("Resume with no run!!!");
			return;
		}
		if (this.
			run.complete();
		else if (this.) {
			IDebugger d = this.;
			if (d != null)
		}
		else
	}
	public void cancel(TaskRun scriptrun) {
		scriptrun.error("script task run canceled");
		if (this. != null)
			this..cancel();
		..println("activity canceled");
	}
	public void completed(TaskRun scriptrun) {
		this. = (System.currentTimeMillis() - this.);
		// try to clean up circular ref
		this. = null;
	}
	public void engageDebugger() {		
		this..trace("Debugger requested");
		this. = true;
		if (this.
			return;
		// need a task run to do debugging
		if (this. != null) {
			IDebuggerHandler debugger = this..getDebugger();
			if (debugger == null) {
				this..error("Unable to debug script, no debugger registered.");
				this..kill();
			}
			else {
				// so debugging don't timeout
				debugger.startDebugger(this.);
			}
		}
	}
    public Struct createStruct(String type) {
    	if (this. != null)
    		return this..createVariable(this.type);
    	
    	return .;
    }
    public RecordStruct getDebugInfo() {
    	RecordStruct info = new RecordStruct();		// TODO type this
    	
    	if (this. != null)
    		info.setField("Log"this..getMessages());
    	
    	ListStruct list = new ListStruct();
    	// global level
    	RecordStruct dumpRec = new RecordStruct();
    	list.addItem(dumpRec);
    	
    	dumpRec.setField("Line", 1);
    	dumpRec.setField("Column", 1);		
    	dumpRec.setField("Command"">Global<");
    	RecordStruct dumpVariables = new RecordStruct();
    	dumpRec.setField("Variables"dumpVariables);
        
        for (Entry<StringStructvar : this..entrySet()) 
            dumpVariables.setField(var.getKey(), var.getValue());
        
        dumpVariables.setField("_Errored"new BooleanStruct(this.));        
        
    	if (this. != null)
    		dumpVariables.setField("_ExitCode"new IntegerStruct(this..getCode()));
        // add the rest of the stack
    	if (this. != null)
    		this..debugStack(list);
    	
        info.setField("Stack"list);
        
        return info;
    }
    public OperationResult compile(String source) {
    	OperationResult res = new OperationResult();
		boolean checkmatches = true;
		Set<Stringincludeonce = new HashSet<>();
		while (checkmatches) {
			checkmatches = false;
	    	
			while (m.find()) {
				String grp = m.group();
				String path = grp.trim();
				path = path.substring(10, path.length() - 3);
				String lib = "\n";
				if (! includeonce.contains(path)) {
					..println("Including: " + path);
					// set lib from file content
					lib = IOUtil.readEntireFile(new File("." + path));
					if (StringUtil.isEmpty(lib))
						lib = "\n";
					else
						lib = "\n" + lib;
					includeonce.add(path);
				}
				source = source.replace(grplib);
				checkmatches = true;
			}
		}
    	
		FuncResult<XElementxres = XmlReader.parse(sourcetrue); 
		res.copyMessages(xres);
		if (res.hasErrors()) {
			res.error("Unable to parse script");
			return res;
		}
    	
        this. = new Script(this.);        
        
        res.copyMessages(this..compile(xres.getResult(), source));
        
        if (res.hasErrors()) {
			res.error("Unable to compile script");
	        return res;
        }
        
       	this. = this..getMain();        
        return res;
    }
    
    public Script getScript() {
		return this.;
	}
    // global variables
    public Struct queryVariable(String name) {
		if (StringUtil.isEmpty(name))
			return null;
        
        if ("_Errored".equals(name)) 
        	return new BooleanStruct(this.);
        
        if ("_ExitCode".equals(name)) 
        	return new IntegerStruct(this..getCode());
        
        if ("_Log".equals(name)) 
        	return this..getMessages();
        if ("_Now".equals(name))
        	return new DateTimeStruct(new DateTime());
        // do not call super - that would expose vars outside of the function
        int dotpos = name.indexOf(".");
        if (dotpos > -1) {
            String oname = name.substring(0, dotpos);
            Struct ov = this..containsKey(oname) ? this..get(oname) : null;
            if (ov == null) {
            	if (this. != null)
            		this..errorTr(507, oname);
            	
            	return null;
            }
            
            if (!(ov instanceof CompositeStruct)){
            	if (this. != null)
            		this..errorTr(508, oname);
            	
            	return null;
            }
            
            FuncResult<Structsres = ((CompositeStruct)ov).select(name.substring(dotpos + 1)); 
        	if (this. != null)
        		this..copyMessages(sres);
            
            return sres.getResult();
        }
        else if (this..containsKey(name)) {
            return this..get(name);
        }
        
        return null;
    }
	public Instruction queryFunction(String name) {
		return this..getFunction(name);
	}
	public void addVariable(String nameStruct var) {
    	this..put(namevar);
	}
	public String tempVarName() {
		return this..incrementAndGet() + "";
	}
New to GrepCode? Check out our FAQ X