Visualizzazione dei risultati da 1 a 10 su 11

Hybrid View

  1. #1
    ciao andbin!

    intanto grazie mille!
    ammetto che da solo non ci sarei arrivato, mi mancano troppi pezzi.

    ho fatto qualche modifica per cercare di capire un pò meglio, e per cerecare di adattarlo.
    codice:
    public abstract class FileParser {
    
        public final FileParseResult parse(File file) throws IOException, SAXException, TikaException {
            BodyContentHandler handler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            ParseContext context = new ParseContext();
            FileInputStream inputstream = new FileInputStream(file);
            Parser parser = createParser();
            parser.parse(inputstream, handler, metadata, context);
            return new FileParseResult(metadata, handler.toString());
        }
    
        protected abstract Parser createParser();
    }
    il prepareContent l'ho levato in quanto FileParseResult già mi da la stringa che mi serve.
    però ho sostituito il primo parametro con Metadata, che elaboro dopo (ma ho qualce dubbio su quello che ho fatto).

    codice:
    public class FileParseResult {
    
        private Metadata metadataNames;
        private String content;
    
        public FileParseResult(Metadata metadataNames, String content) {
            this.metadataNames = metadataNames;
            this.content = content;
        }
    
        public Metadata getMetadataNames() {
            return metadataNames;
        }
    
        public void setMetadataNames(Metadata metadataNames) {
            this.metadataNames = metadataNames;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
    }
    questo un esempio di parser:

    codice:
    public class RTFFileParser extends FileParser {
    
        @Override
        protected Parser createParser() {
            return new RTFParser();
        }
    
    }
    e questo il registry:

    codice:
    public class FileParserRegistry {
    
        private Map<String, FileParser> map = new HashMap<>();
    
        public void add(FileParser parser, String type) {
            map.put(type, parser);
        }
    
        public void add(Parser parser, String type1, String type2) {
            
        }
    
        public FileParser getForType(String type) {
            return map.get(type);
        }
    }
    nella finestra:

    codice:
                File f = new File(strFile);
                FileParserRegistry registry = new FileParserRegistry();
                registry.add(new RTFFileParser(), "application/rtf");
                FileParser parser = registry.getForType(strType);
                FileParseResult result = parser.parse(f);
                StringBuilder sb = new StringBuilder();
                for (String name : result.getMetadataNames().names()) {
                    sb.append(name).append(": ").append(result.getMetadataNames().get(name)).append("\n");
                }
                WindowDetail wd = new WindowDetail(f, new PanelDetail(sb.toString()), new PanelDetail(result.getContent()));
                wd.setVisible(true);
    quello su cui sono dubbioso sono due cose:
    - l'elaborazione di Metadata, e quindi l'uso dello StringBuilder: lo metto qui, oppure forse è meglio elaborarlo direttamente nel PanelDetail?
    - nella magior parte dei casi come secondo parametro di WindowDetail avrò un PanelDetail, a parte quando uso immagini o suoni: per evitare altri switch / if, potrei aggiungere anche quello al registry o devo seguire una strada ancora diversa?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    il prepareContent l'ho levato in quanto FileParseResult già mi da la stringa che mi serve.
    Ok, io avevo previsto quella fase semplicemente perché avevo visto che il tuo jpegParser() era l'unico che non faceva il setContent(handler.toString()); Quindi ho pensato: c'è per tutti (quindi è un "default") mentre per il jpeg no, quindi il content lo si potrebbe mettere fisso a null.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    però ho sostituito il primo parametro con Metadata, che elaboro dopo (ma ho qualce dubbio su quello che ho fatto).
    Puoi scegliere di mettere e tenere quello che vuoi nell'oggetto di "risultato". Insomma, metti pure quello che ritieni utile per chi userà il risultato!

    Quote Originariamente inviata da fermat Visualizza il messaggio
    e questo il registry:

    codice:
    public class FileParserRegistry {
    
        private Map<String, FileParser> map = new HashMap<>();
    
        public void add(FileParser parser, String type) {
            map.put(type, parser);
        }
    
        public void add(Parser parser, String type1, String type2) {
            
        }
    
        public FileParser getForType(String type) {
            return map.get(type);
        }
    }
    Ok, occhio solo che il secondo add ha Parser mentre invece dovrebbe essere FileParser. Io avevo pensato all'uso del varargs, ovvero un ultimo parametro String... types
    Puoi metterne sia uno così, sia tenere anche le versioni in overload con 1 o 2 type (per comodità/efficienza). Assolutamente a tua scelta.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    - l'elaborazione di Metadata, e quindi l'uso dello StringBuilder: lo metto qui, oppure forse è meglio elaborarlo direttamente nel PanelDetail?
    Quella composizione di stringa non l'avevo messa nel FileParser perché in effetti il fatto di voler avere una forma aaa: bbb\nccc: ..... è una questione di "presentazione", riguarda la user interface ... non il parsing.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    - nella magior parte dei casi come secondo parametro di WindowDetail avrò un PanelDetail, a parte quando uso immagini o suoni: per evitare altri switch / if, potrei aggiungere anche quello al registry o devo seguire una strada ancora diversa?
    Se le possibilità sono poche es. testo o immagine o audio, questa informazione la potresti mettere nell'oggetto di result (e impostata da ciascuna classe di FileParser che ovviamente "sa" che tipo tratta) magari come enum. Poi fai uno switch. Non mi pare che sia una "brutta" cosa. Anche perché un conto è il parsing, un altro conto è la "presentazione" dei dati.
    Ci sono sicuramente "design" migliori ma si dovrebbe andare un po' oltre e forse è troppo per il tuo caso o forse non serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    non avevo pensato a varargs.
    ho cambiato il metodo seguendo il tuo consiglio.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se le possibilità sono poche es. testo o immagine o audio, questa informazione la potresti mettere nell'oggetto di result (e impostata da ciascuna classe di FileParser che ovviamente "sa" che tipo tratta) magari come enum. Poi fai uno switch. Non mi pare che sia una "brutta" cosa. Anche perché un conto è il parsing, un altro conto è la "presentazione" dei dati.
    vediamo se ho fatto bene:
    codice:
    public enum PanelEnum {
        PanelDetail, PanelImage
    }
    il FileParser l'ho modificato così:
    codice:
    public abstract class FileParser {
    
        public final FileParseResult parse(File file) throws IOException, SAXException, TikaException {
            BodyContentHandler handler = new BodyContentHandler();
            Metadata metadata = new Metadata();
            ParseContext context = new ParseContext();
            FileInputStream inputstream = new FileInputStream(file);
            Parser parser = createParser();
            parser.parse(inputstream, handler, metadata, context);
            PanelEnum panelEnum = setPanel();
            return new FileParseResult(metadata, handler.toString(),panelEnum);
        }
    
        protected abstract Parser createParser();
    
        protected abstract PanelEnum setPanel();
    }
    e poi i singoli parser:
    codice:
    public class JPEGFileParser extends FileParser {
    
        @Override
        protected Parser createParser() {
            return new JpegParser();
        }
    
        @Override
        protected PanelEnum setPanel() {
            return PanelEnum.PanelImage;
        }
    
    }
    nella finestra:
    codice:
                File f = new File(strFile);
                FileParserRegistry registry = new FileParserRegistry();
                registry.add(new RTFFileParser(), "application/rtf");
                registry.add(new JPEGFileParser(), "image/jpeg", "image/jpg");
                FileParser parser = registry.getForType(strType);
                FileParseResult result = parser.parse(f);
                StringBuilder sb = new StringBuilder();
                for (String name : result.getMetadataNames().names()) {
                    sb.append(name).append(": ").append(result.getMetadataNames().get(name)).append("\n");
                }
                PanelEnum panelEnum = result.getPanelEnum();
                JPanel jp = null;
                switch (panelEnum) {
                    case PanelDetail:
                        jp = new PanelDetail(result.getContent());
                        break;
                    case PanelImage:
                        jp = new PanelImage(f);
                        break;
                    default:
                        break;
                }
                WindowDetail wd = new WindowDetail(f, new PanelDetail(sb.toString()), jp);
                wd.setVisible(true);
    potrebbe andare??

    Ci sono sicuramente "design" migliori ma si dovrebbe andare un po' oltre e forse è troppo per il tuo caso o forse non serve.
    si direi che per me questo già basta per ora.
    anzi, faccio un piccolo OT.
    visto che quello del "design" è un argomento su quale sto abbastanza indietro, hai un buon libro da consigliarmi?
    direi che ora di approfondire un pò....

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.