eu.cloud4soa.relational.persistence.SLAViolationRepository.java Source code

Java tutorial

Introduction

Here is the source code for eu.cloud4soa.relational.persistence.SLAViolationRepository.java

Source

/*
 *  Copyright 2013 Cloud4SOA, www.cloud4soa.eu
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package eu.cloud4soa.relational.persistence;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Subqueries;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import eu.cloud4soa.relational.datamodel.Account;
import eu.cloud4soa.relational.datamodel.ApplicationInstance;
import eu.cloud4soa.relational.datamodel.GuaranteeTerm;
import eu.cloud4soa.relational.datamodel.ISLAEnforcementJob;
import eu.cloud4soa.relational.datamodel.Paas;
import eu.cloud4soa.relational.datamodel.RecoveryAction;
import eu.cloud4soa.relational.datamodel.SLAEnforcementJob;
import eu.cloud4soa.relational.datamodel.SLATemplate;
import eu.cloud4soa.relational.datamodel.SLAViolation;
import eu.cloud4soa.relational.datamodel.User;
import eu.cloud4soa.relational.persistence.support.AbstractHbmDao;

@Repository
public class SLAViolationRepository extends AbstractHbmDao<SLAViolation> implements ISLAViolationRepository {

    @Autowired
    public SLAViolationRepository(SessionFactory sessionFactory) {
        super(sessionFactory, SLAViolation.class);
    }

    public void store(SLAViolation slaViolation) {
        this.saveOrUpdate(slaViolation);
    }

    public void delete(SLAViolation slaViolation) {
        super.delete(slaViolation);
    }

    public List<SLAViolation> retrieveAllSLAViolations() {
        return this.findAll();
    }

    public List<SLAViolation> retrieveAllSLAViolations(ISLAEnforcementJob slaEnforcementJob) {
        return this.findBy("slaEnforcementJobId", slaEnforcementJob.getId());
    }

    public List<SLAViolation> retrieveAllInRange(ISLAEnforcementJob slaEnforcementJob, Date start, Date end) {
        return this.find("slaEnforcementJobId=? AND date>=? AND date<=? ORDER BY date DESC ",
                slaEnforcementJob.getId(), start, end);
    }

    public List<SLAViolation> retrieveAllInRangeLimited(ISLAEnforcementJob slaEnforcementJob, Date start, Date end,
            long limit) {
        LinkedList<SLAViolation> resultSet = (LinkedList<SLAViolation>) retrieveAllInRange(slaEnforcementJob, start,
                end);
        // we have to use that because hibernates criteria handling is a bit buggy und suboptimal designed.
        while (resultSet.size() > limit) {
            resultSet.pollLast();
        }
        return resultSet;
    }

    /**
     * Returns all sla violations for a given PaaS provider following
     * the following query:
     * 
     * SELECT slaviolation.id
     *    FROM slaviolation
     *    WHERE slaviolation.idenforcementjob IN (
     *       SELECT enforcementjob.id
     *        FROM enforcementjob
     *        JOIN slacontract ON enforcementjob.idslacontract=slacontract.id
     *        WHERE slacontract.idprovider=XXX
     *    )
     * 
     * @param providerId the id of the PaaS provider
     * @return a list of SLAViolation objects
     */
    public List<SLAViolation> retrieveAllForProvider(String providerId) {
        DetachedCriteria slap_criteria = DetachedCriteria.forClass(SLATemplate.class)
                .add(Restrictions.eq("serviceProvider", providerId)).setProjection(Projections.property("id"));

        DetachedCriteria enf_criteria = DetachedCriteria.forClass(SLAEnforcementJob.class)
                .add(Property.forName("slaContractId").in(slap_criteria)).setProjection(Projections.property("id"));

        return (List<SLAViolation>) getSession().createCriteria(SLAViolation.class)
                .add(Subqueries.geAll("slaEnforcementJobId", enf_criteria)).list();
    }

    /**
     * Returns all sla violations for a given PaaS offering following
     * the following query:
     * 
     * SELECT slaviolation.id
     *    FROM slaviolation
     *    WHERE slaviolation.idappinstance IN (
     *       SELECT idappinstance.id
     *        FROM idappinstance
     *        JOIN paas ON idappinstance.idpaas=paas.id
     *        WHERE paas.id=XXX
     *    )
     * 
     * @param offeringId the id of the PaaS offering
     * @return a list of SLAViolation objects
     */
    public List<SLAViolation> retrieveAllForOffering(String offeringId) {
        DetachedCriteria pass_criteria = DetachedCriteria.forClass(Paas.class)
                .add(Restrictions.eq("url", offeringId));

        DetachedCriteria acc_criteria = DetachedCriteria.forClass(Account.class)
                .add(Property.forName("paas").in(pass_criteria));

        DetachedCriteria app_criteria = DetachedCriteria.forClass(ApplicationInstance.class)
                .add(Property.forName("account").in(acc_criteria)).setProjection(Projections.property("id"));

        return (List<SLAViolation>) getSession().createCriteria(SLAViolation.class)
                .add(Subqueries.geAll("applicationInstanceUriId", app_criteria)).list();
    }

    /**
     * Returns all SLA violations for a given User between two moments in time.
     * 
     * @param userId the user id
     * @param start  the moment we start to get the SLA violations
     * @param end    the moment we finish to get the SLA violations
     * @return       a list of SLA violations
     */
    public List<SLAViolation> retrieveAllForUserAndTime(String userId, Date start, Date end) {
        DetachedCriteria user_criteria = DetachedCriteria.forClass(User.class).add(Restrictions.eq("uriID", userId))
                .setProjection(Projections.property("id"));

        DetachedCriteria acc_criteria = DetachedCriteria.forClass(Account.class)
                .add(Property.forName("user.id").in(user_criteria)).setProjection(Projections.property("id"));

        DetachedCriteria app_criteria = DetachedCriteria.forClass(ApplicationInstance.class)
                .add(Property.forName("account.id").in(acc_criteria)).setProjection(Projections.property("uriID"));

        return (List<SLAViolation>) getSession().createCriteria(SLAViolation.class)
                .add(Property.forName("applicationInstanceUriId").in(app_criteria))
                .add(Restrictions.between("dateAndTime", start, end)).list();
    }

    public List<SLAViolation> retrieveAlForRecoveryAction(RecoveryAction recoveryAction) {
        List<SLAViolation> slaViolationList = this.find("recoveryAction = ?", recoveryAction);
        return slaViolationList;
    }
}