org.apache.jena.sparql.sse.lang.ParseHandlerLink Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-arq Show documentation
Show all versions of jena-arq Show documentation
ARQ is a SPARQL 1.1 query engine for Apache Jena
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.sse.lang;
import java.util.HashMap ;
import java.util.Map ;
import org.apache.jena.sparql.core.Prologue ;
import org.apache.jena.sparql.sse.Item ;
import org.apache.jena.sparql.sse.ItemList ;
public class ParseHandlerLink extends ParseHandlerResolver
{
// Untested.
// Implements (link@ LABEL) and (@name LABEL expression) to give non-trees.
// Caveat: other things assume tree walking.
static final String tagLink = "link@" ;
static final String tagName = "@name" ;
public ParseHandlerLink(Prologue prologue) { super(prologue) ; }
String currentName = null ;
Map namedItems = new HashMap<>() ; // Item => Item
// ----
@Override
public void parseFinish()
{
// Check links.
super.parseFinish() ;
}
// ----
@Override
protected void declItem(ItemList list, Item item)
{
if ( list.getFirst().isSymbol(tagLink) )
{
System.err.println("Not written: "+item) ;
super.declItem(list, item) ;
return ;
}
if ( list.getFirst().isSymbol(tagName) )
{
if ( ! item.isSymbol() )
throwException("Must be a symbol for a named item: "+item.shortString(), item) ;
if ( namedItems.containsKey(item.getSymbol()) )
throwException("Name already defined: "+item, item) ;
currentName = item.getSymbol() ;
// Add it anyway. Removed in form processing.
super.declItem(list, item) ;
return ;
}
super.declItem(list, item) ;
}
@Override
protected boolean endOfDecl(ItemList list, Item item)
{
// XXX No. This does not allow for nested "@names"
super.setFormResult(item) ;
if ( namedItems.containsKey(currentName) )
throwException("Name already defined: "+currentName, item) ;
namedItems.put(currentName, item) ;
currentName = null ;
return super.endOfDecl(list, item) ;
}
@Override
protected boolean isForm(Item tag)
{
if ( tag.isSymbol(tagLink) || tag.isSymbol(tagName) )
return true ;
return super.isForm(tag) ;
}
}