001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002 *
003 * Copyright 2000-2014, Michael Meyling <mime@qedeq.org>.
004 *
005 * "Hilbert II" is free software; you can redistribute
006 * it and/or modify it under the terms of the GNU General Public
007 * License as published by the Free Software Foundation; either
008 * version 2 of the License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU General Public License for more details.
014 */
015
016 package org.qedeq.kernel.bo.service.unicode;
017
018 import java.io.File;
019 import java.io.FileOutputStream;
020 import java.io.IOException;
021 import java.util.Locale;
022
023 import org.qedeq.base.io.Parameters;
024 import org.qedeq.base.io.TextOutput;
025 import org.qedeq.base.trace.Trace;
026 import org.qedeq.kernel.bo.KernelContext;
027 import org.qedeq.kernel.bo.log.QedeqLog;
028 import org.qedeq.kernel.bo.module.InternalModuleServiceCall;
029 import org.qedeq.kernel.bo.module.InternalServiceJob;
030 import org.qedeq.kernel.bo.module.KernelQedeqBo;
031 import org.qedeq.kernel.bo.service.basis.ModuleServicePluginExecutor;
032 import org.qedeq.kernel.se.common.ModuleService;
033 import org.qedeq.kernel.se.common.SourceFileExceptionList;
034
035
036 /**
037 * Transfer a QEDEQ module into a UTF-8 text file.
038 * <p>
039 * <b>This is just a quick written generator. This class just generates some text output to be able
040 * to get a visual impression of a QEDEQ module.</b>
041 *
042 * @author Michael Meyling
043 */
044 public class Qedeq2Utf8Executor implements ModuleServicePluginExecutor {
045
046 /** This class. */
047 private static final Class CLASS = Qedeq2Utf8Executor.class;
048
049 /** Output goes here. */
050 private TextOutput printer;
051
052 /** Current destination file. */
053 private File destination;
054
055 /** Visit all nodes with this visitor. */
056 private final Qedeq2UnicodeVisitor visitor;
057
058 /** Break automatically before this column number. */
059 private int maxColumns;
060
061 /** Generate text for these languages. */
062 private String[] languages;
063
064 /** Current language selection. See {@link #languages}. */
065 private int run = 0;
066
067 /**
068 * Constructor.
069 *
070 * @param plugin This plugin we work for.
071 * @param prop QEDEQ BO object.
072 * @param parameters Plugin parameter.
073 */
074 public Qedeq2Utf8Executor(final ModuleService plugin, final KernelQedeqBo prop,
075 final Parameters parameters) {
076 final boolean info = parameters.getBoolean("info");
077 // automatically line break after this column. 0 means no automatic line breaking
078 maxColumns = parameters.getInt("maximumColumn");
079 if (parameters.getInt("maximumColumn") != 0) {
080 maxColumns = Math.max(10, maxColumns);
081 }
082 final boolean brief = parameters.getBoolean("brief");
083 visitor = new Qedeq2UnicodeVisitor(plugin, prop, info , maxColumns, true, brief);
084 }
085
086 public Object executePlugin(final InternalModuleServiceCall call, final Object data) {
087 final String method = "executePlugin()";
088 try {
089 QedeqLog.getInstance().logRequest("Generate UTF-8", visitor.getKernelQedeqBo().getUrl());
090 languages = visitor.getKernelQedeqBo().getSupportedLanguages();
091 for (run = 0; run < languages.length; run++) {
092 final String result = generateUtf8(call.getInternalServiceProcess(), languages[run], "1");
093 if (languages[run] != null) {
094 QedeqLog.getInstance().logSuccessfulReply(
095 "UTF-8 for language \"" + languages[run]
096 + "\" was generated into \"" + result + "\"", visitor.getKernelQedeqBo().getUrl());
097 } else {
098 QedeqLog.getInstance().logSuccessfulReply(
099 "UTF-8 for default language "
100 + "was generated into \"" + result + "\"", visitor.getKernelQedeqBo().getUrl());
101 }
102 }
103 if (languages.length == 0) {
104 QedeqLog.getInstance().logMessage("no supported language found, assuming 'en'");
105 final String result = generateUtf8(call.getInternalServiceProcess(), "en", "1");
106 QedeqLog.getInstance().logSuccessfulReply(
107 "UTF-8 for language \"en"
108 + "\" was generated into \"" + result + "\"", visitor.getKernelQedeqBo().getUrl());
109 }
110 } catch (final SourceFileExceptionList e) {
111 final String msg = "Generation failed";
112 Trace.fatal(CLASS, this, method, msg, e);
113 QedeqLog.getInstance().logFailureReply(msg, visitor.getKernelQedeqBo().getUrl(), e.getMessage());
114 } catch (IOException e) {
115 final String msg = "Generation failed";
116 Trace.fatal(CLASS, this, method, msg, e);
117 QedeqLog.getInstance().logFailureReply(msg, visitor.getKernelQedeqBo().getUrl(), e.getMessage());
118 } catch (final RuntimeException e) {
119 Trace.fatal(CLASS, this, method, "unexpected problem", e);
120 QedeqLog.getInstance().logFailureReply(
121 "Generation failed", visitor.getKernelQedeqBo().getUrl(), "unexpected problem: "
122 + (e.getMessage() != null ? e.getMessage() : e.toString()));
123 }
124 return null;
125 }
126
127 /**
128 * Gives a UTF-8 representation of given QEDEQ module as InputStream.
129 *
130 * @param process This process executes us.
131 * @param language Filter text to get and produce text in this language only. Might
132 * be <code>null</code>
133 * @param level Filter for this detail level. LATER mime 20050205: not supported
134 * yet.
135 * @return Name of generated file.
136 * @throws SourceFileExceptionList Major problem occurred.
137 * @throws IOException File IO failed.
138 */
139 public String generateUtf8(final InternalServiceJob process, final String language, final String level)
140 throws SourceFileExceptionList, IOException {
141
142 // first we try to get more information about required modules and their predicates..
143 try {
144 visitor.getKernelQedeqBo().getKernelServices().loadRequiredModules(
145 process, visitor.getKernelQedeqBo());
146 visitor.getKernelQedeqBo().getKernelServices().checkWellFormedness(
147 process, visitor.getKernelQedeqBo());
148 } catch (Exception e) {
149 // we continue and ignore external predicates
150 Trace.trace(CLASS, "generateUtf8(KernelQedeqBo, String, String)", e);
151 }
152 String lan = "en";
153 if (language != null) {
154 lan = language;
155 }
156 // if (level == null) {
157 // this.level = "1";
158 // } else {
159 // this.level = level;
160 // }
161 String txt = visitor.getKernelQedeqBo().getModuleAddress().getFileName();
162 if (txt.toLowerCase(Locale.US).endsWith(".xml")) {
163 txt = txt.substring(0, txt.length() - 4);
164 }
165 if (lan.length() > 0) {
166 txt = txt + "_" + lan;
167 }
168 destination = new File(KernelContext.getInstance().getConfig()
169 .getGenerationDirectory(), txt + ".txt").getCanonicalFile();
170 printer = new TextOutput(visitor.getKernelQedeqBo().getName(), new FileOutputStream(destination),
171 "UTF-8");
172
173 try {
174 visitor.generateUtf8(process, printer, lan, level);
175 } finally {
176 printer.flush();
177 printer.close();
178 }
179 if (printer.checkError()) {
180 throw printer.getError();
181 }
182 return destination.toString();
183 }
184
185 public String getLocationDescription() {
186 if (languages != null && run < languages.length) {
187 return languages[run] + " " + visitor.getLocationDescription();
188 }
189 if (languages != null && languages.length > 0) {
190 return languages[languages.length] + " " + visitor.getLocationDescription();
191 }
192 return "unknown";
193 }
194
195 public double getVisitPercentage() {
196 return visitor.getVisitPercentage() / languages.length * (run + 1);
197 }
198
199 public boolean getInterrupted() {
200 return visitor.getInterrupted();
201 }
202
203 }
|