1 /*
   2  * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 6725036
  27  * @summary javac returns incorrect value for lastModifiedTime() when
  28  *          source is a zip file archive
  29  */
  30 
  31 import java.io.File;
  32 import java.util.Date;
  33 import java.util.TimeZone;
  34 import java.util.jar.JarEntry;
  35 import java.util.jar.JarFile;
  36 import javax.tools.JavaFileObject;
  37 
  38 import com.sun.tools.javac.file.JavacFileManager;
  39 import com.sun.tools.javac.file.RelativePath.RelativeFile;
  40 import com.sun.tools.javac.file.ZipFileIndex;
  41 import com.sun.tools.javac.file.ZipFileIndexArchive;
  42 import com.sun.tools.javac.file.ZipFileIndexCache;
  43 import com.sun.tools.javac.util.Context;
  44 
  45 public class T6725036 {
  46     public static void main(String... args) throws Exception {
  47         new T6725036().run();
  48     }
  49 
  50     void run() throws Exception {
  51         RelativeFile TEST_ENTRY_NAME = new RelativeFile("java/lang/String.class");
  52 
  53         File f = new File(System.getProperty("java.home"));
  54         if (!f.getName().equals("jre"))
  55             f = new File(f, "jre");
  56         File rt_jar = new File(new File(f, "lib"), "rt.jar");
  57 
  58         JarFile j = new JarFile(rt_jar);
  59         JarEntry je = j.getJarEntry(TEST_ENTRY_NAME.getPath());
  60         long jarEntryTime = je.getTime();
  61 
  62         ZipFileIndexCache zfic = ZipFileIndexCache.getSharedInstance();
  63         ZipFileIndex zfi = zfic.getZipFileIndex(rt_jar, null, false, null, false);
  64         long zfiTime = zfi.getLastModified(TEST_ENTRY_NAME);
  65 
  66         check(je, jarEntryTime - TimeZone.getDefault().getOffset(jarEntryTime), 
  67               zfi + ":" + TEST_ENTRY_NAME.getPath(), zfiTime);
  68 
  69         Context context = new Context();
  70         JavacFileManager fm = new JavacFileManager(context, false, null);
  71         ZipFileIndexArchive zfia = new ZipFileIndexArchive(fm, zfi);
  72         JavaFileObject jfo =
  73             zfia.getFileObject(TEST_ENTRY_NAME.dirname(),
  74                                    TEST_ENTRY_NAME.basename());
  75         long jfoTime = jfo.getLastModified();
  76 
  77         check(je, jarEntryTime - TimeZone.getDefault().getOffset(jarEntryTime),
  78               jfo, jfoTime);
  79 
  80         if (errors > 0)
  81             throw new Exception(errors + " occurred");
  82     }
  83 
  84     void check(Object ref, long refTime, Object test, long testTime) {
  85         if (refTime == testTime)
  86             return;
  87         System.err.println("Error: ");
  88         System.err.println("Expected: " + getText(ref, refTime));
  89         System.err.println("   Found: " + getText(test, testTime));
  90         errors++;
  91     }
  92 
  93     String getText(Object x, long t) {
  94         return String.format("%14d", t) + " (" + new Date(t) + ") from " + x;
  95     }
  96 
  97     int errors;
  98 }