Xdocreport - inputstream cannot be null

dimat

Lotus team
31.07.2008
516
0
#1
Всем привет!
Кто нибудь юзал данную библиотеку? подскажите, что не так делаю?

Создал агента подключил все jar, в агенте открыл пример
Для просмотра контента необходимо: Войти или зарегистрироваться
, запускаю и в java debug console вижу данную ошибку.

Код:
Agent Manager: Agent error: java.io.IOException: InputStream cannot be null.
Agent Manager: Agent error: at fr.opensagres.xdocreport.core.io.XDocArchive.readZip(XDocArchive.java:289)
Agent Manager: Agent error: at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.createReport(XDocReportRegistry.java:359)
Agent Manager: Agent error: at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:326)
Agent Manager: Agent error: at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:317)
Agent Manager: Agent error: at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:302)
Agent Manager: Agent error: at DocxProjectWithVelocity.NotesMain(Unknown Source)
Agent Manager: Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
Agent Manager: Agent error: at lotus.domino.NotesThread.run(Unknown Source)
Java:
import lotus.domino.*;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.samples.docxandvelocity.model.Project;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
 
public class DocxProjectWithVelocity extends AgentBase {
	public void NotesMain() {
	  try {
		  Session session = getSession();
		  AgentContext agentContext = session.getAgentContext();
 
		  try {
		   InputStream in = DocxProjectWithVelocity.class.getResourceAsStream("d:/docxandvelocity/DocxProjectWithVelocity.docx");
		   IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
 
			  // 2) Create context Java model
			  IContext context = report.createContext();
			  Project project = new Project("XDocReport");
			  context.put("project", project);
 
			  // 3) Generate report by merging Java model with the Docx
			  OutputStream out = new FileOutputStream(new File("d:\\docxandvelocity\\DocxProjectWithVelocity_Out.docx"));
			  report.process(context, out);
			} catch (IOException e) {
			  e.printStackTrace();
			} catch (XDocReportException e) {
			  e.printStackTrace();
			}
	  } catch(Exception e) {
		  e.printStackTrace();
	   }
   }
}
 
Последнее редактирование модератором:

garrick

Lotus team
26.10.2009
901
61
#2
Здесь где-то ошибка
Код:
 InputStream in = DocxProjectWithVelocity.class.getResourceAsStream("d:/docxandvelocity/DocxProjectWithVelocity.docx");
Не найден файл шаблона. Возможно он есть по указанному пути, но не может быть загружен методом getResourceAsStream. Попробуйте обычный файловый Stream. getResourceAsStream подразумевает загрузку из хранилища "ресурсов", а не любой файл с диска.
 

dimat

Lotus team
31.07.2008
516
0
#3
Не найден файл шаблона. Возможно он есть по указанному пути, но не может быть загружен методом getResourceAsStream. Попробуйте обычный файловый Stream. getResourceAsStream подразумевает загрузку из хранилища "ресурсов", а не любой файл с диска.
Попробвал уже, пишет что для загрузки можно использовать только getResourceAsStream.
Java:
InputStream in = new FileInputStream(new File("d:/DocxProjectWithVelocity.docx"));
Agent Manager: Agent error: fr.opensagres.xdocreport.core.XDocReportException: Impossible to create report for the input stream. The report loader supports only [] files type.
 
Последнее редактирование модератором:

oshmianski

Достойный программист
Lotus team
25.04.2012
556
8
#5
вот рабочий код

Java:
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import org.apache.commons.io.FilenameUtils;
 
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import java.util.List;
 
/**
 * Created by vintselovich on 12.08.2014.
 */
public class XDocReporter {
 
	public XDocReporter() {
 
	}
 
	public String process(String tempalateFilePath, String xmlFilePath) {
	 String outputfilepath = "";
	
		try {
			InputStream in = new FileInputStream(new File(tempalateFilePath));
			IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);
			IContext context = report.createContext();
 
			// create an instance of SAXParser.
			SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
 
			// create an instance of DefaultHandler.
			XMLParserViaSax parseXml = new XMLParserViaSax();
 
			InputStream stream = new FileInputStream(xmlFilePath);
 
			parser.parse(stream, parseXml);
 
			List items = parseXml.getItems();
			
			context.put("items", items);
 
			stream.close();
 
			File inputfile = new File(tempalateFilePath);
 
			outputfilepath = inputfile.getParent() + "\\" + FilenameUtils.getBaseName(inputfile.getAbsolutePath()) + "_out." + FilenameUtils.getExtension(inputfile.getAbsolutePath());
 
			OutputStream out = new FileOutputStream(new File(outputfilepath));
 
			report.process(context, out);
 
			if (items != null) items.clear();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return outputfilepath;
	}
}
Код:
Set js = New JAVASESSION 
Set xDocReporter = js.GetClass("XDocReporter")
Set xDocReporterObj = xDocReporter.CreateObject()
 
docFilePath = xDocReporterObj.process(templateFilePath, xmlFilePath)
 

erdi

Well-known member
20.08.2008
265
17
#6
в примере файл лежит в самом проекте...положи файл в ресурсы агента и вызывай как в примере. Только для работы необходимо добавить в java.policy следующие разрешения
Java:
grant {
   permission java.lang.RuntimePermission "getClassLoader";
   permission java.lang.RuntimePermission "setContextClassLoader";
}
ну или если хочешь использовать файл на жестком используй другую конструкцию
Java:
InputStream in = new FileInputStream("/tmp/template.odt");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
 

dimat

Lotus team
31.07.2008
516
0
#7
Не получается так, все равно требует через report loader:

Java:
InputStream in = new FileInputStream("d:/docxandvelocity/DocxProjectWithVelocity.docx");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
Код:
fr.opensagres.xdocreport.core.XDocReportException: Impossible to create report for the input stream. The report loader supports only [] files type.
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.createReport(XDocReportRegistry.java:380)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.createReport(XDocReportRegistry.java:360)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:326)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:317)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:302)
at DocxProjectWithVelocity.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
И где можно найти java.policy?
 

oshmianski

Достойный программист
Lotus team
25.04.2012
556
8
#11
1.
у меняв grant security добавлены строки

Java:
permission java.awt.AWTPermission "listenToAllAWTEvents";
permission java.lang.RuntimePermission "setContextClassLoader";
2. может каких jar'ников не хватает?
 

oshmianski

Достойный программист
Lotus team
25.04.2012
556
8
#15
вот мой список ext (много лишнего, но для сравнения):

Код:
commons-codec-1.5.jar
commons-collections-3.2.1.jar
commons-io-1.3.1.jar
commons-lang-2.4.jar
commons-lang3-3.1.jar
commons-logging-1.1.jar
docking-frames-common.jar
docking-frames-core.jar
docking-frames-ext-glass.jar
dom4j-1.6.1.jar
fr.opensagres.xdocreport.converter-1.0.4.jar
fr.opensagres.xdocreport.core-1.0.4.jar
fr.opensagres.xdocreport.document-1.0.4.jar
fr.opensagres.xdocreport.document.docx-1.0.4.jar
fr.opensagres.xdocreport.template-1.0.4.jar
fr.opensagres.xdocreport.template.velocity-1.0.4.jar
glasslib.jar
glazedlists_java15-1.9.0.jar
healthcenter.jar
ibmallext.jar
ibmcac.jar
ibmjcefips.jar
ibmjceprovider.jar
ibmpkcs11impl.jar
IBMSecureRandom.jar
JavaDiagnosticsCollector.jar
jcalendar-1.4.jar
jgoodies-common-1.6.0.jar
jgoodies-forms-1.7.1.jar
junit-3.8.1.jar
localedata.jar
log4j-1.2.13.jar
mysql-connector-java-5.1.32-bin.jar
njempcl.jar
Notes.jar
oro-2.0.8.jar
poi-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
saxon9he.jar
stax-api-1.0.1.jar
velocity-1.7.jar
websvc.jar
xmlbeans-2.3.0.jar
xsp.http.bootstrap.jar
 

dimat

Lotus team
31.07.2008
516
0
#16
2. может каких jar'ников не хватает?
Вроде все как в примере, да подсветил бы редактор?


fr.opensagres.xdocreport.core.XDocReportException: Impossible to create report for the input stream. The report loader supports only [] files type.
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.createReport(XDocReportRegistry.java:380)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.createReport(XDocReportRegistry.java:360)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:326)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:317)
at fr.opensagres.xdocreport.document.registry.XDocReportRegistry.loadReport(XDocReportRegistry.java:302)
at DocxProjectWithVelocity.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)


Видел это, но не понял о чем там говорится в ответе, можете пояснить?


А чем код @oshmianski не подошел? Вроде там всё правильно.
Если загружать через FileInputStream - та же ошибка (fr.opensagres.xdocreport.core.XDocReportException: Impossible to create report for the input stream. The report loader supports only [] files type.)
 

garrick

Lotus team
26.10.2009
901
61
#17
Тоже как-то пытался эту штуку к Лотусу прикрутить, но уж больно много всего оно с собой тянет. Решил, что Apache FOP намного легче. В работе конечно, а не в разработке, т.к. FO шаблон не так просто сделать как DOCX файл. Ещё есть вариант пропускать RTF через шаблонизатор, например Velocity. Только там русские буковки ещё конвертить надо.
[DOUBLEPOST=1442320178,1442320056][/DOUBLEPOST]
Видел это, но не понял о чем там говорится в ответе, можете пояснить?
Your error means that you have not XDocReport fr.opensagres.xdocreport.document.docx docx implementation JAR in your classpath.

Библиотечки не хватает.
 

oshmianski

Достойный программист
Lotus team
25.04.2012
556
8
#18
в этом посте думаю ответ.

1. редактор может не подсветить
2. переложите все зависимые jar'ки в ext папку, а из Archive агента уберите
3. добавьте в grant соответсвующие строки
 

erdi

Well-known member
20.08.2008
265
17
#19
Если просто пытаешься пощупать данную библиотеку, то скачай примеры с их сайта и запусти в том же eclipse. Если запустятся, тогда тупым копированием переносишь в агента. Я таким способом отлаживался и я использую данную библиотеку в продакшене