blob: 2382ddb4c2cc44090032f32f6304837dcbca0b64 [file] [log] [blame]
/**
* Copyright (c) 2002-2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.xsd.impl.type;
import org.eclipse.emf.ecore.xml.type.internal.QName;
import org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class XSDQNameType extends XSDAnySimpleType
{
@Override
public void assess(XSDSimpleTypeDefinitionImpl.AssessmentImpl assessment)
{
assessment.xsdAnySimpleType = this;
Object value = null;
if (assessment.context == null)
{
value = getValue(assessment.normalizedLiteral);
}
else
{
value = getValue(assessment.context, assessment.normalizedLiteral);
}
if (value != null)
{
assessment.value = value;
}
else
{
assessment.reportDatatypeDiagnostic();
}
}
@Override
public Object getValue(String literal)
{
try
{
return new QName(literal);
}
catch (RuntimeException e)
{
return null;
}
}
public Object getValue(Element context, String literal)
{
try
{
String localPart;
String prefix;
String namespaceAttribute;
int index = literal.indexOf(':');
if (index == -1)
{
localPart = literal;
prefix = "";
namespaceAttribute = "xmlns";
}
else
{
localPart = literal.substring(index + 1);
prefix = literal.substring(0, index);
namespaceAttribute = "xmlns:" + prefix;
}
String namespace = null;
for (Node node = context; node instanceof Element; node = node.getParentNode())
{
Element elementNode = (Element)node;
if (elementNode.hasAttribute(namespaceAttribute))
{
namespace = elementNode.getAttribute(namespaceAttribute);
break;
}
}
if (namespace == null)
{
if (index == -1)
{
namespace = "";
}
else
{
return null;
}
}
return new QName(namespace, localPart, prefix);
}
catch (RuntimeException e)
{
return null;
}
}
}