/* * Copyright 2009-2010 Rickard Öberg AB * * 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 org.qi4j.library.eventsourcing.application.factory; import java.io.IOException; import org.qi4j.api.concern.ConcernOf; import org.qi4j.api.injection.scope.Service; import org.qi4j.api.injection.scope.Structure; import org.qi4j.api.unitofwork.UnitOfWork; import org.qi4j.api.unitofwork.UnitOfWorkCallback; import org.qi4j.api.unitofwork.UnitOfWorkCompletionException; import org.qi4j.api.unitofwork.UnitOfWorkFactory; import org.qi4j.library.eventsourcing.application.api.ApplicationEvent; import org.qi4j.library.eventsourcing.application.source.ApplicationEventStore; import org.qi4j.library.eventsourcing.domain.factory.DomainEventFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Notify transaction listeners when a complete transaction of domain events is available. */ public class TransactionNotificationConcern extends ConcernOf<ApplicationEventFactory> implements ApplicationEventFactory { @Service ApplicationEventStore eventStore; @Structure UnitOfWorkFactory uowf; Logger logger = LoggerFactory.getLogger( DomainEventFactory.class ); @Override public ApplicationEvent createEvent( String name, Object[] args ) { final UnitOfWork unitOfWork = uowf.currentUnitOfWork(); ApplicationEvent event = next.createEvent( name, args ); // Add event to list in UoW UnitOfWorkApplicationEvents events = unitOfWork.metaInfo( UnitOfWorkApplicationEvents.class ); if( events == null ) { events = new UnitOfWorkApplicationEvents(); unitOfWork.setMetaInfo( events ); unitOfWork.addUnitOfWorkCallback( new UnitOfWorkCallback() { @Override public void beforeCompletion() throws UnitOfWorkCompletionException { } @Override public void afterCompletion( UnitOfWorkStatus status ) { if( status.equals( UnitOfWorkStatus.COMPLETED ) ) { UnitOfWorkApplicationEvents events = unitOfWork.metaInfo( UnitOfWorkApplicationEvents.class ); try { eventStore.storeEvents( events.getEvents() ); } catch( IOException e ) { logger.error( "Could not store events", e ); // How do we handle this? This is a major error! } } } } ); } events.add( event ); return event; } }