/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or any later version.
*
* Squale is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squaleweb.gwt.motionchart.server;
import java.text.DateFormat;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.squale.jraf.commons.exception.JrafEnterpriseException;
import org.squale.squalecommon.enterpriselayer.facade.quality.FactorResultFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.QualityResultFacade;
import org.squale.squalecommon.enterpriselayer.facade.quality.FactorResultFacade.MotionChartApplicationFactorData;
import org.squale.squalecommon.enterpriselayer.facade.quality.QualityResultFacade.MotionChartApplicationMetricData;
import org.squale.squaleweb.applicationlayer.formbean.LogonBean;
import org.squale.squaleweb.applicationlayer.formbean.component.ApplicationForm;
import org.squale.squaleweb.gwt.motionchart.client.DataService;
import org.squale.squaleweb.gwt.motionchart.client.data.Application;
import org.squale.squaleweb.gwt.motionchart.client.data.AuditValues;
import org.squale.squaleweb.gwt.motionchart.client.data.MotionChartData;
import org.squale.squaleweb.resources.WebMessages;
import org.squale.welcom.struts.util.WConstants;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
* The server side implementation of the RPC service that provides data to the motion chart.
*
* @author Fabrice BELLINGARD
*/
public class DataServiceImpl
extends RemoteServiceServlet
implements DataService
{
private static final long serialVersionUID = -8491108470852437054L;
/**
* Logger
*/
private static Log log = LogFactory.getLog( DataServiceImpl.class );
public MotionChartData getData()
{
MotionChartData data = new MotionChartData();
try
{
// let's find the factors that exist in the database
List<String> factorsList = FactorResultFacade.findFactorNames();
for ( String factorDatabaseName : factorsList )
{
String factorName = WebMessages.getString( getThreadLocalRequest(), "rule." + factorDatabaseName );
data.addFactor( factorDatabaseName, factorName );
}
// lets' now retrieve the data that is needed for the Motion Chart
for ( ApplicationForm app : findApplicationsForUser() )
{
Application applicationData = data.createApplication( app.getApplicationName() );
// Metriques
MotionChartApplicationMetricData metricsAppData =
QualityResultFacade.findMetricsForMotionChart( app.getId() );
for ( Iterator<Object[]> iterator = metricsAppData.iterator(); iterator.hasNext(); )
{
Object[] metricData = (Object[]) iterator.next();
AuditValues audit =
applicationData.getAudit( metricsAppData.getAuditId( metricData ),
metricsAppData.getAuditDate( metricData ) );
if ( metricsAppData.getMetricName( metricData ).equals( "numberOfCodeLines" ) )
{
audit.addLinesOfCode( metricsAppData.getMetricValue( metricData ) );
}
else
{
// this is sumVg for the moment
audit.addVg( metricsAppData.getMetricValue( metricData ) );
}
}
// Factors
MotionChartApplicationFactorData factorsAppData =
FactorResultFacade.findFactorsForMotionChart( app.getId() );
for ( Iterator<Object[]> iterator = factorsAppData.iterator(); iterator.hasNext(); )
{
Object[] factorData = (Object[]) iterator.next();
AuditValues audit = applicationData.getAudit( factorsAppData.getAuditId( factorData ) );
audit.addFactorValue( factorsAppData.getFactorName( factorData ),
factorsAppData.getFactorValue( factorData ) );
}
}
}
catch ( JrafEnterpriseException e )
{
log.warn( "Error while generating data needed for the Motion Chart:" + e.getMessage(), e );
}
// just for debug purposes
printMotionChartDataInLog( data );
return data;
}
/**
* Finds the application that the user can see
*
* @return the list of applications
*/
@SuppressWarnings( "unchecked" )
private List<ApplicationForm> findApplicationsForUser()
{
HttpSession httpSession = getThreadLocalRequest().getSession();
LogonBean userLogonBean = (LogonBean) httpSession.getAttribute( WConstants.USER_KEY );
List<ApplicationForm> apps = userLogonBean.getApplicationsList();
return apps;
}
/**
* Just for debugging purposes
*
* @param data the data generated for the Motion Chart
*/
private void printMotionChartDataInLog( MotionChartData data )
{
if ( log.isDebugEnabled() )
{
log.debug( "=============================================================" );
Collection<Application> computedApps = data.getApplications();
for ( Application application : computedApps )
{
log.debug( application.getName() );
Collection<AuditValues> audits = application.getAuditValues();
for ( AuditValues auditValues : audits )
{
log.debug( "\t" + DateFormat.getInstance().format( auditValues.getDate() ) );
log.debug( "\t\tLOC : " + auditValues.getLinesOfCode() );
log.debug( "\t\tvG : " + auditValues.getComplexity() );
}
}
log.debug( "=============================================================" );
}
}
}