jaxws/src/share/jaxws_classes/com/sun/xml/internal/org/jvnet/mimepull/WeakDataFile.java
changeset 23782 953bfc3fbe31
parent 22679 d785acd84a14
equal deleted inserted replaced
23403:85dbdc227c5e 23782:953bfc3fbe31
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     7  * published by the Free Software Foundation.  Oracle designates this
    23  * questions.
    23  * questions.
    24  */
    24  */
    25 
    25 
    26 package com.sun.xml.internal.org.jvnet.mimepull;
    26 package com.sun.xml.internal.org.jvnet.mimepull;
    27 
    27 
       
    28 import java.util.concurrent.TimeUnit;
       
    29 
    28 import java.io.File;
    30 import java.io.File;
    29 import java.io.IOException;
    31 import java.io.IOException;
    30 import java.io.RandomAccessFile;
    32 import java.io.RandomAccessFile;
    31 import java.lang.ref.ReferenceQueue;
    33 import java.lang.ref.ReferenceQueue;
    32 import java.lang.ref.WeakReference;
    34 import java.lang.ref.WeakReference;
    33 import java.util.ArrayList;
    35 import java.util.ArrayList;
    34 import java.util.List;
    36 import java.util.List;
    35 import java.util.concurrent.Executor;
    37 import java.util.concurrent.ScheduledExecutorService;
    36 import java.util.logging.Level;
    38 import java.util.logging.Level;
    37 import java.util.logging.Logger;
    39 import java.util.logging.Logger;
    38 
    40 
    39 /**
    41 /**
    40  * Removing files based on this
    42  * Removing files based on this
    43  * @author Jitendra Kotamraju
    45  * @author Jitendra Kotamraju
    44  */
    46  */
    45 final class WeakDataFile extends WeakReference<DataFile> {
    47 final class WeakDataFile extends WeakReference<DataFile> {
    46 
    48 
    47     private static final Logger LOGGER = Logger.getLogger(WeakDataFile.class.getName());
    49     private static final Logger LOGGER = Logger.getLogger(WeakDataFile.class.getName());
       
    50     private static int TIMEOUT = 10; //milliseconds
    48     //private static final int MAX_ITERATIONS = 2;
    51     //private static final int MAX_ITERATIONS = 2;
    49     private static ReferenceQueue<DataFile> refQueue = new ReferenceQueue<DataFile>();
    52     private static ReferenceQueue<DataFile> refQueue = new ReferenceQueue<DataFile>();
    50     private static List<WeakDataFile> refList = new ArrayList<WeakDataFile>();
    53     private static List<WeakDataFile> refList = new ArrayList<WeakDataFile>();
    51     private final File file;
    54     private final File file;
    52     private final RandomAccessFile raf;
    55     private final RandomAccessFile raf;
    53     private static boolean hasCleanUpExecutor = false;
    56     private static boolean hasCleanUpExecutor = false;
    54     static {
    57     static {
       
    58         int delay = 10;
       
    59         try {
       
    60                 delay = Integer.getInteger("com.sun.xml.internal.org.jvnet.mimepull.delay", 10);
       
    61         } catch (SecurityException se) {
       
    62             if (LOGGER.isLoggable(Level.CONFIG)) {
       
    63                 LOGGER.log(Level.CONFIG, "Cannot read ''{0}'' property, using defaults.",
       
    64                         new Object[] {"com.sun.xml.internal.org.jvnet.mimepull.delay"});
       
    65             }
       
    66         }
    55         CleanUpExecutorFactory executorFactory = CleanUpExecutorFactory.newInstance();
    67         CleanUpExecutorFactory executorFactory = CleanUpExecutorFactory.newInstance();
    56         if (executorFactory!=null) {
    68         if (executorFactory!=null) {
    57             if (LOGGER.isLoggable(Level.FINE)) {
    69             if (LOGGER.isLoggable(Level.FINE)) {
    58                 LOGGER.log(Level.FINE, "Initializing clean up executor for MIMEPULL: {0}", executorFactory.getClass().getName());
    70                 LOGGER.log(Level.FINE, "Initializing clean up executor for MIMEPULL: {0}", executorFactory.getClass().getName());
    59             }
    71             }
    60             Executor executor = executorFactory.getExecutor();
    72             ScheduledExecutorService scheduler = executorFactory.getScheduledExecutorService();
    61             executor.execute(new Runnable() {
    73             scheduler.scheduleWithFixedDelay(new CleanupRunnable(), delay, delay, TimeUnit.SECONDS);
    62                 @Override
       
    63                 public void run() {
       
    64                     WeakDataFile weak;
       
    65                     while (true) {
       
    66                         try {
       
    67                             weak = (WeakDataFile) refQueue.remove();
       
    68                             if (LOGGER.isLoggable(Level.FINE)) {
       
    69                                 LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
       
    70                             }
       
    71                             weak.close();
       
    72                         } catch (InterruptedException e) {
       
    73                         }
       
    74                     }
       
    75                 }
       
    76             });
       
    77             hasCleanUpExecutor = true;
    74             hasCleanUpExecutor = true;
    78         }
    75         }
    79     }
    76     }
    80 
    77 
    81     WeakDataFile(DataFile df, File file) {
    78     WeakDataFile(DataFile df, File file) {
   155                 LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
   152                 LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
   156             }
   153             }
   157             weak.close();
   154             weak.close();
   158         }
   155         }
   159     }
   156     }
       
   157 
       
   158 private static class CleanupRunnable implements Runnable {
       
   159     @Override
       
   160     public void run() {
       
   161         try {
       
   162             if (LOGGER.isLoggable(Level.FINE)) {
       
   163                 LOGGER.log(Level.FINE, "Running cleanup task");
       
   164             }
       
   165                 WeakDataFile weak = (WeakDataFile) refQueue.remove(TIMEOUT);
       
   166             while (weak != null) {
       
   167                 if (LOGGER.isLoggable(Level.FINE)) {
       
   168                     LOGGER.log(Level.FINE, "Cleaning file = {0} from reference queue.", weak.file);
       
   169                 }
       
   170                 weak.close();
       
   171                 weak = (WeakDataFile) refQueue.remove(TIMEOUT);
       
   172             }
       
   173         } catch (InterruptedException e) {
       
   174         }
       
   175     }
   160 }
   176 }
       
   177 }