source: AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java@ 638

Last change on this file since 638 was 637, checked in by alloc, 12 years ago

AEI2 0.94:

  • Added context menu item to open Depot page of mod in table
  • Added last-change column to table
File size: 8.5 KB
RevLine 
[598]1package net.oni2.aeinstaller.backend.mods;
2
[600]3import java.io.BufferedReader;
[598]4import java.io.File;
[600]5import java.io.FileInputStream;
6import java.io.FileNotFoundException;
7import java.io.FilenameFilter;
8import java.io.IOException;
9import java.io.InputStreamReader;
[637]10import java.net.URI;
11import java.net.URISyntaxException;
[600]12import java.util.HashSet;
[598]13
[600]14import net.oni2.aeinstaller.backend.Paths;
15import net.oni2.aeinstaller.backend.Settings;
16import net.oni2.aeinstaller.backend.Settings.Platform;
[604]17import net.oni2.aeinstaller.backend.depot.DepotConfig;
[600]18import net.oni2.aeinstaller.backend.depot.DepotManager;
19import net.oni2.aeinstaller.backend.depot.model.NodeMod;
20import net.oni2.aeinstaller.backend.depot.model.TaxonomyTerm;
21
[598]22/**
23 * @author Christian Illy
24 */
25public class Mod implements Comparable<Mod> {
[600]26 private String name = "";
27 private int packageNumber = 0;
[598]28
[600]29 private HashSet<Type> types = new HashSet<Type>();
[623]30 private boolean tool = false;
[600]31 private ECompatiblePlatform platform = null;
32 private String version = "";
33 private String creator = "";
[608]34 private EBSLInstallType bslInstallType = EBSLInstallType.NORMAL;
[600]35 private String description = "";
36 private double aeVersion = 0;
37 private int zipSize = 0;
38 private NodeMod node = null;
39 private net.oni2.aeinstaller.backend.depot.model.File file = null;
40
[623]41 private File exeFile = null;
42 private File iconFile = null;
43 private String workingDir = "Base";
44
[608]45 private HashSet<Integer> incompatibilities = new HashSet<Integer>();
[602]46 private HashSet<Integer> dependencies = new HashSet<Integer>();
[623]47 private HashSet<Integer> unlockLevel = new HashSet<Integer>();
[602]48
[600]49 private long localTimestamp = 0;
50
51 /**
52 * Create a new Mod entry from a given Mod-Node
53 *
54 * @param nm
55 * Mod-Node
56 */
57 public Mod(NodeMod nm) {
58 node = nm;
59 name = nm.getTitle();
60 packageNumber = nm.getPackageNumber();
[608]61 platform = nm.getPlatform();
[623]62 tool = nm.isTool();
[600]63 for (TaxonomyTerm tt : nm.getTypes()) {
64 Type t = ModManager.getInstance().getTypeByName(tt.getName());
65 types.add(t);
[623]66 if (!tool && !isMandatoryMod() && isValidOnPlatform())
[602]67 t.addEntry(this);
[600]68 }
69 version = nm.getVersion();
70 creator = nm.getCreator();
71 if (nm.getBody() != null)
72 description = nm.getBody().getSafe_value();
73 file = DepotManager.getInstance().getFile(
74 nm.getUploads().firstElement().getFid());
75 zipSize = file.getFilesize();
76
77 if (isLocalAvailable())
78 updateLocalData();
[598]79 }
80
[600]81 /**
82 * Update information for local package existence
83 */
84 public void updateLocalData() {
85 File config = new File(getLocalPath(), "Mod_Info.cfg");
[604]86 File aeicfg = new File(getLocalPath(), "aei.cfg");
[623]87 File plain = new File(getLocalPath(), "plain");
[600]88 if (config.exists()) {
[636]89 Mod_Info mi = new Mod_Info(config, packageNumber);
90
91 aeVersion = mi.getAeVersion();
92 bslInstallType = mi.getBslInstallType();
93 if (node == null) {
94 name = mi.getName();
95 creator = mi.getCreator();
96 version = mi.getVersion();
97 description = mi.getDescription();
[600]98 }
[636]99
100 dependencies = mi.getDependencies();
101 incompatibilities = mi.getIncompatibilities();
102 unlockLevel = mi.getUnlockLevel();
103
104 exeFile = mi.getExeFile();
105 workingDir = mi.getWorkingDir();
106 iconFile = mi.getIconFile();
[600]107 } else {
108 System.err.println("No config found for mod folder: "
109 + getLocalPath().getPath());
110 }
[604]111 if (aeicfg.exists()) {
[600]112 try {
[604]113 FileInputStream fstream = new FileInputStream(aeicfg);
[600]114 InputStreamReader isr = new InputStreamReader(fstream);
115 BufferedReader br = new BufferedReader(isr);
[604]116 String strLine;
117 while ((strLine = br.readLine()) != null) {
118 if (strLine.indexOf("->") < 1)
119 continue;
120 if (strLine.indexOf("//") >= 0)
121 strLine = strLine.substring(0, strLine.indexOf("//"));
122 String[] split = strLine.split("->", 2);
123 String sName = split[0].trim();
124 String sVal = split[1].trim();
125 if (sName.equalsIgnoreCase("Timestamp")) {
126 localTimestamp = Long.parseLong(sVal);
127 }
128 }
[600]129 isr.close();
130 } catch (FileNotFoundException e) {
131 } catch (IOException e) {
132 e.printStackTrace();
133 }
134 }
[623]135 if (node == null)
136 tool = plain.exists();
[600]137 }
138
139 /**
140 * Create a new Mod entry from the given local mod folder
141 *
142 * @param folder
143 * Mod folder with Mod_Info.cfg
144 */
145 public Mod(File folder) {
146 packageNumber = Integer.parseInt(folder.getName().substring(0, 5));
147 updateLocalData();
148
149 platform = ECompatiblePlatform.BOTH;
150 }
151
152 /**
153 * @return has separate paths for win/mac/common or not
154 */
[598]155 public boolean hasSeparatePlatformDirs() {
156 return aeVersion >= 2;
157 }
158
[631]159 private String getSanitizedPathName() {
160 return name.replaceAll("[^a-zA-Z0-9_.-]", "_");
161 }
162
[600]163 /**
164 * @return Path to local mod folder
165 */
[598]166 public File getLocalPath() {
[600]167 final String folderStart = String.format("%05d", packageNumber);
168
169 if (Paths.getModsPath().exists()) {
170 for (File f : Paths.getModsPath().listFiles(new FilenameFilter() {
171 @Override
172 public boolean accept(File d, String fn) {
173 return fn.startsWith(folderStart);
174 }
175 })) {
176 return f;
177 }
178 }
179
[631]180 return new File(Paths.getModsPath(), folderStart
181 + getSanitizedPathName());
[598]182 }
[600]183
184 /**
185 * @return Is there a newer version on the depot?
186 */
187 public boolean isNewerAvailable() {
[603]188 if (file != null)
189 return file.getTimestamp() > localTimestamp;
[600]190 else
191 return false;
[598]192 }
[600]193
194 /**
195 * @return Mod exists within mods folder
196 */
197 public boolean isLocalAvailable() {
198 return getLocalPath().exists();
[598]199 }
[600]200
201 /**
[631]202 * @return Is mod installed?
203 */
204 public boolean isInstalled() {
205 return ModManager.getInstance().isModInstalled(this);
206 }
207
208 /**
[600]209 * @return Name of mod
210 */
211 public String getName() {
212 return name;
213 }
214
215 /**
216 * @return the package number
217 */
[598]218 public int getPackageNumber() {
219 return packageNumber;
220 }
221
[600]222 /**
[604]223 * @return the package number as 5 digit string
224 */
225 public String getPackageNumberString() {
226 return String.format("%05d", packageNumber);
227 }
228
229 /**
[600]230 * @return Types of mod
231 */
232 public HashSet<Type> getTypes() {
233 return types;
234 }
235
236 /**
[623]237 * @return Is this mod actually a tool?
238 */
239 public boolean isTool() {
240 return tool;
241 }
242
243 /**
[600]244 * @return Compatible platforms
245 */
246 public ECompatiblePlatform getPlatform() {
247 return platform;
248 }
249
250 /**
251 * @return Version of mod
252 */
253 public String getVersion() {
254 return version;
255 }
256
257 /**
258 * @return Creator of mod
259 */
260 public String getCreator() {
261 return creator;
262 }
263
264 /**
265 * @return Installation type of BSL files
266 */
267 public EBSLInstallType getBSLInstallType() {
268 return bslInstallType;
269 }
270
271 /**
272 * @return Description of mod
273 */
274 public String getDescription() {
275 return description;
276 }
277
278 /**
279 * @return Size of Zip file on Depot
280 */
281 public int getZipSize() {
282 return zipSize;
283 }
284
285 /**
286 * @return Is a mod that is always installed?
287 */
[602]288 public boolean isMandatoryMod() {
[604]289 return packageNumber < DepotConfig.getMandatoryLimit();
[600]290 }
291
292 /**
293 * @return Get the depot file entry
294 */
295 public net.oni2.aeinstaller.backend.depot.model.File getFile() {
296 return file;
297 }
298
[637]299 /**
300 * @return Depot page URI
301 */
302 public URI getUrl() {
303 if (node == null)
304 return null;
305 if (node.getPath() == null)
306 return null;
307 URI res = null;
308 try {
309 res = new URI(node.getPath());
310 } catch (URISyntaxException e) {
311 e.printStackTrace();
312 }
313 return res;
314 }
315
[598]316 @Override
[600]317 public String toString() {
318 return name;
319 }
320
321 /**
[608]322 * @return the incompabitilities
[602]323 */
[608]324 public HashSet<Integer> getIncompabitilities() {
325 return incompatibilities;
[602]326 }
327
328 /**
329 * @return the dependencies
330 */
331 public HashSet<Integer> getDependencies() {
332 return dependencies;
333 }
334
335 /**
[623]336 * @return the levels this mod will unlock
337 */
338 public HashSet<Integer> getUnlockLevels() {
339 return unlockLevel;
340 }
341
342 /**
343 * @return Executable name of this tool
344 */
345 public File getExeFile() {
346 return exeFile;
347 }
[631]348
[623]349 /**
350 * @return Icon file of this tool
351 */
352 public File getIconFile() {
353 return iconFile;
354 }
355
356 /**
357 * @return Working directory of this tool
358 */
359 public File getWorkingDir() {
360 if (workingDir.equalsIgnoreCase("Exe")) {
361 if (exeFile != null)
362 return exeFile.getParentFile();
363 else
364 return Paths.getEditionGDF();
365 } else if (workingDir.equalsIgnoreCase("GDF"))
366 return Paths.getEditionGDF();
367 else
368 return Paths.getEditionBasePath();
369 }
370
371 /**
[600]372 * @return Is this mod valid on the running platform?
373 */
[608]374 public boolean isValidOnPlatform() {
375 switch (platform) {
[600]376 case BOTH:
377 return true;
378 case MACOS:
379 return (Settings.getPlatform() == Platform.MACOS);
380 case WIN:
381 return (Settings.getPlatform() == Platform.WIN)
382 || (Settings.getPlatform() == Platform.LINUX);
383 }
384 return false;
385 }
386
387 @Override
[598]388 public int compareTo(Mod o) {
389 return getPackageNumber() - o.getPackageNumber();
390 }
391}
Note: See TracBrowser for help on using the repository browser.