package comeon.wikis; import com.google.common.eventbus.EventBus; import com.google.inject.Inject; import com.google.inject.Singleton; import comeon.ComeOn; import comeon.core.WithPreferences; import comeon.model.User; import comeon.model.Wiki; import java.util.ArrayList; import java.util.List; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; @Singleton public final class WikisImpl implements Wikis, WithPreferences { private static final String DEFAULT_ACTIVE_WIKI_NAME = "Commons"; private final ArrayList<Wiki> wikis; private final Preferences preferences; private final EventBus bus; private Wiki activeWiki; @Inject public WikisImpl(final EventBus bus) { this.bus = bus; this.wikis = new ArrayList<>(0); preferences = Preferences.userNodeForPackage(ComeOn.class).node("wikis"); } @Override public void loadPreferences() throws BackingStoreException { final String activeWikiName = preferences.get(WikiPreferencesKeys.ACTIVE.name(), DEFAULT_ACTIVE_WIKI_NAME); final String[] wikiNames = preferences.childrenNames(); this.wikis.ensureCapacity(wikiNames.length); for (final String name : wikiNames) { final Wiki wiki = this.readWiki(name); if (activeWikiName.equals(name)) { activeWiki = wiki; } } } @Override public List<Wiki> getWikis() { return new ArrayList<>(wikis); } @Override public void setWikis(final List<Wiki> wikis) { this.wikis.clear(); this.wikis.ensureCapacity(wikis.size()); this.wikis.addAll(wikis); } @Override public void save() throws BackingStoreException { for (final String name : preferences.childrenNames()) { preferences.node(name).removeNode(); } for (final Wiki wiki : wikis) { final Preferences node = preferences.node(wiki.getName()); node.put(WikiPreferencesKeys.URL.name(), wiki.getUrl()); final Preferences userNode = node.node("user"); userNode.put(UserPreferencesKeys.LOGIN.name(), wiki.getUser().getLogin()); userNode.put(UserPreferencesKeys.PASSWORD.name(), wiki.getUser().getPassword()); userNode.put(UserPreferencesKeys.DISPLAY_NAME.name(), wiki.getUser().getDisplayName()); } } @Override public Wiki getActiveWiki() { return activeWiki; } @Override public void setActiveWiki(final Wiki wiki) { final ActiveWikiChangeEvent event = new ActiveWikiChangeEvent(this.activeWiki, wiki); this.activeWiki = wiki; preferences.put(WikiPreferencesKeys.ACTIVE.name(), wiki.getName()); bus.post(event); } private Wiki readWiki(final String name) throws BackingStoreException { final Preferences node = preferences.node(name); final String url = node.get(WikiPreferencesKeys.URL.name(), null); final Wiki wiki = new Wiki(name, url, this.readUser(node)); wikis.add(wiki); return wiki; } private User readUser(final Preferences wikiNode) throws BackingStoreException { final Preferences userNode = wikiNode.node("user"); final String login = userNode.get(UserPreferencesKeys.LOGIN.name(), null); final String password = userNode.get(UserPreferencesKeys.PASSWORD.name(), null); final String displayName = userNode.get(UserPreferencesKeys.DISPLAY_NAME.name(), null); return new User(login, password, displayName); } private enum WikiPreferencesKeys { URL, ACTIVE } private enum UserPreferencesKeys { LOGIN, PASSWORD, DISPLAY_NAME } }