Le modifiche da apportare all'applicazione pwlsGallery per risolvere l'esercizio 4.1 sono le seguenti:

1) alla classe Immagine occorre aggiungere un membro di tipo String per la descrizione:

public class Immagine {
	public String fileName, descrizione;

	public int larghezza, altezza;

	public Immagine(String f, int w, int h, String d) {
		fileName = f;
		larghezza = w;
		altezza = h;
                descrizione = d;
	}

}

2) bisogna aggiungere (dopo la riga 10 del Listato 4.4) il seguente codice al metodo CaricaImmagini() della classe Galleria in modo da leggere l'eventuale descrizione testuale dell'immagine corrente dal relativo file su disco:

String descrizione="";
try {
  BufferedReader input=new BufferedReader(new FileReader(dir.getAbsolutePath()+File.separator+files[i]+".txt"));
  String lineaCorrente="";
  while((lineaCorrente=input.readLine()) != null) {
    descrizione+=lineaCorrente+"\n";
  }
  input.close();
}
catch(Exception e) {
  descrizione="nessuna\ndescrizione";
}

vanno inoltre aggiunte le seguenti direttive di importazione:

import java.io.BufferedReader;
import java.io.FileReader;

e va aggiunto il parametro "descrizione" nella chiamata al costruttore della classe Immagine in riga 14 del Listato 4.4.

3) bisogna modificare il metodo EliminaImmagine() della classe Galleria, sostituendo il codice in riga 22 del Listato 4.6 con il seguente:

File fileDesc=new File(this.path+File.separator+img.fileName+".txt");

for(i=0; fileDesc.exists() && (this.numeroMaxTentativi==-1 || i<this.numeroMaxTentativi); i++)
  fileDesc.delete();

return !fileImg.exists() && !fileThumb.exists() && !fileDesc.exists();

In questo modo al momento dell'eliminazione dell'immagine e della sua miniatura viene anche eliminato l'eventuale file con la descrizione testuale.

4) nella pagina index.jsp il codice che genera la tabella con le miniature (righe 42--69 del Listato 4.10) va rimpiazzato dalla seguente versione che genera la nuova tabella con miniature ed eventuali descrizioni testuali (si noti che ora, per ogni immagine, vengono generate due celle della tabella):

for(i=0; i<galleria.NumeroImmagini(); i++) {
  if(i%galleria.numeroColonne==0)
    out.println("<tr>");
  %>
      <td class=sfondo_cella><a href="javascript:popup(<%= i%>, <%= galleria.immagini.get(i).larghezza%>, <%= galleria.immagini.get(i).altezza%>)"><img src="<%= thumbPath.substring(1,thumbPath.length())+"/"+galleria.GeneraAnteprima(i)%>" border="0" /></a></td>
      <td class=sfondo_cella><pre><%= galleria.immagini.get(i).descrizione %></pre></td>
  <%
      if((i+1)%galleria.numeroColonne==0)
        out.println("</tr>");
}

if((i+1)%galleria.numeroColonne!=0) {
  for(int j=(i+1)%galleria.numeroColonne; j<=galleria.numeroColonne; j++) {
%>
    <td class=sfondo_cella>
    </td>
    <td class=sfondo_cella>
    </td>
<%
  }

  out.println("</tr>");
}

5) nella pagina nuova.jsp va aggiunto il campo di input relativo alla descrizione (dopo la riga 25 del Listato 4.12):

<tr>
  <td>
    Descrizione dell'immagine: <br />
    <textarea rows="2" cols="20" name="descrizione"></textarea>
  </td>
</tr>

6) nella pagina carica.jsp il codice compreso fra le righe 20 e 47 (Listato 4.13) va sostituito con il seguente (in modo da tener conto anche della descrizione testuale e del suo salvataggio in un file di testo):

    String descFileName="";
    
    while(it.hasNext()) {
      FileItem f=(FileItem)it.next();
      if(!f.isFormField()) {
        char carattereSeparatore=File.separatorChar;
        String separatore="";

        if(carattereSeparatore=='\\')
          separatore="\\\\";
        else
          separatore=File.separator;

        String[] partiPercorso=f.getName().split(separatore);
        FiltraEstensioni filtro=new FiltraEstensioni(formati);
        descFileName=partiPercorso[partiPercorso.length-1]+".txt";
        
        if(filtro.accept(null, partiPercorso[partiPercorso.length-1])) {
          File file=new File(getServletContext().getRealPath(path), partiPercorso[partiPercorso.length-1]);
          f.write(file);
        }
        else
          erroreFormato=true;

      } else {
	if(f.getFieldName().equals("descrizione") && !erroreFormato) {
	  String descrizione=f.getString().trim();
	  if(descrizione.length()>0) {
            BufferedWriter output=new BufferedWriter(new FileWriter(getServletContext().getRealPath(path+File.separator+descFileName),false));
            output.write(descrizione);
            output.close();
	  }
	}
      }
    }

va inoltre aggiunta la direttiva di importazione seguente:

import="java.io.*"

Per completezza nella directory "pwlsGalleryTXT" è incluso tutto il codice relativo alla galleria modificata in base all'esercizio 4.1.
