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

com.mysema.codegen.MemFileManager Maven / Gradle / Ivy

/*
 * Copyright (c) 2010 Mysema Ltd.
 * 
 * base on code from https://hickory.dev.java.net/
 * 
 */

package com.mysema.codegen;

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 getJavaFileForInput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind) throws IOException {
        throw new UnsupportedOperationException();
    }

    @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