You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2012/05/15 10:58:22 UTC

svn commit: r1338604 - in /incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src: main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/ test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/

Author: rwesten
Date: Tue May 15 08:58:22 2012
New Revision: 1338604

URL: http://svn.apache.org/viewvc?rev=1338604&view=rev
Log:
STANBOL-583: CELI Language Identifiaction Engine

* Engine now uses a write lock when writing the language enhancement
* IOExceptions and SOAPExceptiosn are now forwarded as EngineException
* activation checks for illegal formatted Service URLs
* Unit Test validates now the Language Enhancement
* corrected a hard coded ServiceURI in the LnagId HTTP client

With this changes this engine should be ready for usage. 

Modified:
    incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngine.java
    incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/LanguageIdentifierClientHTTP.java
    incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngineTest.java

Modified: incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngine.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngine.java?rev=1338604&r1=1338603&r2=1338604&view=diff
==============================================================================
--- incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngine.java (original)
+++ incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngine.java Tue May 15 08:58:22 2012
@@ -4,6 +4,7 @@ import static org.apache.stanbol.enhance
 import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.ENHANCER_CONFIDENCE;
 
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Collections;
 import java.util.Dictionary;
@@ -12,6 +13,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.Map.Entry;
 
+import javax.xml.soap.SOAPException;
+
 import org.apache.clerezza.rdf.core.LiteralFactory;
 import org.apache.clerezza.rdf.core.MGraph;
 import org.apache.clerezza.rdf.core.UriRef;
@@ -26,6 +29,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.stanbol.commons.stanboltools.offline.OnlineMode;
 import org.apache.stanbol.enhancer.servicesapi.Blob;
+import org.apache.stanbol.enhancer.servicesapi.Chain;
 import org.apache.stanbol.enhancer.servicesapi.ContentItem;
 import org.apache.stanbol.enhancer.servicesapi.EngineException;
 import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
@@ -48,9 +52,18 @@ public class CeliLanguageIdentifierEnhan
 	 * This ensures that no connections to external services are made if Stanbol is started in offline mode 
 	 * as the OnlineMode service will only be available if OfflineMode is deactivated. 
 	 */
-	@Reference
+	@SuppressWarnings("unused")
+    @Reference
     private OnlineMode onlineMode; 
-	
+    /**
+     * The default value for the Execution of this Engine. Currently set to
+     * {@link ServiceProperties#ORDERING_PRE_PROCESSING}-2 to ensure that it is
+     * executed before "normal" pre-processing engines.<p>
+     * NOTE: this information is used by the default and weighed {@link Chain}
+     * implementation to determine the processing order of 
+     * {@link EnhancementEngine}s. Other {@link Chain} implementation do not
+     * use this information.
+     */
 	public static final Integer defaultOrder = ServiceProperties.ORDERING_PRE_PROCESSING -2;
 
 	private Logger log = LoggerFactory.getLogger(getClass());
@@ -64,12 +77,16 @@ public class CeliLanguageIdentifierEnhan
 	 * Set containing the only supported mime type {@link #TEXT_PLAIN_MIMETYPE}
 	 */
 	private static final Set<String> SUPPORTED_MIMTYPES = Collections.singleton(TEXT_PLAIN_MIMETYPE);
+	/**
+	 * The literal factory
+	 */
+    private final LiteralFactory literalFactory = LiteralFactory.getInstance();
 
 	@Property
-	public static final String LICENSE_KEY = "org.apache.stanbol.enhancer.engines.celi.langid.impl.CeliLanguageIdentifierEnhancementEngine.license";
+	public static final String LICENSE_KEY = "org.apache.stanbol.enhancer.engines.celi.langid.license";
 
 	@Property(value = "http://linguagrid.org/LSGrid/ws/language-identifier")
-	public static final String SERVICE_URL = "org.apache.stanbol.enhancer.engines.celi.langid.impl.CeliLanguageIdentifierEnhancementEngine.url";
+	public static final String SERVICE_URL = "org.apache.stanbol.enhancer.engines.celi.langid.url";
 
 	private String licenseKey;
 	private URL serviceURL;
@@ -87,9 +104,19 @@ public class CeliLanguageIdentifierEnhan
 		}
 		String url = (String) properties.get(SERVICE_URL);
 		if (url == null || url.isEmpty()) {
-			throw new ConfigurationException(SERVICE_URL, String.format("%s : please configure the URL of the CELI Web Service (e.g. by" + "using the 'Configuration' tab of the Apache Felix Web Console).", getClass().getSimpleName()));
+			throw new ConfigurationException(SERVICE_URL, 
+			    String.format("%s : please configure the URL of the CELI Web "
+			            + "Service (e.g. by" + "using the 'Configuration' tab of "
+			            +"the Apache Felix Web Console).", 
+			            getClass().getSimpleName()));
 		}
-		this.serviceURL = new URL(url);
+		try {
+		    this.serviceURL = new URL(url);
+		} catch (MalformedURLException e) {
+            throw new ConfigurationException(SERVICE_URL, 
+                String.format("%s : The URL of the CELI Web Service is not well formatted.", 
+                    getClass().getSimpleName()),e);
+        }
 		this.client = new LanguageIdentifierClientHTTP(this.serviceURL, this.licenseKey);
 	}
 	
@@ -134,19 +161,27 @@ public class CeliLanguageIdentifierEnhan
 				lista = this.client.guessLanguage(text);
 			else 
 				lista = this.client.guessQueryLanguage(text);
-			LiteralFactory literalFactory = LiteralFactory.getInstance();
 			
 			MGraph g = ci.getMetadata();
-					
-			GuessedLanguage gl = lista.get(0);
-			UriRef textEnhancement = EnhancementEngineHelper.createTextEnhancement(ci, this);
-		    g.add(new TripleImpl(textEnhancement, DC_LANGUAGE, new PlainLiteralImpl(gl.getLang())));
-			g.add(new TripleImpl(textEnhancement, ENHANCER_CONFIDENCE, literalFactory.createTypedLiteral(gl.getConfidence())));
-		
+			//in ENHANCE_ASYNC we need to use read/write locks on the ContentItem
+			ci.getLock().writeLock().lock();
+			try {
+    			GuessedLanguage gl = lista.get(0);
+    			UriRef textEnhancement = EnhancementEngineHelper.createTextEnhancement(ci, this);
+    		    g.add(new TripleImpl(textEnhancement, DC_LANGUAGE, new PlainLiteralImpl(gl.getLang())));
+    			g.add(new TripleImpl(textEnhancement, ENHANCER_CONFIDENCE, literalFactory.createTypedLiteral(gl.getConfidence())));
+			} finally {
+			    ci.getLock().writeLock().unlock();
+			}
 			
-		} catch (Exception e) {
-			log.error(e.getMessage(),e);
-		}
+		} catch (IOException e) {
+		    throw new EngineException("Error while calling the CELI language"
+		        +" identifier service (configured URL: "
+		        +serviceURL+")!",e);
+        } catch (SOAPException e) {
+            throw new EngineException("Error wile encoding/decoding the request/"
+                +"response to the CELI language identifier service!",e);
+        } 
 
 	}
 	

Modified: incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/LanguageIdentifierClientHTTP.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/LanguageIdentifierClientHTTP.java?rev=1338604&r1=1338603&r2=1338604&view=diff
==============================================================================
--- incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/LanguageIdentifierClientHTTP.java (original)
+++ incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/main/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/LanguageIdentifierClientHTTP.java Tue May 15 08:58:22 2012
@@ -6,11 +6,13 @@ import java.io.OutputStreamWriter;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URL;
+import java.util.Collections;
 import java.util.List;
 import java.util.Vector;
 
 import javax.xml.soap.MessageFactory;
 import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
 import javax.xml.transform.stream.StreamSource;
@@ -70,94 +72,90 @@ public class LanguageIdentifierClientHTT
 	}
 
 
-	
-	public List<GuessedLanguage> guessQueryLanguage(String text){
+	//NOTE (rwesten): I rather do the error handling in the EnhancementEngine!
+	public List<GuessedLanguage> guessQueryLanguage(String text) throws IOException, SOAPException{
+	    if(text == null || text.isEmpty()){ // no text
+	        return Collections.emptyList(); //no language
+	    }
 		List<GuessedLanguage> guesses = new Vector<GuessedLanguage>();
 
-		try {
-			String txt = StringEscapeUtils.escapeXml(text);
-			String xmldata = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lan=\"http://research.celi.it/LanguageIdentifierWS\"><soapenv:Header/><soapenv:Body>"
-					+"<lan:guessQueryLanguage><textToGuess>"+txt+"</textToGuess></lan:guessQueryLanguage></soapenv:Body></soapenv:Envelope>";
-			
-			
-			String responseXml = doPostRequest(this.serviceEP, xmldata);
-			log.debug(responseXml);
-
-			// Create SoapMessage
-			MessageFactory msgFactory = MessageFactory.newInstance();
-			SOAPMessage message = msgFactory.createMessage();
-			SOAPPart soapPart = message.getSOAPPart();
-
-			// Load the SOAP text into a stream source
-			ByteArrayInputStream stream = new ByteArrayInputStream(responseXml.getBytes("UTF-8"));
-			StreamSource source = new StreamSource(stream);
-
-			// Set contents of message
-			soapPart.setContent(source);
-
-			SOAPBody soapBody = message.getSOAPBody();
-			NodeList nlist = soapBody.getElementsByTagNameNS("*","return");
-			for (int i = 0; i < nlist.getLength(); i++) {
-				try {
-					Element result = (Element) nlist.item(i);
-					String lang = result.getAttribute("language");
-					double d=Double.parseDouble(result.getAttribute("guessConfidence"));
-					
-					guesses.add(new GuessedLanguage(lang, d));
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
+		String txt = StringEscapeUtils.escapeXml(text);
+		String xmldata = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lan=\"http://research.celi.it/LanguageIdentifierWS\"><soapenv:Header/><soapenv:Body>"
+				+"<lan:guessQueryLanguage><textToGuess>"+txt+"</textToGuess></lan:guessQueryLanguage></soapenv:Body></soapenv:Envelope>";
+		
+		
+		String responseXml = doPostRequest(this.serviceEP, xmldata);
+		log.debug(responseXml);
 
+		// Create SoapMessage
+		MessageFactory msgFactory = MessageFactory.newInstance();
+		SOAPMessage message = msgFactory.createMessage();
+		SOAPPart soapPart = message.getSOAPPart();
+
+		// Load the SOAP text into a stream source
+		ByteArrayInputStream stream = new ByteArrayInputStream(responseXml.getBytes("UTF-8"));
+		StreamSource source = new StreamSource(stream);
+
+		// Set contents of message
+		soapPart.setContent(source);
+
+		SOAPBody soapBody = message.getSOAPBody();
+		NodeList nlist = soapBody.getElementsByTagNameNS("*","return");
+		for (int i = 0; i < nlist.getLength(); i++) {
+			try {
+				Element result = (Element) nlist.item(i);
+				String lang = result.getAttribute("language");
+				double d=Double.parseDouble(result.getAttribute("guessConfidence"));
+				
+				guesses.add(new GuessedLanguage(lang, d));
+			} catch (Exception e) {
+				e.printStackTrace();
 			}
-		} catch (Exception e) {
-			e.printStackTrace();
+
 		}
 
 		return guesses;
 	}
 	
-	public List<GuessedLanguage> guessLanguage(String text) {
+    //NOTE (rwesten): I rather do the error handling in the EnhancementEngine!
+	public List<GuessedLanguage> guessLanguage(String text) throws IOException,SOAPException {
 
 		List<GuessedLanguage> guesses = new Vector<GuessedLanguage>();
 
-		try {
-			String txt = StringEscapeUtils.escapeXml(text);
-			String xmldata = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lan=\"http://research.celi.it/LanguageIdentifierWS\"><soapenv:Header/><soapenv:Body>"
-					+"<lan:guessLanguage><textToGuess>"+txt+"</textToGuess></lan:guessLanguage></soapenv:Body></soapenv:Envelope>";
-
-			URI uri = new URI("http://linguagrid.org/LSGrid/ws/language-identifier");
-			
-			String responseXml = doPostRequest(uri.toURL(), xmldata);
-			log.debug(responseXml);
-
-			// Create SoapMessage
-			MessageFactory msgFactory = MessageFactory.newInstance();
-			SOAPMessage message = msgFactory.createMessage();
-			SOAPPart soapPart = message.getSOAPPart();
-
-			// Load the SOAP text into a stream source
-			ByteArrayInputStream stream = new ByteArrayInputStream(responseXml.getBytes("UTF-8"));
-			StreamSource source = new StreamSource(stream);
-
-			// Set contents of message
-			soapPart.setContent(source);
-
-			SOAPBody soapBody = message.getSOAPBody();
-			NodeList nlist = soapBody.getElementsByTagNameNS("*","return");
-			for (int i = 0; i < nlist.getLength(); i++) {
-				try {
-					Element result = (Element) nlist.item(i);
-					String lang = result.getAttribute("language");
-					double d=Double.parseDouble(result.getAttribute("guessConfidence"));
-					
-					guesses.add(new GuessedLanguage(lang, d));
-				} catch (Exception e) {
-					e.printStackTrace();
-				}
+		String txt = StringEscapeUtils.escapeXml(text);
+		String xmldata = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lan=\"http://research.celi.it/LanguageIdentifierWS\"><soapenv:Header/><soapenv:Body>"
+				+"<lan:guessLanguage><textToGuess>"+txt+"</textToGuess></lan:guessLanguage></soapenv:Body></soapenv:Envelope>";
+		//NOTE (rwesten) I think this should be also the #serviceEP
+		//URI uri = new URI("http://linguagrid.org/LSGrid/ws/language-identifier");
+		
+		String responseXml = doPostRequest(serviceEP, xmldata);
+		log.debug(responseXml);
 
+		// Create SoapMessage
+		MessageFactory msgFactory = MessageFactory.newInstance();
+		SOAPMessage message = msgFactory.createMessage();
+		SOAPPart soapPart = message.getSOAPPart();
+
+		// Load the SOAP text into a stream source
+		ByteArrayInputStream stream = new ByteArrayInputStream(responseXml.getBytes("UTF-8"));
+		StreamSource source = new StreamSource(stream);
+
+		// Set contents of message
+		soapPart.setContent(source);
+
+		SOAPBody soapBody = message.getSOAPBody();
+		NodeList nlist = soapBody.getElementsByTagNameNS("*","return");
+		for (int i = 0; i < nlist.getLength(); i++) {
+			try {
+				Element result = (Element) nlist.item(i);
+				String lang = result.getAttribute("language");
+				double d=Double.parseDouble(result.getAttribute("guessConfidence"));
+				
+				guesses.add(new GuessedLanguage(lang, d));
+			} catch (Exception e) {
+				e.printStackTrace();
 			}
-		} catch (Exception e) {
-			e.printStackTrace();
+
 		}
 
 		return guesses;

Modified: incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngineTest.java
URL: http://svn.apache.org/viewvc/incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngineTest.java?rev=1338604&r1=1338603&r2=1338604&view=diff
==============================================================================
--- incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngineTest.java (original)
+++ incubator/stanbol/branches/celi-enhancement-engines/engines/celi/src/test/java/org/apache/stanbol/enhancer/engines/celi/langid/impl/CeliLanguageIdentifierEnhancementEngineTest.java Tue May 15 08:58:22 2012
@@ -1,30 +1,43 @@
 package org.apache.stanbol.enhancer.engines.celi.langid.impl;
 
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
 import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.RDF_TYPE;
 import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_ENTITYANNOTATION;
 import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_TEXTANNOTATION;
+import static org.apache.stanbol.enhancer.test.helper.EnhancementStructureHelper.validateAllEntityAnnotations;
+import static org.apache.stanbol.enhancer.test.helper.EnhancementStructureHelper.validateEnhancement;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.Dictionary;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
 
+import junit.framework.Assert;
+
+import org.apache.clerezza.rdf.core.LiteralFactory;
 import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.PlainLiteral;
+import org.apache.clerezza.rdf.core.Resource;
 import org.apache.clerezza.rdf.core.Triple;
 import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.stanbol.enhancer.contentitem.inmemory.InMemoryContentItemFactory;
 import org.apache.stanbol.enhancer.engines.celi.classification.impl.CeliClassificationEnhancementEngine;
 import org.apache.stanbol.enhancer.engines.celi.lemmatizer.impl.CeliLemmatizerEnhancementEngine;
 import org.apache.stanbol.enhancer.engines.celi.ner.impl.CeliNamedEntityExtractionEnhancementEngine;
-import org.apache.stanbol.enhancer.engines.celi.test_utils.MockComponentContext;
+import org.apache.stanbol.enhancer.engines.celi.testutils.MockComponentContext;
 import org.apache.stanbol.enhancer.servicesapi.ContentItem;
 import org.apache.stanbol.enhancer.servicesapi.ContentItemFactory;
 import org.apache.stanbol.enhancer.servicesapi.EngineException;
 import org.apache.stanbol.enhancer.servicesapi.EnhancementEngine;
 import org.apache.stanbol.enhancer.servicesapi.helper.EnhancementEngineHelper;
 import org.apache.stanbol.enhancer.servicesapi.impl.StringSource;
+import org.apache.stanbol.enhancer.servicesapi.rdf.Properties;
+import org.apache.stanbol.enhancer.test.helper.EnhancementStructureHelper;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -67,9 +80,14 @@ public class CeliLanguageIdentifierEnhan
 		ContentItem ci = wrapAsContentItem(TEXT);
 		try {
 			langIdentifier.computeEnhancements(ci);
-			int textAnnoNum = checkAllTextAnnotations(ci.getMetadata(), TEXT);
-	        log.info(textAnnoNum + " TextAnnotations found ...");
-	        int entityAnnoNum = checkAllEntityAnnotations(ci.getMetadata());
+	        HashMap<UriRef,Resource> expectedValues = new HashMap<UriRef,Resource>();
+	        expectedValues.put(Properties.ENHANCER_EXTRACTED_FROM, ci.getUri());
+	        expectedValues.put(Properties.DC_CREATOR, LiteralFactory.getInstance().createTypedLiteral(
+	            langIdentifier.getClass().getName()));
+	        
+	        validateLanguageAnnotation(ci.getMetadata(), TEXT,expectedValues);
+	        int entityAnnoNum = validateAllEntityAnnotations(ci.getMetadata(), expectedValues);
+	        assertEquals("No EntityAnnotations are expected",0, entityAnnoNum);
 	        log.info(entityAnnoNum + " EntityAnnotations found ...");
 		} catch (EngineException e) {
 			if (e.getCause() != null && e.getCause() instanceof UnknownHostException) {
@@ -80,29 +98,27 @@ public class CeliLanguageIdentifierEnhan
 		}
 	}
 
-	private int checkAllEntityAnnotations(MGraph g) {
-		Iterator<Triple> entityAnnotationIterator = g.filter(null, RDF_TYPE, ENHANCER_ENTITYANNOTATION);
-		int entityAnnotationCount = 0;
-		while (entityAnnotationIterator.hasNext()) {
-			UriRef entityAnnotation = (UriRef) entityAnnotationIterator.next().getSubject();
-			entityAnnotationCount++;
-		}
-		return entityAnnotationCount;
-	}
 
-	private int checkAllTextAnnotations(MGraph g, String content) {
+	private void validateLanguageAnnotation(MGraph g, String content,HashMap<UriRef,Resource> expectedValues) {
 		Iterator<Triple> textAnnotationIterator = g.filter(null, RDF_TYPE, ENHANCER_TEXTANNOTATION);
 		// test if a textAnnotation is present
-		assertTrue(textAnnotationIterator.hasNext());
-		int textAnnotationCount = 0;
-		while (textAnnotationIterator.hasNext()) {
-			UriRef textAnnotation = (UriRef) textAnnotationIterator.next().getSubject();
-			textAnnotationCount++;
-		}
-		return textAnnotationCount;
+		assertTrue("The Language Annotation is missing!",textAnnotationIterator.hasNext());
+		NonLiteral annotation = textAnnotationIterator.next().getSubject();
+		assertTrue("TextAnnotations MUST BE URIs", annotation instanceof UriRef);
+		assertFalse("Only a single Language Annotation is expected!", textAnnotationIterator.hasNext());
+		//validate enhancement metadata (this also checks the confidence)
+		validateEnhancement(g, (UriRef)annotation, expectedValues);
+		//validate the dc:language value
+		Iterator<Triple> languageIterator = g.filter(annotation, Properties.DC_LANGUAGE, null);
+        assertTrue("The fise:TextAnnotation for the language MUST HAVE a value for dc:language!",languageIterator.hasNext());
+        Resource languageResource = languageIterator.next().getObject();
+        assertFalse("Only a single dc:langauge value MUST BE present!", languageIterator.hasNext());
+        assertTrue("The dc:langauge value MUST BE a plain literal",languageResource instanceof PlainLiteral);
+        assertTrue("The dc:language value MIST BE at least two chars long",
+            ((PlainLiteral)languageResource).getLexicalForm().length()>=2);
 	}
-
-	public static void addEnanchements(ContentItem ci) throws IOException, ConfigurationException, EngineException {
+// removed: other tests now add a simple triple with <{ciUri},dc:langauge,{lang}>
+/**	public static void addEnanchements(ContentItem ci) throws IOException, ConfigurationException, EngineException {
 		//Add guessed language
 		Dictionary<String, Object> properties = new Hashtable<String, Object>();
 		properties.put(EnhancementEngine.PROPERTY_NAME, "celiLangIdentifier");
@@ -111,5 +127,5 @@ public class CeliLanguageIdentifierEnhan
 		CeliLanguageIdentifierEnhancementEngine langIdentifier=new CeliLanguageIdentifierEnhancementEngine();
 		langIdentifier.activate(context);
 		langIdentifier.computeEnhancements(ci);
-	}
+	} **/
 }