// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.cwm.helper; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.eclipse.xsd.XSDTypeDefinition; import org.talend.cwm.xml.TdXmlContent; import org.talend.cwm.xml.TdXmlElementType; import org.talend.cwm.xml.TdXmlSchema; import orgomg.cwm.objectmodel.core.ModelElement; /** * DOC xqliu class global comment. Detailled comment */ public final class XmlElementHelper { public static final String SLASH = "/";//$NON-NLS-1$ public static final String DOUBLE_SLASH = "//";//$NON-NLS-1$ public static final String emptyString = "";//$NON-NLS-1$ private XmlElementHelper() { } /** * DOC xqliu Comment method "isLeafNode". * * @param element * @return */ public static boolean isLeafNode(TdXmlElementType element) { boolean leafNode = false; XSDElementDeclaration xsdElementDeclearation = (XSDElementDeclaration) element.getXsdElementDeclaration(); if (xsdElementDeclearation != null) { XSDTypeDefinition xsdTypeDef = xsdElementDeclearation.getTypeDefinition(); if (xsdTypeDef instanceof XSDSimpleTypeDefinition) { leafNode = true; } } return leafNode; } /** * DOC xqliu Comment method "isFromSameTable". * * @param xmlElements * @return */ public static boolean isFromSameTable(List<TdXmlElementType> xmlElements) { assert xmlElements != null; Set<String> modelElementNames = new HashSet<String>(); for (TdXmlElementType xmlElement : xmlElements) { ModelElement parentElement = getParentElement(xmlElement); String fullName = ""; if (parentElement instanceof TdXmlSchema) { fullName = DOUBLE_SLASH + parentElement.getName(); } else if (parentElement instanceof TdXmlElementType) { fullName = getFullName((TdXmlElementType) parentElement); } modelElementNames.add(fullName); } return modelElementNames.size() == 1; } /** * DOC xqliu Comment method "getFullName". * * @param xmlElement * @return */ public static String getFullName(TdXmlElementType xmlElement) { ModelElement parentElement = getParentElement(xmlElement); if (parentElement != null) { return DOUBLE_SLASH + parentElement.getName() + SLASH + xmlElement.getName(); } return DOUBLE_SLASH + xmlElement.getName(); } /** * DOC xqliu Comment method "getParentElement". * * @param xmlElement * @return */ public static ModelElement getParentElement(TdXmlElementType xmlElement) { EObject temp = xmlElement.eContainer(); if (temp instanceof TdXmlContent) { EObject eContainer = temp.eContainer(); if (eContainer instanceof TdXmlElementType || eContainer instanceof TdXmlSchema) { return (ModelElement) eContainer; } } else if (temp instanceof TdXmlElementType || temp instanceof TdXmlSchema) { return (ModelElement) temp; } return null; } /** * DOC xqliu Comment method "getParentElementName". * * @param xmlElement * @return */ public static String getParentElementName(TdXmlElementType xmlElement) { ModelElement parentElement = getParentElement(xmlElement); return parentElement == null ? "" : parentElement.getName(); } /** * DOC xqliu Comment method "clearLeafNode". * * @param modelElements * @return */ public static List<ModelElement> clearLeafNode(List<? extends ModelElement> modelElements) { List<ModelElement> result = new ArrayList<ModelElement>(); for (ModelElement me : modelElements) { if (me instanceof TdXmlElementType) { if (!isLeafNode((TdXmlElementType) me)) { result.add(me); } } else { result.add(me); } } return result; } /** * DOC xqliu Comment method "getLeafNode". * * @param modelElements * @return */ public static List<TdXmlElementType> getLeafNode(List<? extends ModelElement> modelElements) { List<TdXmlElementType> result = new ArrayList<TdXmlElementType>(); for (ModelElement me : modelElements) { if (me instanceof TdXmlElementType && isLeafNode((TdXmlElementType) me)) { result.add((TdXmlElementType) me); } } return result; } /** * * DOC qiongli Comment method "getFullPath". * * @param xmlElement * @param path * @return */ public static String getFullPath(TdXmlElementType xmlElement, String path) { if (path == null) { path = emptyString; } if (xmlElement == null) { return path; } ModelElement parentElement = XmlElementHelper.getParentElement(xmlElement); TdXmlSchema xmlSchema = SwitchHelpers.XMLSCHEMA_SWITCH.doSwitch(parentElement); if (xmlSchema != null) { return path; } else { TdXmlElementType parentXmlElement = SwitchHelpers.XMLELEMENTTYPE_SWITCH.doSwitch(parentElement); if (parentXmlElement != null) { if (path.equals(emptyString)) { path = parentElement.getName(); } else { path = parentElement.getName() + SLASH + path; } return getFullPath(parentXmlElement, path); } } return path; } }