package com.github.wicketoracle.app.user.delegate.mgr; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation; import org.apache.wicket.datetime.PatternDateConverter; import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.Localizer; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.StatelessForm; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.RefreshingView; import org.apache.wicket.markup.repeater.util.ModelIteratorAdapter; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.wicketoracle.app.exception.NothingToDoException; import com.github.wicketoracle.html.form.choice.IntegerSelectChoice; import com.github.wicketoracle.html.form.choice.SelectChoiceList; import com.github.wicketoracle.html.form.choice.StringSelectChoice; import com.github.wicketoracle.html.form.choice.YesNoChoice; import com.github.wicketoracle.html.page.StandardPage; import com.github.wicketoracle.html.panel.menu.PostLoginMenuPanelFactory; import com.github.wicketoracle.session.Session; @AuthorizeInstantiation( RequiredRoles.ROLE_DELEGATE_APP_USER_MGR ) public final class DelegateUserMgrPage extends StandardPage { private static final Logger LOGGER = LoggerFactory.getLogger( DelegateUserMgrPage.class ); private final Panel menuPanel = PostLoginMenuPanelFactory.getPostLoginMenuPanel(); private final SearchForm searchForm = new SearchForm( "searchUserForm" ); private final MgrForm mgrForm = new MgrForm( "mgrForm" ); private boolean isFirstRender = true; /** * */ public DelegateUserMgrPage() { add( menuPanel ); add( searchForm ); add( mgrForm ); mgrForm.setVisible( false ); } /** * */ public void onBeforeRender() { if ( ! isFirstRender ) { mgrForm.refreshUsers( searchForm.getUserSearchChoices() ); } isFirstRender = false; super.onBeforeRender(); } /** * * @author Andrew Hall * */ private final class SearchForm extends Form<UserSearchChoices> { private static final long serialVersionUID = 1L; private UserSearchChoices userSearchChoices = new UserSearchChoices( ); private final TextField<String> usernameTextField = new TextField<String>( "username" , new PropertyModel<String>( userSearchChoices , "username" ) ); private final YesNoChoice isEnabledDropDownChoice = new YesNoChoice( "isEnabled" , new PropertyModel<StringSelectChoice>( userSearchChoices , "isEnabled" ) ); private final YesNoChoice isTracingEnabledDropDownChoice = new YesNoChoice( "isTracingEnabled" , new PropertyModel<StringSelectChoice>( userSearchChoices , "isTracingEnabled" ) ); private final DropDownChoice<IntegerSelectChoice> dbRoleDropDownChoice = new DropDownChoice<IntegerSelectChoice>( "dbRole" ); private SelectChoiceList<IntegerSelectChoice> dbRoleData; /** * * @param pId */ public SearchForm( final String pId ) { super( pId ); isEnabledDropDownChoice.setNullValid( true ).setRequired( false ); isTracingEnabledDropDownChoice.setNullValid( true ).setRequired( false ); add( usernameTextField ); add( isEnabledDropDownChoice ); add( isTracingEnabledDropDownChoice ); /* retrieve the */ final Session session = ( Session ) getSession(); OracleDelegateUserMgrDAO dataService = null; Map<String , SelectChoiceList<IntegerSelectChoice>> selectListData = null; try { dataService = new OracleDelegateUserMgrDAO( session.getUsername() , session.getPassword() ); selectListData = dataService.getKeyValueRefData(); } catch ( SQLException sqle ) { LOGGER.error ( "SQL Exception when retrieving ref. data for user management search form -> {}; error code -> {}; sql state -> {}" , new Object [ ] { sqle.getMessage() , sqle.getErrorCode() , sqle.getSQLState() } ); error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } finally { if ( ! dataService.closeConnection() ) { error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } } dbRoleData = selectListData.get( "DBRL" ); if ( dbRoleData != null ) { dbRoleDropDownChoice.setChoices( dbRoleData ).setChoiceRenderer( dbRoleData ).setModel( new PropertyModel <IntegerSelectChoice>( userSearchChoices , "dbRole" ) ); dbRoleDropDownChoice.setNullValid( true ).setRequired( false ).setVisible( true ); } else { dbRoleDropDownChoice.setRequired( false ).setVisible( false ); } add( dbRoleDropDownChoice ); } public void onSubmit() { if ( getIsDebugInfoVisible() ) { info( "Search :: Username :: " + userSearchChoices.getUsername() ); info( "Search :: Is account enabled :: " + userSearchChoices.getIsEnabled().getKey() ); info( "Search :: Is tracing enabled :: " + userSearchChoices.getIsTracingEnabled().getKey() ); info( "Search :: DB Role :: " + userSearchChoices.getDbRole().getKeyAsString() ); } } public UserSearchChoices getUserSearchChoices() { return userSearchChoices; } } /** * * @author Andrew Hall * */ private final class MgrForm extends StatelessForm<DelegateUser> { private static final long serialVersionUID = 1L; private transient Localizer localiser = getLocalizer(); private final Label usernameLabel = new Label( "LabelUsername" , localiser.getString( "LabelUsername" , this ) ); private final Label profileLabel = new Label( "LabelProfile" , localiser.getString( "LabelProfile" , this ) ); private final Label isEnabledLabel = new Label( "LabelIsEnabled" , localiser.getString( "LabelIsEnabled" , this ) ); private final Label isTracingEnabledLabel = new Label( "LabelIsTracingEnabled" , localiser.getString( "LabelIsTracingEnabled" , this ) ); private final Label dateCreatedLabel = new Label( "LabelDateCreated" , localiser.getString( "LabelDateCreated" , this ) ); private final Label changeRolesLabel = new Label( "LabelChangeRoles" , localiser.getString( "LabelChangeRoles" , this ) ); private final boolean canChangeRoles = ( ( Session ) getSession() ).getRoles().hasRole( RequiredRoles.ROLE_DGT_APP_USER_ROLE_MGR ); private transient List<DelegateUser> userList = new ArrayList<DelegateUser>(); public MgrForm( final String pId ) { super( pId ); add( usernameLabel ); add( profileLabel ); add( isEnabledLabel ); add( isTracingEnabledLabel ); add( dateCreatedLabel ); add( changeRolesLabel.setVisible( canChangeRoles ) ); add ( new RefreshingView<DelegateUser>( "UserList" ) { private static final long serialVersionUID = 1L; @Override protected Iterator<IModel<DelegateUser>> getItemModels() { return new ModelIteratorAdapter<DelegateUser>( userList.iterator() ) { @Override protected IModel<DelegateUser> model( final DelegateUser pObject ) { return new CompoundPropertyModel<DelegateUser>( pObject ); } }; } @Override protected void populateItem( final Item<DelegateUser> pItem ) { final boolean isUserTheCurrentUser = pItem.getModelObject().getUsername().equals( ( ( Session ) getSession() ).getUsername() ); pItem.add( new Label( "username" ) ); pItem.add( new Label( "profile" ) ); pItem.add( new YesNoChoice( "isEnabled" ).setEnabled( ! isUserTheCurrentUser ) ); pItem.add( new YesNoChoice( "isTracingEnabled" ) ); pItem.add( new DateLabel( "dateCreated" , new PatternDateConverter( "dd-MM-yyyy", false ) ) ); pItem.add ( new WebMarkupContainer ( "LabelLinkChangeRoles" ) .add ( new Link<DelegateUser>( "LinkChangeRoles" ) { private static final long serialVersionUID = 1L; @Override public void onClick() { setResponsePage( new DelegateUserRoleMgrPage( pItem.getModelObject() ) ); } } ) .setVisible( canChangeRoles ) ); } } ); } public void onSubmit() { /* retrieve the users matching the search criteria */ final Session session = ( Session ) getSession(); OracleDelegateUserMgrDAO dataService = null; try { dataService = new OracleDelegateUserMgrDAO( session.getUsername() , session.getPassword() ); dataService.updateUsers( userList ); dataService.doCommit(); info( getLocalizer().getString( "MessageSuccess" , this ) ); } catch ( NothingToDoException ntde ) { error( getLocalizer().getString( "NoWorkToDo" , this ) ); } catch ( SQLException sqle ) { LOGGER.error ( "SQL Exception when retrieving standard users -> {}; error code -> {}; sql state -> {}" , new Object [ ] { sqle.getMessage() , sqle.getErrorCode() , sqle.getSQLState() } ); error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } finally { if ( ! dataService.closeConnection() ) { error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } } } public void refreshUsers( final UserSearchChoices pSearchCriteria ) { /* retrieve the users matching the search criteria */ final Session session = ( Session ) getSession(); OracleDelegateUserMgrDAO dataService = null; try { dataService = new OracleDelegateUserMgrDAO( session.getUsername() , session.getPassword() ); userList = dataService.getUsers ( pSearchCriteria.getUsername() , pSearchCriteria.getIsEnabled().getKey() , pSearchCriteria.getIsTracingEnabled().getKey() , pSearchCriteria.getDbRole().getKey() ); if ( userList.size() > 0 ) { setVisible( true ); } else { info( getLocalizer().getString( "MessageNoDataFound" , this ) ); setVisible( false ); } } catch ( SQLException sqle ) { LOGGER.error ( "SQL Exception when retrieving standard users -> {}; error code -> {}; sql state -> {}" , new Object [ ] { sqle.getMessage() , sqle.getErrorCode() , sqle.getSQLState() } ); error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } finally { if ( ! dataService.closeConnection() ) { error( getLocalizer().getString( "MessageUnexpectedError" , this ) ); } } } } }