Fixing a new bug: Considering parameters with Type and Type array, e.g., T and T[].
[jpf-core.git] / src / main / gov / nasa / jpf / jvm / DirClassFileContainer.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.jvm;
20
21 import gov.nasa.jpf.jvm.JVMClassFileContainer;
22 import gov.nasa.jpf.util.FileUtils;
23 import gov.nasa.jpf.vm.ClassFileMatch;
24 import gov.nasa.jpf.vm.ClassParseException;
25 import java.io.File;
26 import java.io.FileInputStream;
27 import java.io.IOException;
28 import java.net.MalformedURLException;
29
30 /**
31  *
32  */
33 public class DirClassFileContainer extends JVMClassFileContainer {
34
35   protected File dir;
36
37   static String getContainerURL(File dir){
38     try {
39       return dir.toURI().toURL().toString();
40     } catch (MalformedURLException e) {
41       return dir.getPath();
42     }
43   }
44
45   public DirClassFileContainer(File dir) {
46     super(dir.getPath(), getContainerURL(dir));
47
48     this.dir = dir;
49   }
50
51   @Override
52   public ClassFileMatch getMatch(String clsName) throws ClassParseException {
53     String pn = clsName.replace('.', File.separatorChar) + ".class";
54     File f = new File(dir, pn);
55
56     if (f.isFile()) {
57       FileInputStream fis = null;
58
59       try {
60         fis = new FileInputStream(f);
61         long len = f.length();
62         if (len > Integer.MAX_VALUE) {
63           error("classfile too big: " + f.getPath());
64         }
65         byte[] data = new byte[(int) len];
66         FileUtils.getContents(fis, data);
67
68         return new JVMClassFileMatch( clsName, getClassURL(clsName), data);
69
70       } catch (IOException iox) {
71         error("cannot read " + f.getPath());
72
73       } finally {
74         if (fis != null) {
75           try {
76             fis.close();
77           } catch (IOException iox) {
78             error("cannot close input stream for file " + f.getPath());
79           }
80         }
81       }
82     }
83
84     return null;
85   }
86 }