überladene methoden mit allen möglichen typen aufrufen

alderwaran

Mitglied
hi zusammen,

ich möchte gerne die jaxb-methode "unmarshal" in einer eigenen methode aufrufen und meiner methode dazu alle möglichen objekttypen übergeben können.
momentan kann CreatePDF nur InputStream entgegennehmen um diesen an unmarshal weiter zu geben, unmarshal selbst ist jedoch überladen und kann eigentlich auch URL, File oder StringBuffer verwenden... und genau diese freiheit möchte ich beim aufruf von CreatePDF auch haben.

muss ich CreatePDF für jeden von unmarshal unterstützten eingabetyp auch überladen oder könnte ich einen typ Object übergeben und diesen *irgendwie* auf seinen typ casten?

Java:
package agn.forms.pdf.createpdf;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import agn.forms.pdf.createpdf.technische_nachbetreuung.v1.*;
import java.io.InputStream;
import java.io.OutputStream;


public class CreatePDF {

    private Object xmlObjects;

    public CreatePDF(InputStream _XMLInputStream, OutputStream _PDFOutputStream) {
        try {
            JAXBContext jc;
            jc = JAXBContext.newInstance(ObjectFactory.class);
            Unmarshaller um = jc.createUnmarshaller();
            xmlObjects = um.unmarshal(_XMLInputStream);
            // test ob objekte richtig eingelesen werden
            // Marshaller m = jc.createMarshaller();
            // m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            // m.marshal(xmlObjects, System.out);
            // test ende
            CreatePDF_v1 createPDF_v1 = new CreatePDF_v1(xmlObjects, _PDFOutputStream);
        } catch (JAXBException ex) {
            Logger.getLogger(CreatePDF.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * bequeme main methode um createpdf *in diesem projekt* zu testen
     * @param args
     */
    public static void main(String[] args) {
        try {
            CreatePDF createPDF = new CreatePDF(
                    new FileInputStream(System.getProperty("user.home") + "/v1.xml"),
                    new FileOutputStream(System.getProperty("user.home") + "/test.pdf"));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(CreatePDF.class.getName()).log(Level.SEVERE, null, ex);
        }
        Process p;
        try {
            p = Runtime.getRuntime().exec("/opt/bin/acroread "+System.getProperty("user.home") + "/test.pdf");
            p.waitFor();
        } catch (Exception ex) {
            Logger.getLogger(CreatePDF.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
 
also ich würde sie überladen. ausser du hast irgendein eindeutiges interface, womit du sicher gehen kannst, dass nichts falsches übergeben werden kann. mit instanceof, casten und son zeug schiesst du dir denke ins eigene bein
 
kann sein das ich was nicht sehe, aber das eigene überladen einer methode wäre doch sehr aufwändig und mit viel redundantem code verbunden - dazu kommt falls es mir einfällt das ich statt dem pdf-outputstream gerne auch die wahl hätte in einen stringbuffer o.ä. zu schreiben ich n*m mal die gleiche methode mit allen permutationen von möglichen eingabeklassen schreiben müsste (?)

"gelöst" habe ich das jetzige problem hiermit:
Java:
    public CreatePDF(Object _XMLInputStream, OutputStream _PDFOutputStream) {
        try {
            JAXBContext jc;
            jc = JAXBContext.newInstance(ObjectFactory.class);
            Unmarshaller um = jc.createUnmarshaller();
            if (_XMLInputStream.getClass().getCanonicalName().equals("java.io.InputStream")) {
                xmlObjects = um.unmarshal((InputStream) _XMLInputStream);
            } else if (_XMLInputStream.getClass().getCanonicalName().equals("javax.xml.transform.stream.StreamSource")) {
                xmlObjects = um.unmarshal((StreamSource) _XMLInputStream);
            } else {
                throw new IllegalArgumentException("CreatePDF unterstützt nur InputStream oder StreamSource als eingabequellen.");
            }

falls das unglaublich schlecht ist bitte ich um hinweise 🙂
 
Du musst da nix casten.

Du nimmst als Input parameter deiner Methode einfach nur das gleiche, was XMLCreator haben will.

Fertig 😉

Ansonsten via Reflection herausfinden, was der PDF Creator hat.
 

Zurück
Oben