package de.superx.common; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.io.StringReader; import java.io.StringWriter; import java.math.BigDecimal; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.commons.fileupload.FileItem; import org.slf4j.LoggerFactory; import de.memtext.baseobjects.NamedIdObject; import de.memtext.baseobjects.coll.NamedIdObjectList; import de.memtext.tree.KeyParentEqualException; import de.memtext.tree.NoMainEntryException; import de.memtext.util.DateUtils; import de.memtext.util.EqualsUtil; import de.memtext.util.ServletHelper; import de.memtext.util.StringUtils; import de.memtext.util.TimeUtils; import de.memtext.util.XMLUtils; import de.superx.bin.SxDBUtils; import de.superx.servlet.ExternalPool; import de.superx.servlet.ServletUtils; import de.superx.servlet.SuperXManager; import de.superx.servlet.SxPools; import de.superx.util.SqlStringUtils; import freemarker.template.TemplateException; /** * Eine Maske wie sie in der Tabelle maskeninfo hinterlegt, kann allerdings auch * Untermasken enthalten */ public class Maske extends NamedIdObject implements Serializable { // TODO: für Maskencachfunktion (s. Propadmin) erstmal auf default gesetzt // für Mandanten müsste nach masken cloning MandantenID noch gesetzt werden private static org.slf4j.Logger logger = LoggerFactory.getLogger(Maske.class); private String mandantenID = "default"; private boolean isResultReuseFeatureWanted = true; private String schleifenrelation, schleifenfeldname, schleifenfstand, schleifenfsicht, aktion; private String select_stmt = ""; private String cleanup_stmt = ""; private String xilString = ""; private String chartx = ""; private String charty = ""; private String standString = ""; private String desiredContenttype = ""; private HashMap map = new HashMap(); private boolean navi = false; private boolean isMakroSubMaske = false; private String selectedMaskStylesheetFile = null; private Stylesheet selectedTableStylesheet = null; private SharedData sharedData = new SharedData(); private FieldContainer individualFields = new FieldContainer(); private List maskStylesheetList = new LinkedList(); private List tableStylesheetList = new LinkedList(); private SuperX_el result_el = new SuperX_el(); private String lastExecuted; private String lastHeaderXml = ""; private int offset; // welche Spalten sollen dargestellt werden // wird bewußt nicht geclont! private String colset; private int maxOffset; private static final long serialVersionUID = 1; // browser erstmal abgeklemmt private String browser = ""; private boolean isReuseResult = false; private Integer sortNr; private NamedIdObjectList submaskenListe = new NamedIdObjectList(); private Locale locale; private String maskHtml; // neu für Werte reuse private StringBuffer lastXmlResult; private static final int MACRO_MAX_OFFSET = 10000000; private String explanation; private String hinweis = "", hinweisCaption = ""; // private HttpServletRequest request; private String colsort = null; private HeaderManager headerManager = new HeaderManager(); private String captionShort, captionLong; private String lastsql; private String desiredRows; private List multipartData = null; /** * Dieser Konstruktur wird nur zum Clonen gebraucht * */ private Maske() { locale = TranslationContainer.defaultLocale; } /** * Dieser Konstruktor ist zum Aufbauen einer Maske * * @param locale * @throws TransformerConfigurationException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws SQLException * @throws DBServletException * @throws IOException * @throws TemplateException * @throws NoMainEntryException */ public Maske(String mandantenID, SxUser user, Integer tid, Locale locale) throws TransformerConfigurationException, TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException { Logger.getLogger("superx_" + mandantenID).log(Level.FINE, "Aufbau der Maske " + tid + " " + DateUtils.getNowString()); this.mandantenID = mandantenID; setId(tid); // individualFields.getFormular().put("UserID", user.getId()); setLocale(locale); initFromMaskeninfo(); // erstmal abgeklemmt um Masken-Caching zu vereinfachen // this.browser = browser; NamedIdObjectList fields = readFelderFromDb(user); individualFields.addAll(fields); initMaskStylesheets(); initTableStylesheets(); initSubMasken(user); } /** * Untermaske aufbauen Der Konstruktur ist private, kann also nur von einer * Hauptmaske aus aufgerufen werden * * @param singleSubMask * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws SQLException * @throws DBServletException * @throws IOException * @throws TemplateException * @throws NoMainEntryException */ private Maske(String mandantenID, SxUser user, SharedData sharedData, SxResultRow singleSubMaskRow, Locale locale) throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException { this.mandantenID = mandantenID; this.locale = locale; // individualFields.getFormular().put("UserID", user.getId()); this.isResultReuseFeatureWanted = true; // bei Untermasken setName(singleSubMaskRow.get(0).toString()); setId(singleSubMaskRow.get(1)); // wird in initsubmasken gemacht setMaxOffset(1000000); setSchleifenrelation(singleSubMaskRow.get(2)); setSchleifenfeldname(singleSubMaskRow.get(3)); setSchleifenfstand((String) singleSubMaskRow.get(4)); setSchleifenfsicht((String) singleSubMaskRow.get(5)); if (getSchleifenrelation() != null && getSchleifenfeldname() == null) { throw new IllegalStateException("Die Maske ist derzeit nicht benutzbar. Bei der Maske " + getId() + " ist in makro_masken_bez kein Schleifenfeldname für die Schleife angegeben"); } if (getSchleifenrelation() == null && getSchleifenfeldname() != null) { throw new IllegalStateException("Die Maske ist derzeit nicht benutzbar. Bei der Maske " + getId() + " ist in makro_masken_bez keine Schleifenrelation für die Schleife"); } setAktion(singleSubMaskRow.get(6)); setSortNr(new Integer(singleSubMaskRow.get(7).toString())); initFromMaskeninfo(); this.sharedData = sharedData; individualFields.addAll(readFelderFromDb(user)); initSubMasken(user); } public String getAktion() { if (aktion == null || aktion.toString().trim().equals("")) this.aktion = "SHOWTABLE"; return aktion; } public void setAktion(Object aktion) { if (aktion == null || aktion.toString().trim().equals("")) this.aktion = "SHOWTABLE"; else this.aktion = aktion.toString().toUpperCase(); } /** * Schleifenfeldname * * @return null wenn nicht in Benutzung */ private String getSchleifenfeldname() { return schleifenfeldname; } private void setSchleifenfeldname(Object schleifenfeldname) { if (schleifenfeldname == null || schleifenfeldname.toString().trim().equals("")) this.schleifenfeldname = null; else this.schleifenfeldname = schleifenfeldname.toString(); } /** * schleifenrelation * * @return null wenn nicht in Benutzung */ private String getSchleifenrelation() { return schleifenrelation; } public Collection getTmpFiles() { return sharedData.getGraphicFiles(); } private void setSchleifenrelation(Object schleifenrelation) { if (schleifenrelation == null || schleifenrelation.toString().trim().equals("")) this.schleifenrelation = null; else this.schleifenrelation = schleifenrelation.toString(); } public String getDesiredContenttype() { return desiredContenttype; } public void setDesiredContenttype(String desiredContenttype) { this.desiredContenttype = desiredContenttype; } /** * Die eigenen Felder einlesen und hinzufügen in initSubMasken werden ggfs. aus * übergeordneten Masken Felder rübergeholt * * @return * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws SQLException * @throws DBServletException * @throws IOException * @throws TemplateException * @throws NoMainEntryException */ public NamedIdObjectList readFelderFromDb(SxUser user) throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException { if (getId() == null) throw new IllegalStateException("Kann keine Maske ohne tid vorbereiten"); NamedIdObjectList felder = new NamedIdObjectList(); String query = "select F.tid, F.name, F.nummer, F.x, F.y, F.buttonbreite, " + "F.feldbreite, F.zeilenanzahl, F.typ, F.laenge, " + "F.obligatorisch, F.art, F.relation, F.attribut, F.defaultwert, M.name as Maskenname " + "from felderinfo F, masken_felder_bez B, maskeninfo M " + "where F.art!=999 and B.maskeninfo_id = " + getId() + " and M.tid = " + getId() + " and F.tid = B.felderinfo_id " + "order by F.nummer;"; SxResultSet felderset = ServletUtils.execute("Einlesen der Felder für Maske " + getId(), query, mandantenID); String sql = "select field_name,locale,contents_short, contents_long, record_no " + " from sx_captions " + " where table_name='felderinfo' " + " and field_name in (select name from felderinfo where tid in (select felderinfo_id from masken_felder_bez where maskeninfo_id=" + getId() + "))" + " and (record_no is null OR record_no in (select felderinfo_id from masken_felder_bez where maskeninfo_id=" + getId() + "))" + " and (locale ='" + locale.getLanguage() + "' or locale is null or locale='' or locale='de')" + " order by field_name, record_no ASC;"; SxResultSet captionSet = ServletUtils.execute("Einlesen der Captions für Maske " + getId(), sql, mandantenID); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); for (Iterator it = felderset.iterator(); it.hasNext();) { SxResultRow feldRow = (SxResultRow) it.next(); // MB new version keine Kopien von Felder übernehmen // nur später in updateFormular ggfs. Werte übertragen /* * String feldname = (String) feldRow.get(1); if * (sharedData.getFields().containsField(feldname)) { * felder.add(sharedData.getFields().getByName(feldname)); } else { */ Field feld = new Field(mandantenID, user, ((Integer) this.getId()), feldRow, locale, individualFields.getFormular(), map, individualFields, captionSet); felder.add(feld); // }*/ } return felder; } public void setFieldDefaults(SxUser user, HttpServletRequest request, boolean isCalledByTableServlet) throws ParseException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, UngueltigeEingabeException, TransformerException, NoMainEntryException, InvalidDataTypeException { this.setFieldDefaults(user, request, null, isCalledByTableServlet); } /** * Wenn für Felder Defaults im Request hinterlegt sind, werden diese * eingetragen, ansonsten wird der in der DB ggfs. hinterlegt Defaultwert * genommen isCalledByTableServlet - wenn von TabellenServlet aufgerufen und * Leerstring als Param (= von SuperXmlMaske kommend oder tid=123&abc= im * Request -> Leerparam hat Vorrang vor DB-Defaultwerten) * * @param request * @throws ParseException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws IOException * @throws TemplateException * @throws UngültigeEingabeException * @throws TransformerException * @throws NoMainEntryException * @throws InvalidDataTypeException */ public void setFieldDefaults(SxUser user, HttpServletRequest request, Map params, boolean isCalledByTableServlet) throws ParseException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, UngueltigeEingabeException, TransformerException, NoMainEntryException, InvalidDataTypeException { // für ein Feld müsste auch über request parameter gewünschte Sicht & // Stand einstellbar sein // sichtParamSetzen(request, "Organigramm","10"); Hashtable formular = individualFields.getFormular(); // default, wird ggfs. von request überschrieben formular.put("erlaubt", "0"); sharedData.getFormular().put("erlaubt", "0"); standParamSetzen("Organigramm", DateUtils.getTodayString()); formular.put("UserID", user.getId()); formular.put("system_version", "SuperX"); String h1version = System.getProperty("SuperX-HISinOne-VERSION"); if (h1version != null) { formular.put("system_version", h1version); } String his1_refapp = SuperXManager.his1_refapp; if (his1_refapp != null) { formular.put("his1_refapp", his1_refapp); } // Elemente aus dem request zum Formular hinzufügen // wichtig für Querabhängigkeiten loadFieldsFromRequest(request); // Werte ggfs. trimmen for (Iterator it = individualFields.iterator(); it.hasNext();) { Field aField = (Field) it.next(); String param = (String) formular.get(aField.getName()); if (param != null && param.length() > 30 && param.length() > aField.getLaenge()) { String shortparam = StringUtils.trimLength(param, Math.max(30, aField.getLaenge())); Logger.getLogger("superx_" + mandantenID).log(Level.WARNING, "Parameter für Feld " + aField.getName() + " (" + aField.getId() + ") wird gekürzt auf angegebene Länge " + aField.getLaenge() + " Zeichen:" + shortparam + " \nwar:" + param); formular.put(aField.getName(), shortparam); } // Querabhängigkeit von Dynamischen Sichten von Feldart 0 Datumsfeldern wie // "Datum" oder "ab Datum" "bis Datum" // ermoeglichen #188582c14 if (aField.getArt() == 0 && aField.getDefaultwertString() != null) { aField.updateDefaultValue(formular, map, individualFields, param, false, user); formular.put(aField.getName(), aField.getDefaultValueEscaped()); } // System.out.println("test:"+aField.getName()); if (aField.isOldOrganigrammArt() || aField.isSicht()) { setFeldStand(aField.getName(), ServletHelper.getParameter(request, aField.getName() + "-Stand"), user); setSelectedFeldSicht(aField.getName(), ServletHelper.getParameter(request, aField.getName() + "-Sicht"), user); } // MB ggfs. trennzeichen umformen if (aField.getZeilenanzahl() > 1) { // TODO: Definition für Startreihenfolge // aField.initIfNeeded(formular, user); // if (aField.isOldOrganigrammArt() || aField.isSicht()) // aField.getSichtgruppe().getSelectedSicht(). // setSubelementsinForEach(true); if (param != null && (param.indexOf(",") > -1 || param.indexOf("|") > -1)) formular.put(aField.getName(), aField.getParamAdaptedEscaped(param)); } } for (Iterator it = individualFields.iterator(); it.hasNext();) { Field aField = (Field) it.next(); // Um Werte von html-Listboxen und checkboxen einzulesen String[] fw = request.getParameterValues(aField.getName()); // wenn Parameter übergeben wurde per Maske ist param gefüllt mit Leerstring // wenn URL übergeben wird ohne Parameter abc ist, param null // String param = ""; if (fw != null) { for (int i = 0; i < fw.length; i++) { if (StringUtils.containsTags(fw[i])) throw new IllegalArgumentException( "Parameter für " + aField.getName() + " enthält unerlaubte Tags"); if (i < fw.length - 1) param += fw[i].trim() + ","; else param += fw[i].trim(); } } else if (params != null && params.containsKey(aField.getName())) { param = (String) params.get(aField.getName()); } // Schutz vor Sql-Injection aber nur, wenn mehr param mehr als ";" enthält! if (param.length() > 1) { param = param.replace(';', '^'); } // alt String param = request.getParameter(aField.getName()); // falls noch nötig werden auch selectionElements initialisiert // Art 0 könnte neues Einlesen nötig machen // Beispiel: Datumseingabe manuell Jahr geändert, Kapitel direkt // eingegeben if (aField.isDynamic() && this.hasArt0Fields()) { for (Iterator itr = individualFields.iterator(); itr.hasNext();) { Field f = (Field) itr.next(); if (f.getArt() == 0 && aField.getRelation() != null && aField.getRelation().indexOf("<<" + f.getName() + ">>") > -1) { aField.setInited(false); break; } } } HashMap map = new HashMap(); String fieldId = String.valueOf(aField.getId()); formular.put("FieldID", fieldId); map.putAll(user.getBasicMap()); boolean isTableServletAndEmptyStringParam = isCalledByTableServlet && request.getParameter(aField.getName()) != null && request.getParameter(aField.getName()).equals(""); aField.updateDefaultValue(formular, map, individualFields, param, isTableServletAndEmptyStringParam, user); // damit // initSelectionTree // auf jeden // Fall gelaufen // ist // wenn maskenparameter angegeben sind, z.B. aus Lesezeichen, // selectionbuffer ignorieren int paramcount = params != null ? params.size() : 0; for (Enumeration en = request.getParameterNames(); en.hasMoreElements();) { String name = (String) en.nextElement(); if (name.equals("tid") || name.equals("cachingcontrol") || name.equals("navi")) continue; // System.out.println("paramx:"+name); paramcount++; } // System.out.println("paramx count"+paramcount); SelectionBuffer sb = user.getSelectionBuffer(); // System.out.println("checking // "+aField.getName()+"sb:"+sb.getFieldDefault(aField.getName())); // if (sb.getFieldDefault(aField.getName())!=null) // System.out.println(" // haskey"+aField.hasKeys(sb.getFieldDefault(aField.getName()))); boolean isMehrfachAuswahl = aField.isMehrfachAuswahl(sb.getFieldDefault(aField.getName())); // wenn ein Feldparameter z.B. aus Lesezeichen gefunden wird, hat // der Vorrang // wenn es einen Eintrag für das Feld gibt und der auch in der // Auswahlliste des Felds vorkommt wird gearbeitet if (paramcount == 0 && !aField.isHidden() && request.getParameter(aField.getName()) == null && sb.getFieldDefault(aField.getName()) != null && !sb.getFieldDefault(aField.getName()).equals("") && aField.hasKeys(isMehrfachAuswahl, sb.getFieldDefault(aField.getName()))) { // bei Mehrfachauswahl nur wenn das Zielfeld auch zeilenzahl>1 // hat if (!isMehrfachAuswahl || aField.getZeilenanzahl() > 1) { // aField.setInited(false); { aField.updateDefaultValue(formular, map, individualFields, sb.getFieldDefault(aField.getName()), false, user); } } } formular.put(aField.getName(), aField.getDefaultValueEscaped()); } // MB 8/2011 setFieldsDefaultSichten(user, request); } /** * Bei obligatorischen Kostenstellenfeldern bei denen keine Auswahl möglich ist, * Fehlermeldung ausgeben * * @throws SQLException */ public void kostenstellenSichtAufAuswahlPruefen() throws SQLException { for (Iterator it = individualFields.iterator(); it.hasNext();) { Field aField = (Field) it.next(); if (aField.isObligatorisch() && aField.isSicht() && (aField.getSichtgruppe().getSelectedSicht().getArt().indexOf("Kostenstelle") > -1 || aField.getSichtgruppe().getSelectedSicht().getArt().indexOf("Organigramm") > -1)) { if (aField.getSichtgruppe().getSelectedSicht().isNoSelectionPossible()) throw new SQLException("Feld " + aField.getName() + " bei der Sicht " + aField.getSichtgruppe().getSelectedSicht().getName() + " (Art: " + aField.getSichtgruppe().getSelectedSicht().getArt() + ") enthält keine Elemente"); } } } public void setLocale(Locale newlocale) throws SQLException, DBServletException { if (locale == null || !(locale.equals(newlocale))) { this.locale = newlocale; individualFields.getFormular().put("locale", locale.getLanguage()); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); f.setLocale(locale); } for (Iterator it = sharedData.getFields().iterator(); it.hasNext();) { Field f = (Field) it.next(); f.setLocale(locale); } } } /** * Liest falls vorhanden Submasken ein. * * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws SQLException * @throws DBServletException * @throws IOException * @throws TemplateException * @throws NoMainEntryException * */ private void initSubMasken(SxUser user) throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException { String query = "select A.name,M.maskeninfo_id2, M.schleifenrelation,M.schleifenfeldname,M.schleifenfstand,M.schleifenfsicht,M.aktion,M.sortnr " + "from macro_masken_bez M, maskeninfo A " + "where M.active=1 and M.maskeninfo_id2 = A.tid and M.maskeninfo_id1 = " + getId() + " order by M.sortnr;"; SxResultSet submaskenrs = ServletUtils.execute("Suche möglicher Submasken in makro_masken_bez", query, mandantenID); if (submaskenrs.size() > 0) { sharedData.addUniqueFields(individualFields); } for (Iterator it = submaskenrs.iterator(); it.hasNext();) { SxResultRow singleSubMaskRow = (SxResultRow) it.next(); Maske m = new Maske(mandantenID, user, sharedData, singleSubMaskRow, locale); m.isMakroSubMaske = true; if (SxPools.get(mandantenID).hasMakroFieldSelection(this.getId(), m.getSortNr())) { SxPools.get(mandantenID).applyMacroFieldSelectionTo(this.getId(), m, sharedData.getFormular(), map, individualFields, user); } m.setMaxOffset(MACRO_MAX_OFFSET); submaskenListe.add(m); } if (this.isMakro()) { this.setMaxOffset(MACRO_MAX_OFFSET); isResultReuseFeatureWanted = true; } } public boolean isMakro() { return submaskenListe.size() > 0; } private void initFromMaskeninfo() throws DBServletException, SQLException { if (getId() == null) throw new IllegalStateException( "Die Maske ist derzeit nicht benutzbar. Kann keine Maske ohne tid vorbereiten"); String query = "select M.tid, M.name, M.select_stmt, M.xil_proplist, M.cleanup_stmt, " + "M.breite, M.hoehe, S.datum, M.chart_xtitel, M.chart_ytitel,M.erlaeuterung,M.hinweis " + "from maskeninfo M, maske_system_bez B, systeminfo S " + "where M.tid = " + getId() + " and M.tid = B.maskeninfo_id" + " and S.tid = B.systeminfo_id" + ";"; SxResultRow maskRow; SxResultSet masksRs = ServletUtils.execute("Lesen aus Maskeninfo für Maske " + getId(), query, mandantenID); if (masksRs.size() == 0) throw new SQLException( "Die Maske ist derzeit nicht benutzbar. Fehlende Angaben in Tabellen maskeninfo,maske_system_bez oder systeminfo für Maske " + getId()); maskRow = (SxResultRow) masksRs.first(); setName(maskRow.get(1).toString()); String tmp_select_stmt = "" + (String) maskRow.get(2); //tmp_select_stmt=tmp_select_stmt.replaceAll("<>", this.getId().toString()); String tmp_xil = "" + (String) maskRow.get(3); //tmp_xil=tmp_xil.replaceAll("<>", this.getId().toString()); String tmp_cleanup = "" + (String) maskRow.get(4); //tmp_cleanup=tmp_cleanup.replaceAll("<>", this.getId().toString()); if (tmp_select_stmt.indexOf("") > -1) { int sourceMask = getTmpMaskNr(tmp_select_stmt); tmp_select_stmt = "select select_stmt from maskeninfo where tid=" + sourceMask+""; tmp_cleanup = "select cleanup_stmt from maskeninfo where tid=" + sourceMask+""; tmp_xil = "select xil_proplist from maskeninfo where tid=" + sourceMask+""; } select_stmt = SxPools.get(mandantenID).checkImports(tmp_select_stmt,this.getId().toString()); xilString = SxPools.get(mandantenID).checkImports(tmp_xil,this.getId().toString()); cleanup_stmt = SxPools.get(mandantenID).checkImports(tmp_cleanup,this.getId().toString()); standString = SqlStringUtils.getValueAsString(maskRow.get(7)); chartx = SqlStringUtils.getValueAsString(maskRow.get(8)); charty = SqlStringUtils.getValueAsString(maskRow.get(9)); explanation = SxPools.get(mandantenID).checkImports((String) maskRow.get(10),this.getId().toString()); setHinweis(SxPools.get(mandantenID).checkImports((String) maskRow.get(11),this.getId().toString())); setHinweisCaption(getHinweis()); } private int getTmpMaskNr(String input) { int result = -1; int posStart = input.indexOf(""); int posEnde = input.indexOf(""); if (posEnde == -1) throw new IllegalArgumentException("Tag sximport nicht ordentlich geschlossen"); String part = input.substring(posStart + 50, posEnde - posStart); try { result = Integer.parseInt(part.trim()); } catch (NumberFormatException e) { throw new IllegalArgumentException("Ungültige Maskennummer " + part + " bei sximport"); } return result; } public String getCharty() { return charty; } public void setCharty(String charty) { this.charty = charty; } public String getChartx() { return chartx; } public String getCleanup_stmt() { return cleanup_stmt; } public String getSelect_stmt() { return select_stmt; } public String getStandString() { return standString; } public String getXilString() { return xilString; } public String getHinweis() { return hinweis; } public void setSelectedMaskStylesheetFile(String filename) { this.selectedMaskStylesheetFile = filename; } public String getSelectedMaskStylesheetFile() { return selectedMaskStylesheetFile; } private void initMaskStylesheets() throws SQLException, DBServletException { String query = "select t1.filename, t1.caption, t1.description, " + " t1.contenttype, t0.ord, t1.is_generic," +" t1.toolbar_icon_filepath, t1.jr_datasource, t1.usage_resultset_data, t1.stylesheet_type from sx_mask_style t0, sx_stylesheets t1" + " where (t0.stylesheet_id=t1.tid) and (t1.relation ='mask') and" + " (t0.maskeninfo_id =" + getId() + ")" + " and (t1.useragent = '' or t1.useragent is null or t1.useragent = '" + browser + "')" + " order by t0.ord;"; SxResultSet stylesheetsRs = ServletUtils.execute("Einlesen der Stylesheets für die Maske " + getId(), query, mandantenID); if (stylesheetsRs.size() > 0) { SxResultRow stylesheetRow = (SxResultRow) stylesheetsRs.first(); // Wenn kein Stylesheet definiert ist, dann wird das // erste als Default genommen // hier müssten eigentlich alle stylesheets zur Liste // hinzugefügt werden Stylesheet s = new Stylesheet(stylesheetRow); maskStylesheetList.add(s); if (selectedMaskStylesheetFile == null) selectedMaskStylesheetFile = s.getFilename(); } else { selectedMaskStylesheetFile = SuperXManager.defaultMaskXsl; } } private void initTableStylesheets() throws SQLException, DBServletException { // mainStylesheet = new Stylesheet(request.getParameter("stylesheet")); String query = "select S.filename, S.caption, S.description, " + " S.contenttype, M.ord,S.is_generic, S.toolbar_icon_filepath," + " S.jr_datasource, S.usage_resultset_data, S.stylesheet_type from sx_stylesheets S,sx_mask_style M" + " where M.stylesheet_id=S.tid " + " and M.maskeninfo_id =" + getId() + " " + " and S.relation ='table' " + " and (S.useragent = '' or S.useragent is null or S.useragent = '" + browser + "')" + " union" // Default-Styleshets HTML : + " select S.filename, S.caption, S.description, " + " S.contenttype, 99999, S.is_generic, S.toolbar_icon_filepath," + " S.jr_datasource, S.usage_resultset_data, S.stylesheet_type from sx_stylesheets S " + " where S.filename = 'tabelle_html.xsl'" + " union" // Default-Styleshets die neben HTML immer aktiv sind: + " select S.filename, S.caption, S.description, " + " S.contenttype, 100000, S.is_generic, S.toolbar_icon_filepath," + " S.jr_datasource, S.usage_resultset_data, S.stylesheet_type from sx_stylesheets S " + " where S.is_generic=1 and S.filename != 'tabelle_html.xsl'" + " order by 5,2;"; SxResultSet stylesheetsRs = ServletUtils .execute("Einlesen der Stylesheets für die Tabellen der Maske " + getId(), query, mandantenID); SxResultRow stylesheetRow = null; for (Iterator it = stylesheetsRs.iterator(); it.hasNext();) { stylesheetRow = (SxResultRow) it.next(); Stylesheet s = new Stylesheet(stylesheetRow); tableStylesheetList.add(s); // Wenn ein Stylesheet definiert ist, dann wird das // erste als Default genommen if (selectedTableStylesheet == null) selectedTableStylesheet = s; } } /** * selectedTableStheet zurücksetzen neu 5/06 * */ public void resetTableStylesheet() { selectedTableStylesheet = null; if (tableStylesheetList.size() > 0) { Stylesheet s = (Stylesheet) tableStylesheetList.get(0); selectedTableStylesheet = s; } } private StringBuffer getStylesheetXml() { StringBuffer result = new StringBuffer(); if (tableStylesheetList.size() > 0) { result.append("\n"); for (Iterator it = tableStylesheetList.iterator(); it.hasNext();) { Stylesheet stylesheet = (Stylesheet) it.next(); result.append(stylesheet.toXml()); } result.append("\n"); } return result; } public String getMaskHtml(SxUser user, String jsessionid, boolean showNavigation) throws TransformerConfigurationException, TransformerException, DBServletException { // wenn maske neue aufgebaut wird resetTableStylesheet(); // jsessionid ist nur bei URL-rewriting gefüllt if (maskHtml == null) prepareHtml(user, showNavigation); else { Logger.getLogger("superx_" + mandantenID).log(Level.FINE, " " + getMaskInfo() + " benutze HTML-Vorlage (XSL-Transformation nicht nötig)"); // System.out.println("using prepared Mask HTML"); } String result = maskHtml; result = result.replaceAll("_USERID_", user.getId().toString()); result = result.replaceAll("_USER_IS_ADMIN_", (user.isAdmin() ? "true" : "false")); return result.replaceAll("_HISINONE_", SuperXManager.his1_refapp); } /** * von SuperXmlMaske und Entwicklungsservlet aufgerufen, wenn Masken-XML * angezeigt werden soll * * @param user * @param jsessionid * @return * @throws TransformerConfigurationException * @throws TransformerException * @throws DBServletException */ public String getMaskXml(SxUser user, String jsessionid, boolean showNavigation) throws TransformerConfigurationException, TransformerException, DBServletException { // wenn maske neue aufgebaut wird resetTableStylesheet(); // jsessionid ist nur bei URL-rewriting gefüllt String result = prepareXml(user, true, showNavigation).toString(); result = result.replaceAll("_USERID_", user.getId().toString()); result = result.replaceAll("_USER_IS_ADMIN_", (user.isAdmin() ? "true" : "false")); result = XMLUtils.removeTroublesomeCharacters(result); return result; } private StringBuffer prepareXml(SxUser user, boolean isFullXMLRequired, boolean showNavigation) throws DBServletException { int rownr = 0; Logger.getLogger("superx_" + mandantenID + "_xml").log(Level.FINE, "baue XML auf für " + getMaskInfo() + " fullXMLRequired:" + isFullXMLRequired); Logger.getLogger("superx_" + mandantenID).log(Level.FINE, "baue XML auf für " + getMaskInfo() + " fullXMLRequired:" + isFullXMLRequired); StringBuffer result = new StringBuffer( "\n" + "\n"); result.append("\n"); // for historic reasons result.append("" + user.getId().toString() + "\n"); result.append(addGeneralInfo()); result.append(ServletUtils.addCustomElementsToXml(mandantenID)); if (user != null) { result.append(user.getThemenbaum().getMenupath(this.getId().toString())); if (showNavigation) { result.append(user.getThemenbaum().toXml(locale)); } } result.append(""); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field feld = (Field) it.next(); if (feld.getY() == 0) rownr++; result.append(FieldXmlEncoder.toXml(feld, isFullXMLRequired, rownr)); } result.append("" + rownr + "\n"); // derzeit wird nur das erste Stylesheet zur Liste hinzugefügt for (Iterator it = maskStylesheetList.iterator(); it.hasNext();) { Stylesheet aStylesheet = (Stylesheet) it.next(); result.append(aStylesheet.toXml()); } result.append("\n"); Logger.getLogger("superx_" + mandantenID + "_xml").log(Level.FINE, result.toString()); SuperXManager.setLastXml(result.toString()); SuperXManager.setLastXmlMandantid(mandantenID); return result; } /** * Bereitet aus der Maske in XML-Format einen HTML-String vor, der * zurückgeliefert werden kann. Oder aktualisiert diesen. * * @throws TransformerException * @throws DBServletException * @throws TransformerConfigurationException */ private void prepareHtml(SxUser user, boolean showNavigation) throws TransformerException, TransformerConfigurationException, DBServletException { String stylesheet = "file:///" + ServletUtils.getPath() + File.separatorChar + selectedMaskStylesheetFile; boolean isFullXMLRequired = TransletCache.isFullXMLRequired(stylesheet); StringBuffer result = prepareXml(user, isFullXMLRequired, showNavigation); TimeUtils t = new TimeUtils(); Transformer transformer = TransletCache.getTransformer(mandantenID, stylesheet); transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "html"); // t.print(" got transformer"); StringWriter erg = new StringWriter(); transformer.transform(new StreamSource(new StringReader(result.toString())), new StreamResult(erg)); Logger.getLogger("superx_" + mandantenID).log(Level.FINE, " " + getMaskInfo() + " XSL-Transformation der Maske (mittels Translet) dauerte " + t.getSinceStart()); // t.print(" transformation"); maskHtml = erg.toString(); } public String getMaskInfo() { return getName() + " (" + getId() + (getSortNr() != null ? " sortnr=" + getSortNr() : "") + ")"; } public String runQuery(SxUser user, HttpServletRequest request, Connection dbCon) throws TemplateException, IOException, SQLException, KeyParentEqualException, CloneNotSupportedException, SichtException, TransformerConfigurationException, ObligatoryFieldEmptyException, ParseException, InvalidKeyException, TransformerException, DBServletException, UngueltigeEingabeException, NoMainEntryException, InvalidDataTypeException { return this.runQuery(user, request, dbCon, null); } /** * Parameter für colset/colsort werden in executeQuery ausgelesen und gesetzt * * @param user * @param request * @param dbCon - wohl nur von SuperXmlTabelle.CSVUploadHelper genutzt * @return * @throws TemplateException * @throws IOException * @throws SQLException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws TransformerConfigurationException * @throws ObligatoryFieldEmptyException * @throws ParseException * @throws InvalidKeyException * @throws TransformerException * @throws DBServletException * @throws UngültigeEingabeException * @throws NoMainEntryException * @throws InvalidDataTypeException */ public String runQuery(SxUser user, HttpServletRequest request, Connection dbCon, Map params) throws TemplateException, IOException, SQLException, KeyParentEqualException, CloneNotSupportedException, SichtException, TransformerConfigurationException, ObligatoryFieldEmptyException, ParseException, InvalidKeyException, TransformerException, DBServletException, UngueltigeEingabeException, NoMainEntryException, InvalidDataTypeException { // this.request=request; if (isMakro() && isReuseResult()) { SuperXManager.logActivity(Level.INFO, " Makro-Abfrage " + getMaskInfo() + " liefere gecachtes Ergebnis"); if (lastXmlResult == null || lastXmlResult.toString().trim().equals("")) { throw new IllegalStateException( "Die Maske ist derzeit nicht benutzbar. Parameter reuseresult wurde übergeben, es wurde aber kein gecachter XML im Maskenobjekt (runQuery,lastXmlResult) gefunden"); } return lastXmlResult.toString(); } // Parameter für colset/colsort werden in executeQuery ausgelesen und // gesetzt SuperXManager.logActivity(Level.INFO, "Anforderung: Abfrage " + getMaskInfo()); individualFields.getFormular().put("UserID", user.getId()); sharedData.getFormular().put("UserID", user.getId()); sharedData.setErgebnisOrdNr(0); sharedData.setErgebnisElementOrdNr(0); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); if (SxPools.get(mandantenID).getRepository().containsKey("K_Nutzungsstatistiken")&&SxPools.get(mandantenID).getRepository().get("K_Nutzungsstatistiken").toString().equals("2")) { insertIntoMaskenProtokoll(user,dbCon); } if (!isReuseResult()) { String keyfieldsused = ServletHelper.getParameter(request, "keyfieldsused"); if (EqualsUtil.areEqual(keyfieldsused, "true")) { // ajax-log // System.out.println("keyfieldsused, defaults neu setzen"); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field aField = (Field) it.next(); if (aField.getArt() != 0 && !aField.isSicht() && aField.isDynamic()) aField.setInited(false); // für Sichten gibt's keine Querabhängigkeiten, müssen aber // initialisiert sein // Problem: bei Schlüsseleingabe für Kostenstellen klappte // nicht // auch Definition von kst_sql für Fin-Rechte klappte nicht, // da Sichtfeld Kostenstelle nicht initialisiert if (aField.isSicht()) { aField.initIfNeeded(individualFields.getFormular(), map, individualFields, user); setFeldStand(aField.getName(), ServletHelper.getParameter(request, aField.getName() + "-Stand"), user); setSelectedFeldSicht(aField.getName(), ServletHelper.getParameter(request, aField.getName() + "-Sicht"), user); } } } setFieldDefaults(user, request, params, true); // also sets tablestylesheets, desiredContenttype setFieldSelections(user, request); // MB 1/2016 dynamsische Sichten updaten boolean dynamicSichtFound = false; for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); if (f.getArt() == 12 && f.getSichtgruppe().hasDynamicSicht()) { dynamicSichtFound = true; updateDynamicSichten(f, user); } } // muss nochmal gemacht werden, weil dynamische Sichten Baum neu aufbauen, // dass selection gesetzt wird if (dynamicSichtFound) setFieldSelections(user, request); } String naviParam = ServletHelper.getParameter(request, "navi"); if (naviParam == null && multipartData != null) { naviParam = ServletUtils.getParamValue(multipartData, "navi"); } boolean showNavigation = naviParam != null && !naviParam.isEmpty() ? Boolean.parseBoolean(naviParam) : this.navi; StringBuffer result = new StringBuffer("\n\n"); if (isMakro()) result.append("\n" + this.getName() + "\n\n"); result.append("\n"); // for historic reasons result.append("" + user.getId() + "\n"); if (user != null) { result.append(user.getThemenbaum().getMenupath(this.getId().toString())); if (showNavigation) { result.append(user.getThemenbaum().toXml(locale)); } } // link back to home page addBacklink(request, result); result.append(addGeneralInfo()); result.append(ServletUtils.addCustomElementsToXml(mandantenID)); result.append(getStylesheetXml()); result.append(getMaskResult(user, request, dbCon)); result.append("\n"); String resultstr = XMLUtils.removeTroublesomeCharacters(result); lastXmlResult = new StringBuffer(resultstr); return resultstr; } private void insertIntoMaskenProtokoll(SxUser user, Connection dbCon) throws SQLException { Connection con=dbCon; boolean conUebergeben=true; if (dbCon==null) { conUebergeben=false; con=SxPools.get(mandantenID).getConnection(); } PreparedStatement pst=con.prepareStatement("insert into masken_protokoll (maskeninfo_id,user_id,zeitpunkt) values (?,?,now());"); pst.setInt(1, Integer.parseInt(this.getId().toString())); pst.setInt(2, Integer.parseInt(user.getId().toString())); pst.executeUpdate(); pst.close(); if (!conUebergeben) {con.close();} } // MB 17.8.2011 Defaultsicht setzen falls gewünscht public void setFieldsDefaultSichten(SxUser user, HttpServletRequest request) throws SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException { Hashtable formular = individualFields.getFormular(); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field aField = (Field) it.next(); if (aField.isSicht() && aField.hasDynamicDefaultSicht()) aField.setDefaultSicht(formular, map, individualFields, user); } } /** * General info replaced by sxcaptions * * @return */ public static String addGeneralInfo() { String info = "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "" + "\n"; return info; } private void setColsort(String colsort) { if (colsort != null && !colsort.trim().equals("")) { if (colsort.equalsIgnoreCase("restore")) colsort = null; this.colsort = colsort; result_el.setColsort(colsort); } } public SuperX_el getResult_el() { return result_el; } /** * Interpretiert auch "restore" als zurücksetzen * * @param param */ private void setColset(String param) { if (param != null && !param.trim().equals("")) { if (this.isMakro()) throw new IllegalArgumentException("Die Maske ist derzeit nicht benutzbar." + getMaskInfo() + " ist ein Makro - definieren von colset " + param + " nicht möglich"); if (param.trim().equalsIgnoreCase("restore")) colset = null; else colset = param; } } public String getColset() { return colset; } /** * Returns the field selections in XML form. * * @param user * @return * @throws ParseException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws IOException * @throws TemplateException * @throws NoMainEntryException */ private String getXmlFieldSelection(SxUser user) throws ParseException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException { StringBuffer result = new StringBuffer("\n"); StringBuffer completeFields = new StringBuffer("\n"); int rownr = 0; boolean isFullXMLRequired = false; HashMap map = new HashMap(); map.putAll(user.getBasicMap()); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field feld = (Field) it.next(); try { result.append(feld.getSelectedKeyXml(individualFields.getFormular(), map, individualFields, user)); } catch (InvalidKeyException e) { e.printStackTrace(); throw new RuntimeException("Maske " + getMaskInfo() + " hatte im Feld " + feld.getName() + " (" + feld.getId() + ") einen ungültigen key.\n" + e); } if (feld.getY() == 0) rownr++; // completeFields.append(FieldXmlEncoder.toXml(feld,isFullXMLRequired // ,rownr)); String isHiddenAttr=""; if(feld.getAttribut().equalsIgnoreCase("hidden") || feld.getArt()==13) isHiddenAttr=" hidden=\"true\" "; completeFields.append("" + feld.getValueXml() + "" + "" + "\n"); } // TODO: caption_long etc. rein result.append("\n"); completeFields.append(""); result.append(completeFields); return result.toString(); } /** * Setzt den selectedKey eintrag in den einzelnen feldern und fügt die * ausgewählten Werte dem formular hinzu, das für generateSQL benutzt wird von * runQuery also bei einem Makro der Hauptmaske aufgerufen * * @param request * @throws ObligatoryFieldEmptyException * @throws ParseException * @throws InvalidKeyException * @throws TransformerException * @throws DBServletException * @throws CloneNotSupportedException * @throws KeyParentEqualException * @throws SQLException * @throws IOException * @throws TemplateException * @throws SichtException * @throws NoMainEntryException * @throws InvalidDataTypeException */ private void setFieldSelections(SxUser user, HttpServletRequest request) throws ObligatoryFieldEmptyException, ParseException, InvalidKeyException, TransformerException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException, InvalidDataTypeException { // default-Einträge individualFields.getFormular().put("Organigramm-Sicht", "0"); sharedData.getFormular().put("Organigramm-Sicht", "0"); loadFieldsFromRequest(request); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field feld = (Field) it.next(); if (feld.isOldOrganigrammArt() || feld.isSicht()) { setFeldStand(feld.getName(), ServletHelper.getParameter(request, feld.getName() + "-Stand"), user); setSelectedFeldSicht(feld.getName(), ServletHelper.getParameter(request, feld.getName() + "-Sicht"), user); } // Spezial "Felder" dynamisches Feld für das wichtig ist, dass neu // gelesen wird in Abhängigkeit von tablestylesheet if (feld.getName().equals("Felder")) { feld.setInited(false); feld.initIfNeeded(individualFields.getFormular(), map, individualFields, user); } String param = ""; String[] params = request.getParameterValues(feld.getName()); if (params == null && multipartData != null) { params = new String[1]; params[0] = ServletUtils.getParamValue(multipartData, feld.getName()); if (params[0] == null) params = null; } if (params != null) { for (int i = 0; i < params.length; i++) { if (StringUtils.containsTags(params[i])) throw new IllegalArgumentException( "Parameter für " + feld.getName() + " enthält unerlaubte Tags"); param += params[i].trim(); if (i < params.length - 1) param += "|"; } } // 3.2.09 MB wenn kein Parameter übergeben, aber Defaultwert // vorhanden, diesen nehmen if (param.equals("") // && feld.isObligatorisch() && feld.getDefaultValue() != null && feld.getDefaultValue().getId() != null) param = feld.getDefaultValue().getId().toString(); String selectedKey = new String(param); selectedKey = selectedKey.trim(); if (feld.getArt() != 19 && feld.isObligatorisch() && selectedKey.equals("")) throw new ObligatoryFieldEmptyException("Bitte füllen Sie das Feld " + feld.getName() + " aus."); feld.setSelectedKey(selectedKey); if (!feld.isHidden()) user.getSelectionBuffer().setFieldDefault(feld.getName(), selectedKey); if (feld.isOldOrganigrammArt() || feld.isSicht()) { sichtParamsInsFormular(feld); } String escapedKey = feld.getSelectedKeyEscaped(); // MB Stylesheet by field 6/2010 if (feld.getName().equals("tablestylesheet") && selectedKey != null && !selectedKey.equals("")) { // also sets desired contenttype of that stylesheet! setSelectedTableStylesheetFileAndContenttype(selectedKey); } if (feld.getName().equals("Ausgabeformat") && selectedKey != null && !selectedKey.equals("")) setDesiredContenttype(selectedKey); // if contenttype is in request that has predominance String c = ServletHelper.getParameter(request, "contenttype"); if (c != null && !c.equals("")) setDesiredContenttype(c); individualFields.getFormular().put(feld.getName(), escapedKey); // System.out.println(feld.getName()+" : "+escapedKey); // damit auch ggfs. Submasken die Parameter erhalten sharedData.getFormular().put(feld.getName(), escapedKey); if (feld.isOldOrganigrammArt() || feld.isSicht()) { } } } private void loadFieldsFromRequest(HttpServletRequest request) { // nur für bekannte Felder #279826 for (Enumeration en = request.getParameterNames(); en.hasMoreElements();) { String name = (String) en.nextElement(); if (individualFields.containsField(name)) { ServletUtils.addParamToFormular(request, individualFields.getFormular(), name); } } } public Hashtable getFormularCopy() { Hashtable f = new Hashtable(); f.putAll(sharedData.getFormular()); f.putAll(individualFields.getFormular()); return f; } /** * Sicht-Parameter wie Organigramm-Sicht und -Stand, erlaubt setzen. * defaultOrgaSicht * * @param feld - * */ private void sichtParamsInsFormular(Field feld) { // konkreter Feldname z.B. Org-Einheit-Sicht/Stand String feldname = feld.getName(); standParamSetzen(feldname, feld.getSichtgruppe().getSelectedSicht().getStand()); individualFields.getFormular().put(feldname + "-Sicht", feld.getSichtgruppe().getSelectedSicht().getId().toString()); sharedData.getFormular().put(feldname + "-Sicht", feld.getSichtgruppe().getSelectedSicht().getId().toString()); // das gleiche nochmal für Sichtart name: // Auch Organigramm-Sicht/Stand setzen String sichtart = feld.getSichtgruppe().getArt(); if (sichtart.endsWith("-Sicht")) sichtart = sichtart.substring(0, sichtart.length() - 6); standParamSetzen(sichtart, feld.getSichtgruppe().getSelectedSicht().getStand()); individualFields.getFormular().put(sichtart + "-Sicht", feld.getSichtgruppe().getSelectedSicht().getId().toString()); sharedData.getFormular().put(sichtart + "-Sicht", feld.getSichtgruppe().getSelectedSicht().getId().toString()); // für Organigramm-Felder erlaubt Parameter setzen if (feld.isOldOrganigrammArt() || feld.isOrganigrammSichtArt()) { String erlaubt = "0"; if (feld.getSelectedKey() != null && !feld.getSelectedKey().equals("") && !feld.getSelectedKey().equals("null") && feld.getSichtgruppe().getSelectedSicht().getSelectionCount() > 0) { SelectableItemNode selectedNode = (SelectableItemNode) feld.getSichtgruppe().getSelectedSicht() .getSelectionPath().getLastPathComponent(); erlaubt = selectedNode.isAllowed() ? "1" : "0"; } individualFields.getFormular().put("erlaubt", erlaubt); // auch in SharedData eintragen sonst wird wieder überschrieben sharedData.getFormular().put("erlaubt", erlaubt); } } /** * Stand Parameter in formular setzen * * @param name z.B. Organigramm * @param value */ private void standParamSetzen(String name, String value) { if (!name.endsWith("-Stand")) name = name + "-Stand"; if (SxPools.get(mandantenID).getSqlDialect().equals("Postgres")) value = "date_val('" + value.trim() + "')"; else value = "date('" + value.trim() + "')"; individualFields.getFormular().put(name, value); sharedData.getFormular().put(name, value); } /** * * @param user * @param request * @param dbCon - wohl nur von SuperXmlTabelle.CSVUploadHelper genutzt * @return * @throws TemplateException * @throws IOException * @throws InvalidKeyException * @throws ParseException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws NoMainEntryException * @throws InvalidDataTypeException */ private StringBuffer getMaskResult(SxUser user, HttpServletRequest request, Connection dbCon) throws TemplateException, IOException, InvalidKeyException, ParseException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, NoMainEntryException, InvalidDataTypeException { StringBuffer xmlBuffer = new StringBuffer(""); if (this.isMakro()) { // / MAKRO MAKRO MAKRO updateFormular(user); NamedIdObjectList schleifenElemente = getSchleifenElemente(); // mindestens ein Durchlauf, wenn es schleifenElemente gibt // öfter int schleifendurchläufe = java.lang.Math.max(1, schleifenElemente.size()); // mindestens ein Durchlauf, falls schleifenrelation hinterlegt // wurde öfter for (int i = 0; i < schleifendurchläufe; i++) { for (Iterator it = submaskenListe.iterator(); it.hasNext();) { Maske eineMaske = (Maske) it.next(); // formularFelder aus dem sharedFields auch ins individuelle // formular kopieren updateFormular(user); // wenn wir in einer Schleife sind, ein Element // einsetzten Field schleifenField = null; if (schleifenElemente.size() > 0) { NamedIdObject schleifenElement = (NamedIdObject) schleifenElemente.get(i); SuperXManager.logActivity(Level.FINE, " Abfrage " + eineMaske.getMaskInfo() + " Schleife einsetzen:" + schleifenElement); if (!eineMaske.getFields().containsField(getSchleifenfeldname())) throw new IllegalArgumentException("Versuch einen Schleifenwert " + schleifenElement + " für das Feld " + getSchleifenfeldname() + " bei der Maske " + eineMaske.getMaskInfo() + " fehlgeschlagen, da in der Abfrage kein Feld " + getSchleifenfeldname() + " gefunden wurde"); schleifenField = (Field) eineMaske.getFields().getByName(getSchleifenfeldname()); fieldSichtStandSetzen(user, schleifenField); // Es kann sein, dass Feld, das gewählte Element noch // nicht // in den selectionElements hat, dann als temporäres // Feld hinzufügen if (!schleifenField.getSelectableItemsTree() .containsItemWithId((String) schleifenElement.getId())) { SelectableItem item = new SelectableItem(schleifenElement); item.setTemporary(true); schleifenField.addTempSelectionElement(item); } schleifenField.setSelectedKey(schleifenElement.getId().toString()); schleifenField.setSpecialSelectionApplied(true); eineMaske.getFields().getFormular().put(getSchleifenfeldname(), schleifenField.getSelectedKeyEscaped()); sharedData.getFormular().put(getSchleifenfeldname(), schleifenField.getSelectedKeyEscaped()); } // merken, kann auch null sein sharedData.setSchleifenField(schleifenField); xmlBuffer.append(eineMaske.getMaskResult(user, request, dbCon)); } } } // EINZELNE MASKE else { // formularFelder aus dem sharedFields auch ins individuelle // formular kopieren updateFormular(user); NamedIdObjectList schleifenElemente = getSchleifenElemente(); // mindestens ein Durchlauf, wenn es schleifenElemente gibt öfter int schleifendurchläufe = java.lang.Math.max(1, schleifenElemente.size()); SuperXManager.logActivity(Level.INFO, "Abfrage " + getMaskInfo() + " durchführen"); // mindestens ein Durchlauf, falls schleifenrelation hinterlegt // wurde öfter for (int i = 0; i < schleifendurchläufe; i++) { // wenn wir in einer Schleife sind, ein Element // einsetzten NamedIdObject schleifenElement = null; Field schleifenFeld = null; if (schleifenElemente.size() > 0) { schleifenElement = (NamedIdObject) schleifenElemente.get(i); SuperXManager.logActivity(Level.FINE, " Abfrage " + getMaskInfo() + " Schleife einsetzen:" + schleifenElement); schleifenFeld = (Field) individualFields.getByName(getSchleifenfeldname()); fieldSichtStandSetzen(user, schleifenFeld); schleifenFeld.setSelectedKey(schleifenElement.getId().toString()); schleifenFeld.setSpecialSelectionApplied(true); individualFields.getFormular().put(getSchleifenfeldname(), schleifenFeld.getSelectedKeyEscaped()); /* * war ne Idee, nicht benötigt TMP-Tabelle für Informix if (f.getArt() == 20) { * f.createTmpInformixTable(); } */ } xmlBuffer.append("\n"); sharedData.incOrdnr(); if (sharedData.getSchleifenField() != null) { xmlBuffer.append(sharedData.getSchleifenField().getSchleifenXml()); } xmlBuffer.append("" + getName() + "\n"); xmlBuffer.append("\n"); // in execute Query wird auch ggfs. Hinweis-SQL ausgeführt // sowie setzen von colsort/colset StringBuffer tableXml = executeQuery(user, request, dbCon); String hinweis = getHinweisCaption(); if (isMaxRowsReached()) { if (hinweis != null && !hinweis.equals("")) hinweis = SuperXManager.getMaxRowsHinweis() + ". " + hinweis; else hinweis += SuperXManager.getMaxRowsHinweis(); } xmlBuffer.append("\n"); xmlBuffer.append("" + getStandString() + "\n"); xmlBuffer.append("" + getChartx() + "\n"); xmlBuffer.append("" + getCharty() + "\n"); xmlBuffer.append(getXmlFieldSelection(user)); StringTokenizer st = new StringTokenizer(getAktion(), "|"); while (st.hasMoreElements()) { String anAktion = st.nextToken(); performAktion(anAktion, tableXml, xmlBuffer); } xmlBuffer.append("\n"); } } return xmlBuffer; } /** * Bei der Durchführung von Makros für Felder gewünschte Sicht/Stand setzen * aufgerufen von getMaskResult * * @param f * @throws ParseException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws IOException * @throws TemplateException * @throws SichtException * @throws NoMainEntryException */ private void fieldSichtStandSetzen(SxUser user, Field f) throws ParseException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException { HashMap map = new HashMap(); map.putAll(user.getBasicMap()); try { // damit auf jeden Fall initialisiert f.initIfNeeded(individualFields.getFormular(), map, individualFields, user); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("Die Maske ist derzeit nicht benutzbar. Maske " + getMaskInfo() + " konnte Feld " + f.getName() + " (" + f.getId() + ") nicht initialisieren,\n um ggfs. Sicht oder Stand zu setzen.\n" + e); } if (f.getArt() == 12 && f.getSichtgruppe().size() > 1) { String sicht = getSchleifenfsicht(); if (sicht == null || sicht.trim().equals("")) // sicht sollte gesetzt sein, welche Sicht aus erstes ausgewählt // wird // {System.out.println("Warnung: Keine Sicht für // Schleifenelement in schleifenfsicht angegeben - use at own // risk"); // } throw new IllegalStateException("Die Maske ist derzeit nicht benutzbar.Für das Feld " + f.getName() + " (" + f.getId() + ") Maske " + this.getMaskInfo() + " muss in macro_masken_bez eine Sicht hinterlegt sein (z.B. fest 13 oder dynamisch z.B. Kostenstellen-Sicht in doppelten Kleiner-/Größerzeichen = auf Hauptmaske ausgewaehlte Sicht)"); if (sicht.startsWith("<>")) throw new UnsupportedOperationException( "Die Maske ist derzeit nicht benutzbar. Sql bei der Sichtenauswahl in macros wird noch nicht unterstützt Maske " + this.getId()); sicht = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), new String(sicht)); int sichttid = 0; try { sichttid = Integer.parseInt(sicht); } catch (NumberFormatException e) { throw new IllegalArgumentException( "Die Maske ist derzeit nicht benutzbar. Konnte gewünschte Sicht für das Feld " + f.getName() + " (" + f.getId() + ") Maske " + this.getId() + "nicht ermitteln, " + sicht + " ist kein gültige Integerzahl.(tid)"); } f.setSicht(individualFields.getFormular(), map, individualFields, new Integer(sichttid), user); } String stand = getSchleifenfstand(); if (stand == null || stand.trim().equals("")) { if (f.isOldOrganigrammArt() || (f.getArt() == 12 && f.getSichtgruppe().isStandButtonWanted())) throw new IllegalStateException("Die Maske ist derzeit nicht benutzbar. Für das Feld " + f.getName() + " (" + f.getId() + ") Maske " + this.getId() + " muss in macro_masken_bez ein Stand hinterlegt sein (z.B. fest 01.01.2005 oder dynamisch <>)"); } else { if (stand.startsWith("<>")) throw new UnsupportedOperationException( "Die Maske ist derzeit nicht benutzbar. Sql bei der Standauswahl in macros wird noch nicht unterstützt Maske " + this.getId() + ""); stand = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), new String(stand)); f.setStand(individualFields.getFormular(), map, individualFields, stand, user); } } /** * Removes temp selection items from all fields that may have been used during * macro loop iteration * */ public void removeTempFieldItems() { this.getFields().removeTempFieldItems(); for (Iterator it = submaskenListe.iterator(); it.hasNext();) { Maske m = (Maske) it.next(); m.removeTempFieldItems(); } } private FieldContainer getFields() { return individualFields; } private void performAktion(String anAktion, StringBuffer tableXml, StringBuffer xmlBuffer) throws IOException { if (anAktion.equals("SHOWTABLE")) { xmlBuffer.append(""); sharedData.incErgebnisElementOrdNr(); xmlBuffer.append(tableXml); xmlBuffer.append("\n"); } if (anAktion.startsWith("CREATECHART-")) { GraphicFormat f = SxPools.get(mandantenID).getGraphicFormat(anAktion.substring(12)); // int pos=sharedData.addImage(ChartCreator.create(tableXml,f)); File graphicFile = ChartCreator.createFile(tableXml, f); sharedData.addGraphicFile(graphicFile); xmlBuffer.append("\n"); sharedData.incErgebnisElementOrdNr(); } } public String getSql2() { String select_string = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), getSelect_stmt() + "\n" + getCleanup_stmt()); return select_string; } public String getSql3(SxUser user) throws TemplateException, IOException, SQLException { String select_string = SxPools.get(mandantenID).getTemplateProcessor().process(user.getBasicMap(), (Integer) getId(), getMaskInfo(), getSql2(), individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); return select_string; } public String getFormularValues() { StringBuffer buf = new StringBuffer(); TreeSet set = new TreeSet(sharedData.getFormular().keySet()); set.addAll(individualFields.getFormular().keySet()); for (Iterator it = set.iterator(); it.hasNext();) { Object key = it.next(); if (key.toString().equalsIgnoreCase("passwort")) continue; // if (key.toString().equalsIgnoreCase("passwort")) continue; Object val = sharedData.getFormular().get(key); if (individualFields.getFormular().get(key) != null) val = individualFields.getFormular().get(key); buf.append("" + key + " : " + val + "
"); } return buf.toString(); } public String getLastsql() { return lastsql; } /** * Eine einzelne Abfrage durchführen und Ergebnis-XML zurücklieferen * * @param dbCon kann null sein, dann wird neue Connection geholt * @param dbCon - wohl nur von SuperXmlTabelle.CSVUploadHelper genutzt * @return * @throws DBServletException * @throws SQLException * @throws IOException * @throws TemplateException * @throws SichtException * @throws CloneNotSupportedException * @throws KeyParentEqualException * @throws NoMainEntryException */ private StringBuffer executeQuery(SxUser user, HttpServletRequest request, Connection dbCon) throws DBServletException, SQLException, TemplateException, IOException, KeyParentEqualException, CloneNotSupportedException, SichtException, NoMainEntryException { if (isResultReuseFeatureWanted && isReuseResult() && result_el == null) { throw new IllegalStateException( "Die Maske ist derzeit nicht benutzbar. Maske nicht mehr im Cache - bitte neu aufrufen DETAILS:Can't reuse result for Maske " + getId() + " because result_el is null"); } desiredRows = null; desiredRows = ServletHelper.getParameter(request, "irowno"); if (!isResultReuseFeatureWanted || (isResultReuseFeatureWanted && !isReuseResult())) { // HashMap map = new HashMap(); map.clear(); map.putAll(user.getBasicMap()); individualFields.updateStandTags(map, user); boolean isTemplate = getSelect_stmt().toUpperCase().indexOf("FREEMARKER TEMPLATE") > -1; String select_string = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), getSelect_stmt() + "\n" + getCleanup_stmt()); // select_string=select_string.replaceAll("Fächer.elements", // "Fächer.xx"); // map.clear(); if (isTemplate) { SuperXManager.setLastFMMaskenSql( "-- " + getMaskInfo() + " " + DateUtils.getNowString() + "\n" + select_string); select_string = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), select_string, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); // danach enthält map alle vars inkl. sqlvars } // MB 07/2010 macht Probleme bei Freemarker hashes // generell deaktiviert, hier falls doch noch in alten Masken // vorhanden select_string = SqlStringUtils.removeComment(select_string, "{", "}"); lastsql = select_string; lastExecuted = DateUtils.getNowString(); ExternalPool ep = ServletUtils.getExternalPoolIfSpecified(mandantenID, ((Integer) this.getId()), getSelect_stmt()); result_el = ServletUtils.executeALL_el(ep, dbCon, "Abfrage Maske " + getMaskInfo() + " durchführen", "--Abfrage\n" + select_string, mandantenID, true); String errorstring = result_el.getError_String(); String errorselect = result_el.getAktuelleNachricht(); if (errorstring != null && !errorstring.equals("")) { throw new SQLException("

Fehler

Bei der Abfrage
" + getMaskInfo() + "
ist ein Fehler aufgetreten:
" + errorstring + "
sql:" + errorselect + "

"); } } setColset(ServletHelper.getParameter(request, "colset")); setColsort(ServletHelper.getParameter(request, "colsort")); String stylesheet = ServletHelper.getParameter(request, "stylesheet"); String usetreetable = ServletHelper.getParameter(request, "usetreetable"); if (usetreetable != null) usetreetable = usetreetable.toLowerCase(); boolean isEbenenWanted = false; if (!isMakroSubMaske && (result_el != null && result_el.hasEbeneCol()) && !EqualsUtil.areEqual(usetreetable, "false") && colsort == null && !EqualsUtil.areEqual(stylesheet, "tabelle_html_p.xsl") //&& !EqualsUtil.areEqual(stylesheet, "viz_html_chart.xsl") //TODO generalize: HTML-Stylesheets that need the complete XML in Treetables && (stylesheet == null || stylesheet.indexOf(".jrxml") == -1) && (desiredContenttype == null || desiredContenttype.trim().equals("") || desiredContenttype.toLowerCase().indexOf("htm") > -1)) isEbenenWanted = true; if (hinweis != null) { if (hinweis.startsWith("<>")) { setHinweisCaption(""); String sql = hinweis.substring(7, hinweis.length()); boolean isTemplate = sql.toUpperCase().indexOf("FREEMARKER TEMPLATE") > -1; try { sql = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), sql); if (isTemplate) { map.putAll(user.getBasicMap()); sql = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), sql, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); // danach enthält map alle vars inkl. sqlvars } ExternalPool ep = ServletUtils.getExternalPoolIfSpecified(mandantenID, ((Integer) this.getId()), hinweis); SuperX_el hinweis_el = ServletUtils.executeALL_el(ep, dbCon, "Hinweis holen ", sql, mandantenID, true); SxResultSet rs = hinweis_el.getResultSet(); Iterator it = rs.iterator(); StringBuffer hinw = new StringBuffer(); int i = 0; while (it.hasNext()) { SxResultRow row = (SxResultRow) it.next(); if (i > 0) hinw.append("\n"); hinw.append(row.get(0)); i++; } setHinweisCaption(hinw.toString()); } catch (Exception e) { System.out.println("Error beim Hinweis lesen:" + sql + " " + e); } } } // Wenn das ResultSet die Spalte "_runtimeMessage" enthält und diese // nicht leer ist, wird der Inhalt nach geschrieben. // nützlich z.B. für Datenblätter, deren max. Zeilenanzahl überschritten // ist. String meldung = result_el.getRuntimeMessage(); if (meldung != null && !meldung.equals("")) setHinweisCaption(meldung); meldung = null; return getXmlResultTable(user, desiredRows, isEbenenWanted); } public String getLastExecuted() { return lastExecuted; } public String getSelectString() { boolean isTemplate = getSelect_stmt().toUpperCase().indexOf("FREEMARKER TEMPLATE") > -1; String select_string = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), getSelect_stmt() + "\n" + getCleanup_stmt()); // map.clear(); if (isTemplate) { SuperXManager .setLastFMMaskenSql("-- " + getMaskInfo() + " " + DateUtils.getNowString() + "\n" + select_string); // map.putAll(user.getBasicMap()); try { select_string = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), select_string, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); } catch (TemplateException | IOException | SQLException e) { logger.error("Couldn't get select string!", e); throw new RuntimeException(e); } } return select_string; } /** * new 2/2015 bei export von nur bestimmten Zeilen oder Makro alten Export * nutzen * * @return */ public boolean isNewExcelExport() { return getSelect_stmt().toUpperCase().indexOf("RAM EXCELEXPORT") > -1 && (desiredRows == null || desiredRows.equals("")) && !isMakro() && !isMakroSubMaske; } /** * Bei Submasken von Makros müssen die Formularparameter der Hauptmaske in das * Formular der Untermasken übernommen werden. * * @throws InvalidKeyException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws SichtException * @throws IOException * @throws TemplateException * @throws NoMainEntryException * @throws InvalidDataTypeException * */ private void updateFormular(SxUser user) throws InvalidKeyException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException, InvalidDataTypeException { HashMap map = new HashMap(); map.putAll(user.getBasicMap()); for (Enumeration it = sharedData.getFormular().keys(); it.hasMoreElements();) { String keyname = (String) it.nextElement(); // String x = key + " - |" + sharedData.getFormular().get(key) + // "|"; // erstmal sicherheitshalber aus sharedData alle // Felderinfo ins individuelle Formular kopieren Object wertInSuperMaske = sharedData.getFormular().get(keyname); individualFields.getFormular().put(keyname, wertInSuperMaske); } // aus übergeordneter Maske Werte eintragen for (Iterator it = sharedData.getFields().iterator(); it.hasNext();) { Field superField = (Field) it.next(); if (individualFields.containsItemWithName(superField.getName())) { Field f = (Field) individualFields.getByName(superField.getName()); f.initIfNeeded(individualFields.getFormular(), map, individualFields, user); if (superField.isOldOrganigrammArt() || superField.isSicht()) { f.setStand(individualFields.getFormular(), map, individualFields, superField.getSichtgruppe().getStand(), user); if (f.isSicht() && !f.isMacroMaskenSichtSet()) f.setSicht(individualFields.getFormular(), map, individualFields, (Integer) superField.getSichtgruppe().getSelectedSicht().getId(), user); } // wenn kein Spezialwert hinterlegt wurde // Schlüssel vom superField eintragen. if (!f.isSpecialSelectionApplied()) { f.setSelectedKey(superField.getSelectedKey()); } } } // individuelle Felder durchgehen, ggfs. special selection aus // makro_feld_wert ins Formular eintragen for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); if (f.isSpecialSelectionApplied()) individualFields.getFormular().put(f.getName(), f.getSelectedKeyEscaped()); } if (maxOffset == 0) individualFields.getFormular().put("MAXOFFSET", "" + "ALL"); else individualFields.getFormular().put("MAXOFFSET", "" + maxOffset); individualFields.getFormular().put("OFFSET", "" + getOffset()); } /** * * @param schleifenrelation * @return * @throws DBServletException * @throws SQLException */ private NamedIdObjectList getSchleifenElemente() throws DBServletException, SQLException { NamedIdObjectList result = new NamedIdObjectList(); if (getSchleifenrelation() != null) { String stmt = ""; if (getSchleifenrelation().startsWith("sp_")) { if (SxPools.get(mandantenID).getSqlDialect().equals("Postgres")) stmt = "select " + schleifenrelation; else stmt = "execute procedure " + schleifenrelation; } if (getSchleifenrelation().startsWith("<>")) stmt = getSchleifenrelation().substring(7); stmt = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), stmt); Logger.getLogger("superx_" + mandantenID).log(Level.INFO, "Hole Schleifenelemente : " + stmt); SxResultSet rs = ServletUtils.execute("Hole Schleifenelemente aus makro_maske_bez maske:" + getId(), stmt, mandantenID); for (Iterator it = rs.iterator(); it.hasNext();) { SxResultRow row = (SxResultRow) it.next(); result.add(new NamedIdObject(row.get(0), (String) row.get(1))); } } return result; } /** * Nur den Ergebnisteil incl. Header * * @return * @throws SQLException * @throws DBServletException * @throws NoMainEntryException * @throws KeyParentEqualException */ private StringBuffer getXmlResultTable(SxUser user, String desiredRows, boolean isEbenenWanted) throws SQLException, DBServletException, IOException, TemplateException, KeyParentEqualException, NoMainEntryException { StringBuffer result = new StringBuffer(); result.append("\n\n"); result.append(getXmlHeader(user)); // wichtig if (headerManager.hasTreeFunction()) setColset(headerManager.getColset()); XMLResultCreator rc = new XMLResultCreator(result_el, maxOffset, offset, mandantenID); if (desiredRows != null && !desiredRows.equals("")) rc.setDesiredRows(desiredRows); rc.addXML(result, getColset(), isEbenenWanted, "table0", -1); result.append("\n"); addCustomXmlAdditions(user, result); return result; } private void addCustomXmlAdditions(SxUser user, StringBuffer result) throws TemplateException, IOException, SQLException { Iterator it = SxPools.get(mandantenID).getRepository().keySet().iterator(); while (it.hasNext()) { String key = (String) it.next(); if (key.startsWith("CUSTOMXMLADD")) { String customadd = ((RepositoryItemCollection) SxPools.get(mandantenID).getRepository().get(key)) .get("content").toString(); Logger.getLogger("superx_" + mandantenID + "_xml").log(Level.FINE, "Hinzufügen von " + key + ":\n " + customadd + DateUtils.getNowString()); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); customadd = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), customadd, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); Logger.getLogger("superx_" + mandantenID + "_xml").log(Level.FINE, "Hinzufügen von " + key + ":\n " + customadd + DateUtils.getNowString()); result.append(customadd); } if (key.startsWith("CUSTOM_CSS")) { String customcss = ((RepositoryItemCollection) SxPools.get(mandantenID).getRepository().get(key)) .get("content").toString(); if(customcss!=null && !customcss.trim().equals("")) { result.append(""); } } if (key.startsWith("CUSTOM_JS")) { String customjs = ((RepositoryItemCollection) SxPools.get(mandantenID).getRepository().get(key)) .get("content").toString(); if(customjs!=null && !customjs.trim().equals("")) { result.append(""); } } } } /** * * @return * @throws SQLException * @throws DBServletException * @throws NoMainEntryException * @throws KeyParentEqualException */ private String getXmlHeader(SxUser user) throws SQLException, DBServletException, IOException, TemplateException, KeyParentEqualException, NoMainEntryException { StringBuffer preresult = null; // TODO: hier BasicHashmap übergeben damit auch Repositoryvars zur // Verfügung stehen // TODO: todo noch besser: Map der Maske (damit sqlvars nicht doppelt // gepflegt werden müssen) if (isReuseResult) { // bei aggregationHeadern wird colset überlagert preresult = headerManager.getHeaders(null, getColset(), getColsort(), result_el, individualFields.getFormular(), mandantenID); } else { String tmpxil = getXilString(); // freemaker parsing der XIL Liste tmpxil = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), tmpxil); map.putAll(user.getBasicMap()); tmpxil = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), tmpxil, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); headerManager.setXilString(tmpxil); preresult = headerManager.getHeaders(tmpxil, getColset(), getColsort(), result_el, individualFields.getFormular(), mandantenID); } lastHeaderXml = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), "xil_proplist" + getId(), preresult.toString(), individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); return lastHeaderXml; } private String getColsort() { return colsort; } public int getMaxOffset() { return maxOffset; } /** * Gilt auch für alle Submasken eines Makros Wieviele Zeilen sollen maximal * angezeigt werden, bevor nächste Seite kommt * * @param maxOffset */ public void setMaxOffset(int maxOffset) { this.maxOffset = maxOffset; } public int getOffset() { return offset; } public void setOffset(int offset) { this.offset = offset; } public String getSelectedTableStylesheetFilename() { String result = ""; if (selectedTableStylesheet != null) result = selectedTableStylesheet.getFilename(); return result; } /** * selected Stylesheet object * * @param none * * @return Stylesheet selectedTableStylesheet */ public Stylesheet getSelectedTableStylesheet() { return this.selectedTableStylesheet; } /** * determine contenttype, Default is derived from request, if null, then * sx_stylesheets.contenttype is read * * @param requestContenttype Contenttype according to request * @return String contenttype */ public String getSelectedTableStylesheetContenttype(String requestContenttype) { String result = requestContenttype; if (requestContenttype == null && selectedTableStylesheet != null) result = selectedTableStylesheet.getContenttype(); return result; } /** * also sets desiredContenttype of Stylesheet * * @param desiredTableStylesheet */ public void setSelectedTableStylesheetFileAndContenttype(String desiredTableStylesheet) { this.selectedTableStylesheet = null; for (Iterator it = tableStylesheetList.iterator(); it.hasNext();) { Stylesheet s = (Stylesheet) it.next(); if (s.getFilename().equals(desiredTableStylesheet) || (desiredTableStylesheet.equals("") && s.getFilename().equals("tabelle_html.xsl"))) { selectedTableStylesheet = s; setDesiredContenttype(s.getContenttype()); if (desiredTableStylesheet != null && desiredTableStylesheet.endsWith(".jrxml")) this.maxOffset = 100000000; } } } public Integer getSortNr() { return sortNr; } public void setSortNr(Integer sortNr) { this.sortNr = sortNr; } /** * Legt einen bestimmten Wert fest, der bei einem Feld ausgewählt sein soll. * Aufgerufen von Object.Cache.applyMakroFieldSelection * * @param fieldname * @param selectedKey * @throws InvalidKeyException * @throws InvalidDataTypeException */ public void setSpecialFieldSelection(String fieldname, String selectedKey) throws InvalidKeyException, InvalidDataTypeException { if (!individualFields.containsItemWithName(fieldname)) throw new IllegalArgumentException( "Kein Feld mit Namen " + fieldname + " gefunden in Maske " + getMaskInfo()); Field f = (Field) individualFields.getByName(fieldname); f.setSelectedKey(selectedKey); f.setSpecialSelectionApplied(true); // bringt hier nichts, weil von sharedData.standardmäßig übergebügelt // individualFields.getFormular().put(fieldname, // f.getSelectedKeyEscaped()); // see updateFormular(); } public Field getField(String fieldname) { if (!individualFields.containsItemWithName(fieldname)) throw new IllegalArgumentException("Kein Feld mit Name " + fieldname + " in der Maske " + getMaskInfo() + " (" + selectedTableStylesheet + ") vorhanden. "); Field f = (Field) individualFields.getByName(fieldname); return f; } public boolean isReuseResult() { return isReuseResult; } /** * Wird auch für Submasken eingetragen * * @param isReuseResult */ public void setReuseResult(boolean isReuseResult) { this.isReuseResult = isReuseResult; for (Iterator it = submaskenListe.iterator(); it.hasNext();) { Maske aMask = (Maske) it.next(); aMask.setReuseResult(isReuseResult); } } public Object clone() throws CloneNotSupportedException { Maske cl = new Maske(); cl.setId(this.getId()); cl.setName(this.getName()); // result_el wird einfach neues Result_el Objekt cl.locale = this.locale; cl.schleifenrelation = schleifenrelation; cl.schleifenfeldname = schleifenfeldname; cl.aktion = aktion; cl.select_stmt = select_stmt; cl.cleanup_stmt = cleanup_stmt; cl.xilString = xilString; cl.chartx = chartx; cl.charty = charty; cl.standString = standString; cl.selectedMaskStylesheetFile = selectedMaskStylesheetFile; cl.selectedTableStylesheet = selectedTableStylesheet; cl.sharedData = (SharedData) this.sharedData.clone(); cl.individualFields = (FieldContainer) this.individualFields.clone(); LinkedList l = new LinkedList(); l.addAll(maskStylesheetList); cl.maskStylesheetList = l; l = new LinkedList(); l.addAll(tableStylesheetList); cl.tableStylesheetList = l; cl.sortNr = this.sortNr; NamedIdObjectList tmpList = new NamedIdObjectList(); for (Iterator it = submaskenListe.iterator(); it.hasNext();) { Maske m = (Maske) it.next(); tmpList.add((Maske) m.clone()); } cl.submaskenListe = tmpList; cl.maskHtml = this.maskHtml; return cl; } /** * Ändert den Stand eines Felds Setzt die Membervariable maskHtml auf null, so * dass bei Anforderung in getMaskHtml klar ist, dass neu transformiert werden * muss * * @param feldname * @param String neuerStand * @throws TransformerException * @throws SQLException * @throws DBServletException * @throws KeyParentEqualException * @throws CloneNotSupportedException * @throws IOException * @throws TemplateException * @throws SichtException * @throws NoMainEntryException * @throws IllegalArgumentException wenn kein Feld mit dem Namen gefunden */ public void setFeldStand(String feldname, String neuerStand, SxUser user) throws TransformerException, SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException { if (neuerStand == null) return; if (!individualFields.containsItemWithName(feldname)) throw new IllegalArgumentException("Es wurde versucht, den Stand des Feldes " + feldname + " zu ändern, aber in der Maske wurde kein Feld mit dem Namen gefunden"); if (!SuperXManager.isZukuenftigerStandErlaubt && DateUtils.isValidDate(neuerStand)) { try { neuerStand = neuerStand.replaceAll("'", ""); // Klammern löschen, \\ ist java.util.regex.Pattern escaping neuerStand = neuerStand.replaceAll("\\(", ""); neuerStand = neuerStand.replaceAll("\\)", ""); if (DateUtils.isDateInFuture(DateUtils.parse(neuerStand))) throw new IllegalArgumentException("Datum in der Zukunft nicht erlaubt"); } catch (ParseException e) { // um Fehler kümmert sich schon setFeldStand-Methode } } HashMap map = new HashMap(); map.putAll(user.getBasicMap()); Field f = (Field) individualFields.getByName(feldname); f.setStand(individualFields.getFormular(), map, individualFields, neuerStand, user); // eventuell gecachten HTML löschen maskHtml = null; } /** * Ändert die ausgewählte Sicht für ein Feld. Setzt die Membervariable maskHtml * auf null, so dass bei Anforderung in getMaskHtml klar ist, dass neu * transformiert werden muss * * @param feldname * @param sichttid * @throws TransformerException * @throws DBServletException * @throws TransformerConfigurationException * @throws CloneNotSupportedException * @throws KeyParentEqualException * @throws SQLException * @throws IOException * @throws TemplateException * @throws SichtException * @throws NoMainEntryException * @throws IllegalArgumentException wenn kein Feld mit dem Namen * gefunden */ public void setSelectedFeldSicht(String feldname, String sichtStr, SxUser user) throws TransformerConfigurationException, TransformerException, DBServletException, SQLException, KeyParentEqualException, CloneNotSupportedException, SichtException, TemplateException, IOException, NoMainEntryException { if (!individualFields.containsItemWithName(feldname)) throw new IllegalArgumentException("Es wurde versucht, eine andere Sicht für das Feld " + feldname + " auszuwählen, aber in der Maske wurde kein Feld mit dem Namen gefunden"); HashMap map = new HashMap(); map.putAll(user.getBasicMap()); Field f = (Field) individualFields.getByName(feldname); f.initIfNeeded(individualFields.getFormular(), map, individualFields, user); if (sichtStr != null) { int sichtint = 0; try { sichtint = Integer.parseInt(sichtStr); f.setSicht(individualFields.getFormular(), map, individualFields, new Integer(sichtint), user); if (!f.isHidden()) user.getSelectionBuffer().setFieldSicht(feldname, sichtStr); } catch (NumberFormatException e) { boolean found = false; StringBuffer buf = new StringBuffer(); for (Iterator it2 = f.getSichtgruppe().iterator(); it2.hasNext();) { AbstractSicht sicht = (AbstractSicht) it2.next(); buf.append(sicht.getName_intern() + " "); if (sicht.getName_intern().equals(sichtStr)) { f.setSicht(individualFields.getFormular(), map, individualFields, (Integer) sicht.getId(), user); found = true; } } if (!found) throw new IllegalArgumentException( "Feld " + f.getName() + " konnte nicht aktualisiert werden DETAILS: da Parameter " + f.getName() + "-Sicht, keine gültige tid oder name_intern einer Sicht lieferte (" + sichtStr + ")" + " möglich wären " + buf + " gewesen"); } } // eventuell gecachten HTML löschen maskHtml = null; } private String getSchleifenfstand() { return schleifenfstand; } private void setSchleifenfstand(String schleifenfstand) { this.schleifenfstand = schleifenfstand; } private String getSchleifenfsicht() { return schleifenfsicht; } private void setSchleifenfsicht(String schleifenfsicht) { this.schleifenfsicht = schleifenfsicht; } /* * public void addSpecialFieldValue(MakroFieldSelection makroFieldSelection) { * if (!individualFields.containsItemWithName(makroFieldSelection.getFeldername * ())) throw new IllegalArgumentException("Kein Feld mit Namen " + * makroFieldSelection.getFeldername() + " gefunden in Maske " + getName() + * " (" + getId() + ")"); Field f = (Field) * individualFields.getByName(makroFieldSelection.getFeldername()); * SelectableItem item=new * SelectableItem(makroFieldSelection.getWert(),makroFieldSelection * .getCaption()); //nicht true sonst wirds wieder gelöscht // * item.setTemporary(true); //f.addTempSelectionElement(item); * f.addSelectionElement(item); } */ /** * @return Returns the explanation. */ public String getExplanation() { return explanation; } /** * @param explanation The explanation to set. */ public void setExplanation(String explanation) { this.explanation = explanation; } public void setHinweis(String hinweis) { this.hinweis = hinweis; if (hinweis != null) { if (hinweis.startsWith("<>")) { hinweis = ""; // DQ muss noch gemacht werden wie im Applet: // hinweis = hinweis.substring(7, hinweis.length()); // try { // String sql = SxUtils // .generateSQL(maskeForm, hinweis); // SxSQL.executeQuery(sql); // hinweis = (String) SxSQL.getObjectAt(0, 0); // } catch (Exception e) { // hinweis = null; // } } // System.out.println("setting Hinweis:"+Hinweis); } } public String getHinweisCaption() { return hinweisCaption; } public void setHinweisCaption(String hinweisCaption) { this.hinweisCaption = hinweisCaption; } public String getKidRows(String treetableid, int row) { if (result_el == null) throw new IllegalStateException( "Die Maske ist derzeit nicht benutzbar.Nachladen per Ajax fehlgeschlagen DETAILS:result-objekt ist null, kann keine Kinder per Ajax nachladen"); XMLResultCreator rc = new XMLResultCreator(result_el, maxOffset, offset, mandantenID); StringBuffer xml = new StringBuffer(); rc.addXML(xml, colset, true, treetableid, row); return xml.toString(); } /** * set to uninited damit wieder eingelesen werden */ public void markDynamicFields() { for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); if (f.isDynamic()) f.setInited(false); } } public boolean hasDynamicFields() { boolean result = false; for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); if (f.isDynamic()) result = true; } return result; } public boolean hasArt0Fields() { boolean result = false; for (Iterator it = individualFields.iterator(); it.hasNext();) { Field f = (Field) it.next(); if (f.getArt() == 0) result = true; } return result; } public void openHeader(String key) { headerManager.openHeader(key); setReuseResult(true); } public void closeHeader(String key) { headerManager.closeHeader(key); setReuseResult(true); } public boolean isMaxRowsReached() { boolean result = false; if (result_el != null && result_el.getResultSet() != null && (result_el.getResultSet().size() == SuperXManager.maxRows || (result_el.getRuntimeMessage() != null && result_el.getRuntimeMessage().indexOf("Zeilen liegen über max. Grenze") >= 1))) result = true; return result; } public List getHeaderCaptionList(String mandantenID, boolean removeNewline) { int pos = lastHeaderXml.indexOf(""); if (pos == -1) throw new IllegalStateException("Kein Knoten headersconcated im Masken-Xml gefunden)"); int pos2 = lastHeaderXml.indexOf("]>\n", pos) - 1; String concated = lastHeaderXml.substring(pos + 26, pos2); concated = SxPools.get(mandantenID).localize(concated, new Locale("de")); List result = new ArrayList(); StringTokenizer st = new StringTokenizer(concated, "\t"); while (st.hasMoreTokens()) { String h = st.nextToken(); if (removeNewline) { h = StringUtils.replace(h, "\n", " "); h = StringUtils.replace(h, "\\n", " "); h = StringUtils.replace(h, "\\000", " "); } result.add(h); } return result; } public String getLegendText(SxUser user) throws ParseException { StringBuffer legend = new StringBuffer(); for (Iterator it = individualFields.iterator(); it.hasNext();) { Field feld = (Field) it.next(); String value = feld.getSelectedKey(); if ((value != null && !value.equals("")) || (feld.isOrganigrammSichtArt() && (!feld.getSichtgruppe().getSelectedSicht().isFirstInGroup() || DateUtils.isToday(feld.getSichtgruppe().getSelectedSicht().getStand())))) { String feldname = feld.getCaptionShort(); if (feldname == null || feldname.equals("")) feldname = feld.getName(); String valueCaption = feld.getSelectedKeyValueCaption(); if (feld.isSicht() && feld.isSelectedKeyEmpty()) valueCaption = "keine Einschränkung"; legend.append(feldname + ":" + SqlStringUtils.unescapeString(valueCaption) + " "); if (feld.isSicht()) legend.append(" (Sicht:" + feld.getSichtgruppe().getSelectedSicht().getName() + " Stand:" + feld.getSichtgruppe().getStand() + ") "); } } legend.append(" User:" + user.getName() + " Stand: " + this.getStandString()); return legend.toString(); } public String fmProcess(SxUser user, String vorlage) throws TemplateException, IOException, SQLException { String result = SqlStringUtils.generateSQL(SxPools.get(mandantenID).getDatabaseAbbr(), individualFields.getFormular(), vorlage); map.clear(); map.putAll(user.getBasicMap()); result = SxPools.get(mandantenID).getTemplateProcessor().process(map, (Integer) getId(), getMaskInfo(), result, individualFields, SxPools.get(mandantenID).getRepository(), SxPools.get(mandantenID).getSqlDialect()); return result; } /** * Normalerweise Maskenname nur bei JasperReports der Stylesheetname * * @return */ public String getExportName() { String result = getName(); if (selectedTableStylesheet != null && selectedTableStylesheet.getFilename().indexOf(".jrxml") > -1) result = selectedTableStylesheet.getCaption(); if (map.containsKey("exportfilename")) { if (map.get("exportfilename")==null||map.get("exportfilename").toString().trim().equals("")) { throw new IllegalStateException("Die Maske definiert exportfilename, dieser ist aber leer. Masken-SQL prüfen"); } result=map.get("exportfilename").toString(); } return result; } public String getFullTableXml(String mandantenId, SxUser sxuser, HttpServletRequest request, Locale locale) throws TransformerConfigurationException, TemplateException, IOException, SQLException, KeyParentEqualException, CloneNotSupportedException, SichtException, ObligatoryFieldEmptyException, ParseException, InvalidKeyException, TransformerException, DBServletException, UngueltigeEingabeException, NoMainEntryException, InvalidDataTypeException { boolean isReuse = this.isReuseResult(); int offset = this.getOffset(); int maxoffset = this.getMaxOffset(); this.setOffset(0); this.setMaxOffset(100000000); this.setReuseResult(true); String returnText = this.runQuery(sxuser, request, null).toString(); returnText = SxPools.get(mandantenId).localize(returnText, locale); this.setReuseResult(isReuse); this.setOffset(offset); this.setMaxOffset(maxoffset); return returnText; } private StringBuffer addBacklink(HttpServletRequest request, StringBuffer buf) { String backlink = ServletHelper.getParameter(request, "backlink"); if (backlink != null) { buf.append("\n"); if (backlink.equalsIgnoreCase("his1")) { buf.append(request.getScheme()).append("://").append(request.getServerName()).append(":") .append(request.getServerPort()).append("/").append(System.getProperty("QIS_CONTEXT")) .append("/pages/cs/sys/portal/hisinoneStartPage.faces"); } else { buf.append(backlink); } buf.append("\n"); } return buf; } public FieldContainer getIndividualFields() { return individualFields; } public StringBuffer getCSV(String mandantenID) throws IOException { String fld_delim1 = ""; String fld_delim2 = "^"; if (SxPools.get(mandantenID).getRepository().containsKey("K_CSV_Excel_ISO")&&SxPools.get(mandantenID).getRepository().get("K_CSV_Excel_ISO").toString().equals("1")) { fld_delim2 = ";"; } String row_delim1 = ""; String row_delim2 = "\n";// we only user unix newline, even under DOS String outFormat = "txt"; StringBuffer result = new StringBuffer(); StringBuffer line = new StringBuffer(""); int cols = this.getResult_el().getColumnCount(); // header List headerlist = getHeaderCaptionList(mandantenID, true); for (Iterator it = headerlist.iterator(); it.hasNext();) { String headername = it.next() + fld_delim2; headername = headername.replaceAll(" ", " "); headername = headername.replaceAll(" ", " "); line.append(headername); } line.append("\n"); result.append(line); // data Iterator it = this.getResult_el().getResultSet().iterator(); while (it.hasNext()) { SxResultRow row = (SxResultRow) it.next(); line.setLength(0); for (int i = 1; i <= cols; i++) { Object o = row.get(i - 1); // aus SxTransformer.printResult String f_wert = SxDBUtils.field_value(o); // MB spezifisch statt . ein , als Decimaltrenner if (o instanceof Float || o instanceof Double || o instanceof BigDecimal) f_wert = o.toString().replace('.', ','); // MB Spezifisch Ende if (outFormat.equals("xml") && (f_wert.indexOf("&") > -1 || f_wert.indexOf("<") > -1 || f_wert.indexOf(">") > -1)) f_wert = ""; //wenn der Feldwert einen Zeilenumbruch enthält wird der Test in "" gesetzt -> für CSV Import if (outFormat.equals("txt") && f_wert != null && (f_wert.indexOf("\n") > -1)) { f_wert = "\""+f_wert+"\""; } // wenn der Feldwert zufällig das Zeichen // "\" enthält, wird es mit "\" maskiert if (outFormat.equals("txt") && f_wert != null && (f_wert.indexOf("\n") > -1)) { f_wert = "\""+f_wert+"\""; } if (outFormat.equals("txt") && f_wert != null && (f_wert.indexOf("\\n") > -1)) { f_wert = de.memtext.util.StringUtils.replace(f_wert, "\\n", "\\\\n"); } // wenn der Feldwert zufällig das Trennzeichen enthält, wird es // mit "\" maskiert if (outFormat.equals("txt") && f_wert != null && (f_wert.indexOf(fld_delim2) > -1)) f_wert = de.memtext.util.StringUtils.replace(f_wert, fld_delim2, "\\" + fld_delim2); if (i < cols) line.append(fld_delim1 + f_wert + fld_delim2); else { line.append(fld_delim1 + f_wert + fld_delim2); line.append(row_delim2); } // aus SxTransformer.printResult } result.append(line); } return result; } public void updateDynamicSichten(Field f, SxUser user) throws SQLException, DBServletException, KeyParentEqualException, CloneNotSupportedException, NoMainEntryException, TemplateException, IOException { HashMap map = new HashMap(); map.putAll(user.getBasicMap()); f.getSichtgruppe().updateDynamicSichten(individualFields.getFormular(), map, individualFields); } public void setNavi(boolean navi) { this.navi = navi; } /** * Wenn eine Maske mit multipart-Data aufgerufen wird, dieses Ablegen. in * individualFields reinschreiben wird von setSelection gelesen * * @param multipartData */ public void setMultipartData(List multipartData) { this.multipartData = multipartData; Iterator iter = multipartData.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String paramName = item.getFieldName(); String paramValue = item.getString(); individualFields.getFormular().put(paramName, paramValue); } } } } // Created on 23.09.2004 at 14:11:07