Skip to main content
summaryrefslogtreecommitdiffstats
blob: 39595f81161ff6eb3273f10a2b9d168f38055e1c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package org.eclipse.osee.ote.internal;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;

import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamPumper;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.ote.OTEServerRuntimeCache;
import org.eclipse.osee.ote.OTEServerFolder;

public class OTEServerRuntimeCacheImpl implements OTEServerRuntimeCache  {
   
   private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss"); 

   private File folder;
   private OTEServerFolder oteServerFolder;

   public OTEServerRuntimeCacheImpl(){
   }
   
   /**
    * ds component method
    */
   public void start(){
      folder = oteServerFolder.getCacheFolder();
      if (!folder.exists()) {
         if (!folder.mkdirs()) {
            throw new RuntimeException("Could not create JAR cache at " + folder.getAbsolutePath());
         }
      }
      if (!folder.isDirectory()) {
         throw new IllegalStateException("the JAR cache is not a directory! Path=" + folder.getAbsolutePath());
      }
      clean();
   }
   
   /**
    * ds component method
    */
   public void stop(){
   }
   
   /**
    * ds component method
    */
   public void bindOTEServerFolder(OTEServerFolder oteServerFolder){
      this.oteServerFolder = oteServerFolder;
   }
   
   /**
    * ds component method
    */
   public void unbindOTEServerFolder(OTEServerFolder oteServerFolder){
      this.oteServerFolder = oteServerFolder;
   }
   
   @Override
   public void clearJarCache() {
      File[] bundleFolders = folder.listFiles();
      for(File bundleFolder: bundleFolders){
         if(bundleFolder.isDirectory()){
            File[] jars = bundleFolder.listFiles(new FileFilter() {
               @Override
               public boolean accept(File file) {
                  return file.getAbsolutePath().endsWith(".jar");
               }
            });
            for(File jar:jars){
               jar.delete();
            }
         } else {
            bundleFolder.delete();
         }
      }
   }
   
   @Override
   public File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException {
      File namedFolder = new File(folder, symbolicName);
      if(namedFolder.exists() && !namedFolder.isDirectory()){
         namedFolder.delete();
      }
      namedFolder.mkdirs();
      
      File newCachedFile = new File(namedFolder, md5Digest + ".jar");
      OutputStream cachedFileOut = new FileOutputStream(newCachedFile);
      StreamPumper.pumpData(servedBundleIn, cachedFileOut);
      cachedFileOut.close();
      servedBundleIn.close();
      writeDateFile(newCachedFile);
      return newCachedFile;
   }

   @Override
   public File get(String symbolicName, String md5Digest) throws FileNotFoundException {
      File foundFile = new File(new File(folder, symbolicName), md5Digest + ".jar");
      if(foundFile.exists()){
         writeDateFile(foundFile);
         return foundFile; 
      }
      return null;
   }

   /**
    * Write out a file that has the date a cached file was last accessed.  This file will be used to determine when it is ok to remove a file.
    * 
    * @param foundFile
    */
   private void writeDateFile(File foundFile) {
      File dateFile = new File(foundFile.getParentFile(), foundFile.getName()+ ".date");
      FileOutputStream fos = null;
      try{
         fos = new FileOutputStream(dateFile);
         fos.write(formatter.format(new Date()).getBytes());
         fos.flush();
      } catch(IOException ex) {
         OseeLog.log(getClass(), Level.SEVERE, ex);
      } finally {
         if(fos != null){
            try {
               fos.close();
            } catch (IOException e) {
            }
         }
      }
   }
   
   private void clean(){
      File[] bundleFolders = folder.listFiles();
      for(File bundleFolder: bundleFolders){
         if(bundleFolder.isDirectory()){
            File[] jars = bundleFolder.listFiles(new FileFilter() {
               @Override
               public boolean accept(File file) {
                  return file.getAbsolutePath().endsWith(".jar");
               }
            });
            if(jars.length == 0){
               if(bundleFolder.listFiles().length == 0){
                  bundleFolder.delete();
               }
            } else {
               for(File jar:jars){
                  File dateFile = new File(jar.getAbsolutePath() + ".date");
                  if(dateFile.exists()){
                     if(isDateFileOld(dateFile)){//delete files that haven't been recently used
                        if(jar.exists()){
                           jar.delete();
                        }
                        dateFile.delete();
                     }  
                  } else { //delete a jar without a ".date" file
                     jar.delete();
                  }
               }
            }
         } else { //delete legacy style cache items
            bundleFolder.delete();
         }
      }
   }

   private boolean isDateFileOld(File dateFile) {
      String dateStr = getDateFromFile(dateFile);
      Date date;
      try {
         date = formatter.parse(dateStr);
      } catch (ParseException e) {
         return true;
      }
      Date oldDate = getOldDate();
      if(date.before(oldDate)){
         return true;
      } else {
         return false;
      }
   }
   
   private String getDateFromFile(File dateFile){
      FileInputStream fis = null;
      String dateStr = null;
      try{
         byte[] buffer = new byte[1024];
         fis = new FileInputStream(dateFile);
         fis.read(buffer);
         dateStr = new String(buffer);
      } catch(IOException ex) {
         OseeLog.log(getClass(), Level.SEVERE, ex);
      } finally {
         if(fis != null){
            try {
               fis.close();
            } catch (IOException e) {
            }
         }
      }
      return dateStr;
   }
   
   private Date getOldDate(){
      Calendar cal = Calendar.getInstance();
      cal.setTime(new Date());
      cal.add(Calendar.DAY_OF_MONTH, -7);
      return cal.getTime();
   }

}

Back to the top