2013-03-14 17 views
7

Tworzę wstępny, obszerny raport z analizy statycznego kodu o naszej aplikacji WWW Java/JSP (dziedzictwo oczywiście ;-) w celu zarządzania w celu podniesienia świadomości problemów jakościowych. Główny kod Java nie stanowi problemu, dostępnych jest wiele bezpłatnych narzędzi, np. PMD, Checkstyle, Classcycle itp.Jakie narzędzia lub proces można użyć do statycznej analizy stron JSP?

Ale co ze stronami JSP? W naszych JSP jest osadzony znaczny kod Java (niestety) i należy to przeanalizować. Z jakich narzędzi mogę skorzystać lub jakiego procesu należy wykonać, aby statycznie analizować strony JSP?

  • Wiem o nowej funkcjonalności PMD 5 obejmującej JSP, czy warto ją poznać?
  • W jakiś sposób mogę wygenerować serwlety źródłowe stron JSP i użyć podstawowych narzędzi do analizy Java, jeśli tak, to jaki jest najłatwiejszy sposób uzyskania źródła Java dla stron JSP?

Odpowiedz

3

jak Henry wskazał poprawnie, dobry metryczny fo r JSP to "liczba linii kodu skryptu". Można to zrobić za pomocą wyrażeń regularnych.

Uważam, że stosunek linii kodu do linii HTML (=LoC_Java/LoC_Html) jest najbardziej ekspresyjny: im mniejsza jest ta liczba, tym lepiej.Współczynniki do 20 lub 30% wyglądają dobrze, ale wartości powyżej 50% lub nawet> 1 to bad. W mojej analizie znalazłem JSP o proporcjach do 6 (naprawdę źle).

Również liczba dyrektyw stron zapewnia dokładny wgląd. Ponieważ liczba ta jest głównie spowodowana importem, wysokie liczby wskazują na duże sprzężenie.

Podobne wskaźniki są dostępne w PMD, która ma wartość JSP Ruleset. Jest oparty na analizie strony HTML i jest w stanie zgłosić liczbę skryptletów, długość skryptletów, zduplikowane importowanie i problemy z kodowaniem, jak również zwykłe szablony anty-HTML.

1

Nie chcę zabrzmieć zgorzkniałym, ale co próbują się z tego wydostać?

Myślę (i mogę się mylić), że uzyskanie metryk jakości kodu na stronie JSP nie przydaje się, ponieważ fundament jest w rzeczywistości bardzo złą praktyką.

Osobiście staram się zainwestować wszelkie zasoby lub czas w zastanowienie się, jak przenieść logikę z JSP do MVC lub DCI.

+0

Ty za pytanie. To duży projekt i jestem nowy. Istnieje ponad 500 stron JSP i nie mogę sprawdzić każdego z nich. Widziałem, że niektóre z logiką są mieszane, ale potrzeba oceny, jak zły/powszechny jest problem. W zależności od tego możemy pracować nad jego naprawieniem (lub naprawieniem czegoś innego, ponieważ istnieje wiele opcji ;-) –

0

Szczerze mówiąc ta analiza (jeśli to możliwe) nie da ci nic. Wstawiony kod wewnątrz JSP jest do niczego. Jedynym rozwiązaniem jest przeniesienie tych przynajmniej w klasie usług, jeśli początkowo nie jest możliwa migracja do jakiejkolwiek struktury MVC. Później te klasy usług mogą być ponownie wykorzystane i przeanalizowane łatwiej.

Przykład bolesnej kodu JSP i pracował ostatnio: system ma 9 lat

oListCode.setDB(driverclass, databaseurl, databasetype.intValue()); 
java.util.Vector oVecActiveStatusListCodes = oListCode.getListCodes(13, user.getAdminId()); 


java.text.DecimalFormat dformat = new java.text.DecimalFormat("###0.00"); 
java.text.DecimalFormat averageformat = new java.text.DecimalFormat("###0.##"); 

java.util.Vector userDirectoryVector = new java.util.Vector(); 

String searchoptionvalue = request.getParameter("iscombinesearch"); 
if (searchoptionvalue != null && searchoptionvalue.equals("on")) { 
    java.util.Vector oVectorStudents = (java.util.Vector) session.getAttribute("studentsearchresult"); 

    if (oVectorStudents != null) { 
     oVector.addAll(oVectorStudents); 
    } 
} 


java.util.Vector<StatusSequenceInfo> oStaSeqVector = student.getStatusSequence(user.getAdminId()); 
java.util.Vector<StatusSequenceInfo> oEnrollStatusvecto = student.getProgramStatus(user.getAdminId()); 


String parameterList = "?columns=" + java.net.URLEncoder.encode(columns, "UTF-8") + 
        "&activestatus=" + activestatus + 
        "&studenttype=" + studenttype + 
        "&faith=" + faith + 
        "&race=" + race + 
        "&levelid=" + levelid + 
        "&levelidlist=" + levelidlist + 
        "&curriculumid=" + curriculumid + 
        "&programmeid=" + programmeid + 
        "&programmelevelid=" + programmelevelid + 
        "&semesterid=" + semesterid + 
        "&sex=" + sex + 
        "&idnumber=" + java.net.URLEncoder.encode(idnumber, "UTF-8") + 
        "&batchnumber=" + java.net.URLEncoder.encode(batchnumber, "UTF-8") + 
        "&firstname=" + java.net.URLEncoder.encode(firstname, "UTF-8") + 
        "&middlename=" + java.net.URLEncoder.encode(middlename, "UTF-8") + 
        "&lastname=" + java.net.URLEncoder.encode(lastname, "UTF-8") + 
        "&nationality=" + java.net.URLEncoder.encode(nationality, "UTF-8") + 
        "&address=" + java.net.URLEncoder.encode(address, "UTF-8") + 
        "&city=" + java.net.URLEncoder.encode(city, "UTF-8") + 
        "&state=" + java.net.URLEncoder.encode(state, "UTF-8") + 
        "&zip=" + java.net.URLEncoder.encode(zip, "UTF-8") + 
        "&homephone=" + homephone + 
        "&email=" + email + 
        "&advisor=" + java.net.URLEncoder.encode(advisor, "UTF-8") + 
        "&dob=" + dob + 
        "&visaexpiredate=" + java.net.URLEncoder.encode(visaexpiredate, "UTF-8") + 
        "&regstatus=" + regStatus + 
        "&regstartDate=" + java.net.URLEncoder.encode(regstartDate, "UTF-8") + 
        "&regendDate=" + java.net.URLEncoder.encode(regendDate, "UTF-8") + 
        "&shashmap=" + shashmap + 
        "&studentcount=" + studentcount + extendedurl; 

String paginationLink = "admin_search_student_result.jsp" + parameterList; 
long totalpage = new Double(Math.ceil(new Double(studentcount).doubleValue()/number_of_student)).longValue();//for pagination 

String downloadStudentLink = "download_search_student_result.jsp" + parameterList + "&number_of_student=" + studentcount; 
String printStudentLink = "admin_print_search_student_result.jsp" + parameterList + "&from_row=" + from_row; 

%> 


<html <%if (user.getLanguageId()>0 && oDictionary.getLanguageInfo(user.getLanguageId()).getDirection()==1) out.print("dir='rtl'");%>> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/> 
<title><%if (user.getRole()==6) out.print(oDictionary.getTranslatedWord(userLanguageId, "Sub-Administrator", adminId)); else out.print(oDictionary.getTranslatedWord(userLanguageId, "Administrator", adminId));%></title> 
<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> 
<meta name="ProgId" content="FrontPage.Editor.Document"> 
<meta name="Microsoft Theme" content="blocks 000, default"> 
<meta name="Microsoft Border" content="tlb, default"> 

</head> 


<body bgcolor="#FFFFFF" text="#000000" link="#CC0000" vlink="#CC0000" alink="#CC0000" leftmargin=5 topmargin=5 marginheight="0" marginwidth="0" onResize="if (navigator.family == 'nn4') window.location.reload()"> 


<p> 
<table width=100%> 
<td> 
<img src="images/search.gif"> <b><font color="#666666" face="Arial, Arial, Helvetica" size="5"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Result", adminId)%> &nbsp;&nbsp;</font></b> 
</td> 
<td align=right> 
<table> 
<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=") != -1))) {%> 
<td> 
&nbsp;<img src="images/write.gif"> <font face=arial size=2 color="#666666"><b><a href="new_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "New Student", adminId)%></a></font></b> 
</td> 
<%} %> 
<td> 
&nbsp;<img src="images/search.gif"> <font face=arial size=2 color="#666666"><b><a href="admin_search_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Student", adminId)%></a></font></b> 
</td> 
<td> 
&nbsp;<img src="images/read.gif"> <font face=arial size=2 color="#666666"><b><a href="students.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Student Directory", adminId)%></a></font></b> 
</td> 
</table> 
</td> 
</table> 


<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=F]") != -1 || user.getOptions().indexOf("[STUDENT_RECORDS=V]") != -1))) {%> 

<table width="100%"> 
<tr> 
<td> 
    <%@ include file="paginate.jsp" %> 
</td> 

<td align="right"> 
<table> 
<tr> 
<td> 
<img src="images/download.jpg"> 
<a href="<%=downloadStudentLink%>" target=_><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Download search result", adminId)%>]</font></a> 
</td> 
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="<%=printStudentLink%>" target=_><img border=0 src="images/printer.gif"><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Print search result", adminId)%>]</font></a> 
</td> 
</tr> 
</table> 
</tr> 
</table> 

</font> 
<table border="0" cellpadding="1" cellspacing="0" style="border-collapse: collapse" width="100%" id="AutoNumber1" bordercolordark="#666666" bordercolorlight="#999999"> 

<%if (!columns.equals("")) {%> 

<tr> 
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oDictionary.getTranslatedWord(userLanguageId, "Student Name", adminId)%></b></font></td> 
<%for (int i=0; i<oVectorColumns.size(); i++) {%> 
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oVectorColumns.get(i)%></b></font></td> 
<%}%> 
</tr> 

<% 

    for (StudentInfo studentinfo:oVector) { 

     userDirectoryVector.add(new Long(studentinfo.getStudentId())); 

     java.util.HashMap oHashMapProfielValues = oExtendedProfile.getProfileFieldValues(studentinfo.getStudentId(), 1, user.getAdminId()); 
     java.util.Vector oVectorStudentAllPrograms = registration.getStudentAllProgrammes(studentinfo.getStudentId(), user.getAdminId()); 

     String programname = ""; 
     String levelname = ""; 
     String programlevelname = ""; 
     String RegistrationDate=""; 

Więc, czy nie lepiej, aby oczyścić je raczej analizy? Odpowiedź brzmi: TAK, myślę, że

+0

Zgadzam się, krótka odpowiedź jest oczywiście tak. Ale nie mogę naprawić wszystkich 500 JSP, więc zespół musi pracować nad tym obok głównej firmy, a wtedy zarząd musi ją zatwierdzić, by dać czas. Muszę "stworzyć przypadek", aby poprosić o czas, aby to naprawić, potrzebuję pewnych liczb, równie szorstkich, jak być może. –

+0

zgodził się z tobą. Trochę trudna sytuacja z widoku zarządzania projektami. – Forhad

3

Bardzo prosta metryka może zadziałać w twoim celu - "czy ten plik jsp zawiera skrypty" lub "liczbę linii kodu skryptu", które powinieneś móc kopiować razem z grepem lub czymś podobnym.

Czy może to być dodatkowa wartość, jeśli poświęcasz się zarządzaniu przez jakiś czas, aby rozwiązać problemy?

---- Edit ----

Szybkie google sugeruje, że może być w stanie wyodrębnić statystyk zasugerowałem wyżej dla JSP przy użyciu tej

http://www.semanticdesigns.com/Products/SearchEngine/

Który został zaproponowany jako odpowiedź na to pytanie

What would be a good way to measure the size of a JSP project?

+0

+1 I to jest bardzo dobry wskaźnik. Każda linia kodu w JSP to zła linia kodu :). – Augusto

+0

i relacja z 'dyrektyw <-> LoC scriptled <-> LoC Html' daje mi dobry przegląd tego, co się dzieje: wiele importów/zależności vs. zbyt dużo kodu a strona ok. Dziękuję Ci. –

Powiązane problemy