/* * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2 only, as published by * the Free Software Foundation. Oracle designates this particular file as * subject to the "Classpath" exception as provided by Oracle in the LICENSE * file that accompanied this code. * * This code 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 General Public License version 2 for more * details (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License version 2 * along with this work; if not, write to the Free Software Foundation, Inc., 51 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA or * visit www.oracle.com if you need additional information or have any * questions. */ package berlin.javax.tools; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.nio.CharBuffer; import berlin.javax.lang.model.element.Modifier; import berlin.javax.lang.model.element.NestingKind; import berlin.javax.tools.JavaFileObject.Kind; /** * Provides simple implementations for most methods in JavaFileObject. This * class is designed to be subclassed and used as a basis for JavaFileObject * implementations. Subclasses can override the implementation and specification * of any method of this class as long as the general contract of JavaFileObject * is obeyed. * * @author Peter von der Ahé * @since 1.6 */ public class SimpleJavaFileObject implements JavaFileObject { /** * A URI for this file object. */ protected final URI uri; /** * The kind of this file object. */ protected final Kind kind; /** * Construct a SimpleJavaFileObject of the given kind and with the given * URI. */ protected SimpleJavaFileObject(URI uri, Kind kind) { // null checks uri.getClass(); kind.getClass(); if (uri.getPath() == null) throw new IllegalArgumentException("URI must have a path: " + uri); this.uri = uri; this.kind = kind; } public URI toUri() { return uri; } public String getName() { return toUri().getPath(); } /** * This implementation always throws * {@linkplain UnsupportedOperationException}. Subclasses can change this * behavior as long as the contract of {@link FileObject} is obeyed. */ public InputStream openInputStream() throws IOException { throw new UnsupportedOperationException(); } /** * This implementation always throws * {@linkplain UnsupportedOperationException}. Subclasses can change this * behavior as long as the contract of {@link FileObject} is obeyed. */ public OutputStream openOutputStream() throws IOException { throw new UnsupportedOperationException(); } /** * Wraps the result of {@linkplain #getCharContent} in a Reader. Subclasses * can change this behavior as long as the contract of {@link FileObject} is * obeyed. */ public Reader openReader(boolean ignoreEncodingErrors) throws IOException { CharSequence charContent = getCharContent(ignoreEncodingErrors); if (charContent == null) throw new UnsupportedOperationException(); if (charContent instanceof CharBuffer) { CharBuffer buffer = (CharBuffer) charContent; if (buffer.hasArray()) return new CharArrayReader(buffer.array()); } return new StringReader(charContent.toString()); } /** * This implementation always throws * {@linkplain UnsupportedOperationException}. Subclasses can change this * behavior as long as the contract of {@link FileObject} is obeyed. */ public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { throw new UnsupportedOperationException(); } /** * Wraps the result of openOutputStream in a Writer. Subclasses can change * this behavior as long as the contract of {@link FileObject} is obeyed. */ public Writer openWriter() throws IOException { return new OutputStreamWriter(openOutputStream()); } /** * This implementation returns {@code 0L}. Subclasses can change this * behavior as long as the contract of {@link FileObject} is obeyed. * * @return {@code 0L} */ public long getLastModified() { return 0L; } /** * This implementation does nothing. Subclasses can change this behavior as * long as the contract of {@link FileObject} is obeyed. * * @return {@code false} */ public boolean delete() { return false; } /** * @return {@code this.kind} */ public Kind getKind() { return kind; } /** * This implementation compares the path of its URI to the given simple * name. */ public boolean isNameCompatible(String simpleName, Kind kind) { String baseName = simpleName + kind.extension; return kind.equals(getKind()) && (baseName.equals(toUri().getPath()) || toUri().getPath().endsWith("/" + baseName)); } /** * This implementation returns {@code null}. Subclasses can change this * behavior as long as the contract of {@link JavaFileObject} is obeyed. */ public NestingKind getNestingKind() { return null; } /** * This implementation returns {@code null}. Subclasses can change this * behavior as long as the contract of {@link JavaFileObject} is obeyed. */ public Modifier getAccessLevel() { return null; } @Override public String toString() { return getClass().getName() + "[" + toUri() + "]"; } }