/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program 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 version 2 of the License.
*
* This program 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, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.content;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.content.Distribution;
import org.rhq.core.domain.content.DistributionFile;
import org.rhq.core.domain.content.DistributionType;
import org.rhq.core.domain.content.RepoDistribution;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.RequiredPermission;
/**
* @author Pradeep Kilambi
*/
@Stateless
public class DistributionManagerBean implements DistributionManagerLocal {
// Attributes --------------------------------------------
private final Log log = LogFactory.getLog(this.getClass());
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
@EJB
private DistributionManagerLocal distributionManager;
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Distribution createDistribution(Subject user, String kslabel, String basepath, DistributionType disttype)
throws DistributionException {
DistributionType loaded = distributionManager.getDistributionTypeByName(disttype.getName());
if (loaded != null) {
disttype = loaded;
}
Distribution kstree = new Distribution(kslabel, basepath, disttype);
validateDistTree(kstree);
entityManager.persist(kstree);
return kstree;
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void deleteDistributionMappingsForRepo(Subject user, int repoId) {
log.debug("User [" + user + "] is removing distribution tree mapping from repository [" + repoId + "]");
entityManager.createNamedQuery(RepoDistribution.DELETE_BY_REPO_ID).setParameter("repoId", repoId)
.executeUpdate();
}
public void deleteDistributionByDistId(Subject user, int distId) {
log.debug("User [" + user + "] is deleting distribution tree [" + distId + "]");
entityManager.flush();
entityManager.clear();
entityManager.createNamedQuery(Distribution.QUERY_DELETE_BY_DIST_ID).setParameter("distid", distId)
.executeUpdate();
Distribution kstree = entityManager.find(Distribution.class, distId);
if (kstree != null) {
entityManager.remove(kstree);
log.debug("User [" + user + "] deleted kstree [" + kstree + "]");
} else {
log.debug("Distribution tree ID [" + distId + "] doesn't exist - nothing to delete");
}
}
@SuppressWarnings("unchecked")
public Distribution getDistributionByLabel(String kslabel) {
Query query = entityManager.createNamedQuery(Distribution.QUERY_FIND_BY_DIST_LABEL);
query.setParameter("label", kslabel);
List<Distribution> results = query.getResultList();
if (results.size() > 0) {
return results.get(0);
} else {
return null;
}
}
/**
* Returns a DistributionType for given name
* @param name name of distribution type
* @return distribution type from db
*/
@SuppressWarnings("unchecked")
public DistributionType getDistributionTypeByName(String name) {
Query query = entityManager.createNamedQuery(DistributionType.QUERY_FIND_BY_NAME);
query.setParameter("name", name);
List<DistributionType> results = query.getResultList();
if (results.size() > 0) {
return results.get(0);
} else {
return null;
}
}
/**
* Returns a list of available distribution files for requested distribution
* @param distId
* @return A list of Distributionfile objects associated to a given distribution
*/
@SuppressWarnings("unchecked")
public List<DistributionFile> getDistributionFilesByDistId(int distId) {
Query query = entityManager.createNamedQuery(DistributionFile.SELECT_BY_DIST_ID);
query.setParameter("distId", distId);
List<DistributionFile> results = query.getResultList();
if (results.size() > 0) {
return results;
} else {
return null;
}
}
/**
* deletes list of available distribution files for requested distribution
* @param distId
*/
public void deleteDistributionFilesByDistId(Subject user, int distId) {
log.debug("User [" + user + "] is deleting distribution file from distribution [" + distId + "]");
entityManager.flush();
entityManager.clear();
Query querydel = entityManager.createNamedQuery(DistributionFile.SELECT_BY_DIST_ID);
querydel.setParameter("distId", distId);
querydel.executeUpdate();
DistributionFile distFile = entityManager.find(DistributionFile.class, distId);
if (distFile != null) {
entityManager.remove(distFile);
log.debug("User [" + user + "] deleted distribution file [" + distFile + "]");
} else {
log.debug("Distribution file [" + distFile + "] doesn't exist - nothing to delete");
}
}
/**
* validates a given kickstart tree object and throws a KickstartTreeException
* @param kstree kickstart tree object
* @throws DistributionException
*/
public void validateDistTree(Distribution kstree) throws DistributionException {
if (kstree.getLabel() == null || kstree.getLabel().trim().equals("")) {
throw new DistributionException("A valid Distribution tree is required");
}
Distribution kstreeobj = getDistributionByLabel(kstree.getLabel());
if (kstreeobj != null) {
throw new DistributionException("There is already a kstree with the name of [" + kstree.getLabel() + "]");
}
}
}