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

Originariamente inviata da
andbin
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ò....