/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.modelgenerator.processor; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xsd.XSDSchema; import org.eclipse.xsd.XSDSimpleTypeDefinition; import org.eclipse.xsd.XSDTypeDefinition; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.compare.selector.ModelSelector; /** * XsdDatatypeFinder * * @since 8.0 */ public class XsdDatatypeFinder implements DatatypeFinder { private final ModelSelector datatypeModelSelector; private final DatatypeFinder bidtSelector; private boolean initialized; private final Map datatypeByName; // private final Map datatypeByUri; /** * Construct an instance of XsdDatatypeFinder. * */ public XsdDatatypeFinder( final ModelSelector modelSelector, final DatatypeFinder bidtSelector ) { super(); CoreArgCheck.isNotNull(modelSelector); this.datatypeModelSelector = modelSelector; this.bidtSelector = bidtSelector != null ? bidtSelector : new NullDatatypeFinder(); this.initialized = false; this.datatypeByName = new HashMap(); // this.datatypeByUri = new HashMap(); } /** * @See org.teiid.designer.modelgenerator.DatatypeFinder#findDatatype(java.lang.String) */ @Override public EObject findDatatype(final String name) throws CoreException { if ( !initialized ) { initialize(); } if ( name != null ) { final LinkedList cached = (LinkedList) this.datatypeByName.get(name); if ( cached != null && cached.size() != 0 ) { return (EObject) cached.getFirst(); } } return this.bidtSelector.findDatatype(name); } /** * @See org.teiid.designer.modelgenerator.DatatypeFinder#findDatatype(org.eclipse.emf.common.util.URI) */ @Override public EObject findDatatype(final URI uri) throws CoreException { if ( !initialized ) { initialize(); } if ( uri != null ) { final LinkedList cached = (LinkedList) this.datatypeByName.get(uri.toString()); if ( cached != null && cached.size() != 0 ) { return (EObject) cached.getFirst(); } } return this.bidtSelector.findDatatype(uri); } /** * @See org.teiid.designer.modelgenerator.DatatypeFinder#findAllDatatypes(java.lang.String) */ @Override public List findAllDatatypes(final String name) throws CoreException { if ( !initialized ) { initialize(); } final List result = new LinkedList(); if ( name != null ) { final LinkedList cached = (LinkedList) this.datatypeByName.get(name); result.addAll(cached); } final List bitypes = this.bidtSelector.findAllDatatypes(name); if ( bitypes != null && bitypes.size() != 0 ) { result.addAll(bitypes); } return result; } /** * @See org.teiid.designer.modelgenerator.DatatypeFinder#findAllDatatypes(org.eclipse.emf.common.util.URI) */ @Override public List findAllDatatypes(final URI uri) throws CoreException { if ( !initialized ) { initialize(); } final List result = new LinkedList(); if ( uri != null ) { final LinkedList cached = (LinkedList) this.datatypeByName.get(uri.toString()); result.addAll(cached); } final List bitypes = this.bidtSelector.findAllDatatypes(uri); if ( bitypes != null && bitypes.size() != 0 ) { result.addAll(bitypes); } return result; } protected synchronized void initialize() throws CoreException { // Get all of the global SDTs ... final List roots = this.datatypeModelSelector.getRootObjects(); final Iterator iter = roots.iterator(); while (iter.hasNext()) { final EObject root = (EObject)iter.next(); if ( root instanceof XSDSchema ) { final XSDSchema schema = (XSDSchema) root; final List typeDefns = schema.getTypeDefinitions(); final Iterator typeIter = typeDefns.iterator(); while (typeIter.hasNext()) { final XSDTypeDefinition typeDefn = (XSDTypeDefinition)typeIter.next(); if ( typeDefn instanceof XSDSimpleTypeDefinition ) { final XSDSimpleTypeDefinition sdt = (XSDSimpleTypeDefinition) typeDefn; // Register the global SDT ... final String name = sdt.getName(); if ( name != null && name.trim().length() != 0 ) { final List sdts = findListInMap(this.datatypeByName,name); sdts.add(sdt); } final URI uri = EcoreUtil.getURI(sdt); if ( uri != null ) { final String uriString = uri.toString(); final List sdts = findListInMap(this.datatypeByName,uriString); sdts.add(sdt); } } } } } } protected LinkedList findListInMap( final Map map, final Object key ) { final Object value = map.get(key); if ( value == null ) { final LinkedList result = new LinkedList(); map.put(key,result); return result; } if ( value instanceof List ) { return (LinkedList)value; } final LinkedList result = new LinkedList(); result.add(value); map.put(key,result); return result; } }