Changeset b471e8d


Ignore:
Timestamp:
Aug 6, 2010, 7:42:02 PM (7 years ago)
Author:
Michael Seifert <mseifert@…>
Branches:
master
Children:
8145bd3
Parents:
1deae17
Message:

Version bump to 0.8-SNAPSHOT;

Moved replay classes of the core module to separate package;

Separated replay data containers from the actual parsers;

Using MIME-Types to identify replay formats

Files:
3 added
35 edited
17 moved

Legend:

Unmodified
Added
Removed
  • core/pom.xml

    r1deae17 rb471e8d  
    33    <artifactId>WARP</artifactId>
    44    <groupId>de.erichseifert.warp</groupId>
    5     <version>0.7</version>
     5    <version>0.8-SNAPSHOT</version>
    66  </parent>
    77  <modelVersion>4.0.0</modelVersion>
    88  <groupId>de.erichseifert.warp</groupId>
    99  <artifactId>core</artifactId>
    10   <version>0.7</version>
     10  <version>0.8-SNAPSHOT</version>
    1111  <packaging>jar</packaging>
    1212 
  • core/src/main/java/de/erichseifert/warp/core/DataPresenter.java

    r1deae17 rb471e8d  
    2323
    2424import java.io.File;
     25import java.io.IOException;
    2526import java.util.Collection;
     27import java.util.HashMap;
    2628import java.util.Map;
    2729import java.util.Set;
     
    3234import de.erichseifert.warp.core.io.search.ReplayIndexer.SearchMode;
    3335import de.erichseifert.warp.core.io.search.indices.Index.Range;
    34 import de.erichseifert.warp.core.replays.ReplayParserFactory;
     36import de.erichseifert.warp.core.replay.Replay;
     37import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     38import de.erichseifert.warp.core.replay.ReplayDescriptor;
     39import de.erichseifert.warp.core.replay.ReplayParser;
     40import de.erichseifert.warp.core.replay.ReplayParserFactory;
    3541import de.erichseifert.warp.core.ui.CLI;
    3642import de.erichseifert.warp.core.ui.WARPUI;
     
    4551                private final File dir;
    4652                private final ProgressListener[] listeners;
     53                private final Map<String, Set<ReplayParser<?>>> replayParserCache;
    4754
    4855                /**
     
    5663                        this.dir = dir;
    5764                        this.listeners = listeners;
     65                        replayParserCache = new HashMap<String, Set<ReplayParser<?>>>();
    5866                }
    5967
     
    6371
    6472                        int elementsProcessed = 0;
     73                        int elementsTotal = replayFiles.size();
    6574                        for (File replayFile : replayFiles) {
    6675                                if (storage.contains(replayFile)) {
     
    7180                                        continue;
    7281                                }
    73                                 Replay replay = ReplayParserFactory.getInstance().getReplayParser(replayFile);
    74                                 storage.save(replay);
    75                                 elementsProcessed++;
    76 
     82
     83                                // Retrieve parser set for mime type
     84                                String mimeType = FileUtil.getMimeType(replayFile);
     85                                Set<ReplayParser<?>> parsers = replayParserCache.get(mimeType);
     86                                if (parsers == null) {
     87                                        parsers = ReplayParserFactory.getInstance().getReplayParser(mimeType);
     88                                        replayParserCache.put(mimeType, parsers);
     89                                }
     90
     91                                // Parse replay
     92                                Replay replay = null;
     93                                for (ReplayParser<?> parser : parsers) {
     94                                                try {
     95                                                        if (parser.isSupported(replayFile)) {
     96                                                                replay = parser.getReplay(replayFile);
     97                                                                break;
     98                                                        }
     99                                                } catch (IOException e) {
     100                                                        // TODO Auto-generated catch block
     101                                                        e.printStackTrace();
     102                                                }
     103                                }
     104
     105                                if (replay == null) {
     106                                        System.err.println("No suitable parser for file "+replayFile.getAbsolutePath());
     107                                        elementsTotal--;
     108                                }
     109                                else {
     110                                        storage.save(replay);
     111                                        elementsProcessed++;
     112                                }
     113
     114                                // Notify listeners
    77115                                for (ProgressListener listener : listeners) {
    78                                         listener.progressUpdated(elementsProcessed, replayFiles.size());
     116                                        listener.progressUpdated(elementsProcessed, elementsTotal);
    79117                                }
    80118                        }
  • core/src/main/java/de/erichseifert/warp/core/io/AbstractReplayStorage.java

    r1deae17 rb471e8d  
    2525import java.util.Set;
    2626
    27 import de.erichseifert.warp.core.Replay;
    28 import de.erichseifert.warp.core.ReplayChangeEvent;
    29 import de.erichseifert.warp.core.ReplayDataChangeListener;
    30 import de.erichseifert.warp.core.ReplayDescriptor;
     27import de.erichseifert.warp.core.replay.Replay;
     28import de.erichseifert.warp.core.replay.ReplayChangeEvent;
     29import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     30import de.erichseifert.warp.core.replay.ReplayDescriptor;
    3131
    3232public abstract class AbstractReplayStorage implements ReplayStorage {
  • core/src/main/java/de/erichseifert/warp/core/io/BufferedStorage.java

    r1deae17 rb471e8d  
    2727import java.util.Set;
    2828
    29 import de.erichseifert.warp.core.Replay;
    30 import de.erichseifert.warp.core.ReplayChangeEvent;
    31 import de.erichseifert.warp.core.ReplayDataChangeListener;
    32 import de.erichseifert.warp.core.ReplayDescriptor;
    3329import de.erichseifert.warp.core.io.search.ReplayIndexer.SearchMode;
    3430import de.erichseifert.warp.core.io.search.indices.Index.Range;
    3531import de.erichseifert.warp.core.io.statistics.Statistics;
     32import de.erichseifert.warp.core.replay.Replay;
     33import de.erichseifert.warp.core.replay.ReplayChangeEvent;
     34import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     35import de.erichseifert.warp.core.replay.ReplayDescriptor;
    3636
    3737/**
  • core/src/main/java/de/erichseifert/warp/core/io/MemoryStorage.java

    r1deae17 rb471e8d  
    2828import java.util.Set;
    2929
    30 import de.erichseifert.warp.core.Replay;
    31 import de.erichseifert.warp.core.ReplayDescriptor;
    3230import de.erichseifert.warp.core.io.search.ReplayIndexer.SearchMode;
    3331import de.erichseifert.warp.core.io.search.indices.Index.Range;
    3432import de.erichseifert.warp.core.io.statistics.Statistics;
     33import de.erichseifert.warp.core.replay.Replay;
     34import de.erichseifert.warp.core.replay.ReplayDescriptor;
    3535
    3636/**
  • core/src/main/java/de/erichseifert/warp/core/io/ReplayStorage.java

    r1deae17 rb471e8d  
    2626import java.util.Set;
    2727
    28 import de.erichseifert.warp.core.Replay;
    29 import de.erichseifert.warp.core.ReplayDataChangeListener;
    30 import de.erichseifert.warp.core.ReplayDescriptor;
    3128import de.erichseifert.warp.core.io.search.ReplayIndexer.SearchMode;
    3229import de.erichseifert.warp.core.io.search.indices.Index.Range;
    3330import de.erichseifert.warp.core.io.statistics.Statistics;
     31import de.erichseifert.warp.core.replay.Replay;
     32import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     33import de.erichseifert.warp.core.replay.ReplayDescriptor;
    3434
    3535/**
  • core/src/main/java/de/erichseifert/warp/core/io/SerializingStorage.java

    r1deae17 rb471e8d  
    3434import java.util.Set;
    3535
    36 import de.erichseifert.warp.core.Replay;
    37 import de.erichseifert.warp.core.ReplayDescriptor;
    3836import de.erichseifert.warp.core.io.search.DefaultReplayIndexer;
    3937import de.erichseifert.warp.core.io.search.ReplayIndexer;
     
    4240import de.erichseifert.warp.core.io.statistics.SC2Statistics;
    4341import de.erichseifert.warp.core.io.statistics.Statistics;
     42import de.erichseifert.warp.core.replay.Replay;
     43import de.erichseifert.warp.core.replay.ReplayDescriptor;
    4444import de.erichseifert.warp.core.util.FileUtil;
    4545
  • core/src/main/java/de/erichseifert/warp/core/io/search/DefaultReplayIndexer.java

    r1deae17 rb471e8d  
    3131import java.util.Set;
    3232
    33 import de.erichseifert.warp.core.Replay;
    34 import de.erichseifert.warp.core.ReplayChangeEvent;
    35 import de.erichseifert.warp.core.ReplayDescriptor;
    36 import de.erichseifert.warp.core.ReplayChangeEvent.EventType;
    3733import de.erichseifert.warp.core.io.ReplayStorage;
    3834import de.erichseifert.warp.core.io.search.IndexHierarchy.Node;
    3935import de.erichseifert.warp.core.io.search.indices.Index;
    4036import de.erichseifert.warp.core.io.search.indices.Index.Range;
     37import de.erichseifert.warp.core.replay.Replay;
     38import de.erichseifert.warp.core.replay.ReplayChangeEvent;
     39import de.erichseifert.warp.core.replay.ReplayDescriptor;
     40import de.erichseifert.warp.core.replay.ReplayChangeEvent.EventType;
    4141
    4242/**
  • core/src/main/java/de/erichseifert/warp/core/io/search/ReplayIndexer.java

    r1deae17 rb471e8d  
    2626import java.util.Set;
    2727
    28 import de.erichseifert.warp.core.ReplayDataChangeListener;
    29 import de.erichseifert.warp.core.ReplayDescriptor;
    3028import de.erichseifert.warp.core.io.ReplayStorage;
    3129import de.erichseifert.warp.core.io.search.IndexHierarchy.Node;
    3230import de.erichseifert.warp.core.io.search.indices.Index.Range;
     31import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     32import de.erichseifert.warp.core.replay.ReplayDescriptor;
    3333
    3434/**
  • core/src/main/java/de/erichseifert/warp/core/io/statistics/SC2Statistics.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.core.io.statistics;
    2323
    24 import de.erichseifert.warp.core.ReplayChangeEvent;
     24import de.erichseifert.warp.core.replay.ReplayChangeEvent;
    2525
    2626public class SC2Statistics implements Statistics {
  • core/src/main/java/de/erichseifert/warp/core/io/statistics/Statistics.java

    r1deae17 rb471e8d  
    2424import java.io.Serializable;
    2525
    26 import de.erichseifert.warp.core.ReplayDataChangeListener;
     26import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
    2727
    2828public interface Statistics extends ReplayDataChangeListener, Serializable {
  • core/src/main/java/de/erichseifert/warp/core/replay/ActionFilter.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424
  • core/src/main/java/de/erichseifert/warp/core/replay/ActionFilterFactory.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.IOException;
  • core/src/main/java/de/erichseifert/warp/core/replay/ChatMessage.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.Serializable;
  • core/src/main/java/de/erichseifert/warp/core/replay/DefaultChatMessage.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
     24import de.erichseifert.warp.core.DefaultVersionedComponent;
    2425import de.erichseifert.warp.core.io.search.Indexable;
    2526import de.erichseifert.warp.core.io.search.indices.FullTextIndex;
  • core/src/main/java/de/erichseifert/warp/core/replay/DefaultGameAction.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
     23
     24import de.erichseifert.warp.core.DefaultVersionedComponent;
    2325
    2426/**
  • core/src/main/java/de/erichseifert/warp/core/replay/DefaultPlayer.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.awt.Color;
     
    2727import java.util.List;
    2828
     29import de.erichseifert.warp.core.DefaultVersionedComponent;
    2930import de.erichseifert.warp.core.io.search.Indexable;
    3031import de.erichseifert.warp.core.io.search.IndexableChildren;
  • core/src/main/java/de/erichseifert/warp/core/replay/DefaultReplay.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.File;
     
    3636 * allow support for specific replay versions.
    3737 */
    38 public class DefaultReplay extends DefaultVersionedComponent implements Replay {
     38public class DefaultReplay implements Replay {
    3939        private final List<Player> players;
    40         private final ReplayDescriptor descriptor;
     40        private ReplayDescriptor descriptor;
    4141
    4242        /**
     
    7070         * @param player Player to be added.
    7171         */
    72         public void addPlayer(Player player) {
     72        protected void addPlayer(Player player) {
    7373                players.add(player);
    7474        }
     
    7878         * @param players List of players.
    7979         */
    80         public void setPlayers(List<? extends Player> players) {
     80        protected void setPlayers(List<? extends Player> players) {
    8181                this.players.clear();
    8282                this.players.addAll(players);
     
    8888                return descriptor;
    8989        }
     90
     91        protected void setVersion(String version) {
     92                descriptor.setVersion(version);
     93        }
     94
     95        protected void setDuration(int duration) {
     96                descriptor.setDuration(duration);
     97        }
    9098}
  • core/src/main/java/de/erichseifert/warp/core/replay/GameAction.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.Serializable;
     25
     26import de.erichseifert.warp.core.VersionedComponent;
    2527
    2628/**
  • core/src/main/java/de/erichseifert/warp/core/replay/GameActionFactory.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.nio.ByteBuffer;
  • core/src/main/java/de/erichseifert/warp/core/replay/Player.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.awt.Color;
  • core/src/main/java/de/erichseifert/warp/core/replay/Replay.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.Serializable;
     
    2828 * Interface that represents a unified interface for any type of replay.
    2929 */
    30 public interface Replay extends VersionedComponent, Serializable {
     30public interface Replay extends Serializable {
    3131        /**
    3232         * Returns the players in the replay.
  • core/src/main/java/de/erichseifert/warp/core/replay/ReplayChangeEvent.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import de.erichseifert.warp.core.io.ReplayStorage;
  • core/src/main/java/de/erichseifert/warp/core/replay/ReplayDataChangeListener.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424/**
  • core/src/main/java/de/erichseifert/warp/core/replay/ReplayDescriptor.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core;
     22package de.erichseifert.warp.core.replay;
    2323
    2424import java.io.File;
     
    8080         * @param duration Duration.
    8181         */
    82         public void setDuration(int duration) {
     82        protected void setDuration(int duration) {
    8383                this.duration = duration;
    8484        }
     
    8888         * @param version Version string.
    8989         */
    90         public void setVersion(String version) {
     90        protected void setVersion(String version) {
    9191                this.version = version;
    9292        }
  • core/src/main/java/de/erichseifert/warp/core/replay/ReplayParserFactory.java

    r1deae17 rb471e8d  
    2020 */
    2121
    22 package de.erichseifert.warp.core.replays;
     22package de.erichseifert.warp.core.replay;
    2323
    24 import java.io.File;
    2524import java.io.IOException;
    2625import java.io.InputStream;
     
    3130import java.util.Enumeration;
    3231import java.util.HashMap;
     32import java.util.HashSet;
    3333import java.util.List;
    3434import java.util.Map;
     35import java.util.Set;
    3536
    36 import de.erichseifert.warp.core.Replay;
    3737import de.erichseifert.warp.core.util.FileUtil;
    3838
    3939public class ReplayParserFactory {
    4040        private static ReplayParserFactory instance;
    41         private final Map<String, List<Class<? extends Replay>>> parsersByExtension;
     41        private final Map<String, List<Class<ReplayParser<?>>>> parsersByExtension;
    4242
    4343        @SuppressWarnings("unchecked")
    4444        private ReplayParserFactory() {
    45                 parsersByExtension = new HashMap<String, List<Class<? extends Replay>>>();
     45                parsersByExtension = new HashMap<String, List<Class<ReplayParser<?>>>>();
    4646                Enumeration<URL> files;
    4747                try {
     
    6565                                        String fileExtension = entry.getKey().toLowerCase();
    6666                                        List<String> parserClassNames = entry.getValue();
    67                                         List<Class<? extends Replay>> parserClasses = new ArrayList<Class<? extends Replay>>(parserClassNames.size());
     67                                        List<Class<ReplayParser<?>>> parserClasses = new ArrayList<Class<ReplayParser<?>>>(parserClassNames.size());
    6868                                        for (String parserClassName : parserClassNames) {
    69                                                 Class<? extends Replay> parserClass = (Class<? extends Replay>) Class.forName(parserClassName);
     69                                                Class<ReplayParser<?>> parserClass = (Class<ReplayParser<?>>) Class.forName(parserClassName);
    7070                                                parserClasses.add(parserClass);
    7171                                        }
     
    8282        }
    8383
    84         public Replay getReplayParser(File file) {
    85                 String[] splitName = file.getName().split("\\.");
    86                 String extension = splitName[splitName.length-1].toLowerCase();
    87                 List<Class<? extends Replay>> parsers = parsersByExtension.get(extension);
    88                 if (parsers == null) {
     84        public Set<ReplayParser<?>> getReplayParser(String mimeType) {
     85                List<Class<ReplayParser<?>>> parserClasses = parsersByExtension.get(mimeType);
     86                if (parserClasses == null) {
    8987                        return null;
    9088                }
    91                 Replay parser = null;
    92                 for (Class<? extends Replay> clazz : parsers) {
     89                Set<ReplayParser<?>> parsers = new HashSet<ReplayParser<?>>();
     90                for (Class<ReplayParser<?>> parserClass : parserClasses) {
    9391                        try {
    94                                 Constructor<? extends Replay> constructor = clazz.getConstructor(File.class);
    95                                 parser = constructor.newInstance(file);
    96                                 break;
     92                                Constructor<ReplayParser<?>> constructor = parserClass.getConstructor();
     93                                ReplayParser<?> parser = constructor.newInstance();
     94                                parsers.add(parser);
    9795                        } catch (NoSuchMethodException e) {
    9896                                // TODO Auto-generated catch block
     
    109107                        }
    110108                }
    111                 return parser;
     109                return parsers;
    112110        }
    113111
  • core/src/main/java/de/erichseifert/warp/core/ui/CLI.java

    r1deae17 rb471e8d  
    2424import java.util.Set;
    2525
    26 import de.erichseifert.warp.core.ReplayDescriptor;
     26import de.erichseifert.warp.core.replay.ReplayDescriptor;
    2727
    2828public class CLI implements WARPUI {
  • core/src/main/java/de/erichseifert/warp/core/ui/WARPUI.java

    r1deae17 rb471e8d  
    2424import java.util.Set;
    2525
    26 import de.erichseifert.warp.core.ReplayDescriptor;
     26import de.erichseifert.warp.core.replay.ReplayDescriptor;
    2727
    2828public interface WARPUI {
  • core/src/main/java/de/erichseifert/warp/core/util/FileUtil.java

    r1deae17 rb471e8d  
    2727import java.io.InputStream;
    2828import java.io.InputStreamReader;
     29import java.net.URL;
    2930import java.util.ArrayList;
    3031import java.util.Collection;
    3132import java.util.Collections;
     33import java.util.Enumeration;
    3234import java.util.HashMap;
    3335import java.util.HashSet;
     
    4244 */
    4345public abstract class FileUtil {
     46        private static Map<String, String> mimeTypesByExtension;
    4447
    4548        private FileUtil() {
     
    161164                return Collections.unmodifiableCollection(files);
    162165        }
     166
     167        public static String getMimeType(File file) {
     168                // Initialize MIME type list
     169                if (mimeTypesByExtension == null) {
     170                        mimeTypesByExtension = new HashMap<String, String>();
     171                        try {
     172                                Enumeration<URL> mimeTypeFiles = FileUtil.class.getClassLoader().getResources("mime.types");
     173                                while (mimeTypeFiles.hasMoreElements()) {
     174                                        URL mimeTypeFileURL = mimeTypeFiles.nextElement();
     175                                        InputStream stream = null;
     176                                        stream = mimeTypeFileURL.openStream();
     177                                        List<String> mimeTypeDefs = parseLines(stream);
     178                                        for (String mimeTypeDef : mimeTypeDefs) {
     179                                                String[] splitDef = mimeTypeDef.split("\\s+");
     180                                                String mimeType = splitDef[0];
     181                                                for (int i = 1; i < splitDef.length; i++) {
     182                                                        String fileExtension = splitDef[i].toLowerCase();
     183                                                        mimeTypesByExtension.put(fileExtension, mimeType);
     184                                                }
     185                                        }
     186                                }
     187                        } catch (IOException e) {
     188                                // TODO Auto-generated catch block
     189                                e.printStackTrace();
     190                        }
     191                }
     192
     193                // Retrieve MIME type of file
     194                String[] splitName = file.getName().split("\\.");
     195                String fileExtension = splitName[splitName.length-1].toLowerCase();
     196                return mimeTypesByExtension.get(fileExtension);
     197        }
    163198}
  • core/src/main/resources/help/about.html

    r1deae17 rb471e8d  
    66  <body>
    77    <h1>About WARP</h1>
    8     <p>This WARP v0.7.<br />
     8    <p>This is a snapshot of WARP v0.8.<br />
    99    Keep up to date and visit the project page at <a href="http://trac.erichseifert.de/warp">http://trac.erichseifert.de/warp</a> for the newest version.</p>
    1010    <h1>Credits</h1>
  • gui.swing/pom.xml

    r1deae17 rb471e8d  
    33    <artifactId>WARP</artifactId>
    44    <groupId>de.erichseifert.warp</groupId>
    5     <version>0.7</version>
     5    <version>0.8-SNAPSHOT</version>
    66  </parent>
    77  <modelVersion>4.0.0</modelVersion>
    88  <groupId>de.erichseifert.warp</groupId>
    99  <artifactId>gui.swing</artifactId>
    10   <version>0.7</version>
     10  <version>0.8-SNAPSHOT</version>
    1111  <packaging>jar</packaging>
    1212
     
    5959      <groupId>de.erichseifert.warp</groupId>
    6060      <artifactId>core</artifactId>
    61       <version>0.7</version>
     61      <version>0.8-SNAPSHOT</version>
    6262    </dependency>
    6363    <dependency>
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/APMPlot.java

    r1deae17 rb471e8d  
    5757import de.erichseifert.gral.ui.InteractivePanel;
    5858import de.erichseifert.gral.util.Insets2D;
    59 import de.erichseifert.warp.core.ActionFilter;
    60 import de.erichseifert.warp.core.ActionFilterFactory;
    61 import de.erichseifert.warp.core.GameAction;
    62 import de.erichseifert.warp.core.Player;
     59import de.erichseifert.warp.core.replay.ActionFilter;
     60import de.erichseifert.warp.core.replay.ActionFilterFactory;
     61import de.erichseifert.warp.core.replay.GameAction;
     62import de.erichseifert.warp.core.replay.Player;
    6363
    6464public class APMPlot extends JPanel {
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/ReplayParserGUI.java

    r1deae17 rb471e8d  
    8181
    8282import de.erichseifert.warp.core.DataPresenter;
    83 import de.erichseifert.warp.core.Player;
    8483import de.erichseifert.warp.core.ProgressListener;
    85 import de.erichseifert.warp.core.Replay;
    86 import de.erichseifert.warp.core.ReplayChangeEvent;
    87 import de.erichseifert.warp.core.ReplayDataChangeListener;
    88 import de.erichseifert.warp.core.ReplayDescriptor;
    89 import de.erichseifert.warp.core.ReplayChangeEvent.EventType;
    9084import de.erichseifert.warp.core.io.Settings;
    9185import de.erichseifert.warp.core.io.search.indices.Index.Range;
     86import de.erichseifert.warp.core.replay.Player;
     87import de.erichseifert.warp.core.replay.Replay;
     88import de.erichseifert.warp.core.replay.ReplayChangeEvent;
     89import de.erichseifert.warp.core.replay.ReplayDataChangeListener;
     90import de.erichseifert.warp.core.replay.ReplayDescriptor;
     91import de.erichseifert.warp.core.replay.ReplayChangeEvent.EventType;
    9292import de.erichseifert.warp.core.ui.WARPUI;
    9393import de.erichseifert.warp.core.util.FileUtil;
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/renderers/DefaultChatRenderer.java

    r1deae17 rb471e8d  
    3535import javax.swing.JScrollPane;
    3636
    37 import de.erichseifert.warp.core.ChatMessage;
    38 import de.erichseifert.warp.core.Player;
     37import de.erichseifert.warp.core.replay.ChatMessage;
     38import de.erichseifert.warp.core.replay.Player;
    3939import de.erichseifert.warp.core.util.GUIUtil;
    4040import de.erichseifert.warp.gui.swing.ItemRenderer;
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/renderers/DefaultPlayerRenderer.java

    r1deae17 rb471e8d  
    4242import javax.swing.event.ChangeListener;
    4343
    44 import de.erichseifert.warp.core.Player;
     44import de.erichseifert.warp.core.replay.Player;
    4545import de.erichseifert.warp.core.util.GUIUtil;
    4646import de.erichseifert.warp.gui.swing.ItemRenderer;
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/renderers/DefaultReplayRenderer.java

    r1deae17 rb471e8d  
    3232import javax.swing.border.EmptyBorder;
    3333
    34 import de.erichseifert.warp.core.Player;
    35 import de.erichseifert.warp.core.Replay;
     34import de.erichseifert.warp.core.replay.Player;
     35import de.erichseifert.warp.core.replay.Replay;
    3636import de.erichseifert.warp.gui.swing.ItemRenderer;
    3737import de.erichseifert.warp.gui.swing.VisibilityChangeEvent;
  • gui.swing/src/main/java/de/erichseifert/warp/gui/swing/renderers/ReplayRendererFactory.java

    r1deae17 rb471e8d  
    3232import java.util.Properties;
    3333
    34 import de.erichseifert.warp.core.Replay;
     34import de.erichseifert.warp.core.replay.Replay;
    3535import de.erichseifert.warp.gui.swing.ItemRenderer;
    3636
  • pom.xml

    r1deae17 rb471e8d  
    33  <groupId>de.erichseifert.warp</groupId>
    44  <artifactId>WARP</artifactId>
    5   <version>0.7</version>
     5  <version>0.8-SNAPSHOT</version>
    66  <packaging>pom</packaging>
    77  <inceptionYear>2010</inceptionYear>
  • sc2replay/pom.xml

    r1deae17 rb471e8d  
    33    <artifactId>WARP</artifactId>
    44    <groupId>de.erichseifert.warp</groupId>
    5     <version>0.7</version>
     5    <version>0.8-SNAPSHOT</version>
    66  </parent>
    77  <modelVersion>4.0.0</modelVersion>
    88  <groupId>de.erichseifert.warp</groupId>
    99  <artifactId>sc2replay</artifactId>
    10   <version>0.7</version>
     10  <version>0.8-SNAPSHOT</version>
    1111  <packaging>jar</packaging>
    1212
     
    1515      <groupId>de.erichseifert.warp</groupId>
    1616      <artifactId>core</artifactId>
    17       <version>0.7</version>
     17      <version>0.8-SNAPSHOT</version>
    1818    </dependency>
    1919    <dependency>
     
    2525      <groupId>de.erichseifert.warp</groupId>
    2626      <artifactId>gui.swing</artifactId>
    27       <version>0.7</version>
     27      <version>0.8-SNAPSHOT</version>
    2828      <optional>true</optional>
    2929    </dependency>
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/ReplayMetaData.java

    r1deae17 rb471e8d  
    3131import java.util.Map;
    3232
    33 import de.erichseifert.warp.core.ChatMessage;
    34 import de.erichseifert.warp.core.GameAction;
     33import de.erichseifert.warp.core.replay.ChatMessage;
     34import de.erichseifert.warp.core.replay.GameAction;
    3535import de.erichseifert.warp.core.util.ReplayUtil;
    3636
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2Actions.java

    r1deae17 rb471e8d  
    3030
    3131import de.erichseifert.warp.core.DefaultVersionedComponent;
    32 import de.erichseifert.warp.core.GameAction;
    33 import de.erichseifert.warp.core.GameActionFactory;
     32import de.erichseifert.warp.core.replay.GameAction;
     33import de.erichseifert.warp.core.replay.GameActionFactory;
    3434import de.erichseifert.warp.sc2replay.actions.SC2Action;
    3535
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2ChatLog.java

    r1deae17 rb471e8d  
    2929import java.util.Map;
    3030
    31 import de.erichseifert.warp.core.ChatMessage;
    32 import de.erichseifert.warp.core.DefaultChatMessage;
    3331import de.erichseifert.warp.core.DefaultVersionedComponent;
     32import de.erichseifert.warp.core.replay.ChatMessage;
     33import de.erichseifert.warp.core.replay.DefaultChatMessage;
    3434import de.erichseifert.warp.core.util.ReplayUtil;
    3535import de.erichseifert.warp.sc2replay.util.SC2ReplayUtil;
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2Player.java

    r1deae17 rb471e8d  
    2525import java.util.List;
    2626
    27 import de.erichseifert.warp.core.ChatMessage;
    28 import de.erichseifert.warp.core.DefaultPlayer;
    29 import de.erichseifert.warp.core.GameAction;
     27import de.erichseifert.warp.core.replay.ChatMessage;
     28import de.erichseifert.warp.core.replay.DefaultPlayer;
     29import de.erichseifert.warp.core.replay.GameAction;
    3030
    3131/**
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2Replay.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.sc2replay;
    2323
     24import java.io.File;
     25import java.util.List;
     26
    2427import javax.swing.ImageIcon;
    2528
    26 import de.erichseifert.warp.core.Replay;
     29import de.erichseifert.warp.core.replay.DefaultReplay;
     30import de.erichseifert.warp.core.replay.Player;
    2731
    2832/**
    29  * Interface that represents an object storing .sc2replay files.
     33 * Class that represents an object storing .sc2replay files.
    3034 */
    31 public interface SC2Replay extends Replay {
     35public class SC2Replay extends DefaultReplay {
     36        private ImageIcon mapPreview;
     37
     38        public SC2Replay(File file) {
     39                super(file);
     40        }
    3241
    3342        /**
     
    3544         * @return Map preview.
    3645         */
    37         ImageIcon getMapPreview();
     46        public ImageIcon getMapPreview() {
     47                return mapPreview;
     48        }
     49
     50        protected void setMapPreview(ImageIcon mapPreview) {
     51                this.mapPreview = mapPreview;
     52        }
     53
     54        @Override
     55        public boolean equals(Object obj) {
     56                if (obj != null && obj instanceof SC2Replay) {
     57                        SC2Replay replayObj = (SC2Replay) obj;
     58                        return getDescriptor().getFile().getPath().equals(replayObj.getDescriptor().getFile());
     59                }
     60                return super.equals(obj);
     61        }
     62
     63        @Override
     64        protected void setPlayers(List<? extends Player> players) {
     65                super.setPlayers(players);
     66        }
     67
     68        @Override
     69        protected void setDuration(int duration) {
     70                super.setDuration(duration);
     71        }
     72
     73        @Override
     74        protected void setVersion(String version) {
     75                super.setVersion(version);
     76        }
    3877}
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2ReplayParser_v1.java

    r1deae17 rb471e8d  
    3636
    3737import de.erichseifert.mpqparser.MPQArchive;
    38 import de.erichseifert.warp.core.ChatMessage;
    39 import de.erichseifert.warp.core.DefaultReplay;
    40 import de.erichseifert.warp.core.GameAction;
    41 import de.erichseifert.warp.core.GameActionFactory;
    42 import de.erichseifert.warp.core.Player;
     38import de.erichseifert.warp.core.replay.ChatMessage;
     39import de.erichseifert.warp.core.replay.GameAction;
     40import de.erichseifert.warp.core.replay.GameActionFactory;
     41import de.erichseifert.warp.core.replay.Player;
    4342import de.erichseifert.warp.sc2replay.actions.SC2Action;
    4443import de.erichseifert.warp.sc2replay.actions.SC2ActionFactory;
    4544
    46 public class SC2Replay_v1 extends DefaultReplay implements SC2Replay {
     45public class SC2ReplayParser_v1 extends SC2ReplayParser {
    4746        static {
    48                 addVersionSupport(SC2Replay_v1.class, "0.2.0.13891");
    49                 addVersionSupport(SC2Replay_v1.class, "0.3.0.14093");
    50                 addVersionSupport(SC2Replay_v1.class, "0.4.0.14133");
    51                 addVersionSupport(SC2Replay_v1.class, "0.5.0.14219");
    52                 addVersionSupport(SC2Replay_v1.class, "0.6.0.14259");
    53                 addVersionSupport(SC2Replay_v1.class, "0.7.0.14356");
    54                 addVersionSupport(SC2Replay_v1.class, "0.8.0.14593");
    55                 addVersionSupport(SC2Replay_v1.class, "0.9.0.14621");
    56                 addVersionSupport(SC2Replay_v1.class, "0.10.0.14803");
     47                addVersionSupport(SC2ReplayParser_v1.class, "0.2.0.13891");
     48                addVersionSupport(SC2ReplayParser_v1.class, "0.3.0.14093");
     49                addVersionSupport(SC2ReplayParser_v1.class, "0.4.0.14133");
     50                addVersionSupport(SC2ReplayParser_v1.class, "0.5.0.14219");
     51                addVersionSupport(SC2ReplayParser_v1.class, "0.6.0.14259");
     52                addVersionSupport(SC2ReplayParser_v1.class, "0.7.0.14356");
     53                addVersionSupport(SC2ReplayParser_v1.class, "0.8.0.14593");
     54                addVersionSupport(SC2ReplayParser_v1.class, "0.9.0.14621");
     55                addVersionSupport(SC2ReplayParser_v1.class, "0.10.0.14803");
    5756        }
    5857
     
    6362        private static final int FILE_INDEX_CHAT_LOG = 3;
    6463
    65         private ImageIcon mapPreview;
    66 
    6764        /**
    6865         * Creates a new <code>Starcraft2Replay</code> object by parsing the specified file.
     
    7067         * @throws IOException
    7168         */
    72         public SC2Replay_v1(File file) throws IOException {
    73                 super(file);
     69        public SC2ReplayParser_v1() {
     70        }
     71
     72        @Override
     73        public SC2Replay getReplay(File file) throws IOException {
     74                // FIXME duplicate code for version parsing
    7475                RandomAccessFile raf = new RandomAccessFile(file, "r");
    7576                FileChannel fileChannel = raf.getChannel();
     
    7778                src.order(ByteOrder.BIG_ENDIAN);
    7879
     80                SC2Replay replay = new SC2Replay(file);
     81
    7982                // Read uncompressed replay information
    8083                src.position(src.position()+39);
    8184                String version = src.get()+"."+src.get()+"."+src.get()+"."+src.getInt();
    82                 getDescriptor().setVersion(version);
     85                replay.setVersion(version);
    8386                if (!isVersionSupported(getClass(), version)) {
    8487                        throw new IllegalArgumentException("Unsupported version: "+version);
    8588                }
    8689                src.position(src.position()+6);
    87                 getDescriptor().setDuration(src.getShort());
     90                replay.setDuration(src.getShort());
    8891
    8992                System.out.println("Parsing file: "+file.getPath()+" Version: "+version);
     
    9699                ByteBuffer actionBytes = ByteBuffer.wrap(archive.getFiles()[FILE_INDEX_ACTIONS].getBytes());
    97100                actionBytes.order(ByteOrder.LITTLE_ENDIAN);
    98                 GameActionFactory<SC2Action> actionFactory = SC2ActionFactory.getInstance(this);
     101                GameActionFactory<SC2Action> actionFactory = SC2ActionFactory.getInstance(file);
    99102                SC2Actions actions = new SC2Actions(actionBytes, actionFactory);
    100103                Map<Integer, List<GameAction>> actionList = actions.getActions();
     
    112115                ReplayMetaData metaData = new ReplayMetaData(archive.getFiles()[FILE_INDEX_META_DATA].getBytes(), actionList, messages);
    113116                List<? extends Player> playerList = metaData.getPlayers();
    114                 setPlayers(playerList);
     117                replay.setPlayers(playerList);
    115118
    116119                // Extract map preview
    117                 mapPreview = new ImageIcon(archive.getFiles()[FILE_INDEX_MAP_PREVIEW].getBytes());
     120                ImageIcon mapPreview = new ImageIcon(archive.getFiles()[FILE_INDEX_MAP_PREVIEW].getBytes());
     121                replay.setMapPreview(mapPreview);
    118122
    119123                fileChannel.close();
    120124                raf.close();
    121         }
    122 
    123         /**
    124          * Returns the map preview of the replay.
    125          * @return Map preview.
    126          */
    127         public ImageIcon getMapPreview() {
    128                 return mapPreview;
    129         }
    130 
    131         @Override
    132         public boolean equals(Object obj) {
    133                 if (obj != null && obj instanceof SC2Replay) {
    134                         SC2Replay replayObj = (SC2Replay) obj;
    135                         return getDescriptor().getFile().getPath().equals(replayObj.getDescriptor().getFile());
    136                 }
    137                 return super.equals(obj);
     125                return replay;
    138126        }
    139127}
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/SC2ReplayParser_v2.java

    r1deae17 rb471e8d  
    3636import java.util.Map;
    3737
    38 import javax.swing.ImageIcon;
    39 
    4038import de.erichseifert.mpqparser.MPQArchive;
    41 import de.erichseifert.warp.core.ChatMessage;
    42 import de.erichseifert.warp.core.DefaultReplay;
    43 import de.erichseifert.warp.core.GameAction;
    44 import de.erichseifert.warp.core.GameActionFactory;
     39import de.erichseifert.warp.core.replay.ChatMessage;
     40import de.erichseifert.warp.core.replay.GameAction;
     41import de.erichseifert.warp.core.replay.GameActionFactory;
    4542import de.erichseifert.warp.sc2replay.SC2ReplayDetail.PlayerDetail;
    4643import de.erichseifert.warp.sc2replay.actions.SC2Action;
    4744import de.erichseifert.warp.sc2replay.actions.SC2ActionFactory;
    4845
    49 public class SC2Replay_v2 extends DefaultReplay implements SC2Replay {
     46public class SC2ReplayParser_v2 extends SC2ReplayParser {
    5047        static {
    51                 addVersionSupport(SC2Replay_v2.class, "0.11.0.15133");
    52                 addVersionSupport(SC2Replay_v2.class, "0.12.0.15133");
    53                 addVersionSupport(SC2Replay_v2.class, "0.13.0.15250");
    54                 addVersionSupport(SC2Replay_v2.class, "0.14.0.15343");
    55                 addVersionSupport(SC2Replay_v2.class, "0.14.0.15392");
    56                 addVersionSupport(SC2Replay_v2.class, "0.14.1.15392");
    57                 addVersionSupport(SC2Replay_v2.class, "0.15.0.15449");
    58                 addVersionSupport(SC2Replay_v2.class, "0.16.0.15580");
    59                 addVersionSupport(SC2Replay_v2.class, "0.17.0.15623");
     48                addVersionSupport(SC2ReplayParser_v2.class, "0.11.0.15133");
     49                addVersionSupport(SC2ReplayParser_v2.class, "0.12.0.15133");
     50                addVersionSupport(SC2ReplayParser_v2.class, "0.13.0.15250");
     51                addVersionSupport(SC2ReplayParser_v2.class, "0.14.0.15343");
     52                addVersionSupport(SC2ReplayParser_v2.class, "0.14.0.15392");
     53                addVersionSupport(SC2ReplayParser_v2.class, "0.14.1.15392");
     54                addVersionSupport(SC2ReplayParser_v2.class, "0.15.0.15449");
     55                addVersionSupport(SC2ReplayParser_v2.class, "0.16.0.15580");
     56                addVersionSupport(SC2ReplayParser_v2.class, "0.17.0.15623");
    6057        }
    6158
     
    6663        private static final int FILE_INDEX_CHAT_LOG = 3;
    6764
    68         private ImageIcon mapPreview;
    69 
    7065        /**
    7166         * Creates a new <code>Starcraft2Replay</code> object by parsing the specified file.
     
    7368         * @throws IOException
    7469         */
    75         public SC2Replay_v2(File file) throws IOException {
    76                 super(file);
     70        public SC2ReplayParser_v2() {
     71        }
     72
     73        @Override
     74        public SC2Replay getReplay(File file) throws IOException {
    7775                RandomAccessFile raf = new RandomAccessFile(file, "r");
    7876                FileChannel fileChannel = raf.getChannel();
     
    8078                src.order(ByteOrder.BIG_ENDIAN);
    8179
     80                SC2Replay replay = new SC2Replay(file);
     81
    8282                // Read uncompressed replay information
    8383                src.position(src.position()+39);
    8484                String version = src.get()+"."+src.get()+"."+src.get()+"."+src.getInt();
    85                 getDescriptor().setVersion(version);
     85                replay.setVersion(version);
    8686                if (!isVersionSupported(getClass(), version)) {
    8787                        throw new IllegalArgumentException("Unsupported version: "+version);
    8888                }
    8989                src.position(src.position()+6);
    90                 getDescriptor().setDuration(src.getShort());
     90                replay.setDuration(src.getShort());
    9191
    9292                System.out.println("Parsing file: "+file.getPath()+" Version: "+version);
     
    9999                ByteBuffer actionBytes = ByteBuffer.wrap(archive.getFiles()[FILE_INDEX_ACTIONS].getBytes());
    100100                actionBytes.order(ByteOrder.LITTLE_ENDIAN);
    101                 GameActionFactory<SC2Action> actionFactory = SC2ActionFactory.getInstance(this);
     101                GameActionFactory<SC2Action> actionFactory = SC2ActionFactory.getInstance(file);
    102102                SC2Actions actions = new SC2Actions(actionBytes, actionFactory);
    103103                Map<Integer, List<GameAction>> actionList = actions.getActions();
     
    154154                        playerList.add(player);
    155155                }
    156                 setPlayers(playerList);
     156                replay.setPlayers(playerList);
    157157
    158158                fileChannel.close();
    159159                raf.close();
    160         }
    161 
    162         /**
    163          * Returns the map preview of the replay.
    164          * @return Map preview.
    165          */
    166         @Override
    167         public ImageIcon getMapPreview() {
    168                 return mapPreview;
    169         }
    170 
    171         @Override
    172         public boolean equals(Object obj) {
    173                 if (obj != null && obj instanceof SC2Replay_v2) {
    174                         SC2Replay_v2 replayObj = (SC2Replay_v2) obj;
    175                         return getDescriptor().getFile().getPath().equals(replayObj.getDescriptor().getFile());
    176                 }
    177                 return super.equals(obj);
     160                return replay;
    178161        }
    179162}
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/actions/AbstractSC2Action.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.sc2replay.actions;
    2323
    24 import de.erichseifert.warp.core.DefaultGameAction;
     24import de.erichseifert.warp.core.replay.DefaultGameAction;
    2525
    2626
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/actions/SC2Action.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.sc2replay.actions;
    2323
    24 import de.erichseifert.warp.core.GameAction;
     24import de.erichseifert.warp.core.replay.GameAction;
    2525
    2626/**
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/actions/SC2ActionFactory.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.sc2replay.actions;
    2323
     24import java.io.File;
    2425import java.nio.ByteBuffer;
    2526import java.util.WeakHashMap;
    2627
    27 import de.erichseifert.warp.core.GameActionFactory;
    28 import de.erichseifert.warp.sc2replay.SC2Replay;
     28import de.erichseifert.warp.core.replay.GameActionFactory;
    2929import de.erichseifert.warp.sc2replay.util.SC2ReplayUtil;
    3030
     
    4444        private static final byte CODE_SEND_RESOURCES = 0x0F;
    4545
    46         private static final WeakHashMap<SC2Replay, SC2ActionFactory> instances = new WeakHashMap<SC2Replay, SC2ActionFactory>();
     46        private static final WeakHashMap<File, SC2ActionFactory> instances = new WeakHashMap<File, SC2ActionFactory>();
    4747        private int timeStamp;
    4848
     
    129129         * @return Instance.
    130130         */
    131         public static GameActionFactory<SC2Action> getInstance(SC2Replay replay) {
    132                 SC2ActionFactory instance = instances.get(replay);
     131        public static GameActionFactory<SC2Action> getInstance(File file) {
     132                SC2ActionFactory instance = instances.get(file);
    133133                if (instance == null) {
    134134                        instance = new SC2ActionFactory();
    135                         instances.put(replay, instance);
     135                        instances.put(file, instance);
    136136                }
    137137                return instance;
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/actions/SC2ActionFilter.java

    r1deae17 rb471e8d  
    2222package de.erichseifert.warp.sc2replay.actions;
    2323
    24 import de.erichseifert.warp.core.ActionFilter;
    25 import de.erichseifert.warp.core.GameAction;
     24import de.erichseifert.warp.core.replay.ActionFilter;
     25import de.erichseifert.warp.core.replay.GameAction;
    2626
    2727public class SC2ActionFilter implements ActionFilter {
  • sc2replay/src/main/java/de/erichseifert/warp/sc2replay/renderers/SC2ReplayRenderer.java

    r1deae17 rb471e8d  
    3131import javax.swing.border.EmptyBorder;
    3232
    33 import de.erichseifert.warp.core.Player;
     33import de.erichseifert.warp.core.replay.Player;
    3434import de.erichseifert.warp.gui.swing.VisibilityChangeEvent;
    3535import de.erichseifert.warp.gui.swing.VisibilityChangeListener;
  • sc2replay/src/main/resources/replayparsers.txt

    r1deae17 rb471e8d  
    1 sc2replay de.erichseifert.warp.sc2replay.SC2Replay_v1
    2 sc2replay de.erichseifert.warp.sc2replay.SC2Replay_v2
     1application/x-starcraft2-replay de.erichseifert.warp.sc2replay.SC2ReplayParser_v1
     2application/x-starcraft2-replay de.erichseifert.warp.sc2replay.SC2ReplayParser_v2
Note: See TracChangeset for help on using the changeset viewer.