Newsgroup: it.comp.java
Titolo: Esempio di 'spider' (per Castagna sempre più curioso :)

Visto che glielo avevo detto, ora posto il codice promesso, è uno spider
che se ne va a zonzo per una directory e controlla tutte le gif e jpeg
per cercare di inserire le loro dimensioni in un database.
Nel codice avrei probabilmente fatto una cosa con più stile ad usare il
MediaTracker, ma all'epoca (questo pezzo di codice ha più di un anno) mi
dette dei problemi. E poi non ho più avuto né tempo né voglia di
modificarlo, perché funziona ;)
...non provate a compilarlo così com'è, mancheranno un sacco di classi
esterne.
package com.threeamigos.engine;
import java.io.*;
import java.awt.*;
import java.awt.image.ImageObserver;
import java.sql.*;
public class ImageSpider implements ImageObserver {
  private static Toolkit t = Toolkit.getDefaultToolkit();
  protected String base;
//  private MediaTracker tracker = new MediaTracker(null);
  private static Statement s;
  private static ResultSet r;
  private static String query;
  private static String tableBase;
  private static long startMillis, endMillis, images;
  private static int imagesInserted = 0, imagesSkipped = 0;
  private static String defaultGroup = "";
  private static PrintWriter out;
  public ImageSpider(String tableBase, String base, PrintWriter out,
Statement s) throws Exception {
    this.tableBase = tableBase;
    this.out = out;
    this.s = s;
    images = 0;
    startMillis = System.currentTimeMillis();
    new ImageSpider(base);
    endMillis = System.currentTimeMillis();
    out.println("<P>Finished; " +images + " images checked in " +
(endMillis - startMillis)/1000 + " seconds.<BR>" + imagesInserted + "
images inserted.<BR>" + imagesSkipped + " images skipped.</P>");
    out.flush();
  }
  public ImageSpider(String base) {
    this.base = base;
    spider(base);
  }
  public static void resetResult() {
    imagesInserted = 0;
    imagesSkipped = 0;
  }
  public static void setDefaultGroup(String group) {
    defaultGroup = group;
  }
  protected void process(File aFile) {
    images++;
    String name = aFile.getAbsolutePath();
    int l = name.length();
    if ((l > 4 && (name.substring(l - 4).equalsIgnoreCase(".gif") ||
       name.substring(l - 4).equalsIgnoreCase(".jpg"))) ||
       (l > 5 && name.substring(l - 5).equalsIgnoreCase(".jpeg"))) {
      try {
        String imageName = name.substring(base.length());
        char fSep = File.separatorChar;
        if (fSep != '/')
            imageName = imageName.replace(fSep, '/');
        if (imageName.charAt(0) == '/')
            imageName = imageName.substring(1);
        query = "SELECT COUNT(*) AS Present FROM " + tableBase +
"_Images WHERE Name='" + imageName + "'";
        r = s.executeQuery(query);
        r.next();
        int present = r.getInt("PRESENT");
        r.close();
        r = null;
        if (present == 0) {
          Image i = t.getImage(name);
          int slices = 0;
          while (i.getWidth(this) == -1 && slices < 1000) {
            try {
              Thread.currentThread().sleep(5);
              slices++;
            } catch (InterruptedException e) {
            }
          }
          if (slices != 1000) {
            int w = i.getWidth(null);
            int h = i.getHeight(null);
            String group = defaultGroup;
            if (group.equalsIgnoreCase("FIRSTDIR")) {
              int fSepIdx = imageName.indexOf('/');
              if (fSepIdx == -1)
                group = "-";
              else
                group = imageName.substring(0, fSepIdx);
            }
            query = "INSERT INTO " + tableBase + "_Images([Name],
[Desc], [Group], [TokenLevel], [Width], [Height]) VALUES ('" + imageName
+ "' , '" + imageName + "', '" + group.toUpperCase() + "', 0, " + w + ",
" + h + ")";
            s.execute(query);
            out.println("<B><FONT SIZE=+1>" + imageName + " (" + w + "x"
+ h + ") inserted</FONT></B><BR>\r\n");
            out.flush();
            imagesInserted++;
          }
          else {
            out.println("<B><FONT SIZE=+1>" + imageName + " skipped due
to unknown problem</FONT></B><BR>\r\n");
            out.flush();
            imagesSkipped++;
          }
          i.flush();
          i = null;
        } else {
//          out.println(imageName + " already present<BR>\r\n");
        }
        out.flush();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  public boolean imageUpdate(Image i, int infoflags, int x, int y, int
width, int height) {
    if ((infoflags & java.awt.image.ImageObserver.WIDTH) == 0 &&
        (infoflags & java.awt.image.ImageObserver.HEIGHT) == 0) {
      return false;
    }
    return true;
  }
  private void spider(String base) {
    File f = new File(base);
    boolean stillValid = true;
    if (base.indexOf(' ') != -1 || base.indexOf("'") != -1) {
      String newName = base.replace(' ', '_').replace('\'', '-');
      File newFile = new File(newName);
      stillValid = f.renameTo(newFile);
      if (!stillValid) {
        out.println("<B><FONT SIZE=+1>" + base + " skipped due to a
space in its name; rename failed</FONT></B><BR>\r\n");
        out.flush();
        imagesSkipped++;
      } else {
        out.println("<B><FONT SIZE=+1>" + base + " renamed to " +
newName + "</FONT></B><BR>\r\n");
        out.flush();
      }
      f = newFile;
    }
    if (stillValid) {
      if (f.isDirectory())
        browse(f);
      else
        process(f);
    }
  }
  private void browse(File aDir) {
    String [] contents = aDir.list();
    for (int n = 0; n < contents.length; n++)
      if (imagesSkipped < 10)
        spider(aDir.getAbsolutePath() + File.separator + contents[n]);
      else {
        out.println("<br><b>Too many images were skipped in the
process.</b><br>Please check offending images and try again. :P<br>");
        break;
      }
  }
  public static void main(String[] args) throws Exception {
    int collection = 0;
    String tableBase = null, imageBase = null;
    if (collection == 0) {
      defaultGroup = "Jrrt";
      tableBase = "JRRT";
      imageBase = "E:\\WWWRoot\\lotr\\images\\";
    } else if (collection == 1) {
      defaultGroup = "FIRSTDIR";
      tableBase = "Misc";
      imageBase = "E:\\WWWRoot\\pix\\misc\\";
    }
    Connection c = Database.getConnection("me");
    Statement s = c.createStatement();
    new ImageSpider(tableBase, imageBase, new PrintWriter(System.out),
s);
    s.close();
    Database.releaseConnection("me");
    System.out.println("Finished");
  }
}
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 ... ma è pur sempre non funzionante.
Santo Dio! Ma ti devo mandare tutto il sorgente del mio motore di ricerca per
immagini più il database più le immagini stesse? Non so se mi fanno passare un
attachment di 600 mega! :)
Scherzi a parte, eccezion fatta per la classe Database e il database hai tutto. Crea
un db, costruisci una connessione e prova a farlo funzionare!
