# Collection of code snippets by Arne Vajhøj 
# (from articles on eksperten.dk / vajhoej.dk written sometime between 2004 and now) 
from java.io import FileOutputStream

from javax.persistence import Persistence
from javax.xml.bind import JAXBContext, Marshaller

import AutoMap
import OrdersJPA
import OrderLinesJPA
import OrdersJAXB
import OrdersCollectionJAXB
import OrderLinesJAXB
import OrderLinesCollectionJAXB

# read from database
emf = Persistence.createEntityManagerFactory('orders')
em = emf.createEntityManager()
jpadata = em.createQuery('SELECT DISTINCT o FROM OrdersJPA AS o JOIN FETCH o.orderLines ol', OrdersJPA).getResultList()
em.close()
emf.close()
# convert
mo = AutoMap(OrdersJPA, OrdersJAXB, True)
mol = AutoMap(OrderLinesJPA, OrderLinesJAXB, True)
jaxbdata = OrdersCollectionJAXB()
for ojpa in jpadata:
    ojaxb = OrdersJAXB()
    mo.convert(ojpa, ojaxb)
    for oljpa in ojpa.orderLines:
        oljaxb = OrderLinesJAXB();
        mol.convert(oljpa, oljaxb)
        ojaxb.orderLines.list.add(oljaxb)
    jaxbdata.list.add(ojaxb)
# write to XML
jxbctx = JAXBContext.newInstance(OrdersCollectionJAXB, OrdersJAXB, OrderLinesCollectionJAXB, OrderLinesJAXB)
m = jxbctx.createMarshaller()
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, True)
os = FileOutputStream('orders2.xml')
m.marshal(jaxbdata, os)
os.close()
#
print('db2xml done')
