/** * */ package net.xmind.workbench.internal.notification; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import net.xmind.workbench.internal.XMindNetWorkbench; import org.eclipse.ui.IMemento; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.XMLMemento; public class SiteEventStore { private static final String TAG_ROOT = "site-events"; //$NON-NLS-1$ private static final String TAG_EVENTS = "events"; //$NON-NLS-1$ private static final String TAG_EVENT = "event"; //$NON-NLS-1$ private XMLMemento writeRoot; private IMemento events; private List<ISiteEvent> eventList = new ArrayList<ISiteEvent>(); private Map<String, ISiteEvent> eventMap = new HashMap<String, ISiteEvent>(); public SiteEventStore(Reader reader) { try { this.writeRoot = XMLMemento.createReadRoot(reader); } catch (WorkbenchException e) { XMindNetWorkbench.log(e, "Failed to read site-events.xml."); //$NON-NLS-1$ this.writeRoot = XMLMemento.createWriteRoot(TAG_ROOT); } this.events = writeRoot.getChild(TAG_EVENTS); if (this.events == null) { this.events = writeRoot.createChild(TAG_EVENTS); } for (IMemento m : this.events.getChildren(TAG_EVENT)) { ISiteEvent event = new XMLSiteEvent(m); eventList.add(event); eventMap.put(event.getId(), event); } } public SiteEventStore(List<ISiteEvent> events) { this.writeRoot = XMLMemento.createWriteRoot(TAG_ROOT); this.events = writeRoot.createChild(TAG_EVENTS); for (ISiteEvent event : events) { copyEvent(event); } } @SuppressWarnings("unchecked") public SiteEventStore() { this(Collections.EMPTY_LIST); } public List<ISiteEvent> getEvents() { return eventList; } public ISiteEvent findEvent(String id) { return eventMap.get(id); } public List<ISiteEvent> calcNewEvents(List<ISiteEvent> updates, boolean startup) { List<ISiteEvent> newEvents = new ArrayList<ISiteEvent>(); for (ISiteEvent event : updates) { if (shouldPrompt(event, startup)) { newEvents.add(event); } } return newEvents; } private boolean shouldPrompt(ISiteEvent event, boolean startup) { String prompt = event.getPrompt(); if ("always".equals(prompt)) //$NON-NLS-1$ return true; if ("startup".equals(prompt)) //$NON-NLS-1$ return startup; if (findEvent(event.getId()) == null) return !"never".equals(prompt); //$NON-NLS-1$ return false; } public XMLSiteEvent copyEvent(ISiteEvent event) { XMLSiteEvent e = createEvent(event.getId()); e.setTitle(event.getTitle()); e.setPrompt(event.getPrompt()); e.setEventUrl(event.getEventUrl()); e.setMoreUrl(event.getMoreUrl()); e.setOpenExternal(event.isOpenExternal()); e.setActionText(event.getActionText()); return e; } public XMLSiteEvent createEvent(String id) { IMemento child = events.createChild(TAG_EVENT); XMLSiteEvent event = new XMLSiteEvent(child); event.setId(id); eventList.add(event); eventMap.put(id, event); return event; } public void save(Writer writer) throws IOException { writeRoot.save(writer); } }