All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.querydsl.codegen.utils.MemFileManager Maven / Gradle / Ivy

/*
 * Copyright 2010, Mysema Ltd
 * 
 * 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 com.querydsl.codegen.utils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.StandardLocation;
import javax.tools.JavaFileObject.Kind;

/**
 * MemFileManager is a memory based implementation of the JavaFileManager
 * interface
 * 
 * @author tiwe
 * 
 */
public class MemFileManager extends ForwardingJavaFileManager {

    private final ClassLoader classLoader;

    private final Map> ramFileSystem;

    private final String urlPrefix;

    public MemFileManager(ClassLoader parent, StandardJavaFileManager sjfm) {
        super(sjfm);
        ramFileSystem = new HashMap>();
        Map classLoaderContent = new HashMap();
        ramFileSystem.put(new LocationAndKind(StandardLocation.CLASS_OUTPUT, Kind.CLASS),
                classLoaderContent);
        classLoader = new MemClassLoader(parent, ramFileSystem);
        urlPrefix = MemFileSystemRegistry.DEFAULT.getUrlPrefix(this);
    }

    @Override
    public ClassLoader getClassLoader(JavaFileManager.Location location) {
        return classLoader;
    }

    @Override
    public FileObject getFileForInput(JavaFileManager.Location location, String packageName,
            String relativeName) throws IOException {
        throw new UnsupportedOperationException();
    }

    @Override
    public FileObject getFileForOutput(JavaFileManager.Location location, String packageName,
            String relativeName, FileObject sibling) throws IOException {
        String name = null;
        if ("".equals(packageName)) {
            name = relativeName;
        } else {
            name = packageName.replace('.', '/') + "/" + relativeName;
        }
        LocationAndKind key = new LocationAndKind(location, Kind.OTHER);
        if (ramFileSystem.containsKey(key)) {
            JavaFileObject jfo = ramFileSystem.get(key).get(name);
            if (jfo != null) {
                return jfo;
            }
        }
        JavaFileObject jfo = new MemJavaFileObject(urlPrefix, name, Kind.OTHER);
        register(key, jfo);
        return jfo;
    }

    @Override
    public JavaFileObject getJavaFileForOutput(Location location, String name, Kind kind,
            FileObject sibling) throws IOException {
        JavaFileObject javaFileObject = null;
        LocationAndKind key = new LocationAndKind(location, kind);

        if (ramFileSystem.containsKey(key)) {
            javaFileObject = ramFileSystem.get(key).get(name);
            if (javaFileObject != null) {
                return javaFileObject;
            }
        }
        if (kind == Kind.SOURCE) {
            javaFileObject = new MemSourceFileObject(name);
        } else {
            javaFileObject = new MemJavaFileObject(urlPrefix, name, kind);
        }
        register(key, javaFileObject);
        return javaFileObject;
    }

    @Override
    public String inferBinaryName(Location loc, JavaFileObject javaFileObject) {
        String result;
        if (loc == StandardLocation.CLASS_PATH && javaFileObject instanceof MemJavaFileObject) {
            result = javaFileObject.getName();
        } else {
            result = super.inferBinaryName(loc, javaFileObject);
        }
        return result;
    }

    @Override
    public boolean isSameFile(FileObject a, FileObject b) {
        return a.equals(b);
    }

    @Override
    public Iterable list(Location location, String pkg, Set kinds,
            boolean recurse) throws IOException {

        List result = new ArrayList();
        for (JavaFileObject f : super.list(location, pkg, kinds, recurse)) {
            result.add(f);
        }
        if (location == StandardLocation.CLASS_PATH) {
            location = StandardLocation.CLASS_OUTPUT;
        }

        for (Kind kind : kinds) {
            LocationAndKind key = new LocationAndKind(location, kind);
            if (ramFileSystem.containsKey(key)) {
                Map locatedFiles = ramFileSystem.get(key);
                for (Map.Entry entry : locatedFiles.entrySet()) {
                    String name = entry.getKey();
                    String packageName = "";
                    if (name.indexOf('.') > -1) {
                        packageName = name.substring(0, name.lastIndexOf('.'));
                    }
                    if (recurse ? packageName.startsWith(pkg) : packageName.equals(pkg)) {
                        JavaFileObject candidate = entry.getValue();
                        if (kinds.contains(candidate.getKind())) {
                            result.add(candidate);
                        }
                    }
                }
            }
        }
        return result;
    }

    private void register(LocationAndKind key, JavaFileObject javaFileObject) {
        if (!ramFileSystem.containsKey(key)) {
            ramFileSystem.put(key, new HashMap());
        }
        ramFileSystem.get(key).put(javaFileObject.getName(), javaFileObject);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy