/*********************************************************************************
* Copyright (c) 2013-2015 AKSW Xturtle Project, 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.xturtle.linking;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.diagnostics.Diagnostic;
import org.eclipse.xtext.diagnostics.DiagnosticMessage;
import org.eclipse.xtext.diagnostics.Severity;
import org.eclipse.xtext.linking.impl.LinkingDiagnosticMessageProvider;
import com.google.inject.Inject;
import de.itemis.tooling.xturtle.resource.TurtleResourceService;
import de.itemis.tooling.xturtle.validation.TurtleLinkingErrorExceptions;
import de.itemis.tooling.xturtle.validation.TurtleValidationSeverityLevels;
import de.itemis.tooling.xturtle.validation.XturtleJavaValidator;
import de.itemis.tooling.xturtle.xturtle.QNameDef;
import de.itemis.tooling.xturtle.xturtle.QNameRef;
import de.itemis.tooling.xturtle.xturtle.ResourceRef;
import de.itemis.tooling.xturtle.xturtle.UriRef;
import de.itemis.tooling.xturtle.xturtle.XturtlePackage;
public class TurtleLinkingErrors extends LinkingDiagnosticMessageProvider {
@Inject
TurtleResourceService service;
@Inject
TurtleValidationSeverityLevels levels;
@Inject
TurtleLinkingErrorExceptions exceptions;
private DiagnosticMessage getMissingPrefixDefinitionErrorMessage(String linkText){
boolean isBlankLabelPrefix=linkText.length()==1 &&linkText.charAt(0)=='_';
if(isBlankLabelPrefix){
//no prefix definition for blank label prefix '_' allowed, so it is OK that it is missing
return null;
}else{
return new DiagnosticMessage("no @prefix-Definition for "+linkText+" up to this point", Severity.ERROR, XturtleJavaValidator.UNKNOWN_PREFIX,linkText);
}
}
@Override
public DiagnosticMessage getUnresolvedProxyMessage(
ILinkingDiagnosticContext context) {
EObject object = context.getContext();
String linkText=context.getLinkText();
if(object instanceof ResourceRef){
//unlinked prefix
if(context.getReference()==XturtlePackage.Literals.QNAME_REF__PREFIX){
return getMissingPrefixDefinitionErrorMessage(linkText);
}
Severity severity=null;
if(isNoLinkingError(object)){
return null;
}else if(object instanceof UriRef){
severity= levels.getUnresolvedUriRefLevel();
} else if(object instanceof QNameRef){
//if the prefix is unknown the qualified name will be null
//an unresolved prefix is dealt with separately
if(service.getQualifiedName(object)!=null){
severity = levels.getUnresolvedQNameLevel();
}
}
if(severity!=null){
return new DiagnosticMessage("could not find definition for "+service.getUriString(object), severity, Diagnostic.LINKING_DIAGNOSTIC);
}else{
return null;
}
} else if(object instanceof QNameDef){
return getMissingPrefixDefinitionErrorMessage(linkText);
}
return super.getUnresolvedProxyMessage(context);
}
private boolean isNoLinkingError(EObject object) {
if(object instanceof ResourceRef){
String uri = service.getUriString(object);
if(exceptions.ignoreLinkingError(uri)){
return true;
}
}
return false;
}
}