Visualizzazione dei risultati da 1 a 10 su 16

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da playbasfa Visualizza il messaggio
    Perchè per i progetti universitari che mi capitano è scocciante ogni volta dover perdere 3 minuti per importare le classi e cambiare i dati nel main.
    Ma fare quello che hai chiesto richiederebbe molto di più che 3 minuti e molto, molto più codice rispetto a cambiare poi solo poche cose nei tuoi progetti!!
    Immagino che nei tuoi progetti tu debba trattare ogni volta XML differenti (come struttura intendo) e allora, tanto, in ogni caso devi generare appositamente dei sorgenti Java dai xsd. E se invece in più progetti hai la stessa tipologia di XML, allora la soluzione è creare un progetto-libreria comune.

    Quello che invece si potrebbe fare (e avrebbe anche più senso) è utilizzare un processo di build con Ant o Maven (con Ant è sicuramente fattibile, con Maven dovrei documentarmi) tale per cui una volta impostato il progetto e il/i file di build, esso vada a (ri)generare se necessario i file .java dai file .xsd durante la fase di build.
    E la problematica sarebbe solamente più "impostare il progetto" e se riesci ad ottenere una struttura che puoi riutilizzare velocemente da un progetto all'altro, ancora meglio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma fare quello che hai chiesto richiederebbe molto di più che 3 minuti e molto, molto più codice rispetto a cambiare poi solo poche cose nei tuoi progetti!!.
    Si questo è vero, ma lo faccio una sola volta e poi andrà bene per sempre.
    Quindi potrebbe convenirmi vista la quantità di volte che faccio quella operazione.
    Mi conviene sicuramente nel momento in cui adopero questa cosa come esercizio.
    Ad ogni modo, ho risolto facendo in questo modo:
    Codice PHP:
    import com.sun.codemodel.*;
    import com.sun.tools.xjc.api.*;
    import org.xml.sax.InputSource;


            
    // Configure sources & output
            
    String schemaPath "path/to/schema.xsd";
            
    String outputDirectory "schema/output/source/";

            
    // Setup schema compiler
            
    SchemaCompiler sc XJC.createSchemaCompiler();
            
    sc.forcePackageName("com.xyz.schema.generated");

            
    // Setup SAX InputSource
            
    File schemaFile = new File(schemaPath);
            
    InputSource is = new InputSource(new FileInputStream(schemaFile));

            
    // Parse & build
            
    sc.parseSchema(is);
            
    S2JJAXBModel model sc.bind();
            
    JCodeModel jCodeModel model.generateCode(nullnull);
            
    jCodeModel.build(new File(outputDirectory)); 

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da playbasfa Visualizza il messaggio
    Ad ogni modo, ho risolto facendo in questo modo:
    Ok, non sapevo (beh, potevo immaginarlo ma non ho mai cercato/guardato...) che c'è una API per usare programmaticamente XJC. Quello che hai postato è comunque solo il "succo" ... ovviamente manca il contorno.

    Ma ad ogni modo l'unica cosa che ottieni è un bel insieme di sorgenti ... che devi poi compilare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok, non sapevo (beh, potevo immaginarlo ma non ho mai cercato/guardato...) che c'è una API per usare programmaticamente XJC. Quello che hai postato è comunque solo il "succo" ... ovviamente manca il contorno.
    Si questo è solo il succo ovviamente.
    Il modo in cui vorrei procedere è il seguente:

    Ho creato un programma chiamato Universal.
    Nel package main ho inserito il codice che ti ho postato sopra facendo in modo che i file generati abbiano sempre lo stesso nome, quale che sia l'xsd in ingresso, ma che vengano posizionati in package diversi (il package deve avere lo stesso nome dell'xsd).
    A questo punto sto implementando una funzione "chooser" che riceve in ingresso l'XML capisce con quale xsd quell'xml viene validato e a quel punto importa un dato package piuttosto che un altro (il package ha lo stesso nome dell'xsd con cui l'xml viene validato).
    In questo modo penso di poter automatizzare il tutto.

    Ps. poichè tutti i file all'interno dei package si chiamano allo stesso modo potrò fare:

    Class obj = new Class();
    obj.start;

    in maniera univoca, la scelta di adoperare lo start() di una classe piuttosto che di un'altra sarà fatta importando di volta in volta package diversi come spiegato prima.
    Ciò che adesso sto cercando di fare è capire come fare a importare dinamicamente package differenti data una stringa.
    Hai per caso qualche consiglio a riguardo?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da playbasfa Visualizza il messaggio
    Ciò che adesso sto cercando di fare è capire come fare a importare dinamicamente package differenti data una stringa.
    Vorrei cercare di arrivare a farti capire che cosa puoi solo ottenere e alla fin fine quindi quale è il senso di tutto questo.

    Supponiamo che riesci a scrivere del codice che:
    - genera "programmaticamente" tramite XJC dei sorgenti Java a partire da un xsd.
    - compila "programmaticamente" quei sorgenti (qui o si lancia javac o si usa la Java Compiler API che se non sbaglio esiste da Java 6).
    - permette il caricamento dei .class generati (questo si fa con un apposito class loader, dovrebbe bastare il "solito" java.net.URLClassLoader che è quello che si usa in questi casi).
    - usa JAXB per effettuare l'unmarshal di un XML (sulla base ovviamente dei class generati). Anche questo mi pare fattibile perché JAXBContext ha dei newInstance che ricevono un ClassLoader (ma non ho mai provato così!).

    Tu dall'unmarshal cosa ottieni? Pensa. Ottieni un java.lang.Object. E su questo Object non ci puoi fare nulla di particolare (a parte invocare i metodi noti di Object).
    Non puoi fare cast es. (TipoGenerato) perché il tuo programma principale è stato compilato prima di generare quelle classi. E pertanto su questi oggetti non puoi invocare metodi specifici.

    Quindi a cosa ti serve?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Tu dall'unmarshal cosa ottieni? Pensa. Ottieni un java.lang.Object. E su questo Object non ci puoi fare nulla di particolare (a parte invocare i metodi noti di Object).
    Una volta che ho l'oggetto java.lang.Object posso richiamare tutti i metodi pubblici implementati in quella classe (nel programma principale).
    Potrei dunque con un altro programma richiamare tale oggetto e da qui invocare tutti i metodi che mi interessano?
    Ad esempio accedere ai vari campi dell'XML?

    Dici che c'è qualcosa che mi sfugge?

    Ho provato a riflettere su questa frase
    Non puoi fare cast es. (TipoGenerato) perché il tuo programma principale è stato compilato prima di generare quelle classi. E pertanto su questi oggetti non puoi invocare metodi specifici.
    Ma non riesco a cogliere il problema.

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da playbasfa Visualizza il messaggio
    Dici che c'è qualcosa che mi sfugge?
    Ehm .. sì.

    Quote Originariamente inviata da playbasfa Visualizza il messaggio
    Ho provato a riflettere su questa frase

    Ma non riesco a cogliere il problema.
    Nel tuo sorgente principale, non puoi avere es.:

    TipoMappato oggetto = (TipoMappato) unmarshaller.unmarshal( ..... );

    Anche se supponiamo che tu sappia a priori il nome della classe (lo potresti dedurre dal xsd e sapendo quali sono le convenzioni di XJC).

    Quando compili il tuo programma principale, TipoMappato non esiste ancora poiché viene generato solo in fase di esecuzione del tuo programma.
    Qualunque riferimento "statico" a tipi nel codice sorgente deve essere risolto in fase di compilazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.