package com.limegroup.gnutella.library; import java.io.File; import java.util.Set; import java.util.Iterator; import com.limegroup.gnutella.settings.Settings; import com.limegroup.gnutella.settings.SettingsHandler; import com.limegroup.gnutella.settings.SharingSettings; /** * A container of LibraryData. */ public class LibraryData implements Settings { /** * The Container data, storing all the information. */ private final Container DATA = new Container("library.dat"); /** * The directories not to share. */ public final Set DIRECTORIES_NOT_TO_SHARE = DATA.getSet("DIRECTORIES_NOT_TO_SHARE"); /** * Sensitive directories that are explicitly allowed to be shared. */ public final Set SENSITIVE_DIRECTORIES_VALIDATED = DATA.getSet("SENSITIVE_DIRECTORIES_VALIDATED"); /** * Sensitive directories that are explicitly not allowed to be shared. */ public final Set SENSITIVE_DIRECTORIES_NOT_TO_SHARE = DATA.getSet("SENSITIVE_DIRECTORIES_NOT_TO_SHARE"); /** * Individual files that should be shared despite being located outside * of any shared directory, and despite any extension limitations. */ public final Set SPECIAL_FILES_TO_SHARE = DATA.getSet("SPECIAL_FILES_TO_SHARE"); /** * Files that should be not shared despite being located inside * a shared directory. */ public final Set FILES_NOT_TO_SHARE = DATA.getSet("FILES_NOT_TO_SHARE"); /** * Whether or not a 'save' operation is actually going to save to disk. */ private boolean shouldSave = true; /** * Constructs a new LibraryData, adding it to the SettingsHandler for maintanence. */ public LibraryData() { SettingsHandler.addSettings(this); } /** * Saves all the settings to disk. */ public void save() { if(shouldSave) DATA.save(); } /** * Reverts all settings to their defaults -- this clears all the settings. */ public void revertToDefault() { DATA.clear(); } /** * Sets whether or not these settings should be saved to disk. */ public void setShouldSave(boolean save) { shouldSave = save; } /** * Reloads all settings to match what's on disk. */ public void reload() { DATA.load(); } /** * Cleans special file sharing settings by removing references to files that * no longer exist. */ public final void clean() { SharingSettings.DIRECTORIES_TO_SHARE.clean(); Set parents = SharingSettings.DIRECTORIES_TO_SHARE.getValue(); clean(DIRECTORIES_NOT_TO_SHARE, parents); clean(FILES_NOT_TO_SHARE, parents); clean(SENSITIVE_DIRECTORIES_VALIDATED, parents); clean(SENSITIVE_DIRECTORIES_NOT_TO_SHARE, parents); } /** * Cleans out entries from a setting that no long exist on disk, or, * if the second parameter is non-null, don't exist anywhere in the list * of the second parameter's settings. */ private void clean(Set one, Set two) { synchronized(one) { for(Iterator i = one.iterator(); i.hasNext(); ) { Object o = i.next(); if(!(o instanceof File)) { i.remove(); } else { File f = (File)o; if(!f.exists()) i.remove(); else if(two != null && !containsParent(f, two)) i.remove(); } } } } /** * Determines if the File or any of its parents is contained in the given Set. */ private boolean containsParent(File parent, Set set) { while(parent != null) { if(set.contains(parent)) return true; parent = parent.getParentFile(); } return false; } }