/* * RHQ Management Platform * Copyright (C) 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 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.search.translation; import static org.rhq.enterprise.server.search.common.SearchQueryGenerationUtility.getJPQLForString; import org.rhq.core.domain.alert.AlertPriority; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.search.assist.AlertSearchAssistParam; import org.rhq.enterprise.server.search.SearchExpressionException; import org.rhq.enterprise.server.search.translation.antlr.RHQLAdvancedTerm; import org.rhq.enterprise.server.search.translation.antlr.RHQLComparisonOperator; import org.rhq.enterprise.server.search.translation.jpql.SearchFragment; /** * @author Joseph Marques */ public class ResourceSearchTranslator extends AbstractSearchTranslator { public ResourceSearchTranslator(Subject subject) { super(subject); } public SearchFragment getSearchFragment(String alias, RHQLAdvancedTerm term) { String path = term.getPath(); RHQLComparisonOperator op = term.getOperator(); String param = term.getParam(); String filter = term.getValue(); if (path.equals("availability")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForEnum(alias + ".currentAvailability.availabilityType", op, filter, AvailabilityType.class, true)); } else if (path.equals("category")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForEnum(alias + ".resourceType.category", op, filter, ResourceCategory.class, false)); } else if (path.equals("type")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForString(alias + ".resourceType.name", op, filter)); } else if (path.equals("plugin")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForString(alias + ".resourceType.plugin", op, filter)); } else if (path.equals("name")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForString(alias + ".name", op, filter)); } else if (path.equals("version")) { return new SearchFragment(SearchFragment.Type.WHERE_CLAUSE, // getJPQLForString(alias + ".version", op, filter)); } else if (path.equals("alerts")) { return new SearchFragment( // SearchFragment.Type.PRIMARY_KEY_SUBQUERY, "SELECT res.id" // + " FROM Resource res " // + " JOIN res.alertDefinitions alertDef " // + " JOIN alertDef.alerts alert " // + " WHERE alert.ctime > " + AlertSearchAssistParam.getLastTime(param) // + (filter.equalsIgnoreCase("any") ? "" : " and " + getJPQLForEnum("alertDef.priority", op, filter, AlertPriority.class, false)) // + " GROUP BY res.id " // + "HAVING COUNT(alert) > 0 "); } else if (path.equals("trait")) { return new SearchFragment( // SearchFragment.Type.PRIMARY_KEY_SUBQUERY, "SELECT res.id" // + " FROM Resource res, MeasurementDataTrait trait " // + " JOIN res.schedules schedule " // + " WHERE trait.schedule = schedule " // + " AND schedule.definition.dataType = " + DataType.TRAIT.ordinal() // + " AND " + getJPQLForString("schedule.definition.name", RHQLComparisonOperator.EQUALS, param) // + " AND " + getJPQLForString("trait.value", op, filter)); } else if (path.equals("connection")) { return new SearchFragment( // SearchFragment.Type.PRIMARY_KEY_SUBQUERY, "SELECT res.id" // + " FROM Resource res, PropertySimple simple, PropertyDefinitionSimple simpleDefinition " // + " JOIN res.resourceType.pluginConfigurationDefinition.propertyDefinitions definition " // + " JOIN res.pluginConfiguration.properties property " // + " WHERE simpleDefinition = definition " // only provide translations for simple properties + " AND simpleDefinition.type <> 'PASSWORD' " // do not allow searching by hidden/password fields + " AND property = simple " // join to simple for filter by 'stringValue' attribute + " AND " + getJPQLForString("definition.name", RHQLComparisonOperator.EQUALS, param) // + " AND " + getJPQLForString("simple.stringValue", op, filter)); } else if (path.equals("configuration")) { return new SearchFragment( // SearchFragment.Type.PRIMARY_KEY_SUBQUERY, "SELECT res.id" // + " FROM Resource res, PropertySimple simple, PropertyDefinitionSimple simpleDefinition " // + " JOIN res.resourceType.resourceConfigurationDefinition.propertyDefinitions definition " // + " JOIN res.resourceConfiguration.properties property " // + " WHERE simpleDefinition = definition " // only provide translations for simple properties + " AND simpleDefinition.type <> 'PASSWORD' " // do not allow searching by hidden/password fields + " AND property = simple " // join to simple for filter by 'stringValue' attribute + conditionallyAddAuthzFragment(getConfigAuthzFragment()) // + " AND " + getJPQLForString("definition.name", RHQLComparisonOperator.EQUALS, param) // + " AND " + getJPQLForString("simple.stringValue", op, filter)); } else { if (param == null) { throw new SearchExpressionException("No search fragment available for " + path); } else { throw new SearchExpressionException("No search fragment available for " + path + "[" + param + "]"); } } } private String getConfigAuthzFragment() { return "res.id IN " // + "(SELECT ires.id " // + " FROM Resource ires " // + " JOIN ires.implicitGroups igroup " // + " JOIN igroup.roles irole " // + " JOIN irole.subjects isubject " // + " JOIN irole.permissions iperm " // + " WHERE isubject.id = " + getSubjectId() // + " AND iperm = " + Permission.CONFIGURE_READ.ordinal() + ")"; } }