Author: pkluegl
Date: Fri Nov 15 09:04:07 2019
New Revision: 1869839

URL: http://svn.apache.org/viewvc?rev=1869839&view=rev
Log:
UIMA-3139: provide UI for explanation of inlined rules, refactor debug type 
system by introducing new type that can store required information

Added:
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRootNode.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRuleBlockNode.java
Modified:
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
    
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/DebugInfoFactory.java
    
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/visitor/InlinedRulesExplanationTest.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/ExplainConstants.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeContentProvider.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeLabelProvider.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyViewPage.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/element/ElementTreeContentProvider.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/failed/FailedViewPage.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeContentProvider.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeLabelProvider.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedViewPage.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/matched/MatchedViewPage.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainAbstractTreeNode.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainTree.java
    
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/IExplainTreeNode.java
    
uima/ruta/trunk/ruta-typesystem/src/main/resources/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
 Fri Nov 15 09:04:07 2019
@@ -26,6 +26,7 @@ import java.util.Map;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.Type;
 import org.apache.uima.ruta.RutaElement;
+import org.apache.uima.ruta.ScriptApply;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.block.RutaBlock;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
@@ -68,7 +69,8 @@ public class RutaVerbalizer {
 
   public String verbalize(Object element) {
     if (element != null) {
-      if (externalVerbalizers.keySet().contains(element.getClass()) && element 
instanceof RutaElement) {
+      if (externalVerbalizers.keySet().contains(element.getClass())
+              && element instanceof RutaElement) {
         return 
externalVerbalizers.get(element.getClass()).verbalize((RutaElement) element, 
this);
       } else if (element instanceof AbstractRutaAction) {
         return actionVerbalizer.verbalize((AbstractRutaAction) element);
@@ -106,6 +108,14 @@ public class RutaVerbalizer {
     return scriptVerbalizer.verbalizeRuleElement(element);
   }
 
+  public String verbalizeInlinedActionRuleBlock(List<ScriptApply> block) {
+    return scriptVerbalizer.verbalizeInlinedActionRuleApplyBlock(block);
+  }
+
+  public String verbalizeInlinedConditionRuleBlock(List<ScriptApply> block) {
+    return scriptVerbalizer.verbalizeInlinedConditionRuleApplyBlock(block);
+  }
+
   public String verbalizeType(Type type) {
     if (type.getName().equals(CAS.TYPE_NAME_DOCUMENT_ANNOTATION)) {
       return "Document";

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
 Fri Nov 15 09:04:07 2019
@@ -23,10 +23,12 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.uima.ruta.RutaElement;
 import org.apache.uima.ruta.RutaStatement;
+import org.apache.uima.ruta.ScriptApply;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.block.ForEachBlock;
 import org.apache.uima.ruta.block.RutaBlock;
@@ -212,32 +214,61 @@ public class ScriptVerbalizer {
     }
     if (re instanceof AbstractRuleElement) {
       AbstractRuleElement are = (AbstractRuleElement) re;
+
       List<List<RutaStatement>> inlinedConditionRuleBlocks = 
are.getInlinedConditionRuleBlocks();
       for (List<RutaStatement> inlinedConditionRules : 
inlinedConditionRuleBlocks) {
-        if (inlinedConditionRules != null && !inlinedConditionRules.isEmpty()) 
{
-          result.append(THEN2);
-          result.append(CBOPEN);
-          for (RutaStatement rutaStatement : inlinedConditionRules) {
-            result.append(verbalize(rutaStatement));
-          }
-          result.append(CBCLOSE);
-        }
+        
result.append(verbalizeInlinedConditionRuleBlock(inlinedConditionRules));
       }
       List<List<RutaStatement>> inlinedActionRuleBlocks = 
are.getInlinedActionRuleBlocks();
       for (List<RutaStatement> inlinedActionRules : inlinedActionRuleBlocks) {
-        if (inlinedActionRules != null && !inlinedActionRules.isEmpty()) {
-          result.append(THEN);
-          result.append(CBOPEN);
-          for (RutaStatement rutaStatement : inlinedActionRules) {
-            result.append(verbalize(rutaStatement));
-          }
-          result.append(CBCLOSE);
-        }
+        result.append(verbalizeInlinedActionRuleBlock(inlinedActionRules));
+      }
+    }
+    return result.toString();
+  }
+
+  public String verbalizeInlinedActionRuleBlock(List<RutaStatement> 
inlinedActionRules) {
+    StringBuilder result = new StringBuilder();
+    if (inlinedActionRules != null && !inlinedActionRules.isEmpty()) {
+      result.append(THEN);
+      result.append(CBOPEN);
+      for (RutaStatement rutaStatement : inlinedActionRules) {
+        result.append(verbalize(rutaStatement));
       }
+      result.append(CBCLOSE);
     }
     return result.toString();
   }
 
+  public String verbalizeInlinedConditionRuleBlock(List<RutaStatement> 
inlinedConditionRules) {
+    StringBuilder result = new StringBuilder();
+    if (inlinedConditionRules != null && !inlinedConditionRules.isEmpty()) {
+      result.append(THEN2);
+      result.append(CBOPEN);
+      for (RutaStatement rutaStatement : inlinedConditionRules) {
+        result.append(verbalize(rutaStatement));
+      }
+      result.append(CBCLOSE);
+    }
+    return result.toString();
+  }
+
+  public String verbalizeInlinedConditionRuleApplyBlock(List<ScriptApply> 
block) {
+
+    List<RutaStatement> list = block.stream().map(a -> a.getElement())
+            .filter(RutaStatement.class::isInstance).map(s -> (RutaStatement) 
s)
+            .collect(Collectors.toList());
+    return verbalizeInlinedConditionRuleBlock(list);
+  }
+
+  public String verbalizeInlinedActionRuleApplyBlock(List<ScriptApply> block) {
+
+    List<RutaStatement> list = block.stream().map(a -> a.getElement())
+            .filter(RutaStatement.class::isInstance).map(s -> (RutaStatement) 
s)
+            .collect(Collectors.toList());
+    return verbalizeInlinedActionRuleBlock(list);
+  }
+
   private String verbalizeConjunct(ConjunctRulesRuleElement re) {
     StringBuilder result = new StringBuilder();
     String sep = " % ";

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/DebugInfoFactory.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/DebugInfoFactory.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/DebugInfoFactory.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/visitor/DebugInfoFactory.java
 Fri Nov 15 09:04:07 2019
@@ -49,6 +49,7 @@ import org.apache.uima.ruta.rule.RutaRul
 import org.apache.uima.ruta.type.DebugBlockApply;
 import org.apache.uima.ruta.type.DebugEvaluatedCondition;
 import org.apache.uima.ruta.type.DebugFailedRuleMatch;
+import org.apache.uima.ruta.type.DebugInlinedBlock;
 import org.apache.uima.ruta.type.DebugMatchedRuleMatch;
 import org.apache.uima.ruta.type.DebugRuleApply;
 import org.apache.uima.ruta.type.DebugRuleElementMatch;
@@ -335,9 +336,9 @@ public class DebugInfoFactory {
         } else {
           rem = createDebugRuleElementMatch(each, stream, addToIndex);
         }
-        FSArray inlinedConditionRules = 
createInlinedRules(each.getInlinedConditionRules(), stream,
-                addToIndex, withMatches, timeInfo);
-        rem.setInlinedConditionRules(inlinedConditionRules);
+        FSArray inlinedConditionBlocks = 
createInlinedBlocks(each.getInlinedConditionRules(),
+                stream, true, addToIndex, withMatches, timeInfo);
+        rem.setInlinedConditionBlocks(inlinedConditionBlocks);
         if (rem != null) {
           remList.add(rem);
         }
@@ -348,43 +349,59 @@ public class DebugInfoFactory {
     }
     drems.setMatches(UIMAUtils.toFSArray(cas, remList));
 
-    FSArray inlinedActionRules = createInlinedActionRules(rems, stream, 
addToIndex, withMatches,
+    FSArray inlinedActionBlocks = createInlinedActionBlocks(rems, stream, 
addToIndex, withMatches,
             timeInfo);
-    drems.setInlinedActionRules(inlinedActionRules);
+    drems.setInlinedActionBlocks(inlinedActionBlocks);
 
     if (addToIndex)
       drems.addToIndexes();
     return drems;
   }
 
-  private FSArray createInlinedRules(List<List<ScriptApply>> blocks, 
RutaStream stream,
-          boolean addToIndex, boolean withMatches, Map<RutaElement, Long> 
timeInfo) {
+  private FSArray createInlinedBlocks(List<List<ScriptApply>> blocks, 
RutaStream stream,
+          boolean asCondition, boolean addToIndex, boolean withMatches,
+          Map<RutaElement, Long> timeInfo) {
     JCas jcas = stream.getJCas();
     if (blocks == null || blocks.isEmpty()) {
       return null;
     }
 
-    List<FSArray> resultList = new ArrayList<>();
+    List<DebugInlinedBlock> blockList = new ArrayList<>();
     for (List<ScriptApply> block : blocks) {
       List<DebugScriptApply> list = new ArrayList<>();
+      boolean oneRuleApplied = false;
       for (ScriptApply ruleApply : block) {
+        if (ruleApply instanceof RuleApply) {
+          if (((RuleApply) ruleApply).getApplied() > 0) {
+            oneRuleApplied = true;
+          }
+        }
         DebugScriptApply debugScriptApply = createDebugScriptApply(ruleApply, 
stream, addToIndex,
                 withMatches, timeInfo);
         list.add(debugScriptApply);
       }
-      resultList.add(FSCollectionFactory.createFSArray(jcas, list));
+      DebugInlinedBlock debugInlinedBlock = new DebugInlinedBlock(jcas);
+      
debugInlinedBlock.setInlinedRules(FSCollectionFactory.createFSArray(jcas, 
list));
+      debugInlinedBlock.setAsCondition(asCondition);
+      if (asCondition) {
+        
debugInlinedBlock.setElement(verbalizer.verbalizeInlinedConditionRuleBlock(block));
+        debugInlinedBlock.setMatched(oneRuleApplied);
+      } else {
+        
debugInlinedBlock.setElement(verbalizer.verbalizeInlinedActionRuleBlock(block));
+      }
+      blockList.add(debugInlinedBlock);
     }
-    return FSCollectionFactory.createFSArray(jcas, resultList);
+    return FSCollectionFactory.createFSArray(jcas, blockList);
   }
 
-  private FSArray createInlinedActionRules(List<RuleElementMatch> rems, 
RutaStream stream,
+  private FSArray createInlinedActionBlocks(List<RuleElementMatch> rems, 
RutaStream stream,
           boolean addToIndex, boolean withMatches, Map<RutaElement, Long> 
timeInfo) {
     if (rems == null || rems.isEmpty()) {
       return null;
     }
 
-    return createInlinedRules(rems.get(0).getInlinedActionRules(), stream, 
addToIndex, withMatches,
-            timeInfo);
+    return createInlinedBlocks(rems.get(0).getInlinedActionRules(), stream, 
false, addToIndex,
+            withMatches, timeInfo);
   }
 
   public DebugRuleElementMatch 
createDebugComposedRuleElementMatch(ComposedRuleElementMatch rem,
@@ -444,8 +461,9 @@ public class DebugInfoFactory {
       }
     }
 
-    if (addToIndex)
+    if (addToIndex) {
       drem.addToIndexes();
+    }
     return drem;
   }
 

Modified: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/visitor/InlinedRulesExplanationTest.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/visitor/InlinedRulesExplanationTest.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/visitor/InlinedRulesExplanationTest.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/visitor/InlinedRulesExplanationTest.java
 Fri Nov 15 09:04:07 2019
@@ -86,8 +86,8 @@ public class InlinedRulesExplanationTest
     DebugRuleElementMatches re1Matches = (DebugRuleElementMatches) 
reMatches1FS;
     DebugRuleElementMatches re2Matches = (DebugRuleElementMatches) 
reMatches2FS;
 
-    FSArray inlinedActionRules1 = re1Matches.getInlinedActionRules();
-    FSArray inlinedActionRules2 = re2Matches.getInlinedActionRules();
+    FSArray inlinedActionRules1 = re1Matches.getInlinedActionBlocks();
+    FSArray inlinedActionRules2 = re2Matches.getInlinedActionBlocks();
 
     Assert.assertEquals(1, inlinedActionRules1.size());
     Assert.assertEquals(2, inlinedActionRules2.size());
@@ -95,8 +95,8 @@ public class InlinedRulesExplanationTest
     DebugRuleElementMatch re1Match = (DebugRuleElementMatch) 
re1Matches.getMatches().get(0);
     DebugRuleElementMatch re2Match = (DebugRuleElementMatch) 
re2Matches.getMatches().get(0);
 
-    FSArray inlinedConditionRules1 = re1Match.getInlinedConditionRules();
-    FSArray inlinedConditionRules2 = re2Match.getInlinedConditionRules();
+    FSArray inlinedConditionRules1 = re1Match.getInlinedConditionBlocks();
+    FSArray inlinedConditionRules2 = re2Match.getInlinedConditionBlocks();
 
     Assert.assertEquals(2, inlinedConditionRules1.size());
     Assert.assertEquals(1, inlinedConditionRules2.size());

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/ExplainConstants.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/ExplainConstants.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/ExplainConstants.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/ExplainConstants.java
 Fri Nov 15 09:04:07 2019
@@ -22,6 +22,17 @@ package org.apache.uima.ruta.explain;
 import org.apache.uima.ruta.engine.RutaEngine;
 
 public class ExplainConstants {
+
+  public static final String INLINED_AS_CONDITION = "inlinedAsCondition";
+
+  public static final String INLINED_AS_ACTION = "inlinedAsAction";
+
+  public static final String INLINED_ACTION_BLOCK = "inlinedActionBlock";
+
+  public static final String INLINED_CONDITION_BLOCK_MATCHED = 
"inlinedConditionBlockMatched";
+
+  public static final String INLINED_CONDITION_BLOCK_FAILED = 
"inlinedConditionBlockFailed";
+
   public static final String BASIC_TYPE = RutaEngine.BASIC_TYPE;
 
   public static final String SCRIPT_APPLY_TYPE = 
"org.apache.uima.ruta.type.DebugScriptApply";

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeContentProvider.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeContentProvider.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeContentProvider.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeContentProvider.java
 Fri Nov 15 09:04:07 2019
@@ -29,6 +29,7 @@ import org.eclipse.jface.viewers.Viewer;
 
 public class ApplyTreeContentProvider implements ITreeContentProvider {
 
+  @Override
   public Object[] getChildren(Object parentElement) {
     if (parentElement instanceof IExplainTreeNode) {
       List<Object> result = new ArrayList<Object>();
@@ -43,6 +44,7 @@ public class ApplyTreeContentProvider im
     return null;
   }
 
+  @Override
   public Object getParent(Object element) {
     if (element instanceof IExplainTreeNode) {
       return ((IExplainTreeNode) element).getParent();
@@ -50,10 +52,12 @@ public class ApplyTreeContentProvider im
     return null;
   }
 
+  @Override
   public Object[] getElements(Object parentElement) {
     return getChildren(parentElement);
   }
 
+  @Override
   public boolean hasChildren(Object parentElement) {
     if (parentElement instanceof IExplainTreeNode) {
       IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
@@ -66,10 +70,11 @@ public class ApplyTreeContentProvider im
     return false;
   }
 
+  @Override
   public void dispose() {
   }
 
+  @Override
   public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
   }
-
 }

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeLabelProvider.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeLabelProvider.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeLabelProvider.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyTreeLabelProvider.java
 Fri Nov 15 09:04:07 2019
@@ -29,6 +29,7 @@ import org.apache.uima.cas.Type;
 import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.ruta.explain.ExplainConstants;
 import org.apache.uima.ruta.explain.tree.IExplainTreeNode;
+import org.apache.uima.ruta.type.ProfiledAnnotation;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.LabelProvider;
@@ -37,12 +38,12 @@ import org.eclipse.swt.graphics.Image;
 public class ApplyTreeLabelProvider extends LabelProvider implements 
ILabelProvider {
 
   private DecimalFormat dfTime = new DecimalFormat("###,###,##0.000",
-          DecimalFormatSymbols.getInstance(Locale.ENGLISH));;
+          DecimalFormatSymbols.getInstance(Locale.ENGLISH));
 
   private DecimalFormat dfPercentage = new DecimalFormat("##0.00",
-          DecimalFormatSymbols.getInstance(Locale.ENGLISH));;
+          DecimalFormatSymbols.getInstance(Locale.ENGLISH));
 
-  private ApplyViewPage owner;
+  protected ApplyViewPage owner;
 
   ImageDescriptor blockApply;
 
@@ -111,8 +112,9 @@ public class ApplyTreeLabelProvider exte
           IExplainTreeNode parentNode = debugNode.getParent();
           if (parentNode != null) {
             FeatureStructure parent = parentNode.getFeatureStructure();
-            if (parent != null) {
-              long parentTime = parent.getLongValue(f4);
+            if (parent instanceof ProfiledAnnotation) {
+              // TODO FSArray break in inlined by purpose?
+              long parentTime = ((ProfiledAnnotation) parent).getTime();
               if (parentTime > 0) {
                 percent = (took / (parentTime / 1000.0)) * 100.0;
               }

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyViewPage.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyViewPage.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyViewPage.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/apply/ApplyViewPage.java
 Fri Nov 15 09:04:07 2019
@@ -107,6 +107,23 @@ public class ApplyViewPage extends Page
     image = desc.createImage();
     name = ExplainConstants.RULE_APPLY_TYPE;
     images.put(name, image);
+    images.put(ExplainConstants.INLINED_AS_ACTION, image);
+
+    desc = RutaAddonsPlugin.getImageDescriptor("/icons/arrow_left.png");
+    image = desc.createImage();
+    images.put(ExplainConstants.INLINED_AS_CONDITION, image);
+
+    desc = 
RutaAddonsPlugin.getImageDescriptor("/icons/chart_organisation.png");
+    image = desc.createImage();
+    images.put(ExplainConstants.INLINED_ACTION_BLOCK, image);
+
+    desc = 
RutaAddonsPlugin.getImageDescriptor("/icons/chart_organisation_add.png");
+    image = desc.createImage();
+    images.put(ExplainConstants.INLINED_CONDITION_BLOCK_MATCHED, image);
+
+    desc = 
RutaAddonsPlugin.getImageDescriptor("/icons/chart_organisation_delete.png");
+    image = desc.createImage();
+    images.put(ExplainConstants.INLINED_CONDITION_BLOCK_FAILED, image);
 
     desc = RutaAddonsPlugin.getImageDescriptor("/icons/arrow_branch.png");
     image = desc.createImage();

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/element/ElementTreeContentProvider.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/element/ElementTreeContentProvider.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/element/ElementTreeContentProvider.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/element/ElementTreeContentProvider.java
 Fri Nov 15 09:04:07 2019
@@ -19,21 +19,29 @@
 
 package org.apache.uima.ruta.explain.element;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.uima.ruta.explain.tree.IExplainTreeNode;
+import org.apache.uima.ruta.explain.tree.InlinedRootNode;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 
-
 public class ElementTreeContentProvider implements ITreeContentProvider {
 
+  @Override
   public Object[] getChildren(Object parentElement) {
-    if (parentElement instanceof IExplainTreeNode) {
-      IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
-      return debugNode.getChildren().toArray();
+    List<Object> result = new ArrayList<Object>();
+    IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
+    for (IExplainTreeNode each : debugNode.getChildren()) {
+      if (!(each instanceof InlinedRootNode)) {
+        result.add(each);
+      }
     }
-    return null;
+    return result.toArray();
   }
 
+  @Override
   public Object getParent(Object element) {
     if (element instanceof IExplainTreeNode) {
       return ((IExplainTreeNode) element).getParent();
@@ -42,10 +50,12 @@ public class ElementTreeContentProvider
 
   }
 
+  @Override
   public Object[] getElements(Object element) {
     return getChildren(element);
   }
 
+  @Override
   public boolean hasChildren(Object parentElement) {
     if (parentElement instanceof IExplainTreeNode) {
       IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
@@ -54,9 +64,11 @@ public class ElementTreeContentProvider
     return false;
   }
 
+  @Override
   public void dispose() {
   }
 
+  @Override
   public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
   }
 

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/failed/FailedViewPage.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/failed/FailedViewPage.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/failed/FailedViewPage.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/failed/FailedViewPage.java
 Fri Nov 15 09:04:07 2019
@@ -26,6 +26,7 @@ import org.apache.uima.caseditor.editor.
 import org.apache.uima.ruta.addons.RutaAddonsPlugin;
 import org.apache.uima.ruta.explain.ExplainConstants;
 import org.apache.uima.ruta.explain.apply.ApplyView;
+import org.apache.uima.ruta.explain.inlined.InlinedView;
 import org.apache.uima.ruta.explain.rulelist.RuleListView;
 import org.apache.uima.ruta.explain.selection.ExplainSelectionView;
 import org.apache.uima.ruta.explain.tree.BlockApplyNode;
@@ -126,9 +127,11 @@ public class FailedViewPage extends Page
     }
   }
 
+  @Override
   public void selectionChanged(IWorkbenchPart part, ISelection selection) {
     if (selection instanceof TreeSelection
-            && (part instanceof ApplyView || part instanceof RuleListView || 
part instanceof ExplainSelectionView)) {
+            && (part instanceof ApplyView || part instanceof RuleListView
+                    || part instanceof ExplainSelectionView || part instanceof 
InlinedView)) {
       TreeSelection ts = (TreeSelection) selection;
       Object firstElement = ts.getFirstElement();
 

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeContentProvider.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeContentProvider.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeContentProvider.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeContentProvider.java
 Fri Nov 15 09:04:07 2019
@@ -19,68 +19,8 @@
 
 package org.apache.uima.ruta.explain.inlined;
 
-import java.util.ArrayList;
-import java.util.List;
+import org.apache.uima.ruta.explain.apply.ApplyTreeContentProvider;
 
-import org.apache.uima.ruta.explain.tree.IExplainTreeNode;
-import org.apache.uima.ruta.explain.tree.RuleMatchNode;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-public class InlinedTreeContentProvider implements ITreeContentProvider {
-
-  @Override
-  public Object[] getChildren(Object parentElement) {
-
-    // TODO
-    if (parentElement instanceof IExplainTreeNode) {
-      List<Object> result = new ArrayList<Object>();
-      IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
-      for (IExplainTreeNode each : debugNode.getChildren()) {
-        if (each instanceof RuleMatchNode) {
-          result.add(each);
-        }
-      }
-      return result.toArray();
-    }
-    return null;
-  }
-
-  @Override
-  public Object getParent(Object element) {
-    if (element instanceof IExplainTreeNode) {
-      return ((IExplainTreeNode) element).getParent();
-    }
-    return null;
-
-  }
-
-  @Override
-  public Object[] getElements(Object element) {
-    return getChildren(element);
-  }
-
-  @Override
-  public boolean hasChildren(Object parentElement) {
-
-    // TODO
-    // if (parentElement instanceof IExplainTreeNode) {
-    // IExplainTreeNode debugNode = (IExplainTreeNode) parentElement;
-    // for (Object each : debugNode.getChildren()) {
-    // if(!(each instanceof ExplainRootNode)) {
-    // return true;
-    // }
-    // }
-    // }
-    return false;
-  }
-
-  @Override
-  public void dispose() {
-  }
-
-  @Override
-  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-  }
+public class InlinedTreeContentProvider extends ApplyTreeContentProvider {
 
 }

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeLabelProvider.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeLabelProvider.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeLabelProvider.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedTreeLabelProvider.java
 Fri Nov 15 09:04:07 2019
@@ -20,47 +20,47 @@
 package org.apache.uima.ruta.explain.inlined;
 
 import org.apache.uima.cas.FeatureStructure;
-import org.apache.uima.cas.text.AnnotationFS;
-import org.apache.uima.ruta.explain.tree.RuleMatchNode;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
+import org.apache.uima.ruta.explain.ExplainConstants;
+import org.apache.uima.ruta.explain.apply.ApplyTreeLabelProvider;
+import org.apache.uima.ruta.explain.apply.ApplyViewPage;
+import org.apache.uima.ruta.explain.tree.InlinedRuleBlockNode;
+import org.apache.uima.ruta.type.DebugInlinedBlock;
 import org.eclipse.swt.graphics.Image;
 
+public class InlinedTreeLabelProvider extends ApplyTreeLabelProvider {
 
-public class InlinedTreeLabelProvider extends LabelProvider implements 
ILabelProvider {
-
-  private InlinedViewPage owner;
-
-  public InlinedTreeLabelProvider(InlinedViewPage owner) {
-    super();
-    this.owner = owner;
+  public InlinedTreeLabelProvider(ApplyViewPage owner) {
+    super(owner);
   }
 
   @Override
   public Image getImage(Object element) {
-    if (element instanceof RuleMatchNode) {
-      RuleMatchNode ruleMatchNode = (RuleMatchNode) element;
-      FeatureStructure fs = ruleMatchNode.getFeatureStructure();
-      if (fs != null) {
-        String name = fs.getType().getName();
-        return owner.getImage(name);
+    if (element instanceof InlinedRuleBlockNode) {
+      InlinedRuleBlockNode ruleBlockNode = (InlinedRuleBlockNode) element;
+      if (ruleBlockNode.isAsCondition()) {
+        if (ruleBlockNode.isMatched()) {
+          return 
owner.getImage(ExplainConstants.INLINED_CONDITION_BLOCK_MATCHED);
+        } else {
+          return 
owner.getImage(ExplainConstants.INLINED_CONDITION_BLOCK_FAILED);
+        }
+      } else {
+        return owner.getImage(ExplainConstants.INLINED_ACTION_BLOCK);
       }
     }
-    return null;
+
+    return super.getImage(element);
   }
 
   @Override
   public String getText(Object element) {
-    if (element instanceof RuleMatchNode) {
-      RuleMatchNode debugNode = (RuleMatchNode) element;
-      FeatureStructure fs = debugNode.getFeatureStructure();
-      if (fs != null) {
-        String s = ((AnnotationFS) fs).getCoveredText();
-        s = s.replaceAll("[\\n\\r]", "");
-        return s;
+    if (element instanceof InlinedRuleBlockNode) {
+      InlinedRuleBlockNode node = (InlinedRuleBlockNode) element;
+      FeatureStructure fs = node.getFeatureStructure();
+      if (fs instanceof DebugInlinedBlock) {
+        return ((DebugInlinedBlock) fs).getElement();
       }
     }
 
-    return element.toString();
+    return super.getText(element);
   }
 }

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedViewPage.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedViewPage.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedViewPage.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/inlined/InlinedViewPage.java
 Fri Nov 15 09:04:07 2019
@@ -19,129 +19,63 @@
 
 package org.apache.uima.ruta.explain.inlined;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.uima.caseditor.editor.AnnotationEditor;
-import org.apache.uima.ruta.addons.RutaAddonsPlugin;
-import org.apache.uima.ruta.explain.ExplainConstants;
 import org.apache.uima.ruta.explain.apply.ApplyView;
+import org.apache.uima.ruta.explain.apply.ApplyViewPage;
+import org.apache.uima.ruta.explain.element.ElementView;
+import org.apache.uima.ruta.explain.failed.FailedView;
+import org.apache.uima.ruta.explain.matched.MatchedView;
 import org.apache.uima.ruta.explain.rulelist.RuleListView;
 import org.apache.uima.ruta.explain.selection.ExplainSelectionView;
-import org.apache.uima.ruta.explain.tree.BlockApplyNode;
-import org.apache.uima.ruta.explain.tree.RuleApplyNode;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.apache.uima.ruta.explain.tree.ExplainAbstractTreeNode;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.Page;
-
-public class InlinedViewPage extends Page implements ISelectionListener {
-
-  private CheckboxTreeViewer treeView;
 
-  private Map<String, Image> images;
+public class InlinedViewPage extends ApplyViewPage implements 
ISelectionListener {
 
   public InlinedViewPage(AnnotationEditor editor) {
-    super();
-  }
-
-  @Override
-  public void dispose() {
-    getSite().getPage().removeSelectionListener(this);
-    if (images != null) {
-      for (Image each : images.values()) {
-        each.dispose();
-      }
-    }
-    super.dispose();
-  }
-
-  private void initImages() {
-    images = new HashMap<String, Image>();
-    ImageDescriptor desc;
-    Image image;
-    String name;
-
-    desc = RutaAddonsPlugin.getImageDescriptor("/icons/accept.png");
-    image = desc.createImage();
-    name = "matched";
-    images.put(name, image);
-
-    desc = RutaAddonsPlugin.getImageDescriptor("/icons/cancel.png");
-    image = desc.createImage();
-    name = "failed";
-    images.put(name, image);
-
-    desc = RutaAddonsPlugin.getImageDescriptor("/icons/font_add.png");
-    image = desc.createImage();
-    name = ExplainConstants.MATCHED_RULE_MATCH_TYPE;
-    images.put(name, image);
-
-    desc = RutaAddonsPlugin.getImageDescriptor("/icons/font_delete.png");
-    image = desc.createImage();
-    name = ExplainConstants.FAILED_RULE_MATCH_TYPE;
-    images.put(name, image);
-  }
-
-  public Image getImage(String name) {
-    if (images == null) {
-      initImages();
-    }
-    return images.get(name);
+    super(editor);
   }
 
   @Override
   public void createControl(Composite parent) {
-    treeView = new CheckboxTreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | 
SWT.V_SCROLL);
-    treeView.setContentProvider(new InlinedTreeContentProvider());
-    treeView.setLabelProvider(new InlinedTreeLabelProvider(this));
-    treeView.setInput(null);
-    getSite().setSelectionProvider(treeView);
+    viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
+    viewer.setContentProvider(new InlinedTreeContentProvider());
+    viewer.setLabelProvider(new InlinedTreeLabelProvider(this));
+
+    document.addChangeListener(this);
+
+    viewer.setAutoExpandLevel(2);
+    viewer.addDoubleClickListener(this);
+    getSite().setSelectionProvider(viewer);
     getSite().getPage().addSelectionListener(this);
   }
 
-  @Override
-  public Control getControl() {
-    return treeView.getControl();
-  }
-
-  @Override
-  public void setFocus() {
-    treeView.getControl().setFocus();
-  }
-
   public void inputChange(Object newInput) {
-    if (newInput == null || treeView == null || newInput == 
treeView.getInput()) {
+    if (newInput == null || viewer == null || newInput == viewer.getInput()) {
       return;
     }
-    // TODO filter
-    this.treeView.setInput(newInput);
-    this.treeView.refresh();
+    this.viewer.setInput(newInput);
+    this.viewer.refresh();
   }
 
   @Override
   public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-    if (selection instanceof TreeSelection && (part instanceof ApplyView
-            || part instanceof RuleListView || part instanceof 
ExplainSelectionView)) {
+    if (selection instanceof TreeSelection
+            && (part instanceof ApplyView || part instanceof RuleListView
+                    || part instanceof ExplainSelectionView || part instanceof 
MatchedView
+                    || part instanceof FailedView || part instanceof 
ElementView)) {
       TreeSelection ts = (TreeSelection) selection;
       Object firstElement = ts.getFirstElement();
 
-      // TODO: !!!!
-      if (firstElement instanceof BlockApplyNode) {
-        BlockApplyNode block = (BlockApplyNode) firstElement;
-        inputChange(block.getBlockRuleNode().getMatchedChild());
-      } else if (firstElement instanceof RuleApplyNode) {
-        RuleApplyNode rule = (RuleApplyNode) firstElement;
-        inputChange(rule.getMatchedChild());
+      if (firstElement instanceof ExplainAbstractTreeNode) {
+        inputChange(((ExplainAbstractTreeNode) firstElement).getInlined());
       }
-
     }
   }
 

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/matched/MatchedViewPage.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/matched/MatchedViewPage.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/matched/MatchedViewPage.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/matched/MatchedViewPage.java
 Fri Nov 15 09:04:07 2019
@@ -26,6 +26,7 @@ import org.apache.uima.caseditor.editor.
 import org.apache.uima.ruta.addons.RutaAddonsPlugin;
 import org.apache.uima.ruta.explain.ExplainConstants;
 import org.apache.uima.ruta.explain.apply.ApplyView;
+import org.apache.uima.ruta.explain.inlined.InlinedView;
 import org.apache.uima.ruta.explain.rulelist.RuleListView;
 import org.apache.uima.ruta.explain.selection.ExplainSelectionView;
 import org.apache.uima.ruta.explain.tree.BlockApplyNode;
@@ -126,9 +127,11 @@ public class MatchedViewPage extends Pag
     }
   }
 
+  @Override
   public void selectionChanged(IWorkbenchPart part, ISelection selection) {
     if (selection instanceof TreeSelection
-            && (part instanceof ApplyView || part instanceof RuleListView || 
part instanceof ExplainSelectionView)) {
+            && (part instanceof ApplyView || part instanceof RuleListView
+                    || part instanceof ExplainSelectionView || part instanceof 
InlinedView)) {
       TreeSelection ts = (TreeSelection) selection;
       Object firstElement = ts.getFirstElement();
 

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainAbstractTreeNode.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainAbstractTreeNode.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainAbstractTreeNode.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainAbstractTreeNode.java
 Fri Nov 15 09:04:07 2019
@@ -31,6 +31,8 @@ public abstract class ExplainAbstractTre
 
   private IExplainTreeNode parent;
 
+  private InlinedRootNode inlined;
+
   private List<IExplainTreeNode> children;
 
   private FeatureStructure fs;
@@ -44,14 +46,17 @@ public abstract class ExplainAbstractTre
     this.ts = ts;
   }
 
+  @Override
   public IExplainTreeNode getParent() {
     return parent;
   }
 
+  @Override
   public List<IExplainTreeNode> getChildren() {
     return children;
   }
 
+  @Override
   public boolean hasChildren() {
     if (children.size() > 0) {
       return true;
@@ -59,18 +64,22 @@ public abstract class ExplainAbstractTre
     return false;
   }
 
+  @Override
   public void addChild(IExplainTreeNode child) {
     children.add(child);
   }
 
+  @Override
   public boolean removeChild(IExplainTreeNode child) {
     return children.remove(child);
   }
 
+  @Override
   public FeatureStructure getFeatureStructure() {
     return fs;
   }
 
+  @Override
   public TypeSystem getTypeSystem() {
     return ts;
   }
@@ -80,15 +89,26 @@ public abstract class ExplainAbstractTre
     return fs.toString();
   }
 
+  @Override
   @SuppressWarnings({ "unchecked", "rawtypes" })
   public Object getAdapter(Class adapter) {
 
     if (FeatureStructure.class.equals(adapter)) {
       return getFeatureStructure();
-    } else if (AnnotationFS.class.equals(adapter) && getFeatureStructure() 
instanceof AnnotationFS) {
+    } else if (AnnotationFS.class.equals(adapter)
+            && getFeatureStructure() instanceof AnnotationFS) {
       return getFeatureStructure();
     }
 
     return null;
   }
+
+  @Override
+  public InlinedRootNode getInlined() {
+    return inlined;
+  }
+
+  public void setInlined(InlinedRootNode inlined) {
+    this.inlined = inlined;
+  }
 }

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainTree.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainTree.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainTree.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/ExplainTree.java
 Fri Nov 15 09:04:07 2019
@@ -28,8 +28,10 @@ import org.apache.uima.cas.FeatureStruct
 import org.apache.uima.cas.TypeSystem;
 import org.apache.uima.fit.util.JCasUtil;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.FSArray;
 import org.apache.uima.ruta.type.DebugBlockApply;
 import org.apache.uima.ruta.type.DebugEvaluatedCondition;
+import org.apache.uima.ruta.type.DebugInlinedBlock;
 import org.apache.uima.ruta.type.DebugRuleApply;
 import org.apache.uima.ruta.type.DebugRuleElementMatch;
 import org.apache.uima.ruta.type.DebugRuleElementMatches;
@@ -99,6 +101,20 @@ public class ExplainTree {
     }
   }
 
+  private void buildInlinedBlock(boolean asCondition, DebugInlinedBlock 
debugInlinedBlock,
+          IExplainTreeNode parent, TypeSystem ts, int offset, boolean 
onlyRules) {
+    InlinedRuleBlockNode inlinedBlockNode = new InlinedRuleBlockNode(parent, 
debugInlinedBlock,
+            debugInlinedBlock.getAsCondition(), 
debugInlinedBlock.getMatched(), ts);
+    parent.addChild(inlinedBlockNode);
+
+    FSArray inlinedRules = debugInlinedBlock.getInlinedRules();
+    if (inlinedRules != null) {
+      for (FeatureStructure each : inlinedRules) {
+        buildTree(each, inlinedBlockNode, ts, offset, onlyRules);
+      }
+    }
+  }
+
   private void processBlockApply(DebugBlockApply fs, IExplainTreeNode parent, 
TypeSystem ts,
           int offset, boolean onlyRules) {
     if (offset >= 0 && (fs.getBegin() >= offset || fs.getEnd() <= offset)) {
@@ -151,6 +167,7 @@ public class ExplainTree {
         }
       }
     }
+
   }
 
   private void processRuleApply(DebugRuleApply fs, IExplainTreeNode parent, 
TypeSystem ts,
@@ -181,8 +198,10 @@ public class ExplainTree {
           }
         }
       }
+      if (fs.getRules().size() == 1) {
+        mergeInlinedRuleBlockNodesOfChildren(ruleNode);
+      }
     }
-
   }
 
   private void processRuleMatch(DebugRuleMatch fs, IExplainTreeNode parent, 
TypeSystem ts,
@@ -201,6 +220,7 @@ public class ExplainTree {
         buildTree(each, remRoot, ts, offset, onlyRules);
       }
     }
+    mergeInlinedRuleBlockNodesOfChildren(matchNode);
   }
 
   private void processRuleElementMatches(DebugRuleElementMatches fs, 
IExplainTreeNode parent,
@@ -213,6 +233,19 @@ public class ExplainTree {
         buildTree(each, remsNode, ts, offset, onlyRules);
       }
     }
+
+    FSArray inlinedActionBlocks = fs.getInlinedActionBlocks();
+    if (inlinedActionBlocks != null) {
+      InlinedRootNode inlinedRootNode = new InlinedRootNode(remsNode, ts);
+      remsNode.setInlined(inlinedRootNode);
+      for (FeatureStructure each : inlinedActionBlocks) {
+        if (each instanceof DebugInlinedBlock) {
+          buildInlinedBlock(false, (DebugInlinedBlock) each, inlinedRootNode, 
ts, offset,
+                  onlyRules);
+        }
+      }
+    }
+    mergeInlinedRuleBlockNodesOfChildren(remsNode);
   }
 
   private void processRuleElementMatch(DebugRuleElementMatch fs, 
IExplainTreeNode parent,
@@ -236,6 +269,17 @@ public class ExplainTree {
         buildTree(each, remNode, ts, offset, onlyRules);
       }
     }
+    FSArray inlinedConditionBlocks = fs.getInlinedConditionBlocks();
+    if (inlinedConditionBlocks != null) {
+      InlinedRootNode inlinedRootNode = new InlinedRootNode(remNode, ts);
+      remNode.setInlined(inlinedRootNode);
+      for (FeatureStructure each : inlinedConditionBlocks) {
+        if (each instanceof DebugInlinedBlock) {
+          buildInlinedBlock(true, (DebugInlinedBlock) each, inlinedRootNode, 
ts, offset, onlyRules);
+        }
+      }
+    }
+    mergeInlinedRuleBlockNodesOfChildren(remNode);
   }
 
   private void processEvaluatedCondition(DebugEvaluatedCondition fs, 
IExplainTreeNode parent,
@@ -250,6 +294,41 @@ public class ExplainTree {
     }
   }
 
+  private void mergeInlinedRuleBlockNodesOfChildren(ExplainAbstractTreeNode 
parent) {
+
+    List<IExplainTreeNode> list = new ArrayList<>();
+
+    for (IExplainTreeNode each : parent.getChildren()) {
+      collectInlinedBlockNodes(each, list);
+    }
+    InlinedRootNode inlinedRootNode = parent.getInlined();
+    if (inlinedRootNode == null && !list.isEmpty()) {
+      inlinedRootNode = new InlinedRootNode(parent, parent.getTypeSystem());
+      parent.setInlined(inlinedRootNode);
+    }
+
+    if (inlinedRootNode != null) {
+      for (IExplainTreeNode each : list) {
+        if (!inlinedRootNode.getChildren().contains(each)) {
+          inlinedRootNode.addChild(each);
+        }
+      }
+    }
+  }
+
+  private void collectInlinedBlockNodes(IExplainTreeNode node, 
List<IExplainTreeNode> result) {
+    if (node.getInlined() != null && node.getInlined().hasChildren()) {
+      // already collected down to this level
+      result.addAll(node.getInlined().getChildren());
+      return;
+    }
+
+    List<IExplainTreeNode> children = node.getChildren();
+    for (IExplainTreeNode each : children) {
+      collectInlinedBlockNodes(each, result);
+    }
+  }
+
   private void prune(IExplainTreeNode node) {
     if (node == null) {
       return;

Modified: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/IExplainTreeNode.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/IExplainTreeNode.java?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/IExplainTreeNode.java
 (original)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/IExplainTreeNode.java
 Fri Nov 15 09:04:07 2019
@@ -39,4 +39,7 @@ public interface IExplainTreeNode {
   FeatureStructure getFeatureStructure();
 
   TypeSystem getTypeSystem();
+
+  ExplainAbstractTreeNode getInlined();
+
 }

Added: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRootNode.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRootNode.java?rev=1869839&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRootNode.java
 (added)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRootNode.java
 Fri Nov 15 09:04:07 2019
@@ -0,0 +1,34 @@
+/*
+ * 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.apache.uima.ruta.explain.tree;
+
+import org.apache.uima.cas.TypeSystem;
+
+public class InlinedRootNode extends ExplainAbstractTreeNode implements 
ExplainRootNode {
+
+  public InlinedRootNode(IExplainTreeNode parent, TypeSystem ts) {
+    super(parent, null, ts);
+  }
+
+  @Override
+  public String toString() {
+    return "Inlined";
+  }
+}

Added: 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRuleBlockNode.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRuleBlockNode.java?rev=1869839&view=auto
==============================================================================
--- 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRuleBlockNode.java
 (added)
+++ 
uima/ruta/trunk/ruta-ep-addons/src/main/java/org/apache/uima/ruta/explain/tree/InlinedRuleBlockNode.java
 Fri Nov 15 09:04:07 2019
@@ -0,0 +1,51 @@
+/*
+ * 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.apache.uima.ruta.explain.tree;
+
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.TypeSystem;
+
+public class InlinedRuleBlockNode extends ExplainAbstractTreeNode {
+
+  private final boolean asCondition;
+
+  private final boolean matched;
+
+  public InlinedRuleBlockNode(IExplainTreeNode parent, FeatureStructure fs, 
boolean asCondition,
+          boolean matched, TypeSystem ts) {
+    super(parent, fs, ts);
+    this.asCondition = asCondition;
+    this.matched = matched;
+  }
+
+  @Override
+  public void addChild(IExplainTreeNode node) {
+    super.addChild(node);
+  }
+
+  public boolean isAsCondition() {
+    return asCondition;
+  }
+
+  public boolean isMatched() {
+    return matched;
+  }
+
+}

Modified: 
uima/ruta/trunk/ruta-typesystem/src/main/resources/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-typesystem/src/main/resources/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml?rev=1869839&r1=1869838&r2=1869839&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-typesystem/src/main/resources/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml
 (original)
+++ 
uima/ruta/trunk/ruta-typesystem/src/main/resources/org/apache/uima/ruta/engine/RutaInternalTypeSystem.xml
 Fri Nov 15 09:04:07 2019
@@ -156,10 +156,10 @@
           <multipleReferencesAllowed>false</multipleReferencesAllowed>
         </featureDescription>
         <featureDescription>
-          <name>inlinedConditionRules</name>
+          <name>inlinedConditionBlocks</name>
           <description/>
           <rangeTypeName>uima.cas.FSArray</rangeTypeName>
-          <elementType>org.apache.uima.ruta.type.DebugScriptApply</elementType>
+          
<elementType>org.apache.uima.ruta.type.DebugInlinedBlock</elementType>
           <multipleReferencesAllowed>false</multipleReferencesAllowed>
         </featureDescription>
       </features>
@@ -186,7 +186,36 @@
           <rangeTypeName>uima.cas.Boolean</rangeTypeName>
         </featureDescription>
         <featureDescription>
-          <name>inlinedActionRules</name>
+          <name>inlinedActionBlocks</name>
+          <description/>
+          <rangeTypeName>uima.cas.FSArray</rangeTypeName>
+          
<elementType>org.apache.uima.ruta.type.DebugInlinedBlock</elementType>
+          <multipleReferencesAllowed>false</multipleReferencesAllowed>
+        </featureDescription>
+      </features>
+    </typeDescription>
+    <typeDescription>
+      <name>org.apache.uima.ruta.type.DebugInlinedBlock</name>
+      <description/>
+      <supertypeName>uima.cas.TOP</supertypeName>
+      <features>
+        <featureDescription>
+          <name>element</name>
+          <description/>
+          <rangeTypeName>uima.cas.String</rangeTypeName>
+        </featureDescription>
+        <featureDescription>
+          <name>asCondition</name>
+          <description/>
+          <rangeTypeName>uima.cas.Boolean</rangeTypeName>
+        </featureDescription>
+        <featureDescription>
+          <name>matched</name>
+          <description/>
+          <rangeTypeName>uima.cas.Boolean</rangeTypeName>
+        </featureDescription>
+        <featureDescription>
+          <name>inlinedRules</name>
           <description/>
           <rangeTypeName>uima.cas.FSArray</rangeTypeName>
           <elementType>org.apache.uima.ruta.type.DebugScriptApply</elementType>


Reply via email to