/** * Campaigns * Copyright 09.04.2015 by Michael Peter Christen, @0rb1t3r * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package org.loklak.data; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.zip.GZIPInputStream; import org.eclipse.jetty.util.log.Log; import org.json.JSONObject; public class Campaigns { public static enum State implements Comparable<State>, Comparator<State> { FUTURE(0), // campaigns in the future ONGOING(1), // campaigns are ongoing WRAPPED(2); // campaigns are over int card; private State(int card) { this.card = card; } public int getCard() { return this.card; } @Override public int compare(State o1, State o2) { return o1.card - o2.card; } public String toFileName() { return this.card + "_" + this.name().toLowerCase(); } } private File storagePath; private TreeMap<State, TreeSet<Campaign>> campaigns; public Campaigns(File storagePath) { storagePath.mkdirs(); this.storagePath = storagePath; this.campaigns = new TreeMap<>(); for (State state: State.values()) { File f = new File(storagePath, state.toFileName() + ".txt"); this.campaigns.put(state, load(f)); } } public void processCampaigns() { long duetime = System.currentTimeMillis(); Campaign e; Iterator<Campaign> i; Set<State> needsCommit = new HashSet<>(); i = this.campaigns.get(State.ONGOING).iterator(); while (i.hasNext()) { e = i.next(); if (e.getEndTime() >= duetime) { i.remove(); this.campaigns.get(State.WRAPPED).add(e); needsCommit.add(State.ONGOING); needsCommit.add(State.WRAPPED); } } i = this.campaigns.get(State.FUTURE).iterator(); while (i.hasNext()) { e = i.next(); if (e.getStartTime() >= duetime) { i.remove(); this.campaigns.get(State.ONGOING).add(e); needsCommit.add(State.FUTURE); needsCommit.add(State.ONGOING); } } for (State c: needsCommit) { save(c); } } public void close() { save(); } public void save() { for (State state: State.values()) { save(state); } } public void save(State state) { File f = new File(storagePath, state.toFileName() + ".txt"); save(f, this.campaigns.get(state)); } private TreeSet<Campaign> load(File dumpFile) { TreeSet<Campaign> campaigns = new TreeSet<>(); try { InputStream is = new FileInputStream(dumpFile); String line; BufferedReader br = null; try { if (dumpFile.getName().endsWith(".gz")) is = new GZIPInputStream(is); br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); while ((line = br.readLine()) != null) { JSONObject campaign = new JSONObject(line); Campaign e = new Campaign(campaign); campaigns.add(e); } } catch (IOException e) { Log.getLog().warn(e); } finally { try { if (br != null) br.close(); } catch (IOException e) { Log.getLog().warn(e); } } } catch (FileNotFoundException e) { Log.getLog().warn(e); } return campaigns; } private void save(File dumpFile, TreeSet<Campaign> campaigns) { try { OutputStream os = new FileOutputStream(dumpFile); BufferedWriter bw = null; try { bw = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8)); for (Campaign campaign: campaigns) { bw.write(campaign.toString()); bw.write('\n'); } } catch (IOException e) { Log.getLog().warn(e); } finally { try { if (bw != null) bw.close(); } catch (IOException e) { Log.getLog().warn(e); } } } catch (FileNotFoundException e) { Log.getLog().warn(e); } } }