resource mapping, cosmas2: element attributes
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
index f66fabf..a5c6969 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
@@ -69,6 +69,10 @@
 	 * Flag that indicates whether token fields or meta fields are currently being processed
 	 */
 	boolean inMeta = false;
+	/**
+	 * 
+	 */
+	int classRefCounter = 1;
 	boolean negate = false;
 	
 	Tree cosmasTree;
@@ -139,6 +143,7 @@
 		processNode(tree);
 	}
 	
+	@SuppressWarnings("unchecked")
 	private void processNode(Tree node) {
 		
 		// Top-down processing
@@ -301,7 +306,46 @@
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
 			elem.put("@type", "korap:span");
-			elem.put("key", node.getChild(0).getChild(0).toStringTree().toLowerCase());
+			if (node.getChild(0).toStringTree().equals("EMPTY")) {
+				
+			} else {
+				int elname = 0;
+				Tree elnameNode = getFirstChildWithCat(node, "ELNAME");
+				if (elnameNode != null) {
+					elem.put("key", elnameNode.getChild(0).toStringTree().toLowerCase());
+					elname = 1;
+				}
+				if (node.getChildCount() > elname) {
+					LinkedHashMap<String, Object> termGroup = makeTermGroup("and");
+					ArrayList<Object> termGroupOperands = (ArrayList<Object>) termGroup.get("operands"); 
+					for (int i=elname; i<node.getChildCount(); i++) {
+						Tree attrNode = node.getChild(i);
+						if (attrNode.getChildCount()==2) {
+							LinkedHashMap<String, Object> term = makeTerm();
+							termGroupOperands.add(term);
+							String layer = attrNode.getChild(0).toStringTree();
+							term.put("layer", translateMorph(layer));
+							term.put("key", attrNode.getChild(1).toStringTree());
+							term.put("match", "match:eq");
+						} else {
+							for (int j=1; j<attrNode.getChildCount(); j++) {
+								LinkedHashMap<String, Object> term = makeTerm();
+								termGroupOperands.add(term);
+								String layer = attrNode.getChild(0).toStringTree();
+								term.put("layer", translateMorph(layer));
+								term.put("key", attrNode.getChild(j).toStringTree());
+								term.put("match", "match:eq");
+							}
+						}
+						 
+						
+						if (getNodeCat(attrNode).equals("NOTEQ")) negate=true;
+						
+					}
+					elem.put("attr", termGroup);
+				}
+			}
+			
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
 		}		
@@ -407,7 +451,7 @@
 			submatchgroup.put("@type", "korap:group");
 			submatchgroup.put("operation", "operation:"+ "submatch");
 			ArrayList<Integer> classRef = new ArrayList<Integer>();
-			classRef.add(1);
+			classRef.add(classRefCounter);
 			submatchgroup.put("classRef", classRef);
 			
 			ArrayList<Object> submatchoperands = new ArrayList<Object>(); 
@@ -439,7 +483,8 @@
 			LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
 			classGroup.put("@type", "korap:group");
 			classGroup.put("operation", "operation:"+ "class");
-			classGroup.put("class", 1);
+			classGroup.put("class", classRefCounter);
+			classRefCounter++;
 			classGroup.put("operands", new ArrayList<Object>());
 			objectStack.push(classGroup);
 			stackedObjects++;
@@ -453,7 +498,8 @@
 			LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
 			classGroup.put("@type", "korap:group");
 			classGroup.put("operation", "operation:"+ "class");
-			classGroup.put("class", 2);
+			classGroup.put("class", classRefCounter);
+			classRefCounter++;
 			classGroup.put("operands", new ArrayList<Object>());
 			objectStack.push(classGroup);
 			stackedObjects++;
@@ -467,8 +513,12 @@
 			exclGroup.put("@type", "korap:group");
 			exclGroup.put("operation", "operation:"+ "submatch");
 			ArrayList<Integer> classRef = new ArrayList<Integer>();
-			classRef.add(1);
-			classRef.add(2);
+			
+			classRef.add(classRefCounter);
+//			classRefCounter++;
+			 // yes, do this twice!
+			classRef.add(classRefCounter+1);
+//			classRefCounter++;
 			exclGroup.put("classRef", classRef);
 			exclGroup.put("classRefOp", "classRefOp:"+"intersection");
 			ArrayList<Object> operands = new ArrayList<Object>();
@@ -537,7 +587,8 @@
 				LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
 				classGroup.put("@type", "korap:group");
 				classGroup.put("operation", "operation:class");
-				classGroup.put("class", 1);
+				classGroup.put("class", classRefCounter);
+				classRefCounter++;
 				classGroup.put("operands", new ArrayList<Object>());
 				objectStack.push(classGroup);
 				stackedObjects++;
@@ -584,7 +635,8 @@
 					LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
 					classGroup.put("@type", "korap:group");
 					classGroup.put("operation", "operation:class");
-					classGroup.put("class", 1);
+					classGroup.put("class", classRefCounter);
+					classRefCounter++;
 					ArrayList<Object> classOperands = new ArrayList<Object>(); 
 					classGroup.put("operands", classOperands);
 					distributedOperands.add(classOperands);  // subtree to be put into every class group -> distribute
@@ -646,6 +698,15 @@
 	
 	
 
+	private Object translateMorph(String layer) {
+		LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
+		map.put("ANA", "pos");
+		if (map.containsKey(layer))
+			return map.get(layer);
+		else
+			return layer;
+	}
+
 	private void parseOPINOptions(Tree node, LinkedHashMap<String, Object> posgroup) {
 		Tree posnode = getFirstChildWithCat(node, "POS");
 		Tree rangenode = getFirstChildWithCat(node, "RANGE");
@@ -830,16 +891,21 @@
 //				"Mann /t0 Frau",
 				"sagt der:sa Bundeskanzler",
 //				"Der:sa,-pe,+te ",
+				"#ELEM(W POS!='N V' title=tada)",
+				"#ELEM(W ANA != 'N V')"
+//				"(&Baum #IN #ELEM(NP)) #IN(L) #ELEM(S)"
 				};
 //		CosmasTree.debug=true;
 		for (String q : queries) {
 			try {
 				System.out.println(q);
 				try {
-					@SuppressWarnings("unused")
 					CosmasTree act = new CosmasTree(q);
+					System.out.println(act.parseCosmasQuery(q).toStringTree());
 				} catch (QueryException e) {
 					e.printStackTrace();
+				} catch (RecognitionException e) {
+					e.printStackTrace();
 				}
 				System.out.println();