現在、いくつかのテンプレート ファイルに基づいて .xml ファイルを生成および検証するアプリケーションに取り組んでいます。
これらのファイルを生成するために呼び出すメソッドは次のようになります。
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
私はこのFtlProcessingControllerクラスの作成者ではありませんが、プロセスメソッドは基本的にTEMPLATESディレクトリからテンプレート ファイルを取得し、ルートオブジェクト (Answer オブジェクトのツリー) とmetadata
オブジェクト (追加データのマップ) の内容を入力します。 、および .xml ファイルを OUTPUT _DIRECTORY に出力します。
簡単に言うと、メイン コードは次のようになります。
// Prepare files and data
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
// Validate XML files
問題は、プロセス呼び出しが機能しない後のコンソール出力です。コンソールには何も表示されません。
呼び出しをテスト出力で囲み、PrintStream
リセット用に保存してみました。
System.out.println("Console");
PrintStream stdOut = System.out;
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
// Test Exception was thrown here.
System.setOut(stdOut);
System.out.println("Console again");
しかし、私は得るだけです:
コンソール
ファイルが正常に生成されているため、この呼び出しに無限ループやSystem.exit()がないことは確かです。それを確認するために、呼び出しの直後に例外をスローしようとしたところ、正常に例外がスローされました。
私の質問は次のとおりです: processメソッドがSystem.outSystem.setOut(stdOut)
で行うことと行わないこととは関係なく、呼び出し後にコンソールで再度印刷できるようにすべきではありませんか?
保存された PrintStream が機能しないように、標準出力を台無しにする可能性があるのは何ですか?
ありがとう!
好奇心旺盛な方のために、完全なメイン コード:
public static void main(String[] args) {
try {
// Parse answers
Answer root = AnswerUtils.fromJSON(JSON_FILE, Answer.class);
ModuleInfo manager = new SimpleModuleInfo(MODULE_MANAGER_ID, MODULE_MANAGER_CATEGORY, MODULE_MANAGER_NAME,
MODULE_MANAGER_VERSION, MODULE_MANAGER_VERSION);
ModuleInfo module = new SimpleModuleInfo(MODULE_ID, MODULE_CATEGORY, MODULE_NAME, MODULE_VERSION, INSTANCE);
List<ModuleInfo> info = new ArrayList<ModuleInfo>();
info.add(manager);
info.add(module);
if (DEPENDENCIES_FILES != null) {
// property file, with all dependencies as a comma-separated value under the 'dependencies' key
Properties props = new Properties();
InputStream in = null;
try {
in = new FileInputStream(DEPENDENCIES_FILES);
props.load(in);
} finally {
IOUtils.closeQuietly(in);
}
String[] values = StringUtils.split(props.getProperty("dependencies"), ',');
if (values != null) {
for (String value : values) {
ModuleDependency dep = new ModuleDependency(StringUtils.trim(value));
info.add(new SimpleModuleInfo(dep.getIdentifier(), "Category", WordUtils.capitalizeFully(
dep.getIdentifier(), new char[] { '-' }), dep.getVersion().toString(), dep
.isInstanceDependency() ? module.getInstance() : "Default"));
}
}
}
Map<String, Object> metadata = getMetadata(HOME, os, arch, module, info.toArray(new ModuleInfo[info.size()]));
System.out.println("Console");
PrintStream stdOut = System.out;
FtlProcessingController ctrl = new FtlProcessingController();
ctrl.process(TEMPLATES, OUTPUT_DIRECTORY, root, metadata);
System.setOut(stdOut);
System.out.println("Console again");
// Validate XML
Collection<File> xmlFiles = FileUtils.listFiles(OUTPUT_DIRECTORY, OUTPUT_FILES_EXTENSIONS, WITH_SUBDIRECTORIES);
for (File file : xmlFiles) {
System.out.println(file.getAbsolutePath());
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setFeature(FACTORY_DTD_FEATURE, false);
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new SPErrorHandler());
reader.parse(file.getAbsolutePath());
}
if(true)
throw new IOException();
} catch (SAXException se) {
se.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
}
}