| /******************************************************************************* |
| * Copyright (c) 2002, 2006 IBM Corporation and others. |
| * 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 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.core.internal.contentmodel.internal.util; |
| |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Vector; |
| |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType; |
| import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; |
| import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceHelper; |
| import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceTable; |
| |
| |
| public class CMDataTypeValueHelper |
| { |
| protected int idCount = 0; |
| |
| |
| public String getValue(CMAttributeDeclaration ad, NamespaceTable namespaceTable) |
| { |
| String value = null; |
| |
| if (isXSIType(ad)) |
| { |
| List list = getQualifiedXSITypes(ad, namespaceTable); |
| value = list.size() > 0 ? (String)list.get(0) : null; |
| } |
| |
| // shameless hack |
| // |
| if (value == null) |
| { |
| if (ad.getAttrName().equals("xml:lang")) //$NON-NLS-1$ |
| { |
| value = "EN"; //$NON-NLS-1$ |
| } |
| } |
| |
| if (value == null) |
| { |
| CMDataType dataType = ad.getAttrType(); |
| if (dataType != null) |
| { |
| value = getValue(dataType); |
| } |
| } |
| return value; |
| } |
| |
| |
| public String getValue(CMDataType dataType) |
| { |
| String value = null; |
| value = dataType.getImpliedValue(); |
| |
| if (value == null) |
| { |
| String[] values = dataType.getEnumeratedValues(); |
| if (values != null && values.length > 0) |
| { |
| value = values[0]; |
| } |
| } |
| |
| if (value == null) |
| { |
| value = dataType.generateInstanceValue(); |
| } |
| |
| // Here is a special case where we handle DTD's ID related datatypes. |
| // These values must be generated/validate by considering the entire xml file |
| // so we can't rely on the 'generateInstanceValue' method. |
| // |
| // todo... find a nicer way to handle this |
| if (value == null) |
| { |
| String dataTypeName = dataType.getDataTypeName(); |
| if (dataTypeName != null) |
| { |
| if (dataTypeName.equals("ID")) //$NON-NLS-1$ |
| { |
| value = "idvalue" + idCount++; //$NON-NLS-1$ |
| } |
| else if (dataTypeName.equals("IDREF") || dataTypeName.equals("IDREFS")) //$NON-NLS-1$ //$NON-NLS-2$ |
| { |
| value = "idvalue0"; //$NON-NLS-1$ |
| } |
| } |
| } |
| return value; |
| } |
| |
| |
| public boolean isValidEmptyValue(CMAttributeDeclaration ad) |
| { |
| boolean result = true; |
| CMDataType dataType = ad.getAttrType(); |
| if (dataType != null) |
| { |
| String propertyValue = (String)dataType.getProperty("isValidEmptyValue"); //$NON-NLS-1$ |
| if (propertyValue != null && propertyValue.equals("false")) //$NON-NLS-1$ |
| { |
| result = false; |
| } |
| } |
| return result; |
| } |
| |
| |
| public boolean isXSIType(CMAttributeDeclaration ad) |
| { |
| boolean result = false; |
| if (ad.getNodeName().equals("type")) //$NON-NLS-1$ |
| { |
| CMDocument cmDocument = (CMDocument)ad.getProperty("CMDocument"); //$NON-NLS-1$ |
| if (cmDocument != null) |
| { |
| String namespaceName = (String)cmDocument.getProperty("http://org.eclipse.wst/cm/properties/targetNamespaceURI"); //$NON-NLS-1$ |
| if (namespaceName != null && namespaceName.equals("http://www.w3.org/2001/XMLSchema-instance")) //$NON-NLS-1$ |
| { |
| result = true; |
| } |
| } |
| } |
| return result; |
| } |
| |
| |
| public List getQualifiedXSITypes(CMAttributeDeclaration ad, NamespaceTable table) |
| { |
| List list = new Vector(); |
| |
| List xsiTypes = (List)ad.getProperty("XSITypes"); //$NON-NLS-1$ |
| if (xsiTypes != null && xsiTypes.size() > 0) |
| { |
| for (Iterator i = xsiTypes.iterator(); i.hasNext(); ) |
| { |
| String uriQualifiedName = (String)i.next(); |
| String[] components = DOMNamespaceHelper.getURIQualifiedNameComponents(uriQualifiedName); |
| String prefix = table.getPrefixForURI(components[0] != null ? components[0] : ""); //$NON-NLS-1$ |
| String typeName = (prefix != null && prefix.length() > 0) ? |
| prefix + ":" + components[1] : //$NON-NLS-1$ |
| components[1]; |
| list.add(typeName); |
| } |
| } |
| return list; |
| } |
| } |