/*
* Copyright 2008-2011 the original author or authors.
*
* Licensed 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 com.nominanuda.urispec;
import static com.nominanuda.urispec.UriSpecParser.*;
import org.antlr.v4.runtime.CommonToken;
import org.antlr.v4.runtime.Token;
public class NodeAdapter {
private StringModelAdapter<? super Object> adapter;
@SuppressWarnings("unchecked")
public void setModelAdapter(StringModelAdapter<?> modelAdapter) {
adapter = (StringModelAdapter<? super Object>)modelAdapter;
}
public StringModelAdapter<? super Object> getStringModelAdapter() {
return adapter;
}
public CommonTree create(Token token) {
CommonTree tree = createNode(token);
if(tree instanceof AbstractNode) {
((AbstractNode)tree).setNodeAdaptor(this);
}
return tree;
}
private CommonTree createNode(Token token) {
if(token != null) {
switch (token.getType()) {
case URI_SPEC:
return new URISpecNode(token);
case SCHEME_AUTH_PATH_PART:
return new PathNode(token);
case QUERY_PART:
return new QueryNode(token);
case FRAGMENT_PART:
return new FragmentNode(token);
case ANONYMOUS_EXPRESSION:
return new AnonExprNode(token);
case CHARACTERS:
return new CharactersNode(token);
case NAMED_EXPRESSION:
return new NamedExprNode(token);
case PARAM_DECL:
return new ParamDeclarationNode(token);
case PARAM_GROUP:
return new ParamGroupNode(token);
case SEQUENCE:
return new CharSequenceNode(token);
case PARAM_SEQUENCE:
return new ParamSequenceNode(token);
case STRICT_PARAMS:
return new CommonTree(token);
}
}
return new CommonTree(token);
}
public ParamSequenceNode createEmptyParamSequence() {
ParamSequenceNode pseq = new ParamSequenceNode(new CommonToken(PARAM_SEQUENCE));
pseq.setNodeAdaptor(this);
return pseq;
}
public CharSequenceNode newSeqTreeWithCharChildren(Token... tokens) {
CharactersNode anyCharsTree = createCharacters(tokens);
CharSequenceNode seqTree = new CharSequenceNode(new CommonToken(SEQUENCE));
seqTree.addChild(anyCharsTree);
seqTree.setNodeAdaptor(this);
return seqTree;
}
public CharSequenceNode createEmptyCharSequence() {
CharactersNode anyCharsTree = createCharacters(
new CommonToken(URI_CHARS, ""));
CharSequenceNode seq = new CharSequenceNode(new CommonToken(SEQUENCE));
seq.addChild(anyCharsTree);
seq.setNodeAdaptor(this);
return seq;
}
public CharactersNode createCharacters(Token... tokens) {
CharactersNode anyCharsTree = new CharactersNode(new CommonToken(CHARACTERS));
for(Token t : tokens) {
anyCharsTree.addChild(new CommonTree(t));
}
anyCharsTree.setNodeAdaptor(this);
return anyCharsTree;
}
}