/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.guvnor.structure.backend.config.watch;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TransactionAttribute;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.inject.Named;
import org.guvnor.structure.backend.config.ConfigurationServiceImpl;
import org.guvnor.structure.backend.config.OrgUnit;
import org.guvnor.structure.backend.config.Repository;
import org.guvnor.structure.config.SystemRepositoryChangedEvent;
import org.uberfire.io.IOService;
import org.uberfire.java.nio.file.Path;
import org.uberfire.java.nio.file.WatchKey;
import static javax.ejb.TransactionAttributeType.*;
@Singleton
@Startup
@TransactionAttribute(NOT_SUPPORTED)
public class ConfigServiceWatchServiceExecutorImpl implements ConfigServiceWatchServiceExecutor {
@Inject
@Named("system")
private org.guvnor.structure.repositories.Repository systemRepository;
@Inject
@Named("configIO")
private IOService ioService;
// monitor capabilities
@Inject
@Repository
private Event<SystemRepositoryChangedEvent> repoChangedEvent;
@Inject
@OrgUnit
private Event<SystemRepositoryChangedEvent> orgUnitChangedEvent;
@Inject
private Event<SystemRepositoryChangedEvent> changedEvent;
public void setConfig( final org.guvnor.structure.repositories.Repository systemRepository,
final IOService ioService,
final Event<SystemRepositoryChangedEvent> repoChangedEvent,
final Event<SystemRepositoryChangedEvent> orgUnitChangedEvent,
final Event<SystemRepositoryChangedEvent> changedEvent ) {
this.systemRepository = systemRepository;
this.ioService = ioService;
this.repoChangedEvent = repoChangedEvent;
this.orgUnitChangedEvent = orgUnitChangedEvent;
this.changedEvent = changedEvent;
}
@Override
public void execute( final WatchKey watchKey,
final long localLastModifiedValue,
final AsyncWatchServiceCallback callback ) {
final long currentValue = getLastModified();
if ( currentValue > localLastModifiedValue ) {
callback.callback( currentValue );
// notify first repository
repoChangedEvent.fire( new SystemRepositoryChangedEvent() );
// then org unit
orgUnitChangedEvent.fire( new SystemRepositoryChangedEvent() );
// lastly all others
changedEvent.fire( new SystemRepositoryChangedEvent() );
}
}
private long getLastModified() {
final Path lastModifiedPath = ioService.get( systemRepository.getUri() ).resolve( ConfigurationServiceImpl.LAST_MODIFIED_MARKER_FILE );
return ioService.getLastModifiedTime( lastModifiedPath ).toMillis();
}
}