/******************************************************************************* * Copyright (c) 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.resource; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.naming.QualifiedName; import com.google.common.base.Strings; public class TurtleUriResolver { private PrefixURI currentBaseUri; private Map<String, PrefixURI> prefixToUriMap=new HashMap<String, PrefixURI>(); public TurtleUriResolver(URI uri) { currentBaseUri=new PrefixURI(uri); } public QualifiedName updateAndGetBase(String newBase){ currentBaseUri=new PrefixURI(currentBaseUri.resolve(newBase)); return QualifiedName.create(currentBaseUri.getURIString()); } public QualifiedName getPrefixName(String prefix, String prefixUri){ URI resolved=currentBaseUri.resolve(prefixUri); prefixToUriMap.put(prefix, new PrefixURI(resolved)); return QualifiedName.create(prefixToUriMap.get(prefix).getURIString()); } public QualifiedName resolveWithUri(String uriAsString){ return getName(currentBaseUri.resolve(uriAsString)); } public QualifiedName resolveWithLocalName(String prefix, String localName){ PrefixURI prefixUri = prefixToUriMap.get(prefix); if(prefixUri!=null){ URI newUri=prefixUri.resolveLocal(localName); return getName(newUri); }else{ return null; } } public static final QualifiedName getName(URI uri){ String namespace; String name; String fragment=uri.fragment(); String uriAsString=uri.toString(); if(fragment!=null){ name=fragment; int index=uriAsString.indexOf("#"+fragment); if(index<0){ throw new IllegalStateException("unable to find fragment in "+uri); }else{ namespace=uriAsString.substring(0, index+1); } }else{ List<String> segments = uri.segmentsList(); if(segments.size()==0){ name=""; namespace=uri.toString(); }else{ name=segments.get(segments.size()-1); namespace=uri.trimSegments(1).toString(); } if(segments.size()>1){ namespace=namespace+"/"; } } return QualifiedName.create(namespace,name); } public static final class PrefixURI{ private URI prefixUri; private String uriAsString; boolean baseIsUrn=false; public PrefixURI(URI prefixUri) { baseIsUrn="urn".equals(prefixUri.scheme()); this.prefixUri=prefixUri; uriAsString=prefixUri.toString(); } public URI resolveLocal(String localName){ return URI.createURI(uriAsString+localName); } public URI resolve(String uriString){ if(Strings.isNullOrEmpty(uriString)){ return prefixUri; } try { URI uri = URI.createURI(uriString); if(!uri.isRelative()){ return uri; } else if(baseIsUrn){ if(uriString.charAt(0)=='#'){ return URI.createURI(prefixUri.trimFragment().toString()+uriString); }else{ return URI.createURI("urn:"+uriString); } }else{ return uri.resolve(prefixUri); } } catch (IllegalArgumentException e) { throw new IllegalArgumentException("could not resolve '"+uriString+"' with respect to base uri "+prefixUri ,e); } } String getURIString(){ return uriAsString; } } }