ATransformationPipelet: don't produces single-value output sequences, but only values. HtmlToTextPipelet: Don't fail on empty input attribute.
diff --git a/core/org.eclipse.smila.processing.pipelets.test/code/src/org/eclipse/smila/processing/pipelets/test/TestHtmlToTextPipelet.java b/core/org.eclipse.smila.processing.pipelets.test/code/src/org/eclipse/smila/processing/pipelets/test/TestHtmlToTextPipelet.java
index 13b1460..41bd845 100644
--- a/core/org.eclipse.smila.processing.pipelets.test/code/src/org/eclipse/smila/processing/pipelets/test/TestHtmlToTextPipelet.java
+++ b/core/org.eclipse.smila.processing.pipelets.test/code/src/org/eclipse/smila/processing/pipelets/test/TestHtmlToTextPipelet.java
@@ -93,10 +93,7 @@
     anyMap.put(pipelet.getInputName(), anyMap.getFactory().createStringValue("<html>Hello World!</html>"));
     pipelet.process(getBlackboard(), new String[] { id });
     anyMap = getBlackboard().getMetadata(id);
-    final AnySeq output = anyMap.getSeq(pipelet.getOutputName());
-    assertNotNull(output);
-    assertEquals(1, output.size());
-    assertEquals("Hello World!", output.getStringValue(0));
+    assertEquals("Hello World!", anyMap.getStringValue(pipelet.getOutputName()));
   }
 
   /**
@@ -113,10 +110,7 @@
       .put(pipelet.getInputName(), anyMap.getFactory().createStringValue("<html>H&auml;llo W&ouml;rld!</html>"));
     pipelet.process(getBlackboard(), new String[] { id });
     anyMap = getBlackboard().getMetadata(id);
-    final AnySeq output = anyMap.getSeq(pipelet.getOutputName());
-    assertNotNull(output);
-    assertEquals(1, output.size());
-    assertEquals("H\u00e4llo W\u00f6rld!", output.getStringValue(0));
+    assertEquals("H\u00e4llo W\u00f6rld!", anyMap.getStringValue(pipelet.getOutputName()));
   }
 
   /**
@@ -310,10 +304,7 @@
       ConfigUtils.getConfigStream(CONFIG_BUNDLE, CONFIG_DATADIR + "/headers.html"));
     pipeletRemove.process(getBlackboard(), new String[] { id });
     final AnyMap anyMap = getBlackboard().getMetadata(id);
-    final AnySeq output = anyMap.getSeq(pipeletRemove.getOutputName());
-    assertNotNull(output);
-    assertEquals(1, output.size());
-    assertEquals("Hello!", output.getStringValue(0).trim());
+    assertEquals("Hello!", anyMap.getStringValue(pipeletRemove.getOutputName()).trim());
   }
 
   /**
@@ -330,15 +321,12 @@
       ConfigUtils.getConfigStream(CONFIG_BUNDLE, CONFIG_DATADIR + "/meta.html"));
     pipeletKeep.process(getBlackboard(), new String[] { id });
     final AnyMap anyMap = getBlackboard().getMetadata(id);
-    AnySeq output = anyMap.getSeq(pipeletKeep.getOutputName());
-    assertNotNull(output);
-    assertEquals(1, output.size());
-    assertEquals("Hello World!", output.getStringValue(0).trim());
+    assertEquals("Hello World!", anyMap.getStringValue(pipeletKeep.getOutputName()).trim());
 
-    output = anyMap.getSeq("keywords");
-    assertNotNull(output);
-    assertEquals(1, output.size());
-    assertEquals("cat", output.getStringValue(0).trim());
+    final AnySeq keywordsSeq = anyMap.getSeq("keywords");
+    assertNotNull(keywordsSeq);
+    assertEquals(1, keywordsSeq.size());
+    assertEquals("cat", keywordsSeq.getStringValue(0).trim());
 
     final AnySeq authorsSeq = anyMap.getSeq("authors");
     assertEquals(3, authorsSeq.size());
@@ -367,10 +355,7 @@
         anyMap.put(pipelet.getInputName(), anyMap.getFactory().createStringValue(htmlString));
         pipelet.process(getBlackboard(), new String[] { id });
         anyMap = getBlackboard().getMetadata(id);
-        final AnySeq output = anyMap.getSeq(pipelet.getOutputName());
-        assertNotNull(output);
-        assertEquals(1, output.size());
-        final String textString = output.getStringValue(0);
+        final String textString = anyMap.getStringValue(pipelet.getOutputName());
         assertNotNull(filename + ": null result", textString);
         _log.info(filename + ": " + textString);
       }
diff --git a/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/ATransformationPipelet.java b/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/ATransformationPipelet.java
index f386065..f038104 100644
--- a/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/ATransformationPipelet.java
+++ b/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/ATransformationPipelet.java
@@ -193,11 +193,15 @@
     throws ProcessingException, BlackboardAccessException {

     if (!results.isEmpty()) {

       if (isStoreInAttribute()) {

-        final AnySeq valueSeq = DataFactory.DEFAULT.createAnySeq();

-        for (final String result : results) {

-          valueSeq.add(result);

+        if (results.size() == 1) {

+          blackboard.getMetadata(id).put(_outputName, results.iterator().next());

+        } else {

+          final AnySeq valueSeq = DataFactory.DEFAULT.createAnySeq();

+          for (final String result : results) {

+            valueSeq.add(result);

+          }

+          blackboard.getMetadata(id).put(_outputName, valueSeq);

         }

-        blackboard.getMetadata(id).put(_outputName, valueSeq);

       } else {

         storeResult(blackboard, id, results.iterator().next());

       }

diff --git a/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/HtmlToTextPipelet.java b/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/HtmlToTextPipelet.java
index 64651dd..f143817 100644
--- a/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/HtmlToTextPipelet.java
+++ b/core/org.eclipse.smila.processing.pipelets/code/src/org/eclipse/smila/processing/pipelets/HtmlToTextPipelet.java
@@ -144,7 +144,7 @@
           }

           storeResults(blackboard, id, results);

           storeMetadata(blackboard, id, metadata);

-        } catch (final BlackboardAccessException ex) {

+        } catch (final Exception ex) {

           _log.error("Error processing ID " + id, ex);

         }

       }

@@ -172,19 +172,21 @@
     final MultiValueMap metadata) throws BlackboardAccessException, ProcessingException {

     final AnyMap anyMap = blackboard.getMetadata(id);

     final Any any = anyMap.get(_inputName);

-    for (final Any value : any) {

-      if (value.isValue()) {

-        final String content = ((Value) value).asString();

-        if (content != null) {

-          results.add(extractText(id, content, metadata));

-        }

-      } else if (any.isSeq()) {

-        final AnySeq sequence = (AnySeq) any;

-        for (final Any element : sequence) {

-          if (element.isString()) {

-            final String content = ((Value) element).asString();

-            if (content != null) {

-              results.add(extractText(id, content, metadata));

+    if (any != null) {

+      for (final Any value : any) {

+        if (value.isValue()) {

+          final String content = ((Value) value).asString();

+          if (content != null) {

+            results.add(extractText(id, content, metadata));

+          }

+        } else if (any.isSeq()) {

+          final AnySeq sequence = (AnySeq) any;

+          for (final Any element : sequence) {

+            if (element.isString()) {

+              final String content = ((Value) element).asString();

+              if (content != null) {

+                results.add(extractText(id, content, metadata));

+              }

             }

           }

         }