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?