/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors.xml; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xsd.XSDAttributeDeclaration; import org.eclipse.xsd.XSDAttributeUse; import org.eclipse.xsd.XSDComplexTypeDefinition; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDModelGroup; import org.eclipse.xsd.XSDParticle; import org.eclipse.xsd.XSDParticleContent; import org.eclipse.xsd.XSDSchema; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.eclipse.xsd.XSDTypeDefinition; import org.eclipse.xsd.util.XSDResourceFactoryImpl; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; /** * @author Dart (dpeng@redhat.com) * */ public class XSDObjectAnalyzer { // private static List<XSDElementDeclaration> findChildrenElement(XSDSchema // schema, XSDElementDeclaration baseElement) { // return findChildrenElement(schema, baseElement.getTypeDefinition()); // } private HashMap<Object, Object> tagObjectBuffer = new HashMap<Object, Object>(); public static List<XSDElementDeclaration> loadAllElement(String filePath) throws InvocationTargetException, IOException { List<XSDElementDeclaration> nl = new ArrayList<XSDElementDeclaration>(); String file = null; try { file = SmooksUIUtils.parseFilePath(filePath); } catch (Exception e) { return nl; } Resource resource = new XSDResourceFactoryImpl().createResource(URI.createFileURI(file)); resource.load(Collections.EMPTY_MAP); XSDSchema schema = (XSDSchema) resource.getContents().get(0); List<XSDElementDeclaration> list = schema.getElementDeclarations(); for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) { XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) iterator.next(); if (elementDeclaration.isAbstract()) continue; nl.add(elementDeclaration); } return nl; } private List<XSDElementDeclaration> findChildrenElement(XSDSchema schema, XSDTypeDefinition baseTypeDefinition) { List<XSDElementDeclaration> elementList = new ArrayList<XSDElementDeclaration>(); List<XSDElementDeclaration> elements = schema.getElementDeclarations(); for (Iterator<?> iterator = elements.iterator(); iterator.hasNext();) { XSDElementDeclaration elementDec = (XSDElementDeclaration) iterator.next(); if (elementDec.isAbstract()) continue; XSDTypeDefinition td = elementDec.getType(); XSDSimpleTypeDefinition st = td.getSimpleType(); if (st != null) { continue; } if (td instanceof XSDComplexTypeDefinition) { XSDTypeDefinition tdd = td.getBaseType(); if (tdd == baseTypeDefinition) { elementList.add(elementDec); } } else { // XSDSimpleTypeDefinition stype = td.getSimpleType(); // System.out.println("Simple Type :" +stype.toString()); } } if (elementList.isEmpty()) return null; return elementList; } public TagObject loadElement(XSDSchema schema, String rootElementName) throws IOException { List<XSDElementDeclaration> elements = schema.getElementDeclarations(); for (Iterator<?> iterator = elements.iterator(); iterator.hasNext();) { XSDElementDeclaration elementDec = (XSDElementDeclaration) iterator.next(); if (rootElementName.equals(elementDec.getAliasName())) { tagObjectBuffer.clear(); return loadElement(schema, elementDec); } } return null; } public TagObject loadElement(String filePath, String rootElementName) throws InvocationTargetException, IOException { tagObjectBuffer.clear(); Resource resource = new XSDResourceFactoryImpl().createResource(URI.createFileURI(filePath)); resource.load(Collections.EMPTY_MAP); if (resource.getContents().isEmpty()) return null; XSDSchema schema = (XSDSchema) resource.getContents().get(0); return loadElement(schema, rootElementName); } public TagObject loadElement(String filePath, XSDElementDeclaration rootElement) throws InvocationTargetException, IOException { tagObjectBuffer.clear(); Resource resource = new XSDResourceFactoryImpl().createResource(URI.createFileURI(filePath)); resource.load(Collections.EMPTY_MAP); if (resource.getContents().isEmpty()) return null; XSDSchema schema = (XSDSchema) resource.getContents().get(0); return loadElement(schema, rootElement); } private TagObject loadElement(XSDSchema schema, XSDElementDeclaration elementDec) { if (elementDec.isAbstract()) return null; TagObject tag = (TagObject) tagObjectBuffer.get(elementDec); if (tag == null) { tag = new TagObject(); tag.setName(elementDec.getAliasName()); tag.setNamespaceURI(elementDec.getAliasURI()); tagObjectBuffer.put(elementDec, tag); } else { return tag; } XSDTypeDefinition td = elementDec.getType(); XSDSimpleTypeDefinition st = td.getSimpleType(); // XSDComplexTypeDefinition ct = td.getComplexType(); if (st != null) { } if (td instanceof XSDComplexTypeDefinition) { XSDComplexTypeDefinition ctype = (XSDComplexTypeDefinition) td; XSDParticle xsdparticle = td.getComplexType(); if (xsdparticle != null) { XSDParticleContent term = xsdparticle.getContent();// .getTerm // (); if (term instanceof XSDModelGroup) { List<?> list = ((XSDModelGroup) term).getParticles(); for (Iterator<?> iterator2 = list.iterator(); iterator2.hasNext();) { XSDParticle xp = (XSDParticle) iterator2.next(); XSDParticleContent content = xp.getContent(); if (content instanceof XSDElementDeclaration) { XSDElementDeclaration child = (XSDElementDeclaration) content; List<XSDElementDeclaration> childElement = null; if (child.isElementDeclarationReference()) { child = child.getResolvedElementDeclaration(); } XSDTypeDefinition childType = child.getTypeDefinition(); if (child.isAbstract()) { childElement = findChildrenElement(schema, childType); if (childElement != null) { for (Iterator<?> iterator3 = childElement.iterator(); iterator3.hasNext();) { XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) iterator3 .next(); TagObject childTag = loadElement(schema, elementDeclaration); if (childTag != null) { tag.addChildTag(childTag); } } } } else { TagObject childTag = loadElement(schema, child); if (childTag != null) { tag.addChildTag(childTag); } } } } } } List<?> attributeContents = ctype.getAttributeContents(); for (Iterator<?> iterator2 = attributeContents.iterator(); iterator2.hasNext();) { XSDAttributeUse attributeUse = (XSDAttributeUse) iterator2.next(); XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration(); TagPropertyObject tp = new TagPropertyObject(); tp.setName(attribute.getAliasName()); tp.setNamespaceURI(attribute.getTypeDefinition().getURI()); tag.addProperty(tp); } } else { // XSDSimpleTypeDefinition stype = td.getSimpleType(); // System.out.println("Simple Type :" +stype.toString()); } return tag; } public static void main(String[] args) throws IOException { Resource resource = new XSDResourceFactoryImpl().createResource(URI.createFileURI("F:/smooks-1.1.xsd")); //$NON-NLS-1$ resource.load(Collections.EMPTY_MAP); XSDSchema schema = (XSDSchema) resource.getContents().get(0); TagObject rootTag = new XSDObjectAnalyzer().loadElement(schema, "smooks-resource-list"); //$NON-NLS-1$ // System.out.println(rootTag); // List<XSDElementDeclaration> elements = // schema.getElementDeclarations(); // for (Iterator<?> iterator = elements.iterator(); iterator.hasNext();) // { // XSDElementDeclaration elementDec = (XSDElementDeclaration) // iterator.next(); // if (elementDec.isAbstract()) // continue; // XSDTypeDefinition td = elementDec.getType(); // XSDSimpleTypeDefinition st = td.getSimpleType(); // System.out.println("Element Name :" + elementDec.getAliasName()); // // XSDComplexTypeDefinition ct = td.getComplexType(); // if (st != null) { // System.out.println("\tSimple Type :" + st.toString()); // } // if (td instanceof XSDComplexTypeDefinition) { // XSDComplexTypeDefinition ctype = (XSDComplexTypeDefinition) td; // // XSDParticle xsdparticle = td.getComplexType(); // XSDTypeDefinition tdd = td.getBaseType(); // String tds = ""; // if (tdd != null) { // tds = tdd.getAliasName(); // } // if (xsdparticle != null) { // XSDParticleContent term = xsdparticle.getContent();// .getTerm // // (); // if (term instanceof XSDModelGroup) { // List<?> list = ((XSDModelGroup) term).getParticles(); // for (Iterator<?> iterator2 = list.iterator(); iterator2.hasNext();) { // XSDParticle xp = (XSDParticle) iterator2.next(); // XSDParticleContent content = xp.getContent(); // if (content instanceof XSDElementDeclaration) { // XSDElementDeclaration child = (XSDElementDeclaration) content; // String refStr = ""; // List<XSDElementDeclaration> childElement = null; // if (child.isElementDeclarationReference()) { // child = child.getResolvedElementDeclaration(); // refStr = "Reference"; // } // XSDTypeDefinition childType = child.getTypeDefinition(); // if (child.isAbstract()) { // childElement = findChildrenElement(schema, childType); // if(childElement != null){ // for (Iterator<?> iterator3 = childElement.iterator(); // iterator3.hasNext();) { // XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) // iterator3 // .next(); // System.out.println("\t" + refStr + "Element Name: " + // elementDeclaration.getAliasName() + " - " // + childType.getAliasName()); // } // } // } else { // System.out.println("\t" + refStr + "Element Name: " + // child.getAliasName() + " - " // + childType.getAliasName()); // } // } // } // } // } // List<?> attributeContents = ctype.getAttributeContents(); // for (Iterator<?> iterator2 = attributeContents.iterator(); // iterator2.hasNext();) { // XSDAttributeUse attributeUse = (XSDAttributeUse) iterator2.next(); // XSDAttributeDeclaration attribute = // attributeUse.getAttributeDeclaration(); // System.out.println("\tAttributes :" + attribute.getAliasName() + // " - " // + attribute.getTypeDefinition().getQName()); // } // continue; // } else { // // XSDSimpleTypeDefinition stype = td.getSimpleType(); // // System.out.println("Simple Type :" +stype.toString()); // } // System.out.println(); // } } }