/** * OpenSpotLight - Open Source IT Governance Platform * * Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA * or third-party contributors as indicated by the @author tags or express * copyright attribution statements applied by the authors. All third-party * contributions are distributed under license by CARAVELATECH CONSULTORIA E * TECNOLOGIA EM INFORMATICA LTDA. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * *********************************************************************** * OpenSpotLight - Plataforma de Governança de TI de Código Aberto * * Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA * EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta * @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor. * Todas as contribuições de terceiros estão distribuídas sob licença da * CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA. * * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os * termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software * Foundation. * * Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA * GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA * FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este * programa; se não, escreva para: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.openspotlight.bundle.language.java.asm.tool; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.javabean.JavaBeanConverter; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; import org.openspotlight.bundle.language.java.asm.CompiledTypesExtractor; import org.openspotlight.bundle.language.java.asm.model.MethodDeclaration; import org.openspotlight.bundle.language.java.asm.model.TypeDefinition; import org.openspotlight.bundle.language.java.asm.model.TypeDefinitionSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; /** * This class is an {@link Task ant task} that reads compiled artifacts and generates an XML File with all declared java types. * * @author porcelli */ public class CompiledTypesExtractorTask extends Task { /** The LOG. */ private final Logger LOG = LoggerFactory.getLogger(CompiledTypesExtractorTask.class); /** The context name. Default value is "unknown". */ private String contextName = "unknown"; /** The context version. Default value is "unknown". */ private String contextVersion = "unknown"; /** The compiled artifacts. */ private final Set<File> compiledArtifacts = new HashSet<File>(); /** The xml output file name. */ private String xmlOutputFileName = ""; /** * Adds a set of compiled artifacts. * * @param artifactSet the artifact set */ public void addCompiledArtifacts( final FileSet artifactSet ) { final DirectoryScanner scanner = artifactSet.getDirectoryScanner(getProject()); for (final String activeFileName : scanner.getIncludedFiles()) { final File file = new File(artifactSet.getDir(getProject()), activeFileName); compiledArtifacts.add(file); } } /* * (non-Javadoc) * * @see org.apache.tools.ant.Task#execute() */ @Override public void execute() { if (isValid()) { try { final CompiledTypesExtractor typeExtractor = new CompiledTypesExtractor(); final List<TypeDefinition> scannedTypes = typeExtractor.getJavaTypes(compiledArtifacts); final TypeDefinitionSet wrapper = new TypeDefinitionSet(); wrapper.setTypes(scannedTypes); wrapper.setName(contextName); wrapper.setVersion(contextVersion); // XML Output Generation final XStream xstream = new XStream(); xstream.aliasPackage("", "org.openspotlight.bundle.language.java.asm.model"); xstream.alias("List", LinkedList.class); xstream.registerConverter(new JavaBeanConverter(xstream.getMapper()) { @Override @SuppressWarnings( "unchecked" ) public boolean canConvert( final Class type ) { return type.getName() == MethodDeclaration.class.getName(); } }); LOG.info("Starting XML Output generation."); final String dirName = xmlOutputFileName.substring(0, xmlOutputFileName.lastIndexOf("/")); new File(dirName).mkdirs(); final OutputStream outputStream = new FileOutputStream(xmlOutputFileName); xstream.toXML(wrapper, outputStream); outputStream.flush(); outputStream.close(); LOG.info("Finished XML output file."); } catch (final IOException e) { e.printStackTrace(); } finally { } } else { LOG.error("Invalid State: Missing XmlOutputFileName."); } } /** * Checks if the task state is valid. * * @return true, if it is valid */ private boolean isValid() { if (xmlOutputFileName == null || xmlOutputFileName.trim().length() == 0) { return false; } return true; } /** * Sets the context name. * * @param contextName the new context name */ public void setContextName( final String contextName ) { this.contextName = contextName; } /** * Sets the context version. * * @param contextVersion the new context version */ public void setContextVersion( final String contextVersion ) { this.contextVersion = contextVersion; } /** * Sets the xml output file name. * * @param xmlOutputFileName the new xml output file name */ public void setXmlOutputFileName( final String xmlOutputFileName ) { this.xmlOutputFileName = xmlOutputFileName; } }