Changeset e58398c


Ignore:
Timestamp:
Jun 10, 2010, 12:19:11 PM (10 years ago)
Author:
Michael Seifert <mseifert@…>
Branches:
master
Children:
2a40525
Parents:
16b01d3
Message:

Improved memory handling (closing files, garbage collection, weak references);

Added BufferedStorage? to cache replays;

Moved file processing methods into FileUtils?

Location:
src/main/java/de/erichseifert/warp
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/de/erichseifert/warp/WARP.java

    r16b01d3 re58398c  
    2424import java.io.File;
    2525import java.util.Collection;
    26 import java.util.Collections;
    2726import java.util.HashSet;
    2827import java.util.Set;
     
    3635import de.erichseifert.warp.io.Settings;
    3736import de.erichseifert.warp.replays.ReplayParserFactory;
     37import de.erichseifert.warp.util.FileUtil;
    3838
    3939/**
     
    9393                Settings.getInstance().setReplayDir(dir.getPath());
    9494                // Refresh replay table
    95                 Collection<File> replayFiles = walk(dir, walkDepth);
     95                Collection<File> replayFiles = FileUtil.walk(dir, walkDepth);
    9696                for (File replayFile : replayFiles) {
    9797                        Replay replay = ReplayParserFactory.getInstance().getReplayParser(replayFile);
     
    101101                // Notify listeners
    102102                fireReplayInfoChanged(storage.getDescriptors());
    103         }
    104103
    105         /**
    106          * Retrieves all files in the specified directory, as well as files contained in sub-folders.
    107          * @param dir Directory to be walked.
    108          * @param depth Number of sub-folders to step into.
    109          * @return Collection of files.
    110          */
    111         private Collection<File> walk(File dir, int depth) {
    112                 if (!dir.isDirectory()) {
    113                         throw new IllegalArgumentException("The file "+dir.getPath()+" is not a directory.");
    114                 }
    115                 depth--;
    116                 if (depth == -1) {
    117                         return Collections.emptySet();
    118                 }
    119                 File[] children = dir.listFiles();
    120                 Collection<File> files = new HashSet<File>(children.length);
    121                 for (File file : children) {
    122                         if (file.isDirectory()) {
    123                                 files.addAll(walk(file, depth));
    124                         }
    125                         else {
    126                                 files.add(file);
    127                         }
    128                 }
    129                 return Collections.unmodifiableCollection(files);
     104                // FIXME: Find better solution
     105                replayFiles = null;
     106                System.gc();
    130107        }
    131108
  • src/main/java/de/erichseifert/warp/io/SerializingStorage.java

    r16b01d3 re58398c  
    88import java.io.ObjectInputStream;
    99import java.io.ObjectOutputStream;
    10 import java.math.BigInteger;
    11 import java.security.MessageDigest;
    12 import java.security.NoSuchAlgorithmException;
    1310import java.util.Collection;
    1411import java.util.LinkedList;
     
    1714import de.erichseifert.warp.Replay;
    1815import de.erichseifert.warp.ReplayDescriptor;
     16import de.erichseifert.warp.util.FileUtil;
    1917
    2018public class SerializingStorage implements ReplayStorage {
     
    3230                for (String path : paths) {
    3331                        File replayFile = new File(path);
    34                         String replayFilePath = STORAGE_PATH+File.separator+fileHash(replayFile);
     32                        String replayFilePath = STORAGE_PATH+File.separator+FileUtil.fileHash(replayFile);
    3533                        Replay replay = deserialize(replayFilePath);
    3634                        replays.add(replay);
     
    8078
    8179                for (Replay replay : replays) {
    82                         String replayFilePath = STORAGE_PATH+File.separator+fileHash(replay.getFile());
     80                        String replayFilePath = STORAGE_PATH+File.separator+FileUtil.fileHash(replay.getFile());
    8381                        FileOutputStream fos = null;
    8482                        ObjectOutputStream out = null;
     
    123121                storageDir.delete();
    124122        }
    125 
    126         private static String fileHash(File file) {
    127                 String path = file.getAbsolutePath();
    128                 long modificationDate = file.lastModified();
    129                 long size = file.getTotalSpace();
    130 
    131                 MessageDigest algorithm = null;
    132                 try {
    133                         algorithm = MessageDigest.getInstance("MD5");
    134                 } catch (NoSuchAlgorithmException e) {
    135                         // TODO Auto-generated catch block
    136                         e.printStackTrace();
    137                 }
    138                 algorithm.update(path.getBytes());
    139                 BigInteger hashValue = new BigInteger(1, algorithm.digest());
    140                 return String.format("%1$032X", hashValue).toLowerCase();
    141         }
    142123}
  • src/main/java/de/erichseifert/warp/replays/sc2replay/SC2Replay_v1.java

    r16b01d3 re58398c  
    7272        public SC2Replay_v1(File file) throws IOException {
    7373                super(file);
    74                 FileChannel fileChannel = new RandomAccessFile(file, "r").getChannel();
     74                RandomAccessFile raf = new RandomAccessFile(file, "r");
     75                FileChannel fileChannel = raf.getChannel();
    7576                ByteBuffer src = fileChannel.map(MapMode.READ_ONLY, 0, REPLAY_DATA_OFFSET);
    7677                src.order(ByteOrder.BIG_ENDIAN);
     
    115116                // Extract map preview
    116117                mapPreview = new ImageIcon(archive.getFiles()[FILE_INDEX_MAP_PREVIEW].getBytes());
     118
    117119                fileChannel.close();
     120                raf.close();
    118121        }
    119122
  • src/main/java/de/erichseifert/warp/replays/sc2replay/actions/SC2ActionFactory.java

    r16b01d3 re58398c  
    2323
    2424import java.nio.ByteBuffer;
    25 import java.util.HashMap;
    26 import java.util.Map;
     25import java.util.WeakHashMap;
    2726
    2827import de.erichseifert.warp.GameActionFactory;
     
    4544        private static final byte CODE_SEND_RESOURCES = 0x0F;
    4645
    47         private static final Map<SC2Replay, SC2ActionFactory> instances = new HashMap<SC2Replay, SC2ActionFactory>();
     46        private static final WeakHashMap<SC2Replay, SC2ActionFactory> instances = new WeakHashMap<SC2Replay, SC2ActionFactory>();
    4847        private int timeStamp;
    4948
  • src/main/java/de/erichseifert/warp/util/FileUtil.java

    r16b01d3 re58398c  
    2727import java.io.InputStream;
    2828import java.io.InputStreamReader;
     29import java.math.BigInteger;
     30import java.security.MessageDigest;
     31import java.security.NoSuchAlgorithmException;
    2932import java.util.ArrayList;
     33import java.util.Collection;
     34import java.util.Collections;
    3035import java.util.HashMap;
     36import java.util.HashSet;
    3137import java.util.List;
    3238import java.util.Map;
     
    6773                return path;
    6874        }
     75
     76        public static String fileHash(File file) {
     77                String path = file.getAbsolutePath();
     78
     79                MessageDigest algorithm = null;
     80                try {
     81                        algorithm = MessageDigest.getInstance("MD5");
     82                } catch (NoSuchAlgorithmException e) {
     83                        // TODO Auto-generated catch block
     84                        e.printStackTrace();
     85                }
     86                algorithm.update(path.getBytes());
     87                BigInteger hashValue = new BigInteger(1, algorithm.digest());
     88                return String.format("%1$032X", hashValue).toLowerCase();
     89        }
     90
     91        /**
     92         * Retrieves all files in the specified directory, as well as files contained in sub-folders.
     93         * @param dir Directory to be walked.
     94         * @param depth Number of sub-folders to step into.
     95         * @return Collection of files.
     96         */
     97        public static Collection<File> walk(File dir, int depth) {
     98                if (!dir.isDirectory()) {
     99                        throw new IllegalArgumentException("The file "+dir.getPath()+" is not a directory.");
     100                }
     101                depth--;
     102                if (depth == -1) {
     103                        return Collections.emptySet();
     104                }
     105                File[] children = dir.listFiles();
     106                Collection<File> files = new HashSet<File>(children.length);
     107                for (File file : children) {
     108                        if (file.isDirectory()) {
     109                                files.addAll(walk(file, depth));
     110                        }
     111                        else {
     112                                files.add(file);
     113                        }
     114                }
     115                return Collections.unmodifiableCollection(files);
     116        }
    69117}
Note: See TracChangeset for help on using the changeset viewer.