001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javac.api;
027:
028: import java.io.IOException;
029: import java.net.URI;
030: import java.util.ArrayList;
031: import java.util.Collections;
032: import java.util.Iterator;
033: import java.util.List;
034: import java.util.Set;
035: import javax.tools.JavaFileObject.Kind;
036: import javax.tools.*;
037:
038: // FIXME sb removed before promoting to javax.tools
039: import com.sun.tools.javac.util.Version;
040:
041: /**
042: * Wraps all calls to a given file manager. Subclasses of this class
043: * might override some of these methods and might also provide
044: * additional fields and methods.
045: *
046: * <p>This class might be moved to {@link javax.tools} in a future
047: * release.
048: *
049: * <p><b>This is NOT part of any API supported by Sun Microsystems.
050: * If you write code that depends on this, you do so at your own
051: * risk. This code and its internal interfaces are subject to change
052: * or deletion without notice.</b></p>
053: *
054: * @param <M> the type of file manager wrapped to by this object
055: *
056: * @author Peter von der Ahé
057: * @since 1.6
058: */
059: @Version("@(#)WrappingJavaFileManager.java 1.10 07/05/05")
060: // FIXME sb removed before promoting to javax.tools
061: public class WrappingJavaFileManager<M extends JavaFileManager> extends
062: ForwardingJavaFileManager<M> {
063:
064: /**
065: * Creates a new instance of WrappingJavaFileManager.
066: * @param fileManager file manager to be wrapped
067: */
068: protected WrappingJavaFileManager(M fileManager) {
069: super (fileManager);
070: }
071:
072: /**
073: * This implementation returns the given file object. Subclasses
074: * may override this behavior.
075: *
076: * @param fileObject a file object
077: */
078: protected FileObject wrap(FileObject fileObject) {
079: return fileObject;
080: }
081:
082: /**
083: * This implementation forwards to {@link #wrap(FileObject)}.
084: * Subclasses may override this behavior.
085: *
086: * @param fileObject a file object
087: * @throws ClassCastException if the file object returned from the
088: * forwarded call is not a subtype of {@linkplain JavaFileObject}
089: */
090: protected JavaFileObject wrap(JavaFileObject fileObject) {
091: return (JavaFileObject) wrap((FileObject) fileObject);
092: }
093:
094: /**
095: * This implementation returns the given file object. Subclasses
096: * may override this behavior.
097: *
098: * @param fileObject a file object
099: */
100: protected FileObject unwrap(FileObject fileObject) {
101: return fileObject;
102: }
103:
104: /**
105: * This implementation forwards to {@link #unwrap(FileObject)}.
106: * Subclasses may override this behavior.
107: *
108: * @param fileObject a file object
109: * @throws ClassCastException if the file object returned from the
110: * forwarded call is not a subtype of {@linkplain JavaFileObject}
111: */
112: protected JavaFileObject unwrap(JavaFileObject fileObject) {
113: return (JavaFileObject) unwrap((FileObject) fileObject);
114: }
115:
116: /**
117: * This implementation maps the given list of file objects by
118: * calling wrap on each. Subclasses may override this behavior.
119: *
120: * @param fileObjects a list of file objects
121: * @return the mapping
122: */
123: protected Iterable<JavaFileObject> wrap(
124: Iterable<JavaFileObject> fileObjects) {
125: List<JavaFileObject> mapped = new ArrayList<JavaFileObject>();
126: for (JavaFileObject fileObject : fileObjects)
127: mapped.add(wrap(fileObject));
128: return Collections.unmodifiableList(mapped);
129: }
130:
131: /**
132: * This implementation returns the given URI. Subclasses may
133: * override this behavior.
134: *
135: * @param uri a URI
136: */
137: protected URI unwrap(URI uri) {
138: return uri;
139: }
140:
141: /**
142: * @throws IllegalStateException {@inheritDoc}
143: */
144: public Iterable<JavaFileObject> list(Location location,
145: String packageName, Set<Kind> kinds, boolean recurse)
146: throws IOException {
147: return wrap(super .list(location, packageName, kinds, recurse));
148: }
149:
150: /**
151: * @throws IllegalStateException {@inheritDoc}
152: */
153: public String inferBinaryName(Location location, JavaFileObject file) {
154: return super .inferBinaryName(location, unwrap(file));
155: }
156:
157: /**
158: * @throws IllegalArgumentException {@inheritDoc}
159: * @throws UnsupportedOperationException {@inheritDoc}
160: * @throws IllegalStateException {@inheritDoc}
161: */
162: public JavaFileObject getJavaFileForInput(Location location,
163: String className, Kind kind) throws IOException {
164: return wrap(super
165: .getJavaFileForInput(location, className, kind));
166: }
167:
168: /**
169: * @throws IllegalArgumentException {@inheritDoc}
170: * @throws UnsupportedOperationException {@inheritDoc}
171: * @throws IllegalStateException {@inheritDoc}
172: */
173: public JavaFileObject getJavaFileForOutput(Location location,
174: String className, Kind kind, FileObject sibling)
175: throws IOException {
176: return wrap(super .getJavaFileForOutput(location, className,
177: kind, unwrap(sibling)));
178: }
179:
180: /**
181: * @throws IllegalArgumentException {@inheritDoc}
182: * @throws IllegalStateException {@inheritDoc}
183: */
184: public FileObject getFileForInput(Location location,
185: String packageName, String relativeName) throws IOException {
186: return wrap(super .getFileForInput(location, packageName,
187: relativeName));
188: }
189:
190: /**
191: * @throws IllegalArgumentException {@inheritDoc}
192: * @throws IllegalStateException {@inheritDoc}
193: */
194: public FileObject getFileForOutput(Location location,
195: String packageName, String relativeName, FileObject sibling)
196: throws IOException {
197: return wrap(super.getFileForOutput(location, packageName,
198: relativeName, unwrap(sibling)));
199: }
200:
201: }
|