/************************************************************************* * Copyright 2009-2013 Eucalyptus Systems, Inc. * * 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 3 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, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ package com.eucalyptus.autoscaling.common.internal.activities; import static com.eucalyptus.autoscaling.common.AutoScalingMetadata.AutoScalingGroupMetadata; import static com.eucalyptus.autoscaling.common.AutoScalingMetadata.ScalingActivityMetadata; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Restrictions; import com.eucalyptus.autoscaling.common.AutoScalingMetadatas; import com.eucalyptus.autoscaling.common.internal.metadata.AbstractOwnedPersistents; import com.eucalyptus.autoscaling.common.internal.metadata.AutoScalingMetadataException; import com.eucalyptus.autoscaling.common.internal.metadata.AutoScalingMetadataNotFoundException; import com.eucalyptus.component.annotation.ComponentNamed; import com.eucalyptus.util.Callback; import com.eucalyptus.util.CollectionUtils; import com.eucalyptus.util.Exceptions; import com.eucalyptus.auth.principal.OwnerFullName; import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; /** * */ @ComponentNamed public class PersistenceScalingActivities extends ScalingActivities { private PersistenceSupport persistenceSupport = new PersistenceSupport(); @Override public <T> List<T> list( @Nullable final OwnerFullName ownerFullName, @Nonnull final Predicate<? super ScalingActivity> filter, @Nonnull final Function<? super ScalingActivity,T> transform ) throws AutoScalingMetadataException { return persistenceSupport.list( ownerFullName, filter, transform ); } @Override public <T> List<T> list( @Nullable final OwnerFullName ownerFullName, @Nullable final AutoScalingGroupMetadata group, @Nonnull final Collection<String> activityIds, @Nonnull final Predicate<? super ScalingActivity> filter, @Nonnull final Function<? super ScalingActivity,T> transform ) throws AutoScalingMetadataException { final ScalingActivity example = ScalingActivity.withOwner( ownerFullName ); final Conjunction conjunction = Restrictions.conjunction(); final Collection<Predicate<? super ScalingActivity>> predicates = Lists.newArrayList(); predicates.add( filter ); if ( group != null ) { predicates.add( CollectionUtils.propertyPredicate( group.getArn(), Functions.compose( AutoScalingMetadatas.toArn(), ScalingActivities.group() ) ) ); conjunction.add( Restrictions.eq( "autoScalingGroupName", group.getDisplayName() ) ); } if ( !activityIds.isEmpty() ) { conjunction.add( Restrictions.in( "displayName", activityIds ) ); } return persistenceSupport.listByExample( example, Predicates.and( predicates ), conjunction, Collections.<String,String>emptyMap(), transform ); } @Override public <T> List<T> listByActivityStatusCode( @Nullable final OwnerFullName ownerFullName, @Nonnull final Collection<ActivityStatusCode> statusCodes, @Nonnull final Function<? super ScalingActivity,T> transform ) throws AutoScalingMetadataException { final ScalingActivity example = ScalingActivity.withOwner( ownerFullName ); final Conjunction conjunction = Restrictions.conjunction(); if ( !statusCodes.isEmpty() ) { conjunction.add( Restrictions.in( "statusCode", statusCodes ) ); } return persistenceSupport.listByExample( example, Predicates.alwaysTrue(), conjunction, Collections.<String, String>emptyMap(), transform ); } @Override public void update( final OwnerFullName ownerFullName, final String activityId, final Callback<ScalingActivity> activityUpdateCallback ) throws AutoScalingMetadataException { try { persistenceSupport.withRetries( ).updateByExample( persistenceSupport.exampleWithName( ownerFullName, activityId ), ownerFullName, activityId, activityUpdateCallback ); } catch ( AutoScalingMetadataException e ) { Exceptions.findAndRethrow( e, AutoScalingMetadataNotFoundException.class ); throw e; } } @Override public boolean delete( final ScalingActivityMetadata scalingActivity ) throws AutoScalingMetadataException { return persistenceSupport.delete( scalingActivity ); } @Override public int deleteByCreatedAge( @Nullable final OwnerFullName ownerFullName, final long createdBefore ) throws AutoScalingMetadataException { return persistenceSupport.deleteByExample( ScalingActivity.withOwner( ownerFullName ), Restrictions.lt( "creationTimestamp", new Date( createdBefore ) ), Collections.<String,String>emptyMap() ).size(); } @Override public ScalingActivity save( final ScalingActivity scalingActivity ) throws AutoScalingMetadataException { return persistenceSupport.save( scalingActivity ); } private static class PersistenceSupport extends AbstractOwnedPersistents<ScalingActivity> { private PersistenceSupport() { super( "scaling activity" ); } @Override protected ScalingActivity exampleWithOwner( final OwnerFullName ownerFullName ) { return ScalingActivity.withOwner( ownerFullName ); } @Override protected ScalingActivity exampleWithName( final OwnerFullName ownerFullName, final String name ) { return ScalingActivity.named( ownerFullName, name ); } } }