/*
* Copyright 2012 Axel Winkler, Daniel Dunér
*
* This file is part of Daxplore Presenter.
*
* Daxplore Presenter 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.
*
* Daxplore Presenter 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 Daxplore Presenter. If not, see <http://www.gnu.org/licenses/>.
*/
package org.daxplore.presenter.server.storage;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.daxplore.presenter.server.servlets.GetCsvServlet;
import org.daxplore.presenter.server.servlets.GetStatsServlet;
public class DeleteData {
public static String deleteForPrefix(PersistenceManager pm, String prefix) {
long time = System.currentTimeMillis();
StringBuilder resultMessage = new StringBuilder("Removed data for prefix '").append(prefix).append("': ");
// Delete the single prefix item, this should be enough to remove the prefix from the system
// We still need to remove all related datastore/blobstore items to prevent storage memory leaks
// and to make sure that no settings or data remains if the prefix is reused/overwritten later.
Query query = pm.newQuery(PrefixStore.class);
query.declareParameters("String specificPrefix");
query.setFilter("prefix == specificPrefix");
pm.deletePersistentAll();
long deletedPrefixItems = query.deletePersistentAll(prefix); // should always be 1
resultMessage.append(deletedPrefixItems).append(" prefix item, ");
// Delete the single locale entry for the prefix
query = pm.newQuery(LocaleStore.class);
query.declareParameters("String specificPrefix");
query.setFilter("prefix == specificPrefix");
long deletedLocaleItems = query.deletePersistentAll(prefix); // should always be 1
resultMessage.append(deletedLocaleItems).append(" locale item, ");
// Delete all setting items related to the prefix
query = pm.newQuery(SettingItemStore.class);
query.declareParameters("String specificPrefix");
query.setFilter("prefix == specificPrefix");
long deletedSettingItems = query.deletePersistentAll(prefix);
resultMessage.append(deletedSettingItems).append(" settings, ");
// Delete all statistical data items related to the prefix
query = pm.newQuery(StatDataItemStore.class);
query.declareParameters("String specificPrefix");
query.setFilter("prefix == specificPrefix");
long deletedStatDataItems = query.deletePersistentAll(prefix);
resultMessage.append(deletedStatDataItems).append(" statistical data items, ");
// Delete all the blobstore-stored files
query = pm.newQuery(TextFileStore.class);
query.declareParameters("String specificPrefix");
query.setFilter("prefix == specificPrefix");
List<TextFileStore> fileItems = (List<TextFileStore>)query.execute(prefix);
pm.deletePersistentAll(fileItems);
int deletedBlobs = fileItems.size();
int deletedStaticFileItems = fileItems.size();
resultMessage.append(deletedBlobs).append(" file blobs deleted, ");
resultMessage.append(deletedStaticFileItems).append(" static file pointers ");
//Clear caches in different places
GetStatsServlet.clearServletCache(prefix);
GetCsvServlet.clearServletCache();
TextFileStore.clearTextFileCache();
long totalDeleted = deletedPrefixItems + deletedLocaleItems + deletedStatDataItems + deletedSettingItems + deletedStaticFileItems;
double timeSeconds = ((System.currentTimeMillis()-time)/Math.pow(10, 6));
resultMessage.append(" (" + totalDeleted + " items in " + timeSeconds + " seconds)");
String result = resultMessage.toString();
return result;
}
}