/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.enterprise.server.tagging;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.criteria.TagCriteria;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.tagging.Tag;
import org.rhq.core.domain.tagging.compsite.TagReportComposite;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
/**
* @author Greg Hinkle
*/
@Stateless
public class TagManagerBean implements TagManagerLocal, TagManagerRemote {
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
@EJB
private AuthorizationManagerLocal authorizationManager;
public PageList<Tag> findTagsByCriteria(Subject subject, TagCriteria criteria) {
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
CriteriaQueryRunner<Tag> queryRunner = new CriteriaQueryRunner<Tag>(criteria, generator, entityManager);
return queryRunner.execute();
}
public Set<Tag> addTags(Subject subject, Set<Tag> tags) {
Set<Tag> results = new HashSet<Tag>();
// This isn't efficient, but then how many tags will you really be creating at once
for (Tag tag : tags) {
TagCriteria criteria = new TagCriteria();
criteria.addFilterNamespace(tag.getNamespace());
criteria.addFilterSemantic(tag.getSemantic());
criteria.addFilterName(tag.getName());
criteria.setStrict(true);
List<Tag> found = findTagsByCriteria(subject, criteria);
if (!found.isEmpty()) {
assert found.size() == 1; // should never be more than one
results.add(found.get(0));
} else {
entityManager.persist(tag);
results.add(tag);
}
}
return results;
}
public void removeTags(Subject subject, Set<Tag> tags) {
// This isn't efficient, but then how many tags will you really be deleting at once
for (Tag tag : tags) {
entityManager.remove(entityManager.find(Tag.class, tag.getId()));
}
}
public void updateResourceTags(Subject subject, int resourceId, Set<Tag> tags) {
if (!authorizationManager.hasResourcePermission(subject, Permission.MODIFY_RESOURCE, resourceId)) {
throw new PermissionException("You do not have permission to modify resource");
}
Set<Tag> definedTags = addTags(subject, tags);
Resource resource = entityManager.find(Resource.class, resourceId);
Set<Tag> previousTags = new HashSet<Tag>(resource.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeResource(resource);
}
for (Tag tag : definedTags) {
tag.addResource(resource);
}
}
public void updateResourceGroupTags(Subject subject, int resourceGroupId, Set<Tag> tags) {
if (!authorizationManager.hasGroupPermission(subject, Permission.MODIFY_RESOURCE, resourceGroupId)) {
throw new PermissionException("You do not have permission to modify group");
}
Set<Tag> definedTags = addTags(subject, tags);
ResourceGroup group = entityManager.find(ResourceGroup.class, resourceGroupId);
Set<Tag> previousTags = new HashSet<Tag>(group.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeResourceGroup(group);
}
for (Tag tag : definedTags) {
tag.addResourceGroup(group);
}
}
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void updateBundleTags(Subject subject, int bundleId, Set<Tag> tags) {
Set<Tag> definedTags = addTags(subject, tags);
Bundle bundle = entityManager.find(Bundle.class, bundleId);
Set<Tag> previousTags = new HashSet<Tag>(bundle.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeBundle(bundle);
}
for (Tag tag : definedTags) {
tag.addBundle(bundle);
}
}
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void updateBundleVersionTags(Subject subject, int bundleVersionId, Set<Tag> tags) {
Set<Tag> definedTags = addTags(subject, tags);
BundleVersion bundleVersion = entityManager.find(BundleVersion.class, bundleVersionId);
Set<Tag> previousTags = new HashSet<Tag>(bundleVersion.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeBundleVersion(bundleVersion);
}
for (Tag tag : definedTags) {
tag.addBundleVersion(bundleVersion);
}
}
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void updateBundleDeploymentTags(Subject subject, int bundleDeploymentId, Set<Tag> tags) {
Set<Tag> definedTags = addTags(subject, tags);
BundleDeployment bundleDeployment = entityManager.find(BundleDeployment.class, bundleDeploymentId);
Set<Tag> previousTags = new HashSet<Tag>(bundleDeployment.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeBundleDeployment(bundleDeployment);
}
for (Tag tag : definedTags) {
tag.addBundleDeployment(bundleDeployment);
}
}
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void updateBundleDestinationTags(Subject subject, int bundleDestinationId, Set<Tag> tags) {
Set<Tag> definedTags = addTags(subject, tags);
BundleDestination bundleDestination = entityManager.find(BundleDestination.class, bundleDestinationId);
Set<Tag> previousTags = new HashSet<Tag>(bundleDestination.getTags());
previousTags.removeAll(definedTags);
for (Tag tag : previousTags) {
tag.removeBundleDestination(bundleDestination);
}
for (Tag tag : definedTags) {
tag.addBundleDestination(bundleDestination);
}
}
public PageList<TagReportComposite> findTagReportCompositesByCriteria(Subject subject, TagCriteria tagCriteria) {
// TODO criteria stuff
Query query = entityManager.createNamedQuery(Tag.QUERY_TAG_COMPOSITE_REPORT);
PageList<TagReportComposite> result = new PageList<TagReportComposite>();
result.addAll(query.getResultList());
return result;
}
}