L'ultimo scalino da superare prima del rilascio della prima versione di SqlDocGen è la generazione dell'Output. Dopo aver affrontato il problema di come generare un file PDF partendo da un codice HTML è possibile analizzare il codice che genera il file, ultimo passo prima della release.
Prima di tutto è necessario definire la struttura HTML che avrà il file di uscita, l'ideale è suddividere ed utilizzare i tag <H> (Intestazione) per catalogare Tabelle, colonne, trigger, viste e procedure in modo ordinato:
public static void generateOutputFile(SqlDocGenerator what, String where) throws Exception {
PrintWriter output;
String aux, country;
ConfigurationManager configManager;
LangManager langManager;
configManager = new ConfigurationManager();
country = configManager.get("LANG");
if (country == null) {
throw new Exception("LANG property not defined");
}
langManager = new LangManager(country);
output = new PrintWriter(new FileWriter(where));
output.println("<html><body>");
output.println("<h1>?</h1>".replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_DATABASE")));
output.println("<h2>?</h2>".replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLES")));
if (what.getTables().isEmpty()) {
output.println(langManager.get("GENERATEOUTPUTFILE_EMPTY"));
}
for (Table t : what.getTables()) {
aux = "<h3>?</h3>";
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLE") + " " + t.getName());
output.println(aux);
aux = "<p align=\"justify\" style=\"word-wrap: break-word;\">?</p>";
aux = aux.replaceFirst("\\?", t.getComment());
output.println(aux);
output.println("<table style=\"table-layout:fixed;\" width=100% cellspacing=\"0\" cellpadding=\"0\">");
aux = "<tr><td width=100% colspan=3 style=\"background-color:?;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLECOLUMNS"));
output.println(aux);
aux = "<tr><td width=30% style=\"background-color:?;border-style:solid;border-width:1px;\">?</td><td width=30% style=\"background-color:?;border-style:solid;border-width:1px;\">?</td><td width=40% style=\"background-color:?;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLECOLUMNNAME"));
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLECOLUMNTYPE"));
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_COMMENT"));
output.println(aux);
for (TableColumn tc : t.getColumns()) {
aux = "<tr><td width=30% style=\"border-style:solid;border-width:1px;\">?</td><td width=30% style=\"border-style:solid;border-width:1px;\">?</td><td width=40% style=\"word-wrap: break-word;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", tc.getName());
aux = aux.replaceFirst("\\?", tc.getType());
aux = aux.replaceFirst("\\?", tc.getComment());
output.println(aux);
}
output.println("</table>");
for (TableTrigger tr : t.getTriggers()) {
aux = "<h4>?</h4>";
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_TABLETRIGGER") + " " + tr.getName());
output.println(aux);
aux = "<p align=\"justify\">?</p>";
aux = aux.replaceFirst("\\?", tr.getComment());
output.println(aux);
output.println("<table style=\"table-layout:fixed;\" width=100% cellspacing=\"0\" cellpadding=\"0\">");
aux = "<tr><td width=100% style=\"background-color:?;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_CODE"));
output.println(aux);
aux = "<tr><td width=100% style=\"word-wrap: break-word;font-familiy:courier;font-size:8px;border-style:solid;border-width:1px;\"><pre>?</pre></td></tr>";
aux = aux.replaceFirst("\\?", tr.getCode());
output.println(aux);
}
output.println("</table><br>");
}
output.println("<h2>?</h2>".replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_VIEWS")));
if (what.getViews().isEmpty()) {
output.println(langManager.get("GENERATEOUTPUTFILE_EMPTY"));
}
for (View v : what.getViews()) {
aux = "<h3>?</h3>";
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_VIEW") + " " + v.getName());
output.println(aux);
aux = "<p align=\"justify\" style=\"word-wrap: break-word;\">?</p>";
aux = aux.replaceFirst("\\?", v.getComment());
output.println(aux);
output.println("<table style=\"table-layout:fixed;\" width=100% cellspacing=\"0\" cellpadding=\"0\">");
aux = "<tr><td width=100% colspan=3 style=\"background-color:?;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_CODE"));
output.println(aux);
aux = "<tr><td width=100% colspan=3 style=\"word-wrap: break-word;font-familiy:courier;font-size:8px;border-style:solid;border-width:1px;\"><pre>?</pre></td></tr>";
aux = aux.replaceFirst("\\?", v.getCode());
output.println(aux);
output.println("</table><br>");
}
output.println("<h2>?</h2>".replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_STOREDPROCEDURES")));
if (what.getStoredProcedures().isEmpty()) {
output.println(langManager.get("GENERATEOUTPUTFILE_EMPTY"));
}
for (StoredProcedure sp : what.getStoredProcedures()) {
aux = "<h3>?</h3>";
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_STOREDPROCEDURE") + " " + sp.getName());
output.println(aux);
aux = "<p align=\"justify\" style=\"word-wrap: break-word;\">?</p>";
aux = aux.replaceFirst("\\?", sp.getComment());
output.println(aux);
output.println("<table style=\"table-layout:fixed;\" width=100% cellspacing=\"0\" cellpadding=\"0\">");
aux = "<tr><td width=100% colspan=3 style=\"background-color:?;border-style:solid;border-width:1px;\">?</td></tr>";
aux = aux.replaceFirst("\\?", configManager.get("HEADERS_BGCOLOR"));
aux = aux.replaceFirst("\\?", langManager.get("GENERATEOUTPUTFILE_CODE"));
output.println(aux);
aux = "<tr><td width=100% colspan=3 style=\"word-wrap: break-word;font-familiy:courier;font-size:8px;border-style:solid;border-width:1px;\"><pre>?</pre></td></tr>";
aux = aux.replaceFirst("\\?", sp.getCode());
output.println(aux);
output.println("</table><br>");
}
output.println("</body></html>");
output.flush();
output.close();
}
Questi sono i punti chiave del codice a cui prestare maggiore attenzione:
Viene utilizzato il LangManager, versione simile al ConfigurationManager trattato qui.
In configurazione è definito il parametro HEADERS_BGCOLOR utilizzato per impostare il colore di background delle tabelle (esempio rosso=#ff0000)
Il LangManager viene utilizzato per tradurre le sezioni "statiche" del file di output come il testo delle intestazini delle tabelle oppure testi che precedono il nome delle tabelle, viste ecc..
Dato che i testi potrebbero essere molto lunghi viene utilizzato lo stile CSS "word-wrap: break-word;" in modo da troncare parole o istruzioni di lunghezza eccessiva.
Il codice attuale genera un file HTML, non PDF, ma come abbiamo già visto la cosa non crea alcun problema.
Conclusione
Il prossimo appuntamento sarà focalizzato sulla release del software, l'inserimento del file Jar nella sezione Downloads e qualche linea guida sui futuri sviluppi di questo progetto.
Nessun commento:
Posta un commento