blob: 7323eafaa585042a6b35eb2c5e80400fdb75f78b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.lib.v8debug.commands;
import org.netbeans.lib.v8debug.PropertyBoolean;
import org.netbeans.lib.v8debug.PropertyLong;
import org.netbeans.lib.v8debug.V8Arguments;
import org.netbeans.lib.v8debug.V8Body;
import org.netbeans.lib.v8debug.V8Command;
import org.netbeans.lib.v8debug.V8Request;
/**
*
* @author Martin Entlicher
*/
public final class ChangeLive {
private ChangeLive() {}
public static V8Request createRequest(long sequence, long scriptId, String newSource) {
return createRequest(sequence, scriptId, newSource, null);
}
public static V8Request createRequest(long sequence, long scriptId, String newSource, Boolean previewOnly) {
return new V8Request(sequence, V8Command.Changelive, new Arguments(scriptId, newSource, previewOnly));
}
public static final class Arguments extends V8Arguments {
private final long scriptId;
private final String newSource;
private final PropertyBoolean previewOnly;
public Arguments(long scriptId, String newSource, Boolean previewOnly) {
this.scriptId = scriptId;
this.newSource = newSource;
this.previewOnly = new PropertyBoolean(previewOnly);
}
public long getScriptId() {
return scriptId;
}
public PropertyBoolean isPreviewOnly() {
return previewOnly;
}
public String getNewSource() {
return newSource;
}
}
public static final class ResponseBody extends V8Body {
private final ChangeLog changeLog;
private final Result result;
private final PropertyBoolean stepInRecommended;
public ResponseBody(ChangeLog changeLog, Result result, Boolean stepInRecommended) {
this.changeLog = changeLog;
this.result = result;
this.stepInRecommended = new PropertyBoolean(stepInRecommended);
}
public ChangeLog getChangeLog() {
return changeLog;
}
public Result getResult() {
return result;
}
public PropertyBoolean getStepInRecommended() {
return stepInRecommended;
}
}
public static final class Result {
private final ChangeTree changeTree;
private final TextualDiff diff;
private final boolean updated;
private final PropertyBoolean stackModified;
private final PropertyBoolean stackUpdateNeedsStepIn;
private final String createdScriptName;
public Result(ChangeTree changeTree, TextualDiff diff, boolean updated,
Boolean stackModified, Boolean stackUpdateNeedsStepIn,
String createdScriptName) {
this.changeTree = changeTree;
this.diff = diff;
this.updated = updated;
this.stackModified = new PropertyBoolean(stackModified);
this.stackUpdateNeedsStepIn = new PropertyBoolean(stackUpdateNeedsStepIn);
this.createdScriptName = createdScriptName;
}
public ChangeTree getChangeTree() {
return changeTree;
}
public TextualDiff getDiff() {
return diff;
}
public boolean isUpdated() {
return updated;
}
public PropertyBoolean getStackModified() {
return stackModified;
}
public PropertyBoolean getStackUpdateNeedsStepIn() {
return stackUpdateNeedsStepIn;
}
public String getCreatedScriptName() {
return createdScriptName;
}
public static final class ChangeTree {
private final String name;
private final Positions positions;
private final Positions newPositions;
private final FunctionStatus status;
private final String statusExplanation;
private final ChangeTree[] children;
private final ChangeTree[] newChildren;
public static enum FunctionStatus {
Unchanged,
SourceChanged,
Changed,
Damaged;
public static FunctionStatus fromString(String statusName) {
statusName = Character.toUpperCase(statusName.charAt(0)) + statusName.substring(1);
int i;
while ((i = statusName.indexOf(' ')) > 0) {
statusName = statusName.substring(0, i) +
Character.toUpperCase(statusName.charAt(i+1)) +
statusName.substring(i+2);
}
return FunctionStatus.valueOf(statusName);
}
@Override
public String toString() {
String statusName = super.toString();
statusName = Character.toLowerCase(statusName.charAt(0)) + statusName.substring(1);
for (int i = 0; i < statusName.length(); i++) {
if (Character.isUpperCase(statusName.charAt(i))) {
statusName = statusName.substring(0, i) + " " +
Character.toLowerCase(statusName.charAt(i)) +
statusName.substring(i+1);
i++;
}
}
return statusName;
}
}
public ChangeTree(String name,
Positions positions, Positions newPositions,
FunctionStatus status, String statusExplanation,
ChangeTree[] children, ChangeTree[] newChildren) {
this.name = name;
this.positions = positions;
this.newPositions = newPositions;
this.status = status;
this.statusExplanation = statusExplanation;
this.children = children;
this.newChildren = newChildren;
}
public String getName() {
return name;
}
public Positions getPositions() {
return positions;
}
public Positions getNewPositions() {
return newPositions;
}
public FunctionStatus getStatus() {
return status;
}
public String getStatusExplanation() {
return statusExplanation;
}
public ChangeTree[] getChildren() {
return children;
}
public ChangeTree[] getNewChildren() {
return newChildren;
}
public static final class Positions {
private final long startPosition;
private final long endPosition;
public Positions(long startPosition, long endPosition) {
this.startPosition = startPosition;
this.endPosition = endPosition;
}
public long getStartPosition() {
return startPosition;
}
public long getEndPosition() {
return endPosition;
}
}
}
public static final class TextualDiff {
private final long oldLength;
private final long newLength;
private final long[] chunks;
public TextualDiff(long oldLength, long newLength, long[] chunks) {
this.oldLength = oldLength;
this.newLength = newLength;
this.chunks = chunks;
}
public long getOldLength() {
return oldLength;
}
public long getNewLength() {
return newLength;
}
public long[] getChunks() {
return chunks;
}
}
}
public static final class ChangeLog {
private final BreakpointUpdate[] breakpointsUpdate;
private final String[] namesLinkedToOldScript;
private final String[] droppedFrames;
private final FunctionPatched functionPatched;
private final PositionPatched[] patchedPositions;
public ChangeLog(BreakpointUpdate[] breakpointsUpdate,
String[] namesLinkedToOldScript,
String[] droppedFrames,
FunctionPatched functionPatched,
PositionPatched[] patchedPositions) {
this.breakpointsUpdate = breakpointsUpdate;
this.namesLinkedToOldScript = namesLinkedToOldScript;
this.droppedFrames = droppedFrames;
this.functionPatched = functionPatched;
this.patchedPositions = patchedPositions;
}
public BreakpointUpdate[] getBreakpointsUpdate() {
return breakpointsUpdate;
}
public String[] getNamesLinkedToOldScript() {
return namesLinkedToOldScript;
}
public String[] getDroppedFrames() {
return droppedFrames;
}
public FunctionPatched getFunctionPatched() {
return functionPatched;
}
public PositionPatched[] getPatchedPositions() {
return patchedPositions;
}
public static final class BreakpointUpdate {
public static enum Type {
CopiedToOld,
PositionChanged;
public static Type fromString(String typeName) {
int i = 0, i2;
StringBuilder typeEnumStr = new StringBuilder();
while (i < typeName.length()) {
typeEnumStr.append(Character.toUpperCase(typeName.charAt(i)));
i2 = typeName.indexOf('_', i);
if (i2 < 0) {
i2 = typeName.length();
}
typeEnumStr.append(typeName.substring(i+1, i2));
i = i2 + 1;
}
return Type.valueOf(typeEnumStr.toString());
}
}
private final Type type;
private final long id;
private final PropertyLong newId;
private final Position oldPositions;
private final Position newPositions;
public BreakpointUpdate(Type type, long id, PropertyLong newId,
Position oldPositions,
Position newPositions) {
this.type = type;
this.id = id;
this.newId = newId;
this.oldPositions = oldPositions;
this.newPositions = newPositions;
}
public Type getType() {
return type;
}
public long getId() {
return id;
}
public PropertyLong getNewId() {
return newId;
}
public Position getOldPositions() {
return oldPositions;
}
public Position getNewPositions() {
return newPositions;
}
public static final class Position {
private final long position;
private final long line;
private final long column;
public Position(long position, long line, long column) {
this.position = position;
this.line = line;
this.column = column;
}
public long getPosition() {
return position;
}
public long getLine() {
return line;
}
public long getColumn() {
return column;
}
}
}
public static final class FunctionPatched {
private final String function;
private final PropertyBoolean functionInfoNotFound;
public FunctionPatched(String function, PropertyBoolean functionInfoNotFound) {
this.function = function;
this.functionInfoNotFound = functionInfoNotFound;
}
public String getFunction() {
return function;
}
public PropertyBoolean getFunctionInfoNotFound() {
return functionInfoNotFound;
}
}
public static final class PositionPatched {
private final String name;
private final PropertyBoolean infoNotFound;
public PositionPatched(String name, PropertyBoolean infoNotFound) {
this.name = name;
this.infoNotFound = infoNotFound;
}
public String getName() {
return name;
}
public PropertyBoolean getInfoNotFound() {
return infoNotFound;
}
}
}
}