001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA 010 * is licensed to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.dna.sequencer.java.metadata; 025 026 import java.io.InputStream; 027 import java.util.List; 028 import org.eclipse.jdt.core.dom.CompilationUnit; 029 import org.jboss.dna.sequencer.java.AbstractJavaMetadata; 030 import org.jboss.dna.sequencer.java.CompilationUnitParser; 031 import org.jboss.dna.sequencer.java.JavaMetadataUtil; 032 033 /** 034 * @author Serge Pagop 035 * @author John Verhaeg 036 */ 037 public class JavaMetadata extends AbstractJavaMetadata { 038 039 /** The package representation of a compilation unit. */ 040 private PackageMetadata packageMetadata; 041 042 /** All the import declarations of a compilation unit. */ 043 private List<ImportMetadata> imports; 044 045 /** Types of unit */ 046 private List<TypeMetadata> types; 047 048 private JavaMetadata() { 049 } 050 051 /** 052 * Creates a new instance of <code>JavaMetadata</code>, that will be used to get informations of a compilation unit. 053 * 054 * @param inputStream - the <code>InputStream</code> in our case a <code>FileInputStream</code> of the java file. 055 * @param length - the length of the java file. 056 * @param encoding - the encoding that can be used. 057 * @return the new instace of <code>JavaMetadata</code> 058 * @see java.io.File#length() 059 */ 060 public static JavaMetadata instance( InputStream inputStream, 061 long length, 062 String encoding ) { 063 064 JavaMetadata javaMetadata = new JavaMetadata(); 065 char[] source = null; 066 try { 067 source = JavaMetadataUtil.getJavaSourceFromTheInputStream(inputStream, length, encoding); 068 } catch (Exception e) { 069 e.printStackTrace(); 070 return null; 071 } 072 073 CompilationUnit unit = (CompilationUnit)CompilationUnitParser.runJLS3Conversion(source, true); 074 if (unit != null) { 075 javaMetadata.packageMetadata = javaMetadata.createPackageMetadata(unit); 076 javaMetadata.imports = javaMetadata.createImportMetadata(unit); 077 javaMetadata.types = javaMetadata.createTypeMetadata(unit); 078 079 } 080 081 return javaMetadata; 082 } 083 084 /** 085 * Gets the {@link PackageMetadata} from the unit. 086 * 087 * @return the PackageMetadata or null if there is not package declaration for the unit. 088 */ 089 public final PackageMetadata getPackageMetadata() { 090 return packageMetadata; 091 } 092 093 /** 094 * Gets a list of {@linkImportMetadata} from the unit. 095 * 096 * @return all imports of this unit if there is one. 097 */ 098 public List<ImportMetadata> getImports() { 099 return imports; 100 } 101 102 /** 103 * Gets the list for type declarations (class/interface/enum/annotation) of this unit. 104 * 105 * @return all typeMetadata of this unit. 106 */ 107 public List<TypeMetadata> getTypeMetadata() { 108 return types; 109 } 110 }