You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2017/11/18 20:53:41 UTC
[2/3] zeppelin git commit: [ZEPPELIN-1363] Note level dynamic form
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
index d6619fc..cea7e65 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterContext.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteInterpreterContext, RemoteInterpreterContext._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterContext> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterContext");
@@ -63,7 +63,8 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
private static final org.apache.thrift.protocol.TField AUTHENTICATION_INFO_FIELD_DESC = new org.apache.thrift.protocol.TField("authenticationInfo", org.apache.thrift.protocol.TType.STRING, (short)6);
private static final org.apache.thrift.protocol.TField CONFIG_FIELD_DESC = new org.apache.thrift.protocol.TField("config", org.apache.thrift.protocol.TType.STRING, (short)7);
private static final org.apache.thrift.protocol.TField GUI_FIELD_DESC = new org.apache.thrift.protocol.TField("gui", org.apache.thrift.protocol.TType.STRING, (short)8);
- private static final org.apache.thrift.protocol.TField RUNNERS_FIELD_DESC = new org.apache.thrift.protocol.TField("runners", org.apache.thrift.protocol.TType.STRING, (short)9);
+ private static final org.apache.thrift.protocol.TField NOTE_GUI_FIELD_DESC = new org.apache.thrift.protocol.TField("noteGui", org.apache.thrift.protocol.TType.STRING, (short)9);
+ private static final org.apache.thrift.protocol.TField RUNNERS_FIELD_DESC = new org.apache.thrift.protocol.TField("runners", org.apache.thrift.protocol.TType.STRING, (short)10);
private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
static {
@@ -79,6 +80,7 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
public String authenticationInfo; // required
public String config; // required
public String gui; // required
+ public String noteGui; // required
public String runners; // required
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
@@ -91,7 +93,8 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
AUTHENTICATION_INFO((short)6, "authenticationInfo"),
CONFIG((short)7, "config"),
GUI((short)8, "gui"),
- RUNNERS((short)9, "runners");
+ NOTE_GUI((short)9, "noteGui"),
+ RUNNERS((short)10, "runners");
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
@@ -122,7 +125,9 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
return CONFIG;
case 8: // GUI
return GUI;
- case 9: // RUNNERS
+ case 9: // NOTE_GUI
+ return NOTE_GUI;
+ case 10: // RUNNERS
return RUNNERS;
default:
return null;
@@ -183,6 +188,8 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
tmpMap.put(_Fields.GUI, new org.apache.thrift.meta_data.FieldMetaData("gui", org.apache.thrift.TFieldRequirementType.DEFAULT,
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+ tmpMap.put(_Fields.NOTE_GUI, new org.apache.thrift.meta_data.FieldMetaData("noteGui", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
tmpMap.put(_Fields.RUNNERS, new org.apache.thrift.meta_data.FieldMetaData("runners", org.apache.thrift.TFieldRequirementType.DEFAULT,
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
metaDataMap = Collections.unmodifiableMap(tmpMap);
@@ -201,6 +208,7 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
String authenticationInfo,
String config,
String gui,
+ String noteGui,
String runners)
{
this();
@@ -212,6 +220,7 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
this.authenticationInfo = authenticationInfo;
this.config = config;
this.gui = gui;
+ this.noteGui = noteGui;
this.runners = runners;
}
@@ -243,6 +252,9 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
if (other.isSetGui()) {
this.gui = other.gui;
}
+ if (other.isSetNoteGui()) {
+ this.noteGui = other.noteGui;
+ }
if (other.isSetRunners()) {
this.runners = other.runners;
}
@@ -262,6 +274,7 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
this.authenticationInfo = null;
this.config = null;
this.gui = null;
+ this.noteGui = null;
this.runners = null;
}
@@ -457,6 +470,30 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
}
}
+ public String getNoteGui() {
+ return this.noteGui;
+ }
+
+ public RemoteInterpreterContext setNoteGui(String noteGui) {
+ this.noteGui = noteGui;
+ return this;
+ }
+
+ public void unsetNoteGui() {
+ this.noteGui = null;
+ }
+
+ /** Returns true if field noteGui is set (has been assigned a value) and false otherwise */
+ public boolean isSetNoteGui() {
+ return this.noteGui != null;
+ }
+
+ public void setNoteGuiIsSet(boolean value) {
+ if (!value) {
+ this.noteGui = null;
+ }
+ }
+
public String getRunners() {
return this.runners;
}
@@ -547,6 +584,14 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
}
break;
+ case NOTE_GUI:
+ if (value == null) {
+ unsetNoteGui();
+ } else {
+ setNoteGui((String)value);
+ }
+ break;
+
case RUNNERS:
if (value == null) {
unsetRunners();
@@ -584,6 +629,9 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
case GUI:
return getGui();
+ case NOTE_GUI:
+ return getNoteGui();
+
case RUNNERS:
return getRunners();
@@ -614,6 +662,8 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
return isSetConfig();
case GUI:
return isSetGui();
+ case NOTE_GUI:
+ return isSetNoteGui();
case RUNNERS:
return isSetRunners();
}
@@ -705,6 +755,15 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
return false;
}
+ boolean this_present_noteGui = true && this.isSetNoteGui();
+ boolean that_present_noteGui = true && that.isSetNoteGui();
+ if (this_present_noteGui || that_present_noteGui) {
+ if (!(this_present_noteGui && that_present_noteGui))
+ return false;
+ if (!this.noteGui.equals(that.noteGui))
+ return false;
+ }
+
boolean this_present_runners = true && this.isSetRunners();
boolean that_present_runners = true && that.isSetRunners();
if (this_present_runners || that_present_runners) {
@@ -761,6 +820,11 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
if (present_gui)
list.add(gui);
+ boolean present_noteGui = true && (isSetNoteGui());
+ list.add(present_noteGui);
+ if (present_noteGui)
+ list.add(noteGui);
+
boolean present_runners = true && (isSetRunners());
list.add(present_runners);
if (present_runners)
@@ -857,6 +921,16 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
return lastComparison;
}
}
+ lastComparison = Boolean.valueOf(isSetNoteGui()).compareTo(other.isSetNoteGui());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetNoteGui()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.noteGui, other.noteGui);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
lastComparison = Boolean.valueOf(isSetRunners()).compareTo(other.isSetRunners());
if (lastComparison != 0) {
return lastComparison;
@@ -951,6 +1025,14 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
}
first = false;
if (!first) sb.append(", ");
+ sb.append("noteGui:");
+ if (this.noteGui == null) {
+ sb.append("null");
+ } else {
+ sb.append(this.noteGui);
+ }
+ first = false;
+ if (!first) sb.append(", ");
sb.append("runners:");
if (this.runners == null) {
sb.append("null");
@@ -1065,7 +1147,15 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
- case 9: // RUNNERS
+ case 9: // NOTE_GUI
+ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+ struct.noteGui = iprot.readString();
+ struct.setNoteGuiIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+ }
+ break;
+ case 10: // RUNNERS
if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
struct.runners = iprot.readString();
struct.setRunnersIsSet(true);
@@ -1128,6 +1218,11 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
oprot.writeString(struct.gui);
oprot.writeFieldEnd();
}
+ if (struct.noteGui != null) {
+ oprot.writeFieldBegin(NOTE_GUI_FIELD_DESC);
+ oprot.writeString(struct.noteGui);
+ oprot.writeFieldEnd();
+ }
if (struct.runners != null) {
oprot.writeFieldBegin(RUNNERS_FIELD_DESC);
oprot.writeString(struct.runners);
@@ -1175,10 +1270,13 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
if (struct.isSetGui()) {
optionals.set(7);
}
- if (struct.isSetRunners()) {
+ if (struct.isSetNoteGui()) {
optionals.set(8);
}
- oprot.writeBitSet(optionals, 9);
+ if (struct.isSetRunners()) {
+ optionals.set(9);
+ }
+ oprot.writeBitSet(optionals, 10);
if (struct.isSetNoteId()) {
oprot.writeString(struct.noteId);
}
@@ -1203,6 +1301,9 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
if (struct.isSetGui()) {
oprot.writeString(struct.gui);
}
+ if (struct.isSetNoteGui()) {
+ oprot.writeString(struct.noteGui);
+ }
if (struct.isSetRunners()) {
oprot.writeString(struct.runners);
}
@@ -1211,7 +1312,7 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
@Override
public void read(org.apache.thrift.protocol.TProtocol prot, RemoteInterpreterContext struct) throws org.apache.thrift.TException {
TTupleProtocol iprot = (TTupleProtocol) prot;
- BitSet incoming = iprot.readBitSet(9);
+ BitSet incoming = iprot.readBitSet(10);
if (incoming.get(0)) {
struct.noteId = iprot.readString();
struct.setNoteIdIsSet(true);
@@ -1245,6 +1346,10 @@ public class RemoteInterpreterContext implements org.apache.thrift.TBase<RemoteI
struct.setGuiIsSet(true);
}
if (incoming.get(8)) {
+ struct.noteGui = iprot.readString();
+ struct.setNoteGuiIsSet(true);
+ }
+ if (incoming.get(9)) {
struct.runners = iprot.readString();
struct.setRunnersIsSet(true);
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
index e252775..c75a42f 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterEvent.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class RemoteInterpreterEvent implements org.apache.thrift.TBase<RemoteInterpreterEvent, RemoteInterpreterEvent._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterEvent> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterEvent");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
index b18bad5..efe05aa 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResult.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteInterpreterResult, RemoteInterpreterResult._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterResult> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterResult");
@@ -59,6 +59,7 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
private static final org.apache.thrift.protocol.TField MSG_FIELD_DESC = new org.apache.thrift.protocol.TField("msg", org.apache.thrift.protocol.TType.LIST, (short)2);
private static final org.apache.thrift.protocol.TField CONFIG_FIELD_DESC = new org.apache.thrift.protocol.TField("config", org.apache.thrift.protocol.TType.STRING, (short)3);
private static final org.apache.thrift.protocol.TField GUI_FIELD_DESC = new org.apache.thrift.protocol.TField("gui", org.apache.thrift.protocol.TType.STRING, (short)4);
+ private static final org.apache.thrift.protocol.TField NOTE_GUI_FIELD_DESC = new org.apache.thrift.protocol.TField("noteGui", org.apache.thrift.protocol.TType.STRING, (short)5);
private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
static {
@@ -70,13 +71,15 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
public List<RemoteInterpreterResultMessage> msg; // required
public String config; // required
public String gui; // required
+ public String noteGui; // required
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
public enum _Fields implements org.apache.thrift.TFieldIdEnum {
CODE((short)1, "code"),
MSG((short)2, "msg"),
CONFIG((short)3, "config"),
- GUI((short)4, "gui");
+ GUI((short)4, "gui"),
+ NOTE_GUI((short)5, "noteGui");
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
@@ -99,6 +102,8 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
return CONFIG;
case 4: // GUI
return GUI;
+ case 5: // NOTE_GUI
+ return NOTE_GUI;
default:
return null;
}
@@ -151,6 +156,8 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
tmpMap.put(_Fields.GUI, new org.apache.thrift.meta_data.FieldMetaData("gui", org.apache.thrift.TFieldRequirementType.DEFAULT,
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+ tmpMap.put(_Fields.NOTE_GUI, new org.apache.thrift.meta_data.FieldMetaData("noteGui", org.apache.thrift.TFieldRequirementType.DEFAULT,
+ new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
metaDataMap = Collections.unmodifiableMap(tmpMap);
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(RemoteInterpreterResult.class, metaDataMap);
}
@@ -162,13 +169,15 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
String code,
List<RemoteInterpreterResultMessage> msg,
String config,
- String gui)
+ String gui,
+ String noteGui)
{
this();
this.code = code;
this.msg = msg;
this.config = config;
this.gui = gui;
+ this.noteGui = noteGui;
}
/**
@@ -191,6 +200,9 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
if (other.isSetGui()) {
this.gui = other.gui;
}
+ if (other.isSetNoteGui()) {
+ this.noteGui = other.noteGui;
+ }
}
public RemoteInterpreterResult deepCopy() {
@@ -203,6 +215,7 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
this.msg = null;
this.config = null;
this.gui = null;
+ this.noteGui = null;
}
public String getCode() {
@@ -316,6 +329,30 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
}
}
+ public String getNoteGui() {
+ return this.noteGui;
+ }
+
+ public RemoteInterpreterResult setNoteGui(String noteGui) {
+ this.noteGui = noteGui;
+ return this;
+ }
+
+ public void unsetNoteGui() {
+ this.noteGui = null;
+ }
+
+ /** Returns true if field noteGui is set (has been assigned a value) and false otherwise */
+ public boolean isSetNoteGui() {
+ return this.noteGui != null;
+ }
+
+ public void setNoteGuiIsSet(boolean value) {
+ if (!value) {
+ this.noteGui = null;
+ }
+ }
+
public void setFieldValue(_Fields field, Object value) {
switch (field) {
case CODE:
@@ -350,6 +387,14 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
}
break;
+ case NOTE_GUI:
+ if (value == null) {
+ unsetNoteGui();
+ } else {
+ setNoteGui((String)value);
+ }
+ break;
+
}
}
@@ -367,6 +412,9 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
case GUI:
return getGui();
+ case NOTE_GUI:
+ return getNoteGui();
+
}
throw new IllegalStateException();
}
@@ -386,6 +434,8 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
return isSetConfig();
case GUI:
return isSetGui();
+ case NOTE_GUI:
+ return isSetNoteGui();
}
throw new IllegalStateException();
}
@@ -439,6 +489,15 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
return false;
}
+ boolean this_present_noteGui = true && this.isSetNoteGui();
+ boolean that_present_noteGui = true && that.isSetNoteGui();
+ if (this_present_noteGui || that_present_noteGui) {
+ if (!(this_present_noteGui && that_present_noteGui))
+ return false;
+ if (!this.noteGui.equals(that.noteGui))
+ return false;
+ }
+
return true;
}
@@ -466,6 +525,11 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
if (present_gui)
list.add(gui);
+ boolean present_noteGui = true && (isSetNoteGui());
+ list.add(present_noteGui);
+ if (present_noteGui)
+ list.add(noteGui);
+
return list.hashCode();
}
@@ -517,6 +581,16 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
return lastComparison;
}
}
+ lastComparison = Boolean.valueOf(isSetNoteGui()).compareTo(other.isSetNoteGui());
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ if (isSetNoteGui()) {
+ lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.noteGui, other.noteGui);
+ if (lastComparison != 0) {
+ return lastComparison;
+ }
+ }
return 0;
}
@@ -568,6 +642,14 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
sb.append(this.gui);
}
first = false;
+ if (!first) sb.append(", ");
+ sb.append("noteGui:");
+ if (this.noteGui == null) {
+ sb.append("null");
+ } else {
+ sb.append(this.noteGui);
+ }
+ first = false;
sb.append(")");
return sb.toString();
}
@@ -654,6 +736,14 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
break;
+ case 5: // NOTE_GUI
+ if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+ struct.noteGui = iprot.readString();
+ struct.setNoteGuiIsSet(true);
+ } else {
+ org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+ }
+ break;
default:
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
}
@@ -696,6 +786,11 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
oprot.writeString(struct.gui);
oprot.writeFieldEnd();
}
+ if (struct.noteGui != null) {
+ oprot.writeFieldBegin(NOTE_GUI_FIELD_DESC);
+ oprot.writeString(struct.noteGui);
+ oprot.writeFieldEnd();
+ }
oprot.writeFieldStop();
oprot.writeStructEnd();
}
@@ -726,7 +821,10 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
if (struct.isSetGui()) {
optionals.set(3);
}
- oprot.writeBitSet(optionals, 4);
+ if (struct.isSetNoteGui()) {
+ optionals.set(4);
+ }
+ oprot.writeBitSet(optionals, 5);
if (struct.isSetCode()) {
oprot.writeString(struct.code);
}
@@ -745,12 +843,15 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
if (struct.isSetGui()) {
oprot.writeString(struct.gui);
}
+ if (struct.isSetNoteGui()) {
+ oprot.writeString(struct.noteGui);
+ }
}
@Override
public void read(org.apache.thrift.protocol.TProtocol prot, RemoteInterpreterResult struct) throws org.apache.thrift.TException {
TTupleProtocol iprot = (TTupleProtocol) prot;
- BitSet incoming = iprot.readBitSet(4);
+ BitSet incoming = iprot.readBitSet(5);
if (incoming.get(0)) {
struct.code = iprot.readString();
struct.setCodeIsSet(true);
@@ -777,6 +878,10 @@ public class RemoteInterpreterResult implements org.apache.thrift.TBase<RemoteIn
struct.gui = iprot.readString();
struct.setGuiIsSet(true);
}
+ if (incoming.get(4)) {
+ struct.noteGui = iprot.readString();
+ struct.setNoteGuiIsSet(true);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
index a2aff29..37b3a87 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterResultMessage.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class RemoteInterpreterResultMessage implements org.apache.thrift.TBase<RemoteInterpreterResultMessage, RemoteInterpreterResultMessage._Fields>, java.io.Serializable, Cloneable, Comparable<RemoteInterpreterResultMessage> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("RemoteInterpreterResultMessage");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
index def96fa..ba13f64 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/RemoteInterpreterService.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class RemoteInterpreterService {
public interface Iface {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
index 78cb090..17b6bd8 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/thrift/ZeppelinServerResourceParagraphRunner.java
@@ -51,7 +51,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
-@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-3-27")
+@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2017-10-22")
public class ZeppelinServerResourceParagraphRunner implements org.apache.thrift.TBase<ZeppelinServerResourceParagraphRunner, ZeppelinServerResourceParagraphRunner._Fields>, java.io.Serializable, Cloneable, Comparable<ZeppelinServerResourceParagraphRunner> {
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ZeppelinServerResourceParagraphRunner");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift b/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
index f20fb90..559648a 100644
--- a/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
+++ b/zeppelin-interpreter/src/main/thrift/RemoteInterpreterService.thrift
@@ -27,7 +27,8 @@ struct RemoteInterpreterContext {
6: string authenticationInfo,
7: string config, // json serialized config
8: string gui, // json serialized gui
- 9: string runners // json serialized runner
+ 9: string noteGui, // json serialized note gui
+ 10: string runners // json serialized runner
}
struct RemoteInterpreterResultMessage {
@@ -39,6 +40,7 @@ struct RemoteInterpreterResult {
2: list<RemoteInterpreterResultMessage> msg,
3: string config, // json serialized config
4: string gui // json serialized gui
+ 5: string noteGui // json serialized note gui
}
enum RemoteInterpreterEventType {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java
index d15fab4..d3d5a00 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/display/InputTest.java
@@ -47,7 +47,7 @@ public class InputTest {
public void testFormExtraction() {
// textbox form
String script = "${input_form=}";
- Map<String, Input> forms = Input.extractSimpleQueryForm(script);
+ Map<String, Input> forms = Input.extractSimpleQueryForm(script, false);
assertEquals(1, forms.size());
Input form = forms.get("input_form");
assertEquals("input_form", form.name);
@@ -57,14 +57,14 @@ public class InputTest {
// textbox form with display name & default value
script = "${input_form(Input Form)=xxx}";
- forms = Input.extractSimpleQueryForm(script);
+ forms = Input.extractSimpleQueryForm(script, false);
form = forms.get("input_form");
assertEquals("xxx", form.defaultValue);
assertTrue(form instanceof TextBox);
// selection form
script = "${select_form(Selection Form)=op1,op1|op2(Option 2)|op3}";
- form = Input.extractSimpleQueryForm(script).get("select_form");
+ form = Input.extractSimpleQueryForm(script, false).get("select_form");
assertEquals("select_form", form.name);
assertEquals("op1", form.defaultValue);
assertTrue(form instanceof Select);
@@ -74,7 +74,7 @@ public class InputTest {
// checkbox form
script = "${checkbox:checkbox_form=op1,op1|op2|op3}";
- form = Input.extractSimpleQueryForm(script).get("checkbox_form");
+ form = Input.extractSimpleQueryForm(script, false).get("checkbox_form");
assertEquals("checkbox_form", form.name);
assertTrue(form instanceof CheckBox);
@@ -85,7 +85,7 @@ public class InputTest {
// checkbox form with multiple default checks
script = "${checkbox:checkbox_form(Checkbox Form)=op1|op3,op1(Option 1)|op2|op3}";
- form = Input.extractSimpleQueryForm(script).get("checkbox_form");
+ form = Input.extractSimpleQueryForm(script, false).get("checkbox_form");
assertEquals("checkbox_form", form.name);
assertEquals("Checkbox Form", form.displayName);
assertTrue(form instanceof CheckBox);
@@ -96,7 +96,7 @@ public class InputTest {
// checkbox form with no default check
script = "${checkbox:checkbox_form(Checkbox Form)=,op1(Option 1)|op2(Option 2)|op3(Option 3)}";
- form = Input.extractSimpleQueryForm(script).get("checkbox_form");
+ form = Input.extractSimpleQueryForm(script, false).get("checkbox_form");
assertEquals("checkbox_form", form.name);
assertEquals("Checkbox Form", form.displayName);
assertTrue(form instanceof CheckBox);
@@ -116,14 +116,14 @@ public class InputTest {
params.put("input_form", "some_input");
params.put("select_form", "s_op2");
params.put("checkbox_form", new String[]{"c_op1", "c_op3"});
- String replaced = Input.getSimpleQuery(params, script);
+ String replaced = Input.getSimpleQuery(params, script, false);
assertEquals("INPUT=some_inputSELECTED=s_op2\nCHECKED=c_op1,c_op3", replaced);
// test form substitution with new forms
script = "INPUT=${input_form=}SELECTED=${select_form(Selection Form)=,s_op1|s_op2|s_op3}\n" +
"CHECKED=${checkbox:checkbox_form=c_op1|c_op2,c_op1|c_op2|c_op3}\n" +
"NEW_CHECKED=${checkbox( and ):new_check=nc_a|nc_c,nc_a|nc_b|nc_c}";
- replaced = Input.getSimpleQuery(params, script);
+ replaced = Input.getSimpleQuery(params, script, false);
assertEquals("INPUT=some_inputSELECTED=s_op2\nCHECKED=c_op1,c_op3\n" +
"NEW_CHECKED=nc_a and nc_c", replaced);
@@ -131,7 +131,7 @@ public class InputTest {
script = "INPUT=${input_form=}SELECTED=${select_form(Selection Form)=,s_op1|s_op2|s_op3}\n" +
"CHECKED=${checkbox:checkbox_form=c_op1|c_op2,c_op1|c_op2|c_op3_new}\n" +
"NEW_CHECKED=${checkbox( and ):new_check=nc_a|nc_c,nc_a|nc_b|nc_c}";
- replaced = Input.getSimpleQuery(params, script);
+ replaced = Input.getSimpleQuery(params, script, false);
assertEquals("INPUT=some_inputSELECTED=s_op2\nCHECKED=c_op1\n" +
"NEW_CHECKED=nc_a and nc_c", replaced);
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java
index ecdf108..70e2cba 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java
@@ -27,7 +27,7 @@ public class InterpreterContextTest {
public void testThreadLocal() {
assertNull(InterpreterContext.get());
- InterpreterContext.set(new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null));
+ InterpreterContext.set(new InterpreterContext(null, null, null, null, null, null, null, null, null, null, null, null, null));
assertNotNull(InterpreterContext.get());
InterpreterContext.remove();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java
index d341b58..4156691 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterTest.java
@@ -70,6 +70,7 @@ public class InterpreterTest {
null,
null,
null,
+ null,
null));
Properties p = new Properties();
p.put("p1", "replName #{noteId}, #{paragraphTitle}, #{paragraphId}, #{paragraphText}, #{replName}, #{noteId}, #{user}," +
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/LazyOpenInterpreterTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/LazyOpenInterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/LazyOpenInterpreterTest.java
index 8e325f2..165625e 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/LazyOpenInterpreterTest.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/LazyOpenInterpreterTest.java
@@ -36,7 +36,7 @@ public class LazyOpenInterpreterTest {
assertFalse("Interpreter is not open", lazyOpenInterpreter.isOpen());
InterpreterContext interpreterContext =
- new InterpreterContext("note", "id", null, "title", "text", null, null, null, null, null, null, null);
+ new InterpreterContext("note", "id", null, "title", "text", null, null, null, null, null, null, null, null);
lazyOpenInterpreter.interpret("intp 1", interpreterContext);
assertTrue("Interpeter is open", lazyOpenInterpreter.isOpen());
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index a3e8714..184735a 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -33,10 +33,7 @@ import org.apache.commons.lang.StringUtils;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.zeppelin.conf.ZeppelinConfiguration;
import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
-import org.apache.zeppelin.display.AngularObject;
-import org.apache.zeppelin.display.AngularObjectRegistry;
-import org.apache.zeppelin.display.AngularObjectRegistryListener;
-import org.apache.zeppelin.display.Input;
+import org.apache.zeppelin.display.*;
import org.apache.zeppelin.helium.ApplicationEventListener;
import org.apache.zeppelin.helium.HeliumPackage;
import org.apache.zeppelin.interpreter.*;
@@ -356,6 +353,12 @@ public class NotebookServer extends WebSocketServlet
case WATCHER:
switchConnectionToWatcher(conn, messagereceived);
break;
+ case SAVE_NOTE_FORMS:
+ saveNoteForms(conn, userAndRoles, notebook, messagereceived);
+ break;
+ case REMOVE_NOTE_FORMS:
+ removeNoteForms(conn, userAndRoles, notebook, messagereceived);
+ break;
default:
break;
}
@@ -649,6 +652,8 @@ public class NotebookServer extends WebSocketServlet
}
public void broadcastParagraph(Note note, Paragraph p) {
+ broadcastNoteForms(note);
+
if (note.isPersonalizedMode()) {
broadcastParagraphs(p.getUserParagraphMap(), p);
} else {
@@ -1227,7 +1232,6 @@ public class NotebookServer extends WebSocketServlet
p.setText((String) fromMessage.get("paragraph"));
}
-
note.persist(subject);
if (note.isPersonalizedMode()) {
@@ -2530,4 +2534,53 @@ public class NotebookServer extends WebSocketServlet
}
setting.clearNoteIdAndParaMap();
}
+
+ public void broadcastNoteForms(Note note) {
+ GUI formsSettings = new GUI();
+ formsSettings.setForms(note.getNoteForms());
+ formsSettings.setParams(note.getNoteParams());
+
+ broadcast(note.getId(), new Message(OP.SAVE_NOTE_FORMS).put("formsData", formsSettings));
+ }
+
+ private void saveNoteForms(NotebookSocket conn, HashSet<String> userAndRoles, Notebook notebook,
+ Message fromMessage) throws IOException {
+ String noteId = (String) fromMessage.get("noteId");
+ Map<String, Object> noteParams = (Map<String, Object>) fromMessage.get("noteParams");
+
+ if (!hasParagraphWriterPermission(conn, notebook, noteId,
+ userAndRoles, fromMessage.principal, "update")) {
+ return;
+ }
+
+ Note note = notebook.getNote(noteId);
+ if (note != null) {
+ note.setNoteParams(noteParams);
+
+ AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal);
+ note.persist(subject);
+ broadcastNoteForms(note);
+ }
+ }
+
+ private void removeNoteForms(NotebookSocket conn, HashSet<String> userAndRoles, Notebook notebook,
+ Message fromMessage) throws IOException {
+ String noteId = (String) fromMessage.get("noteId");
+ String formName = (String) fromMessage.get("formName");
+
+ if (!hasParagraphWriterPermission(conn, notebook, noteId,
+ userAndRoles, fromMessage.principal, "update")) {
+ return;
+ }
+
+ Note note = notebook.getNote(noteId);
+ if (note != null) {
+ note.getNoteForms().remove(formName);
+ note.getNoteParams().remove(formName);
+
+ AuthenticationInfo subject = new AuthenticationInfo(fromMessage.principal);
+ note.persist(subject);
+ broadcastNoteForms(note);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
index 6f537fd..d2b38ea 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/AbstractZeppelinIT.java
@@ -63,6 +63,10 @@ abstract public class AbstractZeppelinIT {
return "(//div[@ng-controller=\"ParagraphCtrl\"])[" + paragraphNo + "]";
}
+ protected String getNoteFormsXPath() {
+ return "(//div[@id='noteForms'])";
+ }
+
protected boolean waitForParagraph(final int paragraphNo, final String state) {
By locator = By.xpath(getParagraphXPath(paragraphNo)
+ "//div[contains(@class, 'control')]//span[2][contains(.,'" + state + "')]");
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
index 0911bf7..6c7dfa6 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
@@ -725,4 +725,164 @@ public class ParagraphActionsIT extends AbstractZeppelinIT {
handleException("Exception in ParagraphActionsIT while testMultipleDynamicFormsSameType ", e);
}
}
+
+ @Test
+ public void testNoteDynamicFormTextInput() throws Exception {
+ if (!endToEndTestEnabled()) {
+ return;
+ }
+ try {
+ createNewNote();
+
+ setTextOfParagraph(1, "%spark println(\"Hello \"+z.noteTextbox(\"name\", \"world\")) ");
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+ collector.checkThat("Output text is equal to value specified initially", driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(), CoreMatchers.equalTo("Hello world"));
+ driver.findElement(By.xpath(getNoteFormsXPath() + "//input")).clear();
+ driver.findElement(By.xpath(getNoteFormsXPath() + "//input")).sendKeys("Zeppelin");
+ driver.findElement(By.xpath(getNoteFormsXPath() + "//input")).sendKeys(Keys.RETURN);
+
+ collector.checkThat("After new data in text input form, output should not be changed",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Hello world"));
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+ collector.checkThat("Only after running the paragraph, we can see the newly updated output",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Hello Zeppelin"));
+
+ setTextOfParagraph(2, "%spark println(\"Hello \"+z.noteTextbox(\"name\", \"world\")) ");
+ runParagraph(2);
+ waitForParagraph(2, "FINISHED");
+ collector.checkThat("Running the another paragraph with same form, we can see value from note form",
+ driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Hello Zeppelin"));
+
+ deleteTestNotebook(driver);
+
+ } catch (Exception e) {
+ handleException("Exception in ParagraphActionsIT while testNoteDynamicFormTextInput ", e);
+ }
+ }
+
+ @Test
+ public void testNoteDynamicFormSelect() throws Exception {
+ if (!endToEndTestEnabled()) {
+ return;
+ }
+ try {
+ createNewNote();
+
+ setTextOfParagraph(1, "%spark println(\"Howdy \"+z.noteSelect(\"names\", Seq((\"1\",\"Alice\"), " +
+ "(\"2\",\"Bob\"),(\"3\",\"stranger\"))))");
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+ collector.checkThat("Output text should not display any of the options in select form",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Howdy "));
+
+ Select dropDownMenu = new Select(driver.findElement(By.xpath("(" + (getNoteFormsXPath() + "//select)[1]"))));
+
+ dropDownMenu.selectByVisibleText("Bob");
+ collector.checkThat("After selection in drop down menu, output should not be changed",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Howdy "));
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+
+ collector.checkThat("After run paragraph again, we can see the newly updated output",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Howdy 2"));
+
+ setTextOfParagraph(2, "%spark println(\"Howdy \"+z.noteSelect(\"names\", Seq((\"1\",\"Alice\"), " +
+ "(\"2\",\"Bob\"),(\"3\",\"stranger\"))))");
+
+ runParagraph(2);
+ waitForParagraph(2, "FINISHED");
+
+ collector.checkThat("Running the another paragraph with same form, we can see value from note form",
+ driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("Howdy 2"));
+
+ deleteTestNotebook(driver);
+
+ } catch (Exception e) {
+ handleException("Exception in ParagraphActionsIT while testNoteDynamicFormSelect ", e);
+ }
+ }
+
+ @Test
+ public void testDynamicNoteFormCheckbox() throws Exception {
+ if (!endToEndTestEnabled()) {
+ return;
+ }
+ try {
+ createNewNote();
+
+ setTextOfParagraph(1, "%spark val options = Seq((\"han\",\"Han\"), (\"leia\",\"Leia\"), " +
+ "(\"luke\",\"Luke\")); println(\"Greetings \"+z.noteCheckbox(\"skywalkers\",options).mkString(\" and \"))");
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+ collector.checkThat("Output text should display all of the options included in check boxes",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.containsString("Greetings han and leia and luke"));
+
+ WebElement firstCheckbox = driver.findElement(By.xpath("(" + getNoteFormsXPath() + "//input[@type='checkbox'])[1]"));
+ firstCheckbox.click();
+ collector.checkThat("After unchecking one of the boxes, output should not be changed",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.containsString("Greetings han and leia and luke"));
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+
+ collector.checkThat("After run paragraph again, we can see the newly updated output",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.containsString("Greetings leia and luke"));
+
+ setTextOfParagraph(2, "%spark val options = Seq((\"han\",\"Han\"), (\"leia\",\"Leia\"), " +
+ "(\"luke\",\"Luke\")); println(\"Greetings \"+z.noteCheckbox(\"skywalkers\",options).mkString(\" and \"))");
+
+ runParagraph(2);
+ waitForParagraph(2, "FINISHED");
+
+ collector.checkThat("Running the another paragraph with same form, we can see value from note form",
+ driver.findElement(By.xpath(getParagraphXPath(2) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.containsString("Greetings leia and luke"));
+
+ deleteTestNotebook(driver);
+
+ } catch (Exception e) {
+ handleException("Exception in ParagraphActionsIT while testDynamicNoteFormCheckbox ", e);
+ }
+ }
+
+ @Test
+ public void testWithNoteAndParagraphDynamicFormTextInput() throws Exception {
+ if (!endToEndTestEnabled()) {
+ return;
+ }
+ try {
+ createNewNote();
+
+ setTextOfParagraph(1, "%spark println(z.noteTextbox(\"name\", \"note\") + \" \" + z.textbox(\"name\", \"paragraph\")) ");
+
+ runParagraph(1);
+ waitForParagraph(1, "FINISHED");
+
+ collector.checkThat("After run paragraph, we can see computed output from two forms",
+ driver.findElement(By.xpath(getParagraphXPath(1) + "//div[contains(@class, 'text plainTextContent')]")).getText(),
+ CoreMatchers.equalTo("note paragraph"));
+
+ deleteTestNotebook(driver);
+
+ } catch (Exception e) {
+ handleException("Exception in ParagraphActionsIT while testWithNoteAndParagraphDynamicFormTextInput ", e);
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.css
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.css b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.css
new file mode 100644
index 0000000..d15b240
--- /dev/null
+++ b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.css
@@ -0,0 +1,24 @@
+import './note-create.css'
+
+.dynamicForm {
+ margin-right: 20px;
+ margin-left: 20px;
+}
+
+.dynamicForm.form-horizontal .form-group {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.dynamicForm.form-horizontal .form-group label {
+ padding-left: 0;
+}
+
+.dynamicForm.form-horizontal .form-group .checkbox-item {
+ padding-left: 0;
+ padding-right: 10px;
+}
+
+.dynamicForm.form-horizontal .form-group .checkbox-item input {
+ margin-right: 2px;
+}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html
new file mode 100644
index 0000000..4f3e715
--- /dev/null
+++ b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.html
@@ -0,0 +1,86 @@
+<!--
+Licensed 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.
+-->
+<form id="{{id}}_form" role="form"
+ ng-show="!hide"
+ class="dynamicForm form-horizontal row">
+ <div class="form-group col-sm-6 col-md-6 col-lg-4"
+ ng-repeat="formulaire in forms | toArray"
+ ng-init="loadForm(formulaire, params)">
+ <label class="control-label input-sm" ng-class="{'disable': disable}">{{formulaire.name}}</label>
+ <a ng-if="removeaction">
+ <i class="fa fa-times"
+ ng-click="removeaction(formulaire.name)"
+ tooltip-placement="bottom" uib-tooltip="Remove">
+ </i>
+ </a>
+ <div ng-if="actiononchange === true">
+ <input class="form-control input-sm"
+ ng-if="forms[formulaire.name].type == 'TextBox'"
+ ng-change="action()"
+ ng-model-options='{ debounce: 1000 }'
+ ng-model="params[formulaire.name]"
+ ng-class="{'disable': disable}"
+ name="{{formulaire.name}}" />
+ </div>
+ <div ng-if="!actiononchange">
+ <input class="form-control input-sm"
+ ng-if="forms[formulaire.name].type == 'TextBox'"
+ ng-enter="action()"
+ ng-model="params[formulaire.name]"
+ ng-class="{'disable': disable}"
+ name="{{formulaire.name}}" />
+ </div>
+ <div ng-if="actiononchange === true">
+ <select class="form-control input-sm"
+ ng-if="forms[formulaire.name].type == 'Select'"
+ ng-change="action()"
+ ng-model="params[formulaire.name]"
+ ng-class="{'disable': disable}"
+ name="{{formulaire.name}}"
+ ng-options="option.value as (option.displayName||option.value) for option in forms[formulaire.name].options">
+ </select>
+ </div>
+ <div ng-if="!actiononchange">
+ <select class="form-control input-sm"
+ ng-if="forms[formulaire.name].type == 'Select'"
+ ng-enter="action()"
+ ng-model="params[formulaire.name]"
+ ng-class="{'disable': disable}"
+ name="{{formulaire.name}}"
+ ng-options="option.value as (option.displayName||option.value) for option in forms[formulaire.name].options">
+ </select>
+ </div>
+ <div ng-if="actiononchange === true &&
+ forms[formulaire.name].type == 'CheckBox'">
+ <label ng-repeat="option in forms[formulaire.name].options"
+ class="checkbox-item input-sm">
+ <input type="checkbox"
+ ng-checked="params[formulaire.name].indexOf(option.value) > -1"
+ ng-class="{'disable': disable}"
+ ng-click="toggleCheckbox(formulaire, option, params); action()"/> {{option.displayName||option.value}}
+ </label>
+ </div>
+ <div ng-if="!actiononchange &&
+ forms[formulaire.name].type == 'CheckBox'">
+ <label ng-repeat="option in forms[formulaire.name].options"
+ class="checkbox-item input-sm">
+ <input type="checkbox"
+ ng-checked="params[formulaire.name].indexOf(option.value) > -1"
+ ng-class="{'disable': disable}"
+ ng-enter="action()"
+ ng-click="toggleCheckbox(formulaire, option, params)"/> {{option.displayName||option.value}}
+ </label>
+ </div>
+ </div>
+</form>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
new file mode 100644
index 0000000..40a70eb
--- /dev/null
+++ b/zeppelin-web/src/app/notebook/dynamic-forms/dynamic-forms.directive.js
@@ -0,0 +1,62 @@
+/*
+ * Licensed 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.
+ */
+
+import './dynamic-forms.css'
+
+angular.module('zeppelinWebApp').directive('dynamicForms', DynamicFormDirective)
+
+function DynamicFormDirective($templateRequest, $compile) {
+ return {
+ restrict: 'AE',
+ scope: {
+ id: '=id',
+ hide: '=hide',
+ disable: '=disable',
+ actiononchange: '=actiononchange',
+ forms: '=forms',
+ params: '=params',
+ action: '=action',
+ removeaction: '=removeaction'
+ },
+
+ link: function (scope, element, attrs, controller) {
+ scope.loadForm = this.loadForm
+ scope.toggleCheckbox = this.toggleCheckbox
+ $templateRequest('app/notebook/dynamic-forms/dynamic-forms.directive.html').then(function (formsHtml) {
+ let forms = angular.element(formsHtml)
+ element.append(forms)
+ $compile(forms)(scope)
+ })
+ },
+
+ loadForm: function (formulaire, params) {
+ let value = formulaire.defaultValue
+ if (params[formulaire.name]) {
+ value = params[formulaire.name]
+ }
+
+ params[formulaire.name] = value
+ },
+
+ toggleCheckbox: function (formulaire, option, params) {
+ let idx = params[formulaire.name].indexOf(option.value)
+ if (idx > -1) {
+ params[formulaire.name].splice(idx, 1)
+ } else {
+ params[formulaire.name].push(option.value)
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/notebook.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js
index 456e463..d09a0b2 100644
--- a/zeppelin-web/src/app/notebook/notebook.controller.js
+++ b/zeppelin-web/src/app/notebook/notebook.controller.js
@@ -27,6 +27,9 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
ngToast.dismiss()
$scope.note = null
+ $scope.actionOnFormSelectionChange = true
+ $scope.hideForms = false
+ $scope.disableForms = false
$scope.editorToggled = false
$scope.tableToggled = false
$scope.viewOnly = false
@@ -1367,6 +1370,26 @@ function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope,
}
}
+ $scope.$on('saveNoteForms', function (event, data) {
+ $scope.note.noteForms = data.formsData.forms
+ $scope.note.noteParams = data.formsData.params
+ })
+
+ $scope.isShowNoteForms = function() {
+ if ($scope.note && !angular.equals({}, $scope.note.noteForms)) {
+ return true
+ }
+ return false
+ }
+
+ $scope.saveNoteForms = function () {
+ websocketMsgSrv.saveNoteForms($scope.note)
+ }
+
+ $scope.removeNoteForms = function (formName) {
+ websocketMsgSrv.removeNoteForms($scope.note, formName)
+ }
+
$scope.$on('$destroy', function () {
angular.element(window).off('beforeunload')
$scope.killSaveTimer()
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/notebook.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html
index 9441f6e..f004e9b 100644
--- a/zeppelin-web/src/app/notebook/notebook.html
+++ b/zeppelin-web/src/app/notebook/notebook.html
@@ -119,6 +119,23 @@ limitations under the License.
</div>
<div class="note-jump"></div>
+ <div id="noteForms" ng-if="isShowNoteForms()" class="paragraph-space box">
+ <div>
+ <h4>Note forms</h4>
+ </div>
+ <hr />
+ <div>
+ <dynamic-forms
+ id="note.id"
+ hide="hideForms"
+ disable="disableForms"
+ actiononchange="actionOnFormSelectionChange"
+ forms="note.noteForms"
+ params="note.noteParams"
+ action="saveNoteForms"
+ removeaction="removeNoteForms"></dynamic-forms>
+ </div>
+ </div>
<!-- Include the paragraphs according to the note, pass the note to init function -->
<div id="{{currentParagraph.id}}_paragraphColumn_main"
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterized-query-form.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterized-query-form.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterized-query-form.html
deleted file mode 100644
index 249e7c1..0000000
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterized-query-form.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-Licensed 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.
--->
-<form id="{{paragraph.id}}_form" role="form"
- ng-show="!paragraph.config.tableHide"
- class=" paragraphForm form-horizontal row">
- <div class="form-group col-sm-6 col-md-6 col-lg-4"
- ng-repeat="formulaire in paragraph.settings.forms | toArray"
- ng-init="loadForm(formulaire, paragraph.settings.params)">
- <label class="control-label input-sm" ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }">{{formulaire.name}}</label>
- <div>
- <input class="form-control input-sm"
- ng-if="paragraph.settings.forms[formulaire.name].type == 'TextBox'"
- ng-enter="runParagraphFromButton(getEditorValue())"
- ng-model="paragraph.settings.params[formulaire.name]"
- ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }"
- name="{{formulaire.name}}" />
- </div>
- <div ng-if="paragraph.config.runOnSelectionChange == true">
- <select class="form-control input-sm"
- ng-if="paragraph.settings.forms[formulaire.name].type == 'Select'"
- ng-change="runParagraphFromButton(getEditorValue())"
- ng-model="paragraph.settings.params[formulaire.name]"
- ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }"
- name="{{formulaire.name}}"
- ng-options="option.value as (option.displayName||option.value) for option in paragraph.settings.forms[formulaire.name].options">
- </select>
- </div>
- <div ng-if="paragraph.config.runOnSelectionChange == false">
- <select class="form-control input-sm"
- ng-if="paragraph.settings.forms[formulaire.name].type == 'Select'"
- ng-enter="runParagraphFromButton(getEditorValue())"
- ng-model="paragraph.settings.params[formulaire.name]"
- ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }"
- name="{{formulaire.name}}"
- ng-options="option.value as (option.displayName||option.value) for option in paragraph.settings.forms[formulaire.name].options">
- </select>
- </div>
- <div ng-if="paragraph.config.runOnSelectionChange == true &&
- paragraph.settings.forms[formulaire.name].type == 'CheckBox'">
- <label ng-repeat="option in paragraph.settings.forms[formulaire.name].options"
- class="checkbox-item input-sm">
- <input type="checkbox"
- ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }"
- ng-checked="paragraph.settings.params[formulaire.name].indexOf(option.value) > -1"
- ng-click="toggleCheckbox(formulaire, option, false); runParagraphFromButton(getEditorValue())"/> {{option.displayName||option.value}}
- </label>
- </div>
- <div ng-if="paragraph.config.runOnSelectionChange == false &&
- paragraph.settings.forms[formulaire.name].type == 'CheckBox'">
- <label ng-repeat="option in paragraph.settings.forms[formulaire.name].options"
- class="checkbox-item input-sm">
- <input type="checkbox"
- ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING' }"
- ng-checked="paragraph.settings.params[formulaire.name].indexOf(option.value) > -1"
- ng-enter="runParagraphFromButton(getEditorValue())"
- ng-click="toggleCheckbox(formulaire, option, false)"/> {{option.displayName||option.value}}
- </label>
- </div>
- </div>
-</form>
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
index 7d95d3b..c578841 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js
@@ -466,9 +466,9 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
$scope.runParagraph(paragraphText, true, false)
}
- $scope.runParagraphFromButton = function (paragraphText) {
+ $scope.runParagraphFromButton = function () {
// we come here from the view, so we don't need to call `$digest()`
- $scope.runParagraph(paragraphText, false, false)
+ $scope.runParagraph($scope.getEditorValue(), false, false)
}
$scope.turnOnAutoRun = function (paragraph) {
@@ -657,24 +657,6 @@ function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $loca
commitParagraph(paragraph)
}
- $scope.loadForm = function (formulaire, params) {
- let value = formulaire.defaultValue
- if (params[formulaire.name]) {
- value = params[formulaire.name]
- }
-
- $scope.paragraph.settings.params[formulaire.name] = value
- }
-
- $scope.toggleCheckbox = function (formulaire, option) {
- let idx = $scope.paragraph.settings.params[formulaire.name].indexOf(option.value)
- if (idx > -1) {
- $scope.paragraph.settings.params[formulaire.name].splice(idx, 1)
- } else {
- $scope.paragraph.settings.params[formulaire.name].push(option.value)
- }
- }
-
$scope.aceChanged = function (_, editor) {
let session = editor.getSession()
let dirtyText = session.getValue()
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
index 29b203c..94230de 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js
@@ -34,7 +34,7 @@ describe('Controller: ParagraphCtrl', function () {
let functions = ['isRunning', 'getIframeDimensions', 'cancelParagraph', 'runParagraph', 'saveParagraph',
'moveUp', 'moveDown', 'insertNew', 'removeParagraph', 'toggleEditor', 'closeEditor', 'openEditor',
'closeTable', 'openTable', 'showTitle', 'hideTitle', 'setTitle', 'showLineNumbers', 'hideLineNumbers',
- 'changeColWidth', 'columnWidthClass', 'toggleOutput', 'loadForm',
+ 'changeColWidth', 'columnWidthClass', 'toggleOutput',
'aceChanged', 'aceLoaded', 'getEditorValue', 'getProgress', 'getExecutionTime', 'isResultOutdated']
functions.forEach(function (fn) {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/paragraph/paragraph.css
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css
index a0bf299..b17272b 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css
@@ -304,28 +304,6 @@ table.table-shortcut {
}
/*
- Paragraph Forms CSS
-*/
-
-.paragraphForm.form-horizontal .form-group {
- margin-right: 0;
- margin-left: 0;
-}
-
-.paragraphForm.form-horizontal .form-group label {
- padding-left: 0;
-}
-
-.paragraphForm.form-horizontal .form-group .checkbox-item {
- padding-left: 0;
- padding-right: 10px;
-}
-
-.paragraphForm.form-horizontal .form-group .checkbox-item input {
- margin-right: 2px;
-}
-
-/*
Ace Text Editor CSS
*/
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/app/notebook/paragraph/paragraph.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
index f80fb53..10afd17 100644
--- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html
+++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
@@ -49,7 +49,16 @@ limitations under the License.
</div>
<div ng-include src="'app/notebook/paragraph/paragraph-progress-bar.html'"></div>
- <div ng-include src="'app/notebook/paragraph/paragraph-parameterized-query-form.html'"></div>
+ <div>
+ <dynamic-forms
+ id="paragraph.id"
+ hide="paragraph.config.tableHide"
+ disable="paragraph.status == 'RUNNING' || paragraph.status == 'PENDING'"
+ actiononchange="paragraph.config.runOnSelectionChange"
+ forms="paragraph.settings.forms"
+ params="paragraph.settings.params"
+ action="runParagraphFromButton"></dynamic-forms>
+ </div>
<!-- Rendering -->
<div class="tableDisplay"
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/components/websocket/websocket-event.factory.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/websocket/websocket-event.factory.js b/zeppelin-web/src/components/websocket/websocket-event.factory.js
index d4bfadf..70d61ec 100644
--- a/zeppelin-web/src/components/websocket/websocket-event.factory.js
+++ b/zeppelin-web/src/components/websocket/websocket-event.factory.js
@@ -142,6 +142,8 @@ function WebsocketEventFactory ($rootScope, $websocket, $location, baseUrlSrv) {
$rootScope.$broadcast('noteRevisionForCompare', data)
} else if (op === 'INTERPRETER_BINDINGS') {
$rootScope.$broadcast('interpreterBindings', data)
+ } else if (op === 'SAVE_NOTE_FORMS') {
+ $rootScope.$broadcast('saveNoteForms', data)
} else if (op === 'ERROR_INFO') {
BootstrapDialog.show({
closable: false,
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/components/websocket/websocket-message.service.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/components/websocket/websocket-message.service.js b/zeppelin-web/src/components/websocket/websocket-message.service.js
index ab97fa8..cd65e1d 100644
--- a/zeppelin-web/src/components/websocket/websocket-message.service.js
+++ b/zeppelin-web/src/components/websocket/websocket-message.service.js
@@ -351,5 +351,23 @@ function WebsocketMessageService ($rootScope, websocketEvents) {
websocketEvents.sendNewEvent({op: 'GET_INTERPRETER_SETTINGS'})
},
+ saveNoteForms: function (note) {
+ websocketEvents.sendNewEvent({op: 'SAVE_NOTE_FORMS',
+ data: {
+ noteId: note.id,
+ noteParams: note.noteParams
+ }
+ })
+ },
+
+ removeNoteForms: function (note, formName) {
+ websocketEvents.sendNewEvent({op: 'REMOVE_NOTE_FORMS',
+ data: {
+ noteId: note.id,
+ formName: formName
+ }
+ })
+ }
+
}
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-web/src/index.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/index.js b/zeppelin-web/src/index.js
index ed8f1d8..4c41336 100644
--- a/zeppelin-web/src/index.js
+++ b/zeppelin-web/src/index.js
@@ -58,6 +58,7 @@ import './app/search/result-list.controller.js'
import './app/search/search.service.js'
import './app/helium'
import './app/helium/helium.service.js'
+import './app/notebook/dynamic-forms/dynamic-forms.directive.js'
import './components/array-ordering/array-ordering.service.js'
import './components/navbar/navbar.controller.js'
import './components/navbar/expand-collapse/expand-collapse.directive.js'
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
index 13fe46a..8964210 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java
@@ -238,11 +238,15 @@ public class RemoteInterpreter extends Interpreter {
context.getConfig().clear();
context.getConfig().putAll(remoteConfig);
GUI currentGUI = context.getGui();
+ GUI currentNoteGUI = context.getNoteGui();
if (form == FormType.NATIVE) {
GUI remoteGui = GUI.fromJson(remoteResult.getGui());
+ GUI remoteNoteGui = GUI.fromJson(remoteResult.getNoteGui());
currentGUI.clear();
currentGUI.setParams(remoteGui.getParams());
currentGUI.setForms(remoteGui.getForms());
+ currentNoteGUI.setParams(remoteNoteGui.getParams());
+ currentNoteGUI.setForms(remoteNoteGui.getForms());
} else if (form == FormType.SIMPLE) {
final Map<String, Input> currentForms = currentGUI.getForms();
final Map<String, Object> currentParams = currentGUI.getParams();
@@ -403,7 +407,8 @@ public class RemoteInterpreter extends Interpreter {
private RemoteInterpreterContext convert(InterpreterContext ic) {
return new RemoteInterpreterContext(ic.getNoteId(), ic.getParagraphId(), ic.getReplName(),
ic.getParagraphTitle(), ic.getParagraphText(), gson.toJson(ic.getAuthenticationInfo()),
- gson.toJson(ic.getConfig()), ic.getGui().toJson(), gson.toJson(ic.getRunners()));
+ gson.toJson(ic.getConfig()), ic.getGui().toJson(), gson.toJson(ic.getNoteGui()),
+ gson.toJson(ic.getRunners()));
}
private InterpreterResult convert(RemoteInterpreterResult result) {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
index 9fb0f0e..6e66732 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
@@ -74,6 +74,9 @@ public class Note implements ParagraphJobListener, JsonSerializable {
private String name = "";
private String id;
+ private Map<String, Object> noteParams = new HashMap<>();
+ private LinkedHashMap<String, Input> noteForms = new LinkedHashMap<>();
+
private transient ZeppelinConfiguration conf = ZeppelinConfiguration.create();
@@ -158,6 +161,22 @@ public class Note implements ParagraphJobListener, JsonSerializable {
return name;
}
+ public Map<String, Object> getNoteParams() {
+ return noteParams;
+ }
+
+ public void setNoteParams(Map<String, Object> noteParams) {
+ this.noteParams = noteParams;
+ }
+
+ public LinkedHashMap<String, Input> getNoteForms() {
+ return noteForms;
+ }
+
+ public void setNoteForms(LinkedHashMap<String, Input> noteForms) {
+ this.noteForms = noteForms;
+ }
+
public String getNameWithoutPath() {
String notePath = getName();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
index 6a0c27a..10a8548 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
@@ -408,14 +408,28 @@ public class Paragraph extends Job implements Cloneable, JsonSerializable {
if (interpreter.getFormType() == FormType.NATIVE) {
settings.clear();
} else if (interpreter.getFormType() == FormType.SIMPLE) {
- // inputs will be built from script scriptText
- LinkedHashMap<String, Input> inputs = Input.extractSimpleQueryForm(this.scriptText);
+ // inputs will be built from script body
+ LinkedHashMap<String, Input> inputs = Input.extractSimpleQueryForm(script, false);
+ LinkedHashMap<String, Input> noteInputs = Input.extractSimpleQueryForm(script, true);
final AngularObjectRegistry angularRegistry =
interpreter.getInterpreterGroup().getAngularObjectRegistry();
- String scriptBody = extractVariablesFromAngularRegistry(this.scriptText, inputs,
- angularRegistry);
+ String scriptBody = extractVariablesFromAngularRegistry(script, inputs, angularRegistry);
+
settings.setForms(inputs);
- script = Input.getSimpleQuery(settings.getParams(), scriptBody);
+ if (!noteInputs.isEmpty()) {
+ if (!note.getNoteForms().isEmpty()) {
+ Map<String, Input> currentNoteForms = note.getNoteForms();
+ for (String s : noteInputs.keySet()) {
+ if (!currentNoteForms.containsKey(s)) {
+ currentNoteForms.put(s, noteInputs.get(s));
+ }
+ }
+ } else {
+ note.setNoteForms(noteInputs);
+ }
+ }
+ script = Input.getSimpleQuery(note.getNoteParams(), scriptBody, true);
+ script = Input.getSimpleQuery(settings.getParams(), script, false);
}
logger.debug("RUN : " + script);
try {
@@ -423,6 +437,11 @@ public class Paragraph extends Job implements Cloneable, JsonSerializable {
InterpreterContext.set(context);
InterpreterResult ret = interpreter.interpret(script, context);
+ if (interpreter.getFormType() == FormType.NATIVE) {
+ note.setNoteParams(context.getNoteGui().getParams());
+ note.setNoteForms(context.getNoteGui().getForms());
+ }
+
if (Code.KEEP_PREVIOUS_RESULT == ret.code()) {
return getReturn();
}
@@ -545,8 +564,8 @@ public class Paragraph extends Job implements Cloneable, JsonSerializable {
InterpreterContext interpreterContext =
new InterpreterContext(note.getId(), getId(), intpText, this.getTitle(),
- this.getText(), this.getAuthenticationInfo(), this.getConfig(), this.settings, registry,
- resourcePool, runners, output);
+ this.getText(), this.getAuthenticationInfo(), this.getConfig(), this.settings,
+ getNoteGui(), registry, resourcePool, runners, output);
return interpreterContext;
}
@@ -575,13 +594,12 @@ public class Paragraph extends Job implements Cloneable, JsonSerializable {
InterpreterContext interpreterContext =
new InterpreterContext(note.getId(), getId(), intpText, this.getTitle(),
- this.getText(), this.getAuthenticationInfo(), this.getConfig(), this.settings, registry,
- resourcePool, runners, output);
+ this.getText(), this.getAuthenticationInfo(), this.getConfig(), this.settings,
+ getNoteGui(), registry, resourcePool, runners, output);
return interpreterContext;
}
public InterpreterContextRunner getInterpreterContextRunner() {
-
return new ParagraphRunner(note, note.getId(), getId());
}
@@ -743,6 +761,13 @@ public class Paragraph extends Job implements Cloneable, JsonSerializable {
return runtimeInfos;
}
+ private GUI getNoteGui() {
+ GUI gui = new GUI();
+ gui.setParams(this.note.getNoteParams());
+ gui.setForms(this.note.getNoteForms());
+ return gui;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
index d99bd59..82d96ae 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/socket/Message.java
@@ -182,8 +182,10 @@ public class Message implements JsonSerializable {
NOTE_UPDATED, // [s-c] paragraph updated(name, config)
RUN_ALL_PARAGRAPHS, // [c-s] run all paragraphs
PARAGRAPH_EXECUTED_BY_SPELL, // [c-s] paragraph was executed by spell
- RUN_PARAGRAPH_USING_SPELL, // [s-c] run paragraph using spell
- PARAS_INFO // [s-c] paragraph runtime infos
+ RUN_PARAGRAPH_USING_SPELL, // [s-c] run paragraph using spell
+ PARAS_INFO, // [s-c] paragraph runtime infos
+ SAVE_NOTE_FORMS, // save note forms
+ REMOVE_NOTE_FORMS // remove note forms
}
private static final Gson gson = new Gson();
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/lifecycle/TimeoutLifecycleManagerTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/lifecycle/TimeoutLifecycleManagerTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/lifecycle/TimeoutLifecycleManagerTest.java
index 971f376..329cb7a 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/lifecycle/TimeoutLifecycleManagerTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/lifecycle/TimeoutLifecycleManagerTest.java
@@ -56,7 +56,7 @@ public class TimeoutLifecycleManagerTest extends AbstractInterpreterTest {
RemoteInterpreter remoteInterpreter = (RemoteInterpreter) interpreterFactory.getInterpreter("user1", "note1", "test.echo");
InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "repl",
"title", "text", AuthenticationInfo.ANONYMOUS, new HashMap<String, Object>(), new GUI(),
- null, null, new ArrayList<InterpreterContextRunner>(), null);
+ new GUI(), null, null, new ArrayList<InterpreterContextRunner>(), null);
remoteInterpreter.interpret("hello world", context);
assertTrue(remoteInterpreter.isOpened());
InterpreterSetting interpreterSetting = interpreterSettingManager.getInterpreterSettingByName("test");
@@ -95,7 +95,7 @@ public class TimeoutLifecycleManagerTest extends AbstractInterpreterTest {
protected Object jobRun() throws Throwable {
InterpreterContext context = new InterpreterContext("noteId", "paragraphId", "repl",
"title", "text", AuthenticationInfo.ANONYMOUS, new HashMap<String, Object>(), new GUI(),
- null, null, new ArrayList<InterpreterContextRunner>(), null);
+ new GUI(), null, null, new ArrayList<InterpreterContextRunner>(), null);
return remoteInterpreter.interpret("100000", context);
}
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java
index 54814c4..658fda3 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteAngularObjectTest.java
@@ -86,6 +86,7 @@ public class RemoteAngularObjectTest implements AngularObjectRegistryListener {
new AuthenticationInfo(),
new HashMap<String, Object>(),
new GUI(),
+ new GUI(),
new AngularObjectRegistry(intp.getInterpreterGroup().getId(), null),
new LocalResourcePool("pool1"),
new LinkedList<InterpreterContextRunner>(), null);
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/50cfabdf/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java
index f52803d..fa2aa42 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterOutputTestStream.java
@@ -76,6 +76,7 @@ public class RemoteInterpreterOutputTestStream implements RemoteInterpreterProce
new AuthenticationInfo(),
new HashMap<String, Object>(),
new GUI(),
+ new GUI(),
null,
null,
new LinkedList<InterpreterContextRunner>(), null);