/*
* 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;
}
}