/* * ModeShape (http://www.modeshape.org) * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.sequencer.javafile.metadata; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.eclipse.jdt.core.dom.CompilationUnit; import org.modeshape.sequencer.javafile.AbstractJavaMetadata; import org.modeshape.sequencer.javafile.CompilationUnitParser; import org.modeshape.sequencer.javafile.JavaMetadataUtil; /** * Metadata for a Java source file. */ public class JavaMetadata extends AbstractJavaMetadata { /** The package representation of a compilation unit. */ private PackageMetadata packageMetadata; /** All the import declarations of a compilation unit. */ private List<ImportMetadata> imports; /** Types of unit */ private List<TypeMetadata> types; private JavaMetadata() { // private constructor to enforce static class pattern } /** * Creates a new instance of <code>JavaMetadata</code>, that will be used to get informations of a compilation unit. * * @param inputStream - the <code>InputStream</code> in our case a <code>FileInputStream</code> of the java file. * @param length - the length of the java file. * @param encoding - the encoding that can be used. * @return the new instace of <code>JavaMetadata</code> * @see java.io.File#length() * @throws java.io.IOException if the input stream cannot be parsed */ public static JavaMetadata instance( InputStream inputStream, long length, String encoding ) throws IOException { JavaMetadata javaMetadata = new JavaMetadata(); char[] source = JavaMetadataUtil.getJavaSourceFromTheInputStream(inputStream, length, encoding); CompilationUnit unit = (CompilationUnit)CompilationUnitParser.runJLS3Conversion(source, true); if (unit != null) { javaMetadata.packageMetadata = javaMetadata.createPackageMetadata(unit); javaMetadata.imports = javaMetadata.createImportMetadata(unit); javaMetadata.types = javaMetadata.createTypeMetadata(unit); } return javaMetadata; } /** * Gets the {@link PackageMetadata} from the unit. * * @return the PackageMetadata or null if there is not package declaration for the unit. */ public final PackageMetadata getPackageMetadata() { return packageMetadata; } /** * Gets a list of {@link ImportMetadata} from the unit. * * @return all imports of this unit if there is one. */ public List<ImportMetadata> getImports() { return imports; } /** * Gets the list for type declarations (class/interface/enum/annotation) of this unit. * * @return all typeMetadata of this unit. */ public List<TypeMetadata> getTypeMetadata() { return types; } }