/*
* Copyright 2016 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.
* 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.guvnor.structure.client.editors.context;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.guvnor.structure.repositories.NewBranchEvent;
import org.guvnor.structure.repositories.NewRepositoryEvent;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryRemovedEvent;
import org.guvnor.structure.repositories.RepositoryService;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.uberfire.client.callbacks.Callback;
/**
* Context that keeps track of repositories and branches. Used in Guvnor Administration perspective,
* more specifically by the Guvnor Structure module.
*/
@ApplicationScoped
public class GuvnorStructureContext {
private final HashMap<GuvnorStructureContextChangeHandler.HandlerRegistration, GuvnorStructureContextChangeHandler> handlers = new HashMap<>();
private final HashMap<GuvnorStructureContextBranchChangeHandler.HandlerRegistration, GuvnorStructureContextBranchChangeHandler> branchChangeHandlers = new HashMap<>();
private final HashMap<String, String> aliasBranch = new HashMap<>();
private Caller<RepositoryService> repositoryService;
public GuvnorStructureContext() {
}
@Inject
public GuvnorStructureContext( final Caller<RepositoryService> repositoryService ) {
this.repositoryService = repositoryService;
}
public void getRepositories( final Callback<Collection<Repository>> callback ) {
repositoryService.call( new RemoteCallback<Collection<Repository>>() {
@Override
public void callback( final Collection<Repository> response ) {
final Collection<String> foundAliases = updateRepositories( response );
removeMissingAliases( foundAliases );
callback.callback( response );
}
} ).getRepositories();
}
private Collection<String> updateRepositories( final Collection<Repository> response ) {
final Collection<String> foundAliases = new ArrayList<>();
for ( final Repository repository : response ) {
foundAliases.add( repository.getAlias() );
updateRepository( repository );
}
return foundAliases;
}
private void updateRepository( final Repository repository ) {
if ( isNewRepository( repository ) ) {
aliasBranch.put( repository.getAlias(),
repository.getDefaultBranch() );
} else {
updateBranch( repository );
}
}
private void updateBranch( final Repository repository ) {
final String branch = aliasBranch.get( repository.getAlias() );
if ( branch == null || hasBranchBeenRemoved( repository,
branch ) ) {
aliasBranch.put( repository.getAlias(),
repository.getDefaultBranch() );
}
}
private boolean isNewRepository( final Repository repository ) {
return !aliasBranch.containsKey( repository.getAlias() );
}
private boolean hasBranchBeenRemoved( final Repository repository,
final String branch ) {
return !repository.getBranches().contains( branch );
}
private void removeMissingAliases( final Collection<String> foundAliases ) {
for ( final String missingAlias : getMissingAliases( foundAliases ) ) {
aliasBranch.remove( missingAlias );
}
}
private Collection<String> getMissingAliases( final Collection<String> foundAliases ) {
final Collection<String> missingAliases = new ArrayList<>();
for ( final String alias : aliasBranch.keySet() ) {
if ( !foundAliases.contains( alias ) ) {
missingAliases.add( alias );
}
}
return missingAliases;
}
public GuvnorStructureContextChangeHandler.HandlerRegistration addGuvnorStructureContextChangeHandler( final GuvnorStructureContextChangeHandler handler ) {
final GuvnorStructureContextChangeHandler.HandlerRegistration handlerRegistration = new GuvnorStructureContextChangeHandler.HandlerRegistration();
handlers.put( handlerRegistration,
handler );
return handlerRegistration;
}
public GuvnorStructureContextBranchChangeHandler.HandlerRegistration addGuvnorStructureContextBranchChangeHandler( final GuvnorStructureContextBranchChangeHandler handler ) {
final GuvnorStructureContextBranchChangeHandler.HandlerRegistration handlerRegistration = new GuvnorStructureContextBranchChangeHandler.HandlerRegistration();
branchChangeHandlers.put( handlerRegistration,
handler );
return handlerRegistration;
}
public void changeBranch( final String alias,
final String branch ) {
aliasBranch.put( alias,
branch );
for ( final GuvnorStructureContextBranchChangeHandler handler : branchChangeHandlers.values() ) {
handler.onBranchChange( alias,
branch );
}
}
public void onNewRepository( final @Observes NewRepositoryEvent event ) {
final Repository newRepository = event.getNewRepository();
aliasBranch.put( newRepository.getAlias(),
newRepository.getDefaultBranch() );
for ( final GuvnorStructureContextChangeHandler handler : handlers.values() ) {
handler.onNewRepositoryAdded( newRepository );
}
}
public void onNewBranch( final @Observes NewBranchEvent event ) {
for ( final GuvnorStructureContextChangeHandler handler : handlers.values() ) {
handler.onNewBranchAdded( event.getRepositoryAlias(), event.getBranchName(), event.getBranchPath() );
}
}
public void onRepositoryRemoved( final @Observes RepositoryRemovedEvent event ) {
aliasBranch.remove( event.getRepository().getAlias() );
for ( final GuvnorStructureContextChangeHandler handler : handlers.values() ) {
handler.onRepositoryDeleted( event.getRepository() );
}
}
public void removeHandler( final GuvnorStructureContextChangeHandler.HandlerRegistration handlerRegistration ) {
handlers.remove( handlerRegistration );
}
public void removeHandler( final GuvnorStructureContextBranchChangeHandler.HandlerRegistration handlerRegistration ) {
branchChangeHandlers.remove( handlerRegistration );
}
public String getCurrentBranch( final String alias ) {
return aliasBranch.get( alias );
}
}