/* * NotebookQueueUnit.java * * Copyright (C) 2009-16 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.rmarkdown.model; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; public class NotebookQueueUnit extends JavaScriptObject { protected NotebookQueueUnit() { } public final static native NotebookQueueUnit create( String docId, String chunkId, int execMode, int execScope, String code) /*-{ return { doc_id: docId, chunk_id: chunkId, exec_mode: execMode, exec_scope: execScope, code: code, pending: [], completed: [], executing: null }; }-*/; public final native String getDocId() /*-{ return this.doc_id; }-*/; public final native String getChunkId() /*-{ return this.chunk_id; }-*/; public final native int getExecMode() /*-{ return this.exec_mode; }-*/; public final native int getExecScope() /*-{ return this.exec_scope; }-*/; public final native String getCode() /*-{ return this.code; }-*/; public final native JsArray<NotebookExecRange> getPending() /*-{ return this.pending; }-*/; public final native JsArray<NotebookExecRange> getCompleted() /*-{ return this.completed; }-*/; public final native NotebookExecRange getExecuting() /*-{ return this.executing; }-*/; public final native void addPendingRange(NotebookExecRange range) /*-{ this.pending.push(range); }-*/; public final native void addCompletedRange(NotebookExecRange range) /*-{ this.completed.push(range); }-*/; public final native void setExecutingRange(NotebookExecRange range) /*-{ this.executing = range; }-*/; public final void extendExecutingRange(NotebookExecRange range) { if (getExecuting() == null) setExecutingRange(range); else getExecuting().extendTo(range); } public final List<Integer> getPendingLines() { return linesFromRanges(getPending()); } public final List<Integer> getCompletedLines() { return linesFromRanges(getCompleted()); } public final List<Integer> getExecutingLines() { return linesFromRange(getExecuting()); } public final List<Integer> linesFromRange(NotebookExecRange range) { JsArray<NotebookExecRange> ranges = JsArray.createArray().cast(); ranges.push(range); return linesFromRanges(ranges); } public final boolean hasPendingRange(NotebookExecRange range) { JsArray<NotebookExecRange> ranges = getPending(); for (int i = 0; i < ranges.length(); i++) { if (ranges.get(i).getStart() >= range.getStart() && ranges.get(i).getStop() <= range.getStop()) return true; } return false; } private final List<Integer> linesFromRanges( JsArray<NotebookExecRange> ranges) { List<Integer> lines = new ArrayList<Integer>(); final String code = getCode(); int line = 0, last = -1; for (int i = 0; i < code.length(); i++) { // increment line counter if we're on a new line if (code.charAt(i) == '\n') line++; // skip if this line was already accounted for if (line == last) continue; // check to see if this line is included in any of the given ranges for (int j = 0; j < ranges.length(); j++) { final NotebookExecRange range = ranges.get(j); if (i >= range.getStart() && i < range.getStop()) { // if this is a newline, include the previous line if not // already included if (code.charAt(i) == '\n' && last != line - 1) lines.add(line - 1); lines.add(line); last = line; continue; } } } return lines; } public final static int EXEC_SCOPE_CHUNK = 0; public final static int EXEC_SCOPE_PARTIAL = 1; public final static int EXEC_SCOPE_INLINE = 2; public final static int EXEC_MODE_SINGLE = 0; public final static int EXEC_MODE_BATCH = 1; }