/*******************************************************************************
* Copyright (c) 2013 itemis AG (http://www.itemis.eu).
* 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 de.itemis.tooling.terminology.resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.impl.LeafNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.impl.DefaultResourceDescriptionStrategy;
import org.eclipse.xtext.util.IAcceptor;
import org.eclipse.xtext.util.IResourceScopeCache;
import de.itemis.tooling.terminology.terminology.Entry;
import de.itemis.tooling.terminology.terminology.Term;
import de.itemis.tooling.terminology.terminology.TermStatus;
import de.itemis.tooling.terminology.terminology.TerminologyPackage;
public class TerminologyResourceDescriptionStrategy extends
DefaultResourceDescriptionStrategy {
@Inject
IResourceScopeCache cache;
@Override
public boolean createEObjectDescriptions(EObject eObject,
IAcceptor<IEObjectDescription> acceptor) {
if (eObject instanceof Entry) {
acceptor.accept(EObjectDescription.create(getQualifiedNameProvider().getFullyQualifiedName(eObject), eObject));
Term defTerm=getTermForDefinition((Entry) eObject);
for (Term term : ((Entry) eObject).getTerms()) {
acceptor.accept(EObjectDescription.create(
getQualifiedNameProvider().getFullyQualifiedName(term),
term, getUserData((Term) term, defTerm)));
}
return false;
}
return super.createEObjectDescriptions(eObject, acceptor);
}
private Term getTermForDefinition(Entry entry) {
Term fallBack=null;
Term firstPreferred=null;
if(entry.getTerms().size()>0){
fallBack=entry.getTerms().get(0);
}
for (Term term : entry.getTerms()) {
if(term.getStatus()==TermStatus.PREFERRED){
if(firstPreferred==null){
firstPreferred=term;
break;
}
}
}
return firstPreferred!=null?firstPreferred:fallBack;
}
private Map<String, String> getUserData(Term term, Term defTerm) {
Map<String, String> result = new HashMap<String, String>();
result.put("status", term.getStatus().toString());
String def = ((Entry) term.eContainer()).getDefinition();
if (term==defTerm && def != null && def.length() > 0 ) {
result.put("def", def);
}
if(term.getUsage()!=null &&term.getUsage().length()>0){
result.put("sem", term.getUsage());
}
List<INode> languageNodes = NodeModelUtils.findNodesForFeature(term, TerminologyPackage.Literals.TERM__LANGUAGE);
for (INode iNode : languageNodes) {
if(iNode instanceof LeafNode){
if(!((LeafNode) iNode).isHidden()){
result.put("lang", iNode.getText());
break;
}
}
}
return result;
}
}