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 } |