/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.controller; import org.candlepin.model.Consumer; import org.candlepin.model.ConsumerCurator; import org.candlepin.model.ContentAccessCertificateCurator; import org.candlepin.model.EnvironmentCurator; import org.candlepin.model.ExporterMetadata; import org.candlepin.model.ExporterMetadataCurator; import org.candlepin.model.ImportRecord; import org.candlepin.model.ImportRecordCurator; import org.candlepin.model.Owner; import org.candlepin.model.OwnerContentCurator; import org.candlepin.model.OwnerCurator; import org.candlepin.model.OwnerEnvContentAccessCurator; import org.candlepin.model.OwnerProductCurator; import org.candlepin.model.PermissionBlueprint; import org.candlepin.model.PermissionBlueprintCurator; import org.candlepin.model.Pool; import org.candlepin.model.UeberCertificateCurator; import org.candlepin.model.activationkeys.ActivationKey; import org.candlepin.model.activationkeys.ActivationKeyCurator; import org.candlepin.service.ContentAccessCertServiceAdapter; import com.google.inject.Inject; import com.google.inject.persist.Transactional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; /** * Used to perform operations on Owners that need more than just the owner * curator. */ public class OwnerManager { @Inject private static Logger log = LoggerFactory.getLogger(OwnerManager.class); @Inject private ConsumerCurator consumerCurator; @Inject private PoolManager poolManager; @Inject private ActivationKeyCurator activationKeyCurator; @Inject private EnvironmentCurator envCurator; @Inject private ExporterMetadataCurator exportCurator; @Inject private ImportRecordCurator importRecordCurator; @Inject private PermissionBlueprintCurator permissionCurator; @Inject private OwnerProductCurator ownerProductCurator; @Inject private ProductManager productManager; @Inject private OwnerContentCurator ownerContentCurator; @Inject private ContentManager contentManager; @Inject private OwnerCurator ownerCurator; @Inject private ContentAccessCertServiceAdapter contentAccessCertService; @Inject private ContentAccessCertificateCurator contentAccessCertCurator; @Inject private OwnerEnvContentAccessCurator ownerEnvContentAccessCurator; @Inject private UeberCertificateCurator uberCertificateCurator; @Transactional public void cleanupAndDelete(Owner owner, boolean revokeCerts) { log.info("Cleaning up owner: {}", owner); Collection<String> consumerIds = this.ownerCurator.getConsumerIds(owner).list(); Collection<Consumer> consumers = this.consumerCurator.lockAndLoadByIds(consumerIds); for (Consumer consumer : consumers) { log.info("Removing all entitlements for consumer: {}", consumer); poolManager.revokeAllEntitlements(consumer, revokeCerts); } // Actual consumer deletion is done out of the loop above since all // entitlements need to be removed before the deletion occurs. This // is due to the sourceConsumer that was added to Pool. Deleting an // entitlement may result in the deletion of a sub pool, which would // cause issues. // FIXME Perhaps this can be handled a little better. for (Consumer consumer : consumers) { // need to check if this has been removed due to a // parent being deleted // TODO: There has to be a more efficient way to do this... log.info("Deleting consumer: {}", consumer); Consumer next = consumerCurator.find(consumer.getId()); if (next != null) { consumerCurator.delete(next); } } for (ActivationKey key : activationKeyCurator.listByOwner(owner)) { log.info("Deleting activation key: {}", key); activationKeyCurator.delete(key); } log.debug("Deleting environments for owner: {}", owner); envCurator.deleteEnvironmentsForOwner(owner); // Delete the ueber certificate for this owner, if one exists. log.debug("Deleting uber certificate for owner: {}", owner); this.uberCertificateCurator.deleteForOwner(owner); for (Pool p : poolManager.listPoolsByOwner(owner)) { log.info("Deleting pool: {}", p); poolManager.deletePool(p); } ExporterMetadata m = exportCurator.lookupByTypeAndOwner(ExporterMetadata.TYPE_PER_USER, owner); if (m != null) { log.info("Deleting export metadata: {}", m); exportCurator.delete(m); } for (ImportRecord record : importRecordCurator.findRecords(owner)) { log.info("Deleting import record: {}", record); importRecordCurator.delete(record); } for (PermissionBlueprint perm : permissionCurator.findByOwner(owner)) { log.info("Deleting permission: {}", perm.getAccess()); perm.getRole().getPermissions().remove(perm); permissionCurator.delete(perm); } log.info("Deleting all products..."); this.productManager.removeAllProducts(owner); log.info("Deleting all content..."); this.contentManager.removeAllContent(owner, false); log.info("Deleting owner: {}", owner); ownerCurator.delete(owner); ownerCurator.flush(); } public void determineContentAccessCertState(Owner owner) { if (!owner.isContentAccessModeDirty()) { return; } if (owner.contentAccessMode() .equals(ContentAccessCertServiceAdapter.DEFAULT_CONTENT_ACCESS_MODE)) { contentAccessCertCurator.deleteForOwner(owner); } owner.setContentAccessModeDirty(false); ownerCurator.merge(owner); } @Transactional public void refreshOwnerForContentAccess(Owner owner) { // we need to update the owner's consumers if the content access mode has changed owner = ownerCurator.lockAndLoad(owner); this.determineContentAccessCertState(owner); // removed cached versions of content access cert data ownerEnvContentAccessCurator.removeAllForOwner(owner.getId()); ownerCurator.flush(); } }