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

com.querydsl.codegen.utils.MemClassLoader 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.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind;
import javax.tools.StandardLocation;

/**
 * MemClassLoader is a mmemory based implementation of the ClassLoader interface
 *
 * @author tiwe
 */
public final class MemClassLoader extends ClassLoader {

  private static final LocationAndKind CLASS_KEY =
      new LocationAndKind(StandardLocation.CLASS_OUTPUT, Kind.CLASS);

  private static final LocationAndKind OTHER_KEY =
      new LocationAndKind(StandardLocation.CLASS_OUTPUT, Kind.OTHER);

  private static final LocationAndKind SOURCE_KEY =
      new LocationAndKind(StandardLocation.CLASS_OUTPUT, Kind.SOURCE);

  private final Map> memFileSystem;

  public MemClassLoader(
      ClassLoader parent, Map> ramFileSystem) {
    super(parent);
    this.memFileSystem = ramFileSystem;
  }

  @Override
  protected Class findClass(String name) throws ClassNotFoundException {
    var jfo = memFileSystem.get(CLASS_KEY).get(name);
    if (jfo != null) {
      var bytes = ((MemJavaFileObject) jfo).getByteArray();
      return defineClass(name, bytes, 0, bytes.length);
    } else {
      return super.findClass(name);
    }
  }

  @Override
  protected URL findResource(String name) {
    var retValue = super.findResource(name);
    if (retValue != null) {
      return retValue;
    } else {
      var jfo = getFileObject(name);
      if (jfo != null) {
        try {
          return jfo.toUri().toURL();
        } catch (MalformedURLException ex) {
          return null;
        }
      } else {
        return null;
      }
    }
  }

  private JavaFileObject getFileObject(String n) {
    LocationAndKind key;
    String name;
    if (n.endsWith(Kind.CLASS.extension)) {
      name = n.replace('.', '/') + Kind.CLASS.extension;
      key = CLASS_KEY;
    } else if (n.endsWith(Kind.SOURCE.extension)) {
      name = n.replace('.', '/') + Kind.SOURCE.extension;
      key = SOURCE_KEY;
    } else {
      name = n;
      key = OTHER_KEY;
    }
    if (memFileSystem.containsKey(key)) {
      return memFileSystem.get(key).get(name);
    } else {
      return null;
    }
  }

  @Override
  public InputStream getResourceAsStream(String name) {
    var jfo = getFileObject(name);
    if (jfo != null) {
      var bytes = ((MemJavaFileObject) jfo).getByteArray();
      return new ByteArrayInputStream(bytes);
    } else {
      return null;
    }
  }

  @Override
  public Enumeration getResources(String name) throws IOException {
    List retValue;
    retValue = Collections.list(super.getResources(name));
    var jfo = getFileObject(name);
    if (jfo != null) {
      retValue.add(jfo.toUri().toURL());
    }
    return Collections.enumeration(retValue);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy