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.
il prepareContent l'ho levato in quanto FileParseResult già mi da la stringa che mi serve.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(); }
però ho sostituito il primo parametro con Metadata, che elaboro dopo (ma ho qualce dubbio su quello che ho fatto).
questo un esempio di parser: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; } }
e questo il registry:codice:public class RTFFileParser extends FileParser { @Override protected Parser createParser() { return new RTFParser(); } }
nella finestra: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); } }
quello su cui sono dubbioso sono due cose: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);
- 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?

Rispondi quotando