package org.rr.jeborker.app.preferences; import java.io.File; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; import org.rr.commons.collection.LRUCacheMap; import org.rr.jeborker.app.BasePathList; import org.rr.jeborker.app.FileWatchService; import org.rr.jeborker.db.DefaultDBManager; import org.rr.jeborker.db.item.PreferenceItem; class DBPreferenceStore extends APreferenceStore { private final String BASE_PATH = "basePath"; private static final Map<String, String> CACHE = new LRUCacheMap<String, String>(100); /** * Fetch a previously stored string value with it's key from the DB. * @param key The key to access the value. * @return The desired value or <code>null</code> if the value wasn't stored. */ @Override protected String getEntryFromImpl(final String key) { String value = CACHE.get(key); if(value != null) { return value; } final DefaultDBManager db = DefaultDBManager.getInstance(); final List<PreferenceItem> result = db.getObject(PreferenceItem.class, "name", key); if(result.isEmpty()) { value = null; } else { value =result.get(0).getValue(); } CACHE.put(key, value); return value; } @Override protected void addEntryToImpl(final String key, final String value) { final DefaultDBManager db = DefaultDBManager.getInstance(); final PreferenceItem newPreferenceItem = db.newInstance(PreferenceItem.class); newPreferenceItem.setName(key); newPreferenceItem.setValue(value); db.storeObject(newPreferenceItem); CACHE.put(key, value); } @Override protected void deleteEntryFromImpl(final String key) { final DefaultDBManager db = DefaultDBManager.getInstance(); final List<PreferenceItem> result = db.getObject(PreferenceItem.class, "name", key); for(PreferenceItem item : result) { db.deleteObject(item); } CACHE.remove(key); } public void addBasePath(String path) { String basePath = getGenericEntryAsString(BASE_PATH); if (basePath.length() == 0) { basePath = path; } else { basePath += (File.pathSeparator + path); } addGenericEntryAsString(BASE_PATH, basePath); FileWatchService.addWatchPath(path); } /** * Removes one entry from the base path list. * @param path The path entry to be removed. */ public void removeBasePath(String path) { List<String> oldBasePath = getBasePath(); StringBuilder newBasePath = new StringBuilder(); for (Iterator<String> iterator = oldBasePath.iterator(); iterator.hasNext();) { final String oldPath = iterator.next(); if(!oldPath.replaceAll("\\/", "").equals(path.replaceAll("\\/", "")) && !oldPath.equals(BasePathList.getImportBasePath())) { newBasePath.append(oldPath).append(File.pathSeparator); } } //remove the last separator char if(newBasePath.length() > 0) { newBasePath.deleteCharAt(newBasePath.length() - 1); } addGenericEntryAsString(BASE_PATH, newBasePath.toString()); } /** * Get all base path entries from the preference store. * @return The stored base path entries. never returns <code>null</code>. */ public BasePathList getBasePath() { String basePath = getGenericEntryAsString(BASE_PATH); if(basePath.length() == 0) { return new BasePathList(); } else if (basePath.indexOf(File.pathSeparator) == -1) { return new BasePathList(basePath); } else { String[] split = basePath.split(File.pathSeparator); return new BasePathList(Arrays.asList(split)); } } }