package com.github.wicketoracle.app.report;
import java.sql.SQLException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.tree.BaseTree;
import org.apache.wicket.markup.html.tree.LinkTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.wicketoracle.html.page.StandardPage;
import com.github.wicketoracle.html.panel.TreeControlPanel;
import com.github.wicketoracle.html.panel.menu.PostLoginMenuPanelFactory;
import com.github.wicketoracle.session.Session;
@AuthorizeInstantiation( RequiredRoles.ROLE_REPORT_USER )
public final class ReportPage extends StandardPage
{
private static final Logger LOGGER = LoggerFactory.getLogger( ReportPage.class );
private final Panel menuPanel = PostLoginMenuPanelFactory.getPostLoginMenuPanel();
private final ReportTreeView reportTreeView = new ReportTreeView( "ViewReportTree" );
/**
* Constructor that is invoked when page is invoked without a session.
*/
public ReportPage()
{
add( menuPanel );
add( reportTreeView );
}
/**
*
* @author Andrew Hall
*
*/
private class ReportTreeView extends WebMarkupContainer
{
private static final long serialVersionUID = 1L;
private final LinkTree reportTree = getReportTree();
private final TreeControlPanel treeControlPanel = new TreeControlPanel( "PanelTreeControl" , reportTree );
/**
*
* @return
*/
private LinkTree getReportTree()
{
final Session session = ( Session ) getSession();
ReportDAO dataService = null;
TreeModel reportTreeModel = null;
try
{
dataService = new ReportDAO( session.getUsername() , session.getPassword() );
reportTreeModel = dataService.getReportTree( new DefaultMutableTreeNode( getLocalizer().getString( "LabelReportTreeRootNode" , this ) ) );
}
catch ( SQLException sqle )
{
LOGGER.error
(
"SQL Exception when constructing reports link-tree -> {}; error code -> {}; sql state -> {}"
, new Object [ ]
{
sqle.getMessage()
, sqle.getErrorCode()
, sqle.getSQLState()
}
);
error( getLocalizer().getString( "MessageUnexpectedError" , this ) );
}
finally
{
if ( ! dataService.closeConnection() )
{
final String errmsg = getLocalizer().getString( "MessageUnexpectedError" , this );
error( errmsg );
}
}
return new LinkTree( "TreeReport" , reportTreeModel )
{
private static final long serialVersionUID = 1L;
protected void onNodeLinkClicked( final Object pNode, final BaseTree pTree, final AjaxRequestTarget pTarget )
{
Object reportPage = ( ( DefaultMutableTreeNode ) pNode ).getUserObject();
if ( reportPage instanceof Report )
{
if ( ( ( Session ) getSession() ).getRoles().hasRole( ( ( Report ) reportPage ).getDbrlName() ) )
{
try
{
setResponsePage( Class.forName( ( ( Report ) reportPage ).getTarget() ).asSubclass( StandardPage.class ) );
}
catch ( ClassNotFoundException cnfe )
{
LOGGER.error( "ClassNotFoundException when accessing report page -> {}", cnfe.getMessage() );
error( getLocalizer().getString( "MessageInaccessibleReport" , this ) );
}
}
else
{
LOGGER.error( "Permission denied when attempting to access -> {}", ( ( Report ) reportPage ).getTarget() );
error( getLocalizer().getString( "MessagePermissionDenied" , this ) );
}
}
}
};
}
/**
*
* @param pId
*/
public ReportTreeView( final String pId )
{
super( pId );
reportTree.setRootLess( false );
reportTree.getTreeState().expandAll();
add( reportTree );
add( treeControlPanel );
}
/**
*
*/
@Override
public void onBeforeRender()
{
final TreeModel treeModel = reportTree.getModelObject();
final boolean isData = ( treeModel.getChildCount( treeModel.getRoot() ) >= 1 );
if ( ! isData )
{
info( getLocalizer().getString( "MessageNoDataFound" , this ) );
setVisible( false );
}
super.onBeforeRender();
}
}
}