[TOB-475] Fix star (*) in textblock pdf generate

* fixed bug in textblock parsing logic that failed parsing texts that
  that contained a star character. Confliced with bulletpoint detection

Signed-off-by: Tobias Stummer <stummer@develop-group.de>
diff --git a/pom.xml b/pom.xml
index 3a620a5..b9e648c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 </parent>
 <groupId>org.eclipse.openk</groupId>
 <artifactId>statement-public-affairs</artifactId>
-<version>1.0.1</version>
+<version>1.0.2</version>
 <name>statement-public-affairs</name>
 <description>StatementPublicAffairs project for openKONSEQUENZ</description>
 
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
index 482eaf7..fe83724 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
@@ -56,5 +56,26 @@
 		return token;
 	}
 
+	public static TextToken newBulletToken() {
+		TextToken token = new TextToken();
+		token.setType(Token.TK_BULLET);
+		token.setValue(" *");
+		return token;
+	}
+
+	public static TextToken newBoldToken() {
+		TextToken token = new TextToken();
+		token.setType(Token.TK_BOLD);
+		token.setValue("**");
+		return token;
+	}
+
+	public static TextToken newItalicToken() {
+		TextToken token = new TextToken();
+		token.setType(Token.TK_ITALIC);
+		token.setValue("__");
+		return token;
+	}
+
 
 }
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
index cbbc53d..5e8f88f 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
@@ -483,6 +483,7 @@
 					}
 					break;
 				case TK_UNDERSCORE:
+				case TK_STAR:
 				case STRING:
 					cont.setFont(fonts.get(currentFontMod), fontSize);
 					if (firstInLine && inBulletPoint) {
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
index d653438..96ca9a8 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
@@ -68,7 +68,7 @@
     }
 
     private boolean nextToken() {
-        for (Token t : Token.values()) {
+        for (Token t : Token.lexerTokens()) {
             int end = t.endOfMatch(input.toString());
 
             if (end != -1) {
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
index 752b938..083779b 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
@@ -60,6 +60,66 @@
 		if (!lexer.isSuccessful()) {
 			throw new BadRequestException("Textblock could not be parsed: " + lexer.errorMessage());
 		}
+		
+		
+		// second stage filter
+		
+		List<TextToken> filtered = new ArrayList<>();
+		boolean changes;
+		do {
+			changes = false;
+			for (int i=0; i < tokens.size(); i++) {
+				if (i == 0 && tokens.size() > 1) {
+					// Initial, Star, Space -> Bulletpoint
+					if (tokens.get(i).getType() == Token.TK_STAR && tokens.get(i+1).getType() == Token.TK_SPACE) {
+						tokens.remove(i);
+						tokens.remove(i);
+						tokens.add(i, TextToken.newBulletToken());
+						changes = true;
+						break;
+					}
+				}
+				if (i+2 < tokens.size()) {
+						// NL, Star, Space -> NL, Bulletpoint
+					if (tokens.get(i).getType() == Token.TK_NL && tokens.get(i+1).getType() == Token.TK_STAR && tokens.get(i+2).getType() == Token.TK_SPACE) {
+						tokens.remove(i+1);
+						tokens.remove(i+1);
+						tokens.add(i+1, TextToken.newBulletToken());
+						changes = true;
+						break;
+					}
+				}
+				if (i + 1 < tokens.size()) {
+					// Star, Star -> Bold
+					if (tokens.get(i).getType() == Token.TK_STAR && tokens.get(i+1).getType() == Token.TK_STAR) {
+						tokens.remove(i);
+						tokens.remove(i);
+						tokens.add(i, TextToken.newBoldToken());
+						changes = true;
+						break;
+					}
+
+					// _, _ -> Italic
+					if (tokens.get(i).getType() == Token.TK_UNDERSCORE && tokens.get(i+1).getType() == Token.TK_UNDERSCORE) {
+						tokens.remove(i);
+						tokens.remove(i);
+						tokens.add(i, TextToken.newItalicToken());
+						changes = true;
+						break;
+					}
+				}
+			}
+		} while (changes);
+		
+		// cleanup change TK_UNDERSCORE and TK_STAR to STRING
+		for (TextToken token : tokens) {
+			if (Token.TK_STAR == token.getType()) {
+				token.setType(Token.STRING);
+			} else if (Token.TK_UNDERSCORE == token.getType()) {
+				token.setType(Token.STRING);
+			}
+		}
+		
 		return tokens;
 	}
 
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
index a4240d5..0fb8885 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
@@ -22,14 +22,20 @@
 
 	TK_PB("<PB>"),
 	TK_PAR("<PAR>"),
+    TK_NL ("\n"),
+    TK_SPACE(" "),
+    TK_BULLET(" \\*"),
+	TK_STAR("\\*"),
+    TK_UNDERSCORE("_"), 
     TK_BOLD ("\\*\\*"), 
     TK_ITALIC ("__"), 
-    TK_BULLET("\\* "), 
-    TK_UNDERSCORE("_"), 
-    TK_SPACE(" "),
-    TK_NL ("\n"),
     STRING ("[^ \\*_\n]+");
 
+	public static Token[] lexerTokens() {
+		Token[] lexertokens = {TK_PB, TK_PAR, TK_NL, TK_SPACE, TK_STAR, TK_UNDERSCORE, STRING};
+		return lexertokens;
+	}
+
     private final Pattern pattern;
 
     Token(String regex) {
@@ -44,4 +50,4 @@
         }
         return -1;
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
index c9fb39f..1a9fc20 100644
--- a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
+++ b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
@@ -37,8 +37,125 @@
 import org.junit.jupiter.api.Test;
 
 class TextCompileUtilTest {
-	
-	
+
+	/**
+	 * Special Testcase bulletpoints
+	 */
+	@Test
+	void parseTextToTokenWithGoldenTextBulltepoints() {
+
+			// *
+			String testString1 = "*";
+			Token[] tokenarr1 = { Token.STRING};
+			assertTrue(compare(testString1, tokenarr1), "Error comparing " + testString1);
+			// *a
+			String testString2 = "*a";
+			Token[] tokenarr2 = { Token.STRING, Token.STRING};
+			assertTrue(compare(testString2, tokenarr2), "Error comparing " + testString2);
+			// *<SPC>
+			String testString3 = "* ";
+			Token[] tokenarr3 = { Token.TK_BULLET};
+			assertTrue(compare(testString3, tokenarr3), "Error comparing " + testString3);
+			// *<SPC><NL>
+			String testString4 = "* \n";
+			Token[] tokenarr4 = { Token.TK_BULLET, Token.TK_NL };
+			assertTrue(compare(testString4, tokenarr4), "Error comparing " + testString4);
+			// *<SPC>a
+			String testString5 = "* a";
+			Token[] tokenarr5 = { Token.TK_BULLET, Token.STRING };
+			assertTrue(compare(testString5, tokenarr5), "Error comparing " + testString5);
+			// **
+			String testString6 = "**";
+			Token[] tokenarr6 = { Token.TK_BOLD };
+			assertTrue(compare(testString6, tokenarr6), "Error comparing " + testString6);
+			// **a
+			String testString7 = "**a";
+			Token[] tokenarr7 = { Token.TK_BOLD, Token.STRING };
+			assertTrue(compare(testString7, tokenarr7), "Error comparing " + testString7);
+			// **<NL>
+			String testString8 = "**\n";
+			Token[] tokenarr8 = { Token.TK_BOLD, Token.TK_NL };
+			assertTrue(compare(testString8, tokenarr8), "Error comparing " + testString8);
+			// <NL>*
+			String testString9 = "\n*";
+			Token[] tokenarr9 = { Token.TK_NL, Token.STRING };
+			assertTrue(compare(testString9, tokenarr9), "Error comparing " + testString9);
+			// <NL>*a
+			String testString10 = "\n*a";
+			Token[] tokenarr10 = { Token.TK_NL, Token.STRING, Token.STRING };
+			assertTrue(compare(testString10, tokenarr10), "Error comparing " + testString10);
+			// <NL>*<SPC>
+			String testString11 = "\n* ";
+			Token[] tokenarr11 = { Token.TK_NL, Token.TK_BULLET };
+			assertTrue(compare(testString11, tokenarr11), "Error comparing " + testString11);
+			// <NL>*<SPC><NL>
+			String testString12 = "\n* \n";
+			Token[] tokenarr12 = { Token.TK_NL, Token.TK_BULLET, Token.TK_NL };
+			assertTrue(compare(testString12, tokenarr12), "Error comparing " + testString12);
+			// <NL>*<SPC>a
+			String testString13 = "\n* a";
+			Token[] tokenarr13 = { Token.TK_NL, Token.TK_BULLET, Token.STRING };
+			assertTrue(compare(testString13, tokenarr13), "Error comparing " + testString13);
+			// <NL>**
+			String testString14 = "\n**";
+			Token[] tokenarr14 = { Token.TK_NL, Token.TK_BOLD };
+			assertTrue(compare(testString14, tokenarr14), "Error comparing " + testString14);
+			// <NL>**a
+			String testString15 = "\n**a";
+			Token[] tokenarr15 = { Token.TK_NL, Token.TK_BOLD, Token.STRING };
+			assertTrue(compare(testString15, tokenarr15), "Error comparing " + testString15);
+			// <NL>**<NL>
+			String testString16 = "\n**\n";
+			Token[] tokenarr16 = { Token.TK_NL, Token.TK_BOLD, Token.TK_NL };
+			assertTrue(compare(testString16, tokenarr16), "Error comparing " + testString16);
+			// Das ist * ein Stern
+			String testString17 = "Ein * Stern";
+			Token[] tokenarr17 = {Token.STRING, Token.TK_SPACE, Token.STRING, Token.TK_SPACE, Token.STRING};
+			assertTrue(compare(testString17, tokenarr17), "Error comparing " + testString17);
+
+	}
+
+	private boolean compare(String teststring, Token[] tokenarr) {
+		List<TextToken> texttokens = TextCompileUtil.parseTextToToken(teststring);
+		List<Token> tokens = new ArrayList<>();
+		for (int i = 0; i < tokenarr.length; i++) {
+			tokens.add(tokenarr[i]);
+		}
+
+		boolean result = false;
+		if (tokens.size() == texttokens.size()) {
+			result = true;
+			for (int i = 0; i < tokens.size(); i++) {
+				if (tokens.get(i) != texttokens.get(i).getType()) {
+					result = false;
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	@Test
+	void parseTextToTokenWithGoldenText3() {
+
+		String goldenString = "Test (7,03m*4,50m); Test";
+		List<TextToken> texttokens = TextCompileUtil.parseTextToToken(goldenString);
+		List<Token> tokens = new ArrayList<>();
+		tokens.add(Token.STRING);
+		tokens.add(Token.TK_SPACE);
+		tokens.add(Token.STRING);
+		tokens.add(Token.STRING);
+		tokens.add(Token.STRING);
+		tokens.add(Token.TK_SPACE);
+		tokens.add(Token.STRING);
+
+		assertTrue(tokens.size() == texttokens.size());
+
+		for (int i = 0; i < tokens.size(); i++) {
+			assertEquals(tokens.get(i), texttokens.get(i).getType());
+		}
+
+	}
 
 	@Test
 	void parseTextToTokenWithGoldenText() {
@@ -105,10 +222,9 @@
 		tokens.add(Token.STRING);
 		tokens.add(Token.TK_SPACE);
 		tokens.add(Token.STRING);
-		tokens.add(Token.TK_UNDERSCORE);
 		tokens.add(Token.STRING);
-		
-		
+		tokens.add(Token.STRING);
+
 		assertTrue(tokens.size() == texttokens.size());
 
 		for (int i = 0; i < tokens.size(); i++) {