/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
/**
*
*/
package org.jabylon.review.standard.internal;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.jabylon.common.review.ReviewParticipant;
import org.jabylon.common.review.TerminologyProvider;
import org.jabylon.properties.PropertiesFactory;
import org.jabylon.properties.Property;
import org.jabylon.properties.PropertyFileDescriptor;
import org.jabylon.properties.Review;
import org.jabylon.properties.ReviewState;
import org.jabylon.properties.Severity;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
@Component
@Service(value=ReviewParticipant.class)
public class TerminologyCheck extends AdapterImpl implements ReviewParticipant {
private static final String TERMINOLOGY_DELIMITER = " \t\n\r\f.,;:(){}\"'<>?-";
@Reference(cardinality=ReferenceCardinality.MANDATORY_UNARY,policy=ReferencePolicy.DYNAMIC)
private TerminologyProvider terminologyProvider;
/**
*
*/
public TerminologyCheck() {
}
/* (non-Javadoc)
* @see org.jabylon.ui.review.ReviewParticipant#review(org.jabylon.properties.PropertyFileDescriptor, org.jabylon.properties.Property, org.jabylon.properties.Property)
*/
@Override
public Review review(PropertyFileDescriptor descriptor, Property master, Property slave) {
Locale variant = descriptor.getVariant();
if(variant==null)
return null;
Map<String, Property> terminology = terminologyProvider.getTerminology(variant);
return analyze(master, slave, terminology);
}
private Review analyze(Property master, Property slave, Map<String, Property> terminology) {
if(master==null || slave==null || terminology.isEmpty())
return null;
String masterValue = master.getValue();
String slaveValue = slave.getValue();
if(masterValue==null || slaveValue==null)
return null;
Map<String,String> mustFinds = new HashMap<String,String>();
StringTokenizer tokenizer = new StringTokenizer(masterValue, TERMINOLOGY_DELIMITER);
while(tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
Property property = terminology.get(token);
if(property!=null)
mustFinds.put(property.getValue(),property.getKey());
}
if(!mustFinds.isEmpty())
{
tokenizer = new StringTokenizer(slaveValue, TERMINOLOGY_DELIMITER);
while(tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
mustFinds.remove(token);
}
}
if(!mustFinds.isEmpty())
{
Entry<String, String> next = mustFinds.entrySet().iterator().next();
Review review = PropertiesFactory.eINSTANCE.createReview();
review.setCreated(System.currentTimeMillis());
review.setState(ReviewState.OPEN);
review.setSeverity(Severity.ERROR);
review.setReviewType(getReviewType());
String message = "Template language contained the term ''{0}'' but the terminology translation ''{1}'' is missing";
message = MessageFormat.format(message, next.getValue(),next.getKey());
review.setMessage(message);
return review;
}
return null;
}
@Override
public String getReviewType() {
return "Terminology";
}
public void bindTerminologyProvider(TerminologyProvider provider) {
this.terminologyProvider = provider;
}
public void unbindTerminologyProvider(TerminologyProvider provider) {
if(terminologyProvider==provider)
terminologyProvider = null;
}
@Override
public String getID() {
return "TerminologyCheck";
}
@Override
public String getDescription() {
return "%terminology.check.description";
}
@Override
public String getName() {
return "%terminology.check.name";
}
}