/*
* Copyright 2012 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.organizationalunit.manager.client.editor;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import com.google.gwt.user.client.Command;
import org.guvnor.organizationalunit.manager.client.editor.popups.AddOrganizationalUnitPopup;
import org.guvnor.organizationalunit.manager.client.editor.popups.EditOrganizationalUnitPopup;
import org.guvnor.organizationalunit.manager.client.resources.i18n.OrganizationalUnitManagerConstants;
import org.guvnor.structure.client.security.OrganizationalUnitController;
import org.guvnor.structure.config.SystemRepositoryChangedEvent;
import org.guvnor.structure.events.AfterCreateOrganizationalUnitEvent;
import org.guvnor.structure.events.AfterDeleteOrganizationalUnitEvent;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.organizationalunit.OrganizationalUnitService;
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.annotations.WorkbenchPartTitle;
import org.uberfire.client.annotations.WorkbenchPartView;
import org.uberfire.client.annotations.WorkbenchScreen;
import org.uberfire.client.mvp.UberView;
import org.uberfire.commons.validation.PortablePreconditions;
import org.uberfire.ext.widgets.common.client.callbacks.HasBusyIndicatorDefaultErrorCallback;
import org.uberfire.lifecycle.OnOpen;
import org.uberfire.lifecycle.OnStartup;
import org.uberfire.security.annotations.ResourceCheck;
import static org.guvnor.structure.client.security.OrganizationalUnitController.*;
@ApplicationScoped
//The identifier has been preserved from kie-wb-common so existing .niogit System repositories are not broken
@WorkbenchScreen(identifier = "org.kie.workbench.common.screens.organizationalunit.manager.OrganizationalUnitManager")
public class OrganizationalUnitManagerPresenterImpl implements OrganizationalUnitManagerPresenter {
private OrganizationalUnitManagerView view;
private Caller<OrganizationalUnitService> organizationalUnitService;
private Caller<RepositoryService> repositoryService;
private AddOrganizationalUnitPopup addOrganizationalUnitPopup;
private EditOrganizationalUnitPopup editOrganizationalUnitPopup;
private Event<AfterCreateOrganizationalUnitEvent> createOUEvent;
private Event<AfterDeleteOrganizationalUnitEvent> deleteOUEvent;
private Collection<Repository> allRepositories;
private Collection<OrganizationalUnit> allOrganizationalUnits;
private OrganizationalUnitController controller;
public OrganizationalUnitManagerPresenterImpl() {
//For CDI proxying
}
@Inject
public OrganizationalUnitManagerPresenterImpl( final OrganizationalUnitManagerView view,
final Caller<OrganizationalUnitService> organizationalUnitService,
final Caller<RepositoryService> repositoryService,
final OrganizationalUnitController organizationalUnitController,
final AddOrganizationalUnitPopup addOrganizationalUnitPopup,
final EditOrganizationalUnitPopup editOrganizationalUnitPopup,
final Event<AfterCreateOrganizationalUnitEvent> createOUEvent,
final Event<AfterDeleteOrganizationalUnitEvent> deleteOUEvent ) {
this.view = PortablePreconditions.checkNotNull( "view",
view );
this.organizationalUnitService = PortablePreconditions.checkNotNull( "organizationalUnitService",
organizationalUnitService );
this.repositoryService = PortablePreconditions.checkNotNull( "repositoryService",
repositoryService );
this.controller= PortablePreconditions.checkNotNull( "organizationalUnitController",
organizationalUnitController );
this.addOrganizationalUnitPopup = PortablePreconditions.checkNotNull( "addOrganizationalUnitPopup",
addOrganizationalUnitPopup );
this.editOrganizationalUnitPopup = PortablePreconditions.checkNotNull( "editOrganizationalUnitPopup",
editOrganizationalUnitPopup );
this.createOUEvent = PortablePreconditions.checkNotNull( "createOUEvent",
createOUEvent );
this.deleteOUEvent = PortablePreconditions.checkNotNull( "deleteOUEvent",
deleteOUEvent );
}
@PostConstruct
public void setup() {
addOrganizationalUnitPopup.init( this );
editOrganizationalUnitPopup.init( this );
}
@OnStartup
public void onStartup() {
view.reset();
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
view.setAddOrganizationalUnitEnabled(controller.canCreateOrgUnits());
view.setEditOrganizationalUnitEnabled(false);
view.setDeleteOrganizationalUnitEnabled(false);
repositoryService.call( new RemoteCallback<Collection<Repository>>() {
@Override
public void callback( final Collection<Repository> repositories ) {
OrganizationalUnitManagerPresenterImpl.this.allRepositories = repositories;
loadOrganizationalUnits();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).getRepositories();
}
@OnOpen
public void onOpen() {
view.reset();
}
@WorkbenchPartTitle
public String getTitle() {
return OrganizationalUnitManagerConstants.INSTANCE.OrganizationalUnitManagerTitle();
}
@WorkbenchPartView
public UberView<OrganizationalUnitManagerPresenter> getView() {
return view;
}
private Collection<Repository> getAllowedRepositories(Collection<Repository> repositories) {
Collection<Repository> available = new ArrayList<>();
for (Repository repo : repositories) {
if (controller.canReadRepository(repo)) {
available.add(repo);
}
}
return available;
}
@Override
public void loadOrganizationalUnits() {
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnitService.call( new RemoteCallback<Collection<OrganizationalUnit>>() {
@Override
public void callback( final Collection<OrganizationalUnit> organizationalUnits ) {
OrganizationalUnitManagerPresenterImpl.this.allOrganizationalUnits = organizationalUnits;
view.setOrganizationalUnits( organizationalUnits );
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).getOrganizationalUnits();
}
@Override
@ResourceCheck(action=ORG_UNIT_READ)
public void organizationalUnitSelected( final OrganizationalUnit organizationalUnit ) {
//Reload rather than using cached Object as it could have been changed server-side (adding/deleting Repositories)
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnitService.call( new RemoteCallback<OrganizationalUnit>() {
@Override
public void callback( final OrganizationalUnit organizationalUnit ) {
Collection<Repository> onlyAllowed = getAllowedRepositories(organizationalUnit.getRepositories());
view.setOrganizationalUnitRepositories(onlyAllowed, getAvailableRepositories());
view.setEditOrganizationalUnitEnabled(controller.canUpdateOrgUnit(organizationalUnit));
view.setDeleteOrganizationalUnitEnabled(controller.canDeleteOrgUnit(organizationalUnit));
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).getOrganizationalUnit( organizationalUnit.getName() );
}
private Collection<Repository> getAvailableRepositories() {
final Collection<Repository> availableRepositories = new ArrayList<Repository>();
availableRepositories.addAll( allRepositories );
for ( OrganizationalUnit ou : allOrganizationalUnits ) {
availableRepositories.removeAll( ou.getRepositories() );
}
return availableRepositories;
}
@Override
@ResourceCheck(type=ORG_UNIT_TYPE, action=ORG_UNIT_CREATE)
public void addNewOrganizationalUnit() {
addOrganizationalUnitPopup.show();
}
@Override
public void checkIfOrganizationalUnitExists( final String organizationalUnitName,
final Command onSuccessCommand,
final Command onFailureCommand ) {
//Check the Organizational Unit doesn't already exist
organizationalUnitService.call( new RemoteCallback<OrganizationalUnit>() {
@Override
public void callback( final OrganizationalUnit organizationalUnit ) {
if ( organizationalUnit == null ) {
onSuccessCommand.execute();
} else {
onFailureCommand.execute();
}
}
} ).getOrganizationalUnit( organizationalUnitName );
}
@Override
@ResourceCheck(type=ORG_UNIT_TYPE, action=ORG_UNIT_CREATE)
public void createNewOrganizationalUnit( final String organizationalUnitName,
final String organizationalUnitOwner,
final String defaultGroupId ) {
final Collection<Repository> repositories = new ArrayList<Repository>();
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnitService.call( new RemoteCallback<OrganizationalUnit>() {
@Override
public void callback( final OrganizationalUnit newOrganizationalUnit ) {
createOUEvent.fire( new AfterCreateOrganizationalUnitEvent( newOrganizationalUnit ) );
allOrganizationalUnits.add( newOrganizationalUnit );
view.addOrganizationalUnit( newOrganizationalUnit );
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).createOrganizationalUnit( organizationalUnitName,
organizationalUnitOwner,
defaultGroupId,
repositories );
}
@Override
@ResourceCheck(action=ORG_UNIT_UPDATE)
public void editOrganizationalUnit( final OrganizationalUnit organizationalUnit ) {
editOrganizationalUnitPopup.setOrganizationalUnit( organizationalUnit );
editOrganizationalUnitPopup.show();
}
@Override
@ResourceCheck(type=ORG_UNIT_TYPE, action=ORG_UNIT_UPDATE)
public void saveOrganizationalUnit( final String organizationalUnitName,
final String organizationalUnitOwner,
final String defaultGroupId ) {
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnitService.call( new RemoteCallback<OrganizationalUnit>() {
@Override
public void callback( final OrganizationalUnit response ) {
loadOrganizationalUnits();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).updateOrganizationalUnit( organizationalUnitName,
organizationalUnitOwner,
defaultGroupId );
}
@Override
@ResourceCheck(action=ORG_UNIT_DELETE)
public void deleteOrganizationalUnit( final OrganizationalUnit organizationalUnit ) {
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnitService.call( new RemoteCallback<Void>() {
@Override
public void callback( final Void v ) {
deleteOUEvent.fire( new AfterDeleteOrganizationalUnitEvent( organizationalUnit ) );
allOrganizationalUnits.remove( organizationalUnit );
view.deleteOrganizationalUnit( organizationalUnit );
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).removeOrganizationalUnit( organizationalUnit.getName() );
}
@Override
@ResourceCheck(action=ORG_UNIT_UPDATE)
public void addOrganizationalUnitRepository( final OrganizationalUnit organizationalUnit,
final Repository repository ) {
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnit.getRepositories().add( repository );
organizationalUnitService.call( new RemoteCallback<Void>() {
@Override
public void callback( final Void v ) {
view.setOrganizationalUnitRepositories( organizationalUnit.getRepositories(),
getAvailableRepositories() );
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).addRepository( organizationalUnit,
repository );
}
@Override
@ResourceCheck(action= ORG_UNIT_UPDATE)
public void removeOrganizationalUnitRepository( final OrganizationalUnit organizationalUnit,
final Repository repository ) {
view.showBusyIndicator( OrganizationalUnitManagerConstants.INSTANCE.Wait() );
organizationalUnit.getRepositories().remove( repository );
organizationalUnitService.call( new RemoteCallback<Void>() {
@Override
public void callback( final Void v ) {
view.setOrganizationalUnitRepositories( organizationalUnit.getRepositories(),
getAvailableRepositories() );
view.hideBusyIndicator();
}
},
new HasBusyIndicatorDefaultErrorCallback( view ) ).removeRepository( organizationalUnit,
repository );
}
@Override
public void checkValidGroupId( final String proposedGroupId,
RemoteCallback<Boolean> callback ) {
organizationalUnitService.call( callback,
new HasBusyIndicatorDefaultErrorCallback( view ) ).isValidGroupId( proposedGroupId );
}
@Override
public void getSanitizedGroupId( String proposedGroupId,
RemoteCallback<String> callback ) {
organizationalUnitService.call( callback,
new HasBusyIndicatorDefaultErrorCallback( view ) ).getSanitizedDefaultGroupId( proposedGroupId );
}
public void onRepositoryAddedEvent( @Observes NewRepositoryEvent event ) {
onStartup();
}
public void onRepositoryRemovedEvent( @Observes RepositoryRemovedEvent event ) {
onStartup();
}
public void onSystemRepositoryChanged( @Observes SystemRepositoryChangedEvent event ) {
onStartup();
}
}