/* * Copyright (c) 2009, SQL Power Group Inc. * * This file is part of SQL Power Library. * * SQL Power Library is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * SQL Power Library 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ca.sqlpower.dao.helper; import java.util.List; import ca.sqlpower.dao.PersistedSPOProperty; import ca.sqlpower.dao.PersistedSPObject; import ca.sqlpower.object.SPObject; import com.google.common.collect.Multimap; public abstract class AbstractSPPersisterHelper<T extends SPObject> implements SPPersisterHelper<T> { /** * Returns a simple string for use in exceptions from * {@link SPPersisterHelper#commitProperty(SPObject, String, Object)} and * {@link SPPersisterHelper#findProperty(SPObject, String)}. This * message describes that a persistable property cannot be found on the * object. This is refactored here as a lot of methods throw an exception * with a message equivalent to this one. * * @param spo * The {@link SPObject} that does not contain the given property. * @param propertyName * The property we want to find on the {@link SPObject} that * cannot be found. * @return An error message for exceptions that describes the above. */ public static String createSPPersistenceExceptionMessage(SPObject spo, String propertyName) { return "Cannot persist property \"" + propertyName + "\" on " + spo.getClass() + " with name \"" + spo.getName() + "\" and UUID \"" + spo.getUUID() + "\""; } /** * Finds and removes a property from a {@link Multimap} of persisted * properties of a given {@link SPObject}. * * @param uuid * The UUID of the {@link SPObject} to find and remove the * property from. * @param propertyName * The JavaBean property name. * @param persistedProperties * {@link Multimap} of persisted properties to retrieve and * remove the property from. * @return The value of the property. */ public static Object findPropertyAndRemove( String uuid, String propertyName, Multimap<String, PersistedSPOProperty> persistedProperties) { for (PersistedSPOProperty property : persistedProperties.get(uuid)) { if (property.getPropertyName().equals(propertyName)) { Object newValue = property.getNewValue(); persistedProperties.remove(uuid, property); return newValue; } } // Property might not be persisted because it might be null. // We therefore need to return null. return null; } /** * Finds a property from a {@link Multimap} of persisted * properties of a given {@link SPObject} without removing the property. * * @param uuid * The UUID of the {@link SPObject} to find and remove the * property from. * @param propertyName * The JavaBean property name. * @param persistedProperties * {@link Multimap} of persisted properties to retrieve and * remove the property from. * @return The value of the property. */ public static PersistedSPOProperty findProperty( String uuid, String propertyName, Multimap<String, PersistedSPOProperty> persistedProperties) { for (PersistedSPOProperty property : persistedProperties.get(uuid)) { if (property.getPropertyName().equals(propertyName)) { return property; } } // Property might not be persisted because it might be null. // We therefore need to return null. return null; } /** * Finds the {@link PersistedSPObject} in a {@link List} that matches the * given UUIDs * * @param parentUUID * The {@link SPObject}'s parent UUID. * @param persistedObjects * The {@link List} of {@link PersistedSPObject}s to search * through. * @return The matching {@link PersistedSPObject}. If it cannot be found, * null is returned. */ public static PersistedSPObject findPersistedSPObject(String parentUUID, String childUUID, List<PersistedSPObject> persistedObjects) { for (PersistedSPObject pwo : persistedObjects) { if (pwo.isLoaded()) continue; if (pwo.getParentUUID().equals(parentUUID)) { if (pwo.getUUID().equals(childUUID)) { return pwo; } } } return null; } }