Fix problem with hint migration from v3EAP to v3
authorValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Fri, 29 Jul 2016 12:46:29 +0000 (15:46 +0300)
committerValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Fri, 29 Jul 2016 12:53:13 +0000 (15:53 +0300)
1) Remove hint migration because it works only for migration from v2 to v3 and doesn't work for v3EAP to v3
2) Keep string hint field to obtain compatibility between v2, v3EAP and v3
3) Create list of "additional" hints to support multihints.
4) Create api for getting all hints, it aggregates one hint and list of additional hints. It allows version supporting multihints to work with hints as if there's only one list

python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectService.java
python/educational-core/student/src/com/jetbrains/edu/learning/StudySerializationUtils.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/AnswerPlaceholder.java
python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyHint.kt

index 43691ae56c35be8fa6392572020416e3eddfc69d..59d67e6ca38d95354758d81ea5856f6355ca96ed 100644 (file)
@@ -94,7 +94,6 @@ public class CCProjectService implements PersistentStateComponent<Element> {
               int offset = document.getLineStartOffset(line) + start;
               addChildWithName(placeholder, OFFSET, offset);
               addChildWithName(placeholder, "useLength", "false");
-              addHints(placeholder);
             }
           }
         }
index 43c84a1d7b10397f4ed04462b85f67427075196f..ea49362f0f605d5d13557a35b4540667ff08e38d 100644 (file)
@@ -18,7 +18,6 @@ import com.jetbrains.edu.learning.courseFormat.TaskFile;
 import org.jdom.Attribute;
 import org.jdom.Element;
 import org.jdom.output.XMLOutputter;
-import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
 import java.lang.reflect.Type;
@@ -190,7 +189,6 @@ public class StudySerializationUtils {
               taskStatus = addStatus(outputter, placeholderTextToStatus, taskStatus, placeholder);
               addOffset(document, placeholder);
               addInitialState(document, placeholder);
-              addHints(placeholder);
             }
           }
           if (taskStatus != null) {
@@ -232,19 +230,6 @@ public class StudySerializationUtils {
       addChildWithName(placeholder, OFFSET, offset);
     }
 
-    public static void addHints(@NotNull Element placeholder) throws StudyUnrecognizedFormatException {
-      Element element = getChildWithName(placeholder, HINT, true);
-      if (element == null) {
-        return;
-      }
-      final String hint = element.getAttribute(VALUE).getValue();
-      Element listElement = new Element(LIST);
-      final Element hintElement = new Element(OPTION);
-      hintElement.setAttribute(VALUE, hint);
-      listElement.setContent(hintElement);
-      addChildWithName(placeholder, HINTS, listElement);
-    }
-
     public static int getAsInt(Element element, String name) throws StudyUnrecognizedFormatException {
       return Integer.valueOf(getChildWithName(element, name).getAttributeValue(VALUE));
     }
index f06489c552c3ab960ad1ea24f59d5cf65e873729..76e96d52e4e8e3662e8618241fe0ebb4ce6ebafd 100644 (file)
@@ -14,9 +14,12 @@ import java.util.List;
  */
 
 public class AnswerPlaceholder {
+  
+  @SerializedName("hint")
+  @Expose private String myHint = "";
 
   @SerializedName("hints")
-  @Expose private List<String> myHints = new ArrayList<String>();
+  @Expose private List<String> myAdditionalHints = new ArrayList<String>();
 
   @SerializedName("possible_answer")
   @Expose private String possibleAnswer = "";
@@ -68,12 +71,12 @@ public class AnswerPlaceholder {
   }
 
   @NotNull
-  public List<String> getHints() {
-    return myHints;
+  public List<String> getAdditionalHints() {
+    return myAdditionalHints;
   }
 
-  public void setHints(@Nullable final List<String> hints) {
-    myHints = hints;
+  public void setAdditionalHints(@Nullable final List<String> additionalHints) {
+    myAdditionalHints = additionalHints;
   }
 
   public String getPossibleAnswer() {
@@ -168,6 +171,56 @@ public class AnswerPlaceholder {
     myOffset = offset;
   }
 
+  public String getHint() {
+    return myHint;
+  }
+
+  public void setHint(String hint) {
+    myHint = hint;
+  }
+
+  @Transient
+  public List<String> getHints() {
+    final ArrayList<String> result = new ArrayList<>();
+    result.add(myHint);
+    result.addAll(myAdditionalHints);
+    return result;
+  }
+
+  @Transient
+  public void setHints(@NotNull final List<String> hints) {
+    if (hints.isEmpty()) return;
+    myHint = hints.get(0);
+    myAdditionalHints = hints.subList(1, hints.size());
+  }
+
+  public void setHintByIndex(int i, @NotNull final String text) {
+    if (i == 0) {
+      myHint = text;
+    }
+    else {
+      myAdditionalHints.set(i - 1, text);
+    }
+  }
+
+  public void addHint(@NotNull final String text) {
+    if (myHint.isEmpty() && myAdditionalHints.isEmpty()) {
+      myHint = text;
+    }
+    else {
+      myAdditionalHints.add(text);
+    }
+  }
+
+  public void removeHint(int i) {
+    if (i == 0) {
+      myHint = "";
+    }
+    else {
+      myAdditionalHints.remove(i);
+    }
+  }
+
   public static class MyInitialState {
     private int length = -1;
     private int offset = -1;
index 956c30ab3419fb23ee1e5a663a12feaa71573974..93677f2327f455972e07e5eb69d22684b6505110 100644 (file)
@@ -128,7 +128,7 @@ class StudyHint(private val myPlaceholder: AnswerPlaceholder?, project: Project)
       }
       else {
         isEditingMode = false
-        myPlaceholder!!.hints[myShownHintNumber] = currentDocument!!.text
+        myPlaceholder!!.setHintByIndex(myShownHintNumber, currentDocument!!.text)
         studyToolWindow.setText(myPlaceholder.hints[myShownHintNumber])
         studyToolWindow.setDefaultTopComponent()
       }
@@ -142,7 +142,7 @@ class StudyHint(private val myPlaceholder: AnswerPlaceholder?, project: Project)
   private inner class AddHint : AnAction("Add Hint", "Add Hint", AllIcons.General.Add) {
 
     override fun actionPerformed(e: AnActionEvent) {
-      myPlaceholder!!.hints.add(newHintDefaultText)
+      myPlaceholder!!.addHint(newHintDefaultText)
       myShownHintNumber++
       studyToolWindow.setText(newHintDefaultText)
     }
@@ -155,7 +155,7 @@ class StudyHint(private val myPlaceholder: AnswerPlaceholder?, project: Project)
   private inner class RemoveHint : AnAction("Remove Hint", "Remove Hint", AllIcons.General.Remove) {
 
     override fun actionPerformed(e: AnActionEvent) {
-      myPlaceholder!!.hints.removeAt(myShownHintNumber)
+      myPlaceholder!!.removeHint(myShownHintNumber)
       myShownHintNumber = if (myPlaceholder.hints.size == 1) 0 else if (myShownHintNumber + 1 < myPlaceholder.hints.size) myShownHintNumber + 1 else myShownHintNumber - 1
       studyToolWindow.setText(myPlaceholder.hints[myShownHintNumber])
     }