001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.codegen;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.jet.OutputFile;
021
022 import java.net.URL;
023 import java.net.URLClassLoader;
024 import java.util.List;
025 import java.util.jar.Manifest;
026
027 public class GeneratedClassLoader extends URLClassLoader {
028 private ClassFileFactory state;
029
030 public GeneratedClassLoader(@NotNull ClassFileFactory state, ClassLoader parentClassLoader, URL...urls) {
031 super(urls, parentClassLoader);
032 this.state = state;
033 }
034
035 @NotNull
036 @Override
037 protected Class<?> findClass(@NotNull String name) throws ClassNotFoundException {
038 String classFilePath = name.replace('.', '/') + ".class";
039
040 OutputFile outputFile = state.get(classFilePath);
041 if (outputFile != null) {
042 byte[] bytes = outputFile.asByteArray();
043 int lastDot = name.lastIndexOf('.');
044 if (lastDot >= 0) {
045 String pkgName = name.substring(0, lastDot);
046 if (getPackage(pkgName) == null) {
047 definePackage(pkgName, new Manifest(), null);
048 }
049 }
050 return defineClass(name, bytes, 0, bytes.length);
051 }
052
053 return super.findClass(name);
054 }
055
056 public void dispose() {
057 state = null;
058 }
059
060 @NotNull
061 public List<OutputFile> getAllGeneratedFiles() {
062 return state.asList();
063 }
064 }