/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.tools.library.builders; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.axis2.wsdl.codegen.CodeGenerationException; import org.ebayopensource.turmeric.runtime.common.impl.utils.CallTrackingLogger; import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager; import org.ebayopensource.turmeric.tools.codegen.util.CodeGenUtil; import org.ebayopensource.turmeric.tools.codegen.util.ContextClassLoaderUtil; import org.ebayopensource.turmeric.tools.library.TypeLibraryConstants; import org.ebayopensource.turmeric.tools.library.codegen.TypeLibraryCodeGenContext; import org.ebayopensource.turmeric.tools.library.utils.TypeLibraryUtilities; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TypeLibraryParser extends DefaultHandler { /* * Constants representing element name and attribute names */ private final String ELEMENT_TYPE_REF_TYPE_LIB = "referredTypeLibrary"; private final String ATTRIBUTE_NAME = "name"; private volatile String m_currentReferredLibraryName; private final Set<String> m_referedTypeLibraries = new HashSet<String>(); private final String TYPE_DEPENDENCY_FILE_NAME = "TypeDependencies.xml"; private static CallTrackingLogger logger = LogManager.getInstance(TypeLibraryParser.class); private static CallTrackingLogger getLogger(){ return logger; } /** * * @return An instance of TypeDependencyParser */ public static synchronized TypeLibraryParser getInstance() { return new TypeLibraryParser(); } /** * @deprecated use {@link #processTypeDepXMLFileForGen(TypeLibraryCodeGenContext, String)} instead. */ @Deprecated public void processTypeDepXMLFileForGen(String projectRoot, String typeLibraryName) throws Exception{ throw new CodeGenerationException("Unable to processTypeDefXMLFileForGen without a proper TypeLibraryCodeGenContext."); } public void processTypeDepXMLFileForGen(TypeLibraryCodeGenContext codeGenCtx, String typeLibraryName) throws Exception{ String typeDefsFolder = TypeLibraryUtilities.getTypeDepFolder(codeGenCtx, typeLibraryName ); String defaultSvcLayerFilePath = TypeLibraryConstants.META_INF_FOLDER + "/" + typeLibraryName + "/" + TYPE_DEPENDENCY_FILE_NAME; InputStream inStream = null; try { inStream = ContextClassLoaderUtil.getResourceAsStream(defaultSvcLayerFilePath); if(inStream == null){ File typeDepFile = new File(typeDefsFolder + File.separator + TYPE_DEPENDENCY_FILE_NAME); if(!typeDepFile.exists()){ getLogger().log( Level.WARNING, TYPE_DEPENDENCY_FILE_NAME + " could not be found for library " + typeLibraryName + " under the path " + typeDepFile.getPath()); return; //Its not mandatory for a project to have TypeDependencies.xml file } inStream = new FileInputStream(typeDepFile); } DefaultHandler handler = this; SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(inStream, handler); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Unable to parse the TypeDepedencies.xml file, of library " + typeLibraryName + " its content could be invalid", t); throw new Exception(t); } finally{ CodeGenUtil.closeQuietly(inStream); } } /** * * @param typeLibraryName */ public void processTypeDepXMLFile(String typeLibraryName) throws Exception{ String defaultSvcLayerFilePath = TypeLibraryConstants.META_INF_FOLDER + "/" + typeLibraryName + "/" + TYPE_DEPENDENCY_FILE_NAME; ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader(); InputStream inStream = null; try { inStream = myClassLoader.getResourceAsStream(defaultSvcLayerFilePath); if(inStream == null){ getLogger().log( Level.WARNING, TYPE_DEPENDENCY_FILE_NAME + " could not be found for library " + typeLibraryName + " under the class path " + defaultSvcLayerFilePath); return; } DefaultHandler handler = this; SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(inStream, handler); } catch (Throwable t) { getLogger().log(Level.SEVERE, "Unable to parse the TypeDepedencies.xml file, of library " + typeLibraryName + " its content could be invalid", t); throw new Exception(t); } finally{ CodeGenUtil.closeQuietly(inStream); } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { String eName = localName; // element name if ("".equals(eName)) eName = qName; // not namespace-aware if(eName.contains(ELEMENT_TYPE_REF_TYPE_LIB)) processElement_refTypeLib(uri, eName, attributes); } private void processElement_refTypeLib(String uri, String name, Attributes attributes) throws SAXException { if(attributes != null){ m_currentReferredLibraryName = attributes.getValue(ATTRIBUTE_NAME); } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { String eName = localName; // element name if ("".equals(eName)) eName = qName; // not namespace-aware if(eName.contains(ELEMENT_TYPE_REF_TYPE_LIB)) { m_referedTypeLibraries.add(m_currentReferredLibraryName); m_currentReferredLibraryName = null; } } public Set<String> getReferredTypeLibraries(){ return m_referedTypeLibraries; } }