Advertisement
Ravenbvutt

Untitled

Aug 11th, 2017
8,596
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.97 KB | None | 0 0
  1. package org.inventivetalent.FunnyFrames;
  2.  
  3. import com.google.common.io.BaseEncoding;
  4. import com.google.gson.Gson;
  5. import com.google.gson.GsonBuilder;
  6. import com.google.gson.JsonObject;
  7. import com.google.gson.annotations.Expose;
  8. import com.google.gson.annotations.SerializedName;
  9. import lombok.EqualsAndHashCode;
  10. import lombok.Synchronized;
  11. import lombok.ToString;
  12. import org.bukkit.Bukkit;
  13. import org.bukkit.entity.ItemFrame;
  14. import org.inventivetalent.FunnyFrames.event.*;
  15. import org.inventivetalent.mapmanager.TimingsHelper;
  16. import org.inventivetalent.vectors.d3.Vector3DDouble;
  17.  
  18. import java.io.*;
  19. import java.net.MalformedURLException;
  20. import java.net.URL;
  21. import java.net.URLConnection;
  22. import java.net.URLEncoder;
  23. import java.nio.file.Files;
  24. import java.util.HashSet;
  25. import java.util.Map;
  26. import java.util.Set;
  27. import java.util.TreeMap;
  28. import java.util.concurrent.atomic.AtomicInteger;
  29. import java.util.logging.Level;
  30.  
  31. @ToString
  32. @EqualsAndHashCode
  33. public class FrameManager {
  34.  
  35. public static final Gson GSON = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
  36.  
  37. private FunnyFramesPlugin plugin;
  38.  
  39. private File saveDirectory;
  40. private File indexFile;
  41.  
  42. private File imageDirectory;
  43.  
  44. @Expose @SerializedName("frames") private final Map<String, AnimatedFrame> frameMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
  45.  
  46. public FrameManager(FunnyFramesPlugin plugin) {
  47. this.plugin = plugin;
  48.  
  49. try {
  50. this.saveDirectory = new File(new File(plugin.getDataFolder(), "saves"), "frames");
  51. if (!this.saveDirectory.exists()) { this.saveDirectory.mkdirs(); }
  52. this.indexFile = new File(this.saveDirectory, "index.afi");
  53. if (!this.indexFile.exists()) { this.indexFile.createNewFile(); }
  54.  
  55. this.imageDirectory = new File(plugin.getDataFolder(), "images");
  56. if (!this.imageDirectory.exists()) { this.imageDirectory.mkdirs(); }
  57. } catch (IOException e) {
  58. throw new RuntimeException(e);
  59. }
  60. }
  61.  
  62. @Synchronized
  63. public AnimatedFrame getFrame(String name) {
  64. return frameMap.get(name);
  65. }
  66.  
  67. @Synchronized
  68. public boolean doesFrameExist(String name) {
  69. return frameMap.containsKey(name);
  70. }
  71.  
  72. @Synchronized
  73. public AnimatedFrame createFrame(String name, String source, ItemFrame firstFrame, ItemFrame secondFrame) {
  74. if (frameMap.containsKey(name)) {
  75. throw new IllegalArgumentException("Frame '" + name + "' already exists");
  76. }
  77. JsonObject meta = new JsonObject();
  78. AsyncFrameCreationEvent creationEvent = new AsyncFrameCreationEvent(name, source, firstFrame, secondFrame, meta);
  79. Bukkit.getPluginManager().callEvent(creationEvent);
  80. name = creationEvent.getName();
  81. source = creationEvent.getSource();
  82.  
  83. AnimatedFrame frame = new AnimatedFrame(firstFrame, new Vector3DDouble(firstFrame.getLocation().toVector()), new Vector3DDouble(secondFrame.getLocation().toVector()), name, source);
  84. frameMap.put(frame.getName(), frame);
  85. frame.setMeta(meta);
  86.  
  87. return frame;
  88. }
  89.  
  90. public void startFrame(AnimatedFrame frame) {
  91. plugin.frameExecutor.execute(frame);
  92. }
  93.  
  94. @Synchronized
  95. private void addFrame(String name, AnimatedFrame frame) {
  96. if (frameMap.containsKey(name)) {
  97. throw new IllegalArgumentException("Frame '" + name + "' already exists");
  98. }
  99. frameMap.put(name, frame);
  100. }
  101.  
  102. public void stopFrame(AnimatedFrame frame) {
  103. frame.setPlaying(false);
  104. }
  105.  
  106. @Synchronized
  107. public void removeFrame(AnimatedFrame frame) {
  108. if (!frameMap.containsKey(frame.getName())) {
  109. throw new IllegalArgumentException("Frame '" + frame.getName() + "' does not exists");
  110. }
  111. frameMap.remove(frame.getName());
  112.  
  113. File imageFile = getImageFile(frame.getImageSource());
  114. if (imageFile != null && imageFile.exists()) {
  115. imageFile.delete();
  116. }
  117. }
  118.  
  119. public boolean downloadImage(String source) {
  120. try {
  121. File targetFile = getImageFile(source);
  122. targetFile.delete();
  123. try {// Try to load from URL
  124. URL url = new URL(source);
  125. URLConnection connection = url.openConnection();
  126. connection.setRequestProperty("User-Agent", "FunnyFrames/" + plugin.getDescription().getVersion());
  127. try (InputStream in = connection.getInputStream()) {
  128. Files.copy(in, targetFile.toPath());
  129. }
  130. plugin.getLogger().info("Downloaded '" + source + "' to '" + targetFile + "'.");
  131. return true;
  132. } catch (MalformedURLException malformedUrl) {
  133. try {// Try to load from file instead
  134. File file = new File(source);
  135. if (!file.exists()) { throw new FileNotFoundException(); }
  136. Files.copy(file.toPath(), targetFile.toPath());
  137. plugin.getLogger().info("Copied '" + source + " to '" + targetFile + "'.");
  138. return true;
  139. } catch (FileNotFoundException fileNotFound) {
  140. plugin.getLogger().log(Level.WARNING, "Source '" + source + "' is no valid URL", malformedUrl);
  141. plugin.getLogger().log(Level.WARNING, "Source '" + source + "' is no valid File or doesn't exist", fileNotFound);
  142. }
  143. }
  144. } catch (IOException e) {
  145. plugin.getLogger().log(Level.SEVERE, "Could not download image from '" + source + "'", e);
  146. }
  147. return false;
  148. }
  149.  
  150. public File downloadOrGetImage(String source) {
  151. File file = getImageFile(source);
  152.  
  153. AsyncImageRequestEvent requestEvent = new AsyncImageRequestEvent(source, file, !file.exists());
  154. Bukkit.getPluginManager().callEvent(requestEvent);
  155.  
  156. file = requestEvent.getImageFile();
  157. if (file.exists()) {// Already downloaded
  158. if (!requestEvent.isShouldDownload()) {
  159. return file;
  160. } else {
  161. file.delete();
  162. }
  163. }
  164.  
  165. // Download first
  166. if (downloadImage(source)) {
  167. if (!file.exists()) {
  168. throw new IllegalStateException("Downloaded file doesn't exist");
  169. }
  170. return file;
  171. }
  172. return null;
  173. }
  174.  
  175. File getImageFile(String source) {
  176. return new File(imageDirectory, BaseEncoding.base64Url().encode(source.getBytes()));
  177. }
  178.  
  179. @Synchronized
  180. public Set<String> getFrameNames() {
  181. return new HashSet<>(frameMap.keySet());
  182. }
  183.  
  184. @Synchronized
  185. public Set<AnimatedFrame> getFrames() {
  186. return new HashSet<>(frameMap.values());
  187. }
  188.  
  189. @Synchronized
  190. public Set<AnimatedFrame> getFramesInWorld(String worldName) {
  191. Set<AnimatedFrame> frames = new HashSet<>();
  192. for (AnimatedFrame frame : frameMap.values()) {
  193. if (frame.getWorldName().equals(worldName)) {
  194. frames.add(frame);
  195. }
  196. }
  197. return frames;
  198. }
  199.  
  200. @Synchronized
  201. public int size() {
  202. return frameMap.size();
  203. }
  204.  
  205. public void writeToFile(AnimatedFrame frame) {
  206. plugin.getLogger().fine("Saving '" + frame.getName() + "'...");
  207. try {
  208. File saveFile = new File(saveDirectory, URLEncoder.encode(frame.getName(), "UTF-8") + ".afd");
  209. if (!saveFile.exists()) { saveFile.createNewFile(); }
  210. try {
  211. Bukkit.getPluginManager().callEvent(new FrameSaveEvent(frame, saveFile));
  212. } catch (Throwable throwable) {
  213. plugin.getLogger().log(Level.WARNING, "Unhandled exception in FrameSaveEvent for '" + frame.getName() + "'", throwable);
  214. }
  215. try (Writer writer = new FileWriter(saveFile)) {
  216. GSON.toJson(frame, writer);
  217. }
  218. } catch (IOException e) {
  219. plugin.getLogger().log(Level.WARNING, "Failed to save Frame '" + frame.getName() + "'", e);
  220. }
  221. }
  222.  
  223. public void writeIndexToFile() {
  224. try {
  225. try (Writer writer = new FileWriter(indexFile)) {
  226. new Gson().toJson(getFrameNames(), writer);
  227. }
  228. } catch (IOException e) {
  229. plugin.getLogger().log(Level.WARNING, "Failed to save Frame-Index file", e);
  230. }
  231. }
  232.  
  233. // public void writeFramesToFile() {
  234. // if (size() <= 0) {
  235. // plugin.getLogger().info("No frames found");
  236. // return;
  237. // }
  238. //
  239. //// TimingsHelper.startTiming("FunnyFrames - writeToFile");
  240. //
  241. // for (AnimatedFrame frame : getFrames()) {
  242. // plugin.getLogger().fine("Saving '" + frame.getName() + "'...");
  243. // try {
  244. // File saveFile = new File(saveDirectory, URLEncoder.encode(frame.getName(), "UTF-8") + ".afd");
  245. // if (!saveFile.exists()) { saveFile.createNewFile(); }
  246. // try {
  247. // Bukkit.getPluginManager().callEvent(new FrameSaveEvent(frame, saveFile));
  248. // } catch (Throwable throwable) {
  249. // plugin.getLogger().log(Level.WARNING, "Unhandled exception in FrameSaveEvent for '" + frame.getName() + "'", throwable);
  250. // }
  251. // try (Writer writer = new FileWriter(saveFile)) {
  252. // GSON.toJson(frame, writer);
  253. // }
  254. // } catch (IOException e) {
  255. // plugin.getLogger().log(Level.WARNING, "Failed to save Frame '" + frame.getName() + "'", e);
  256. // }
  257. // }
  258. //
  259. // try {
  260. // try (Writer writer = new FileWriter(indexFile)) {
  261. // new Gson().toJson(getFrameNames(), writer);
  262. // }
  263. // } catch (IOException e) {
  264. // plugin.getLogger().log(Level.WARNING, "Failed to save Frame-Index file", e);
  265. // }
  266. //
  267. //// TimingsHelper.stopTiming("FunnyFrames - writeToFile");
  268. // }
  269.  
  270. public void readFramesFromFile() {
  271. // TimingsHelper.startTiming("FunnyFrames - readFromFile");
  272.  
  273. Set<String> index;
  274. try {
  275. try (Reader reader = new FileReader(indexFile)) {
  276. index = (Set<String>) new Gson().fromJson(reader, HashSet.class);
  277. }
  278. } catch (IOException e) {
  279. TimingsHelper.stopTiming("MapMenu - readFromFile");
  280. throw new RuntimeException("Failed to load Menu-Index file", e);
  281. }
  282. if (index == null) {
  283. plugin.getLogger().info("No index found > First time startup or data deleted");
  284. return;
  285. }
  286.  
  287. for (String name : index) {
  288. try {
  289. File file = new File(saveDirectory, URLEncoder.encode(name, "UTF-8") + ".afd");
  290. try (Reader reader = new FileReader(file)) {
  291. AnimatedFrame loadedFrame = GSON.fromJson(reader, AnimatedFrame.class);
  292. frameMap.put(loadedFrame.getName(), loadedFrame);
  293. try {
  294. Bukkit.getPluginManager().callEvent(new AsyncFrameLoadEvent(file, loadedFrame));
  295. } catch (Throwable throwable) {
  296. plugin.getLogger().log(Level.WARNING, "Unhandled exception in FrameLoadEvent for '" + loadedFrame.getName() + "'", throwable);
  297. }
  298. }
  299. } catch (IOException e) {
  300. plugin.getLogger().log(Level.WARNING, "Failed to load Menu '" + name + "'", e);
  301. }
  302. }
  303. final AtomicInteger startCounter = new AtomicInteger(1);
  304. final int toStart = size();
  305.  
  306. if (FunnyFramesPlugin.synchronizedStart) {
  307. long startDelay = (2500 * toStart);
  308. plugin.getLogger().info("Starting all frames in " + (startDelay / 1000.0) + " seconds.");
  309. FunnyFramesPlugin.synchronizedTime = System.currentTimeMillis() + startDelay;
  310. }
  311. for (final AnimatedFrame loadedFrame : getFrames()) {
  312. try {
  313. Bukkit.getPluginManager().callEvent(new AsyncFrameStartEvent(loadedFrame));
  314. } catch (Throwable throwable) {
  315. plugin.getLogger().log(Level.WARNING, "Unhandled exception in FrameStartEvent for '" + loadedFrame.getName() + "'");
  316. }
  317.  
  318. loadedFrame.startCallback = new Callback<Void>() {
  319. @Override
  320. public void call(Void aVoid) {
  321. plugin.getLogger().info("Started '" + loadedFrame.getName() + "' (" + startCounter.getAndIncrement() + "/" + toStart + ")");
  322. }
  323. };
  324. loadedFrame.refresh();
  325. startFrame(loadedFrame);
  326. loadedFrame.setPlaying(true);
  327. }
  328.  
  329. // TimingsHelper.stopTiming("FunnyFrames - readFromFile");
  330. }
  331.  
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement