/*
* Copyright 2014 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.asset.management.client.editors.repository.wizard.pages;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import com.google.gwt.user.client.ui.Widget;
import org.guvnor.asset.management.client.editors.repository.wizard.CreateRepositoryWizardModel;
import org.guvnor.asset.management.client.i18n.Constants;
import org.guvnor.structure.client.editors.repository.RepositoryPreferences;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.organizationalunit.OrganizationalUnitService;
import org.guvnor.structure.repositories.RepositoryService;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.ErrorCallback;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.jboss.errai.ioc.client.container.IOC;
import org.jboss.errai.ioc.client.container.SyncBeanDef;
import org.jboss.errai.ioc.client.container.IOCResolutionException;
import org.uberfire.client.callbacks.Callback;
import org.uberfire.commons.data.Pair;
import org.uberfire.ext.widgets.common.client.callbacks.DefaultErrorCallback;
import org.uberfire.ext.widgets.core.client.resources.i18n.CoreConstants;
public class RepositoryInfoPage extends RepositoryWizardPage
implements
RepositoryInfoPageView.Presenter {
public interface RepositoryInfoPageHandler {
void managedRepositoryStatusChanged( boolean status );
}
private RepositoryInfoPageView view;
private Caller<OrganizationalUnitService> organizationalUnitService;
private Caller<RepositoryService> repositoryService;
private boolean isNameValid = false;
private boolean isOUValid = false;
private boolean isRepositoryStructurePageValid = false;
private Map<String, OrganizationalUnit> availableOrganizationalUnits = new HashMap<String, OrganizationalUnit>();
private boolean mandatoryOU = true;
private boolean isManagedRepository = false;
private RepositoryInfoPageHandler handler;
@Inject
public RepositoryInfoPage( RepositoryInfoPageView view,
Caller<OrganizationalUnitService> organizationalUnitService,
Caller<RepositoryService> repositoryService ) {
this.view = view;
view.init( this );
this.organizationalUnitService = organizationalUnitService;
this.repositoryService = repositoryService;
}
@Override
public String getTitle() {
return Constants.INSTANCE.RepositoryInfoPage();
}
@Override
public void isComplete( final Callback<Boolean> callback ) {
boolean completed = mandatoryOU ? isNameValid && isOUValid : isNameValid;
callback.callback( completed );
}
@Override
public void initialise() {
//no additional processing required
}
@Override
public void prepareView() {
init();
}
@Override
public Widget asWidget() {
return view.asWidget();
}
public void setHandler( RepositoryInfoPageHandler handler ) {
this.handler = handler;
}
public void onNameChange() {
String name = view.getName().trim();
model.setRepositoryName( name );
if ( !name.equals( view.getName() )) {
view.setName( name );
}
repositoryService.call( new RemoteCallback<Boolean>() {
@Override
public void callback( Boolean isValid ) {
if ( isValid ) {
view.clearNameErrorMessage();
} else {
view.setNameErrorMessage( Constants.INSTANCE.InvalidRepositoryName() );
}
if ( isValid != isNameValid ) {
isNameValid = isValid;
refreshRepositoryStructurePageStatus( );
}
} }, new DefaultErrorCallback() ).validateRepositoryName( model.getRepositoryName() );
}
public void onOUChange() {
final String selectedOU = view.getOrganizationalUnitName();
boolean newIsOUValid = selectedOU != null && !RepositoryInfoPageView.NOT_SELECTED.equals( selectedOU );
if ( mandatoryOU ) {
view.setValidOU( newIsOUValid );
}
model.setOrganizationalUnit( selectedOU != null ? availableOrganizationalUnits.get( selectedOU ) : null );
if ( isOUValid != newIsOUValid ) {
isOUValid = newIsOUValid;
refreshRepositoryStructurePageStatus( );
}
}
public void onManagedRepositoryChange() {
model.setManged( view.isManagedRepository() );
if ( isManagedRepository != view.isManagedRepository() ) {
isManagedRepository = view.isManagedRepository();
refreshRepositoryStructurePageStatus( );
}
}
private void refreshRepositoryStructurePageStatus( ) {
boolean newIsRepositoryStructurePageValid = isManagedRepository && isNameValid && isOUValid;
if ( newIsRepositoryStructurePageValid != isRepositoryStructurePageValid ) {
isRepositoryStructurePageValid = newIsRepositoryStructurePageValid;
if ( handler != null ) {
handler.managedRepositoryStatusChanged( isRepositoryStructurePageValid );
}
}
fireEvent();
}
@PostConstruct
protected void init() {
mandatoryOU = isOUMandatory();
if ( !mandatoryOU ) {
view.setVisibleOU( false );
}
//populate Organizational Units list box
organizationalUnitService.call( new RemoteCallback<Collection<OrganizationalUnit>>() {
@Override
public void callback( Collection<OrganizationalUnit> organizationalUnits ) {
initOrganizationalUnits( organizationalUnits );
}
},
new ErrorCallback<Message>() {
@Override
public boolean error( final Message message,
final Throwable throwable ) {
view.alert( CoreConstants.INSTANCE.CantLoadOrganizationalUnits() + " \n" + message.toString() );
return false;
}
}
).getOrganizationalUnits();
}
@Override
public void setModel( CreateRepositoryWizardModel model ) {
super.setModel( model );
model.setMandatoryOU( mandatoryOU );
model.setManged( view.isManagedRepository() );
}
public void enableManagedRepoCreation( boolean enable ) {
view.enabledManagedRepositoryCreation( enable );
}
protected boolean isOUMandatory() {
try {
final SyncBeanDef<RepositoryPreferences> beanDef = IOC.getBeanManager().lookupBean( RepositoryPreferences.class );
return beanDef == null || beanDef.getInstance().isOUMandatory();
} catch ( IOCResolutionException exception ) {
}
return true;
}
protected void initOrganizationalUnits( Collection<OrganizationalUnit> organizationalUnits ) {
List<Pair<String, String>> organizationalUnitsInfo = new ArrayList<Pair<String, String>>( );
if ( organizationalUnits != null && !organizationalUnits.isEmpty() ) {
for ( OrganizationalUnit organizationalUnit : organizationalUnits ) {
availableOrganizationalUnits.put( organizationalUnit.getName(),
organizationalUnit );
organizationalUnitsInfo.add( new Pair( organizationalUnit.getName(), organizationalUnit.getName() ) );
}
}
view.initOrganizationalUnits( organizationalUnitsInfo );
}
}