Bonjour,

Je suis tombé sur quelque chose qui me laisse perplexe !
Dans le cadre d'un test, j'ai une classe java (un thread) qui effectue une édition crystal report avec export PDF

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 
package com.test.crystal;
// je passe les imports :)
public class ReportEdition extends Thread {
	/** Attribut de table 'Connection String' */
	private static final String ATT_CONNECTIONSTRING = "Connection String";
	/** Attribut de table 'Local XML File' */
	private static final String ATT_LOCAL_FILE = "Local XML File";
 
	/**
         * {@inheritDoc}
         * 
         * @see java.lang.Thread#run()
         */
	@Override
	public void run() {
		System.out.println("Lancement du thread " + getName());
		ReportClientDocument rcd = new ReportClientDocument();
		try {
			String report = "C:/Editions/test/report.rpt";
			rcd.setLocale(Locale.ENGLISH);
			rcd.open(report, 0);
			// rcd.getDataDefController().getParameterFieldController().
			DatabaseController dc = rcd.getDatabaseController();
			for (Iterator<?> iter = dc.getDatabase().getTables().iterator(); iter.hasNext();) {
				ITable table = (ITable) iter.next();
				PropertyBag atts = table.getConnectionInfo().getAttributes();
				String varCmdConnect = atts.getStringValue(ATT_CONNECTIONSTRING);
				String varSchConnect = varCmdConnect.substring(varCmdConnect.indexOf(';'));
				String varNomTable = table.getName();
				varNomTable = varNomTable.substring(varNomTable.indexOf('/') + 1);
				String varXML_Fic = "C:/Editions/test/source_" + varNomTable + ".xml";
				varCmdConnect = ATT_LOCAL_FILE + "=s(" + varXML_Fic + ")" + varSchConnect;
				atts.putStringValue(ATT_CONNECTIONSTRING, varCmdConnect);
				atts.putStringValue(ATT_LOCAL_FILE, varXML_Fic);
				// atts.putStringValue("Local XML File", varXML_Fic);
				dc.setTableLocation(table, table);
			}
 
			try {
				exportReportToFile(rcd, ReportExportFormat.PDF, "C:/Editions/test/test" + System.nanoTime() + getName() + ".pdf");
			} catch (ImpressionException e) {
				e.printStackTrace();
			}
			System.out.println("Fin du thread " + getName());
		} catch (Exception e) {
			System.out.println("Fin en erreur du thread " + getName());
			e.printStackTrace();
		} finally {
			try {
				rcd.close();
			} catch (ReportSDKException e) {
				e.printStackTrace();
			}
		}
	}
 
	public static void exportReportToFile(ReportClientDocument report, ReportExportFormat format, File cible) throws ReportSDKException,
			ImpressionException {
		ByteArrayInputStream byteArrayInputStream = null;
		ByteArrayOutputStream byteArrayOutputStream = null;
		FileOutputStream fileOutputStream = null;
		try {
			try {
				byteArrayInputStream = (ByteArrayInputStream) report.getPrintOutputController().export(format);
			} catch (Throwable re) {
				LogUtils.logFatal("Erreur lors de l'export crystal pour le format " + format);
				byteArrayInputStream = (ByteArrayInputStream) report.getPrintOutputController().export(format);
			}
			byte byteArray[] = new byte[byteArrayInputStream.available()];
 
			// Create a new file that will contain the exported result.
			fileOutputStream = new FileOutputStream(cible);
 
			byteArrayOutputStream = new ByteArrayOutputStream(byteArrayInputStream.available());
			int x = byteArrayInputStream.read(byteArray, 0, byteArrayInputStream.available());
 
			byteArrayOutputStream.write(byteArray, 0, x);
			byteArrayOutputStream.writeTo(fileOutputStream);
 
		} catch (IOException e) {
			throw new ImpressionException("Erreur lors de l'export fichier", e);
		} finally {
			try {
				if (byteArrayInputStream != null) {
					byteArrayInputStream.close();
				}
			} catch (IOException e) {
			}
			try {
				if (byteArrayOutputStream != null) {
					byteArrayOutputStream.close();
				}
			} catch (IOException e) {
			}
			try {
				if (fileOutputStream != null) {
					fileOutputStream.close();
				}
			} catch (IOException e) {
			}
		}
 
	}
 
}
jusque la tout fonctionne correctement !
J'ai voulu isoler le traitement dans URLClassLoader et ai remplacé le new par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
loader.loadClass("com.test.crystal.ReportEdition").newInstance()
j'ai aussi supprimer les libs crystal du classpath d'origine et les ai ajouté à mon URLClassLoader.

mais là c'est le drame, je me retrouve avec une exception , alors que la seul différence est le classLoader :

- org.apache.xmlbeans.XmlException: Thread Thread-0: The 0th supplied input is not a schema document: its type is N=
at org.apache.xmlbeans.impl.schema.SchemaTypeSystemCompiler.compile(SchemaTypeSystemCompiler.java:211)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.xmlbeans.XmlBeans.compileXmlBeans(XmlBeans.java:665)
at org.apache.xmlbeans.XmlBeans.compileXsd(XmlBeans.java:551)
at com.crystaldecisions.data.xml.t.if(Unknown Source)
at com.crystaldecisions.data.xml.t.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.CRDB_XMLImpl.DbLogonServer(Unknown Source)
at com.crystaldecisions.reports.queryengine.driverImpl.a.if(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.new(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.byte(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.j.a(Unknown Source)
at com.crystaldecisions.reports.dataengine.bb.try(Unknown Source)
at com.crystaldecisions.reports.common.aw.a(Unknown Source)
at com.crystaldecisions.reports.common.ah.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)

- org.apache.xmlbeans.XmlException: Thread Thread-0: The 0th supplied input is not a schema document: its type is N=
at com.crystaldecisions.data.xml.t.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.f.a(Unknown Source)
at com.crystaldecisions.data.xml.CRDB_XMLImpl.DbLogonServer(Unknown Source)
at com.crystaldecisions.reports.queryengine.driverImpl.a.if(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.new(Unknown Source)
at com.crystaldecisions.reports.queryengine.av.byte(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.b.a(Unknown Source)
at com.crystaldecisions.reports.reportdefinition.datainterface.j.a(Unknown Source)
at com.crystaldecisions.reports.dataengine.bb.try(Unknown Source)
at com.crystaldecisions.reports.common.aw.a(Unknown Source)
at com.crystaldecisions.reports.common.ah.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)

- XmlDriverException happened in the function CRDB_XMLImpl.DbLogonServer() when logoning from Local
- Failed to load the resource 'XmlError' from the bundle java.util.PropertyResourceBundle@16cbd97.
java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key XmlError
at java.util.ResourceBundle.getObject(Unknown Source)
at java.util.ResourceBundle.getObject(Unknown Source)
at java.util.ResourceBundle.getString(Unknown Source)
at com.crystaldecisions.reports.common.CrystalResources.loadString(Unknown Source)
at com.crystaldecisions.reports.common.CrystalResources.loadMessage(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.crystaldecisions.reports.common.bk.a(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- JRCAgent1 detected an exception: XmlError
at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throwReportSDKException(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)

Fin en erreur du thread Thread-0
com.crystaldecisions.sdk.occa.report.lib.ReportSDKException: XmlError---- Error code:-2147467259 Error code name:failed
at com.crystaldecisions.sdk.occa.report.lib.ReportSDKException.throwReportSDKException(Unknown Source)
at com.businessobjects.reports.sdk.b.e.a(Unknown Source)
at com.businessobjects.reports.sdk.JRCCommunicationAdapter.request(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.y.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.r.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.cf.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.z.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ak.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.ad.int(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.bk.for(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.a(Unknown Source)
at com.crystaldecisions.proxy.remoteagent.v.if(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.a(Unknown Source)
at com.crystaldecisions.sdk.occa.report.application.DatabaseController.setTableLocation(Unknown Source)
at com.crystaldecisions.reports.sdk.DatabaseController.setTableLocation(Unknown Source)
at com.test.crystal.ReportEdition.run(ReportEdition.java:56)
- JRCAgent1 received request: closeServerAgent
- JRCAgent1 has cleaned up and closed down the report
Quelqu'un aurait il une explication logique a ce problème ?

Merci d'avance !