TemplatesDB.java
package sk.iway.iwcm.doc;
import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.DB;
import sk.iway.iwcm.DBPool;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.helpers.BeanDiff;
import sk.iway.iwcm.helpers.BeanDiffPrinter;
import sk.iway.iwcm.stat.BrowserDetector;
import sk.iway.iwcm.stat.StatNewDB;
import sk.iway.iwcm.system.cluster.ClusterDB;
import sk.iway.iwcm.users.UserDetails;
/**
* Cachuje v pamati zaznamy z tabulky templates
*
*@Title Interway Content Management
*@Company Interway s.r.o. (www.interway.sk)
*@Copyright Interway s.r.o. (c) 2001-2002
*@author $Author: jeeff $
*@version $Revision: 1.4 $
*@created $Date: 2004/01/24 08:05:42 $
*@modified $Date: 2004/01/24 08:05:42 $
*/
public class TemplatesDB extends DB
{
private List<TemplateDetails> temps;
public static TemplatesDB getInstance() {
return getInstance(false);
}
/**
* Gets the instance attribute of the TemplatesDB class
*
*@param force_refresh Description of the Parameter
*@return The instance value
*/
public static TemplatesDB getInstance(boolean forceRefresh)
{
//try to get it from server space
if (forceRefresh == false)
{
//Logger.println(this,"TempDB: getting from server space");
TemplatesDB tempDB = ((TemplatesDB) Constants.getServletContext().getAttribute(Constants.A_TEMP_DB));
if (tempDB != null)
{
return tempDB;
}
}
synchronized (TemplatesDB.class)
{
if (forceRefresh)
{
TemplatesDB tempDB = new TemplatesDB();
// remove
Constants.getServletContext().removeAttribute(Constants.A_TEMP_DB);
//save us to server space
Constants.getServletContext().setAttribute(Constants.A_TEMP_DB, tempDB);
return tempDB;
}
else
{
//double check
TemplatesDB tempDB = (TemplatesDB) Constants.getServletContext().getAttribute(Constants.A_TEMP_DB);
if (tempDB == null)
{
tempDB = new TemplatesDB();
// remove
Constants.getServletContext().removeAttribute(Constants.A_TEMP_DB);
//save us to server space
Constants.getServletContext().setAttribute(Constants.A_TEMP_DB, tempDB);
}
return tempDB;
}
}
}
/**
* Constructor for the TemplatesDB object
*
* @param servletContext Description of the Parameter
* @param serverName Description of the Parameter
*/
private TemplatesDB() {
DebugTimer dt = new DebugTimer("TempDB: constructor [" + Constants.getInstallName() + "]");
try {
reload();
} catch (Exception ex) {
Logger.error(this, "Can't load templates");
Logger.error(TemplatesDB.class, ex);
}
ClusterDB.addRefresh(TemplatesDB.class);
dt.diff("done");
}
/**
* Description of the Method
*
* @param servletContext Description of the Parameter
* @exception Exception Description of the Exception
*/
private void reload() throws Exception {
List<TemplateDetails> loadedTemps = new ArrayList<>();
java.sql.Connection db_conn = null;
java.sql.PreparedStatement ps = null;
ResultSet rs = null;
try {
//Nacitaj zoznam tempGroups
List<TemplatesGroupBean> tempGroupsList = TemplatesGroupDB.getAllTemplatesGroups();
Map<Long, String> tempGroupsTable = new Hashtable<>();
for (TemplatesGroupBean tgb : tempGroupsList) {
tempGroupsTable.put(tgb.getId(), tgb.getName());
}
db_conn = DBPool.getConnection();
String sql;
sql = "SELECT * FROM templates order by temp_name";
// sql = "SELECT t.*, COUNT(d.temp_id) as doc_count FROM templates t LEFT JOIN
// documents d USING (temp_id) GROUP BY temp_id;";
ps = db_conn.prepareStatement(sql);
// ps.setInt(1, user.getUserId());
// Logger.println(this,"sql="+sql);
rs = ps.executeQuery();
TemplateDetails tmpDetails;
while (rs.next()) {
tmpDetails = new TemplateDetails();
tmpDetails.setTempId(rs.getInt("temp_id"));
tmpDetails.setTempName(getDbString(rs, "temp_name"));
tmpDetails.setForward(getDbString(rs, "forward"));
tmpDetails.setLng(getDbString(rs, "lng"));
tmpDetails.setHeaderDocId(rs.getInt("header_doc_id"));
tmpDetails.setFooterDocId(rs.getInt("footer_doc_id"));
tmpDetails.setMenuDocId(rs.getInt("menu_doc_id"));
tmpDetails.setRightMenuDocId(rs.getInt("right_menu_doc_id"));
tmpDetails.setAfterBodyData(getDbString(rs, "after_body_data"));
tmpDetails.setCss(getDbString(rs, "css"));
tmpDetails.setBaseCssPath(getDbString(rs, "base_css_path"));
tmpDetails.setObjectADocId(rs.getInt("object_a_doc_id"));
tmpDetails.setObjectBDocId(rs.getInt("object_b_doc_id"));
tmpDetails.setObjectCDocId(rs.getInt("object_c_doc_id"));
tmpDetails.setObjectDDocId(rs.getInt("object_d_doc_id"));
tmpDetails.setAvailableGroups(getDbString(rs, "available_groups"));
tmpDetails.setTemplateInstallName(getDbString(rs, "template_install_name"));
tmpDetails.setDisableSpamProtection(rs.getBoolean("disable_spam_protection"));
// tmpDetails.setPocetPouziti(rs.getInt("doc_count"));
tmpDetails.setTemplatesGroupId(rs.getLong("templates_group_id"));
String tempGroupName = null;
if (tmpDetails.getTemplatesGroupId()!=null) {
tempGroupName = tempGroupsTable.get(tmpDetails.getTemplatesGroupId());
}
if (tempGroupName==null) tempGroupName = "";
tmpDetails.setTemplatesGroupName(tempGroupName);
tmpDetails.setInlineEditingMode(getDbString(rs, "inline_editing_mode"));
loadedTemps.add(tmpDetails);
}
rs.close();
ps.close();
db_conn.close();
db_conn = null;
rs = null;
ps = null;
temps = loadedTemps;
} catch (Exception ex) {
Logger.error(TemplatesDB.class, ex);
// backward compatibility - method used to throw an exception
throw ex;
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (db_conn != null)
db_conn.close();
} catch (Exception e) {
//
}
}
}
/**
* vrati sablonu so zadanym id
*
*@param temp_id id sablony
*@return sablona
*/
public TemplateDetails getTemplate(int temp_id)
{
for (TemplateDetails details : temps)
{
if (details.getTempId() == temp_id)
{
return (details);
}
}
return (null);
}
/**
* vrati sablonu so zadanym menom
*
*@param tempName id sablony
*@return sablona
*/
public TemplateDetails getTemplate(String tempName)
{
if (tempName==null || tempName.trim().length()<1) return(null);
tempName = tempName.trim();
for (TemplateDetails details : temps)
{
if (details.getTempName().equalsIgnoreCase(tempName))
{
return (details);
}
}
return (null);
}
/**
* Vrati sablonu na zaklade nazvu a typu zariadenia (browserDeviceType)
* Sablona musi v nazve obsahovat "device="+bd.getBrowserDeviceType()
* @param temp
* @param bd
* @return
*/
public TemplateDetails getTemplate(TemplateDetails temp, BrowserDetector bd)
{
if (temp==null) return null;
String tempName = temp.getTempName();
if (tempName==null || tempName.trim().length()<1 || bd == null || bd.getBrowserDeviceType()==null) return(null);
tempName = tempName.trim();
for (TemplateDetails details : temps)
{
if (details.getTempName().startsWith(tempName+" device=") && details.getTempName().indexOf("device="+bd.getBrowserDeviceType())!=-1)
{
return (details);
}
}
if (Tools.isNotEmpty(bd.getBrowserDeviceType()) && "normal".equals(bd.getBrowserDeviceType())==false)
{
synchronized (temps)
{
//double check
for (TemplateDetails details : temps)
{
if (details.getTempName().startsWith(tempName+" device=") && details.getTempName().toLowerCase().indexOf("device="+bd.getBrowserDeviceType())!=-1)
{
return (details);
}
}
try
{
Logger.debug(TemplatesDB.class, "Creating device template, name="+temp.getTempName()+" device="+bd.getBrowserDeviceType());
//vytvor pseudo sablonu pre dane device
TemplateDetails deviceTemp = new TemplateDetails();
BeanUtils.copyProperties(deviceTemp, temp);
deviceTemp.setTempId(-1);
deviceTemp.setTempName(temp.getTempName()+" device="+bd.getBrowserDeviceType());
deviceTemp.setHeaderDocData(getDeviceHeaderFooterMenu(temp.getHeaderDocId(), bd));
deviceTemp.setMenuDocData(getDeviceHeaderFooterMenu(temp.getMenuDocId(), bd));
deviceTemp.setRightMenuDocData(getDeviceHeaderFooterMenu(temp.getRightMenuDocId(), bd));
deviceTemp.setFooterDocData(getDeviceHeaderFooterMenu(temp.getFooterDocId(), bd));
deviceTemp.setObjectADocData(getDeviceHeaderFooterMenu(temp.getObjectADocId(), bd));
deviceTemp.setObjectBDocData(getDeviceHeaderFooterMenu(temp.getObjectBDocId(), bd));
deviceTemp.setObjectCDocData(getDeviceHeaderFooterMenu(temp.getObjectCDocId(), bd));
deviceTemp.setObjectDDocData(getDeviceHeaderFooterMenu(temp.getObjectDDocId(), bd));
//uloz do listu
temps.add(deviceTemp);
return deviceTemp;
}
catch (Exception ex)
{
Logger.error(TemplatesDB.class, ex);
}
}
}
return (null);
}
private String getDeviceHeaderFooterMenu(int origDocId, BrowserDetector bd)
{
if (origDocId<1) return null;
DocDB docDB = DocDB.getInstance();
//tu nemoze byt BasicDocDetails pretoze dole potrebujem origDoc.getData
DocDetails origDoc = docDB.getDoc(origDocId);
if (origDoc != null)
{
List<DocDetails> docs = docDB.getBasicDocDetailsByGroup(origDoc.getGroupId(), -1);
for (DocDetails doc:docs)
{
//Logger.debug(TemplatesDB.class, "Testing: "+origDoc.getTitle()+" d="+bd.getBrowserDeviceType()+" vs "+doc.getTitle()+" device="+bd.getBrowserDeviceType()+" p1="+doc.getTitle().startsWith(origDoc.getTitle())+" p2="+(doc.getTitle().toLowerCase().indexOf("device="+bd.getBrowserDeviceType())));
if (doc.getTitle().startsWith(origDoc.getTitle()) && doc.getTitle().toLowerCase().indexOf("device="+bd.getBrowserDeviceType())!=-1)
{
//musim ziskat komplet dokument
DocDetails docFull = docDB.getDoc(doc.getDocId());
if (docFull!=null) return docFull.getData();
return origDoc.getData();
}
}
return origDoc.getData();
}
return null;
}
/**
* Vrati subor na zaklade jeho mena a browser detector
* subor musi v nazve obsahovat "device="+bd.getBrowserDeviceType()
* @param rootDir
* @param forward
* @param bd
* @return
*/
public static File getDeviceTemplateFile(File rootDir, String forward, BrowserDetector bd)
{
File forwFile = new File(rootDir.getAbsolutePath()+File.separatorChar+forward.replace('/', File.separatorChar));
if (forwFile.exists()==false) return(forwFile);
if (bd!=null && bd.getBrowserDeviceType()!=null)
{
String forwName = Tools.replace(forwFile.getName(), ".jsp", "");
forwName = Tools.replace(forwFile.getName(), ".html", "");
File[] files = rootDir.listFiles();
int size = files.length;
int i;
for (i=0; i<size; i++)
{
if (files[i].getName().startsWith(forwName) && files[i].getName().toLowerCase().indexOf("device="+bd.getBrowserDeviceType())!=-1)
{
return(files[i]);
}
}
}
return(forwFile);
}
/**
* vrati zoznam vsetkych sablon
*
*@return sablony
*/
public List<TemplateDetails> getTemplates()
{
return (temps);
}
/**
* Vrati sablony dostupne pre zadane groupId
* @param groupId
* @return
*/
public List<TemplateDetails> getTemplates(int groupId)
{
return getTemplates(groupId, -1);
}
/**
* Vrati sablony dostupne pre zadane groupId pricom VZDY bude obsahovat aj sabonu s mustHaveTempId
* @param groupId
* @param mustHaveTempId
* @return
*/
public List<TemplateDetails> getTemplates(int groupId, int mustHaveTempId)
{
//najskor potrebujeme zoznam parent skupin
GroupsDB groupsDB = GroupsDB.getInstance();
List<GroupDetails> groups = groupsDB.getParentGroups(groupId);
List<TemplateDetails> ret = new ArrayList<>();
for (TemplateDetails temp : temps)
{
if (temp.getTempId()<1) continue;
int[] availableGroups = temp.getAvailableGroupsInt();
if (availableGroups.length == 0 || isGroupAvailable(availableGroups, groups) || temp.getTempId()==mustHaveTempId)
{
ret.add(temp);
}
}
if (ret.size()==0)
{
ret.add(temps.get(0));
}
return (ret);
}
/**
* Odfiltruje zo zoznamu sablon tie, ktore su urcene pre specificky device (v nazve obsahuju device=)
* viz tiket 7197
* @param allTemplates
* @return
*/
public static List<TemplateDetails> filterDeviceTemplates(List<TemplateDetails> allTemplates)
{
List<TemplateDetails> templates = new ArrayList<>();
for (TemplateDetails temp : allTemplates)
{
if (temp == null || Tools.isEmpty(temp.getTempName()) || temp.getTempName().indexOf("device=")!=-1) continue;
templates.add(temp);
}
return templates;
}
private boolean isGroupAvailable(int[] availableGroups, List<GroupDetails> groups)
{
for (int groupId : availableGroups)
{
for (GroupDetails group : groups)
{
if (group.getGroupId() == groupId) return true;
}
}
return false;
}
/**
* Otestuje, ci sa dana sablona pouziva. Ak je zadane -1 tak vzdy vrati ze ano
* @param tempId
* @return
*/
public static boolean isTemplateUsed(int tempId)
{
//novym vraciame ze ano, aby sa nezobrazilo Delete tlacitko
if (tempId < 0) return(true);
boolean used = false;
Connection db_conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
db_conn = DBPool.getConnection();
String sql = "SELECT doc_id FROM documents WHERE temp_id=?";
if (Constants.DB_TYPE==Constants.DB_MYSQL || Constants.DB_TYPE==Constants.DB_PGSQL) sql += " LIMIT 1";
else if (Constants.DB_TYPE==Constants.DB_MSSQL) sql = "SELECT TOP 1 doc_id FROM documents WHERE temp_id=?";
else if (Constants.DB_TYPE==Constants.DB_ORACLE) sql += " AND rownum<2";
ps = StatNewDB.prepareStatement(db_conn, sql);
ps.setInt(1, tempId);
rs = ps.executeQuery();
if (rs.next())
{
used = true;
}
rs.close();
ps.close();
rs = null;
ps = null;
}
catch (Exception ex)
{
Logger.error(TemplatesDB.class, ex);
}
finally
{
try
{
if (db_conn != null)
db_conn.close();
if (rs != null)
rs.close();
if (ps != null)
ps.close();
}
catch (Exception ex2)
{
//
}
}
return(used);
}
/**
* vrati Hashtable, kde kluc je temp_id a hodnota je pocet stranok, ktore pouzivaju dany template
* @return Hashtable
*/
public Map<Integer, Integer> numberOfPages()
{
Map<Integer, Integer> table = new Hashtable<>();
List<DocDetails> allDocs = DocDB.getInstance().getBasicDocDetailsAll();
for (DocDetails d : allDocs)
{
Integer tempId = Integer.valueOf(d.getTempId());
Integer count = table.get(tempId);
if (count == null) count = Integer.valueOf(1);
else count = Integer.valueOf(count.intValue() + 1);
table.put(tempId, count);
}
return(table);
}
/**
* Ulozi sablonu do databazy
* @param t_form
* @return
*/
public boolean saveTemplate(TemplateDetails t_form)
{
Connection db_conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
db_conn = DBPool.getConnection();
String sql;
TemplateDetails oldTemplate = t_form.getTempId() > 0 ? getTemplate(t_form.getTempId()) : null;
sql = "INSERT INTO templates (temp_name, forward, header_doc_id, footer_doc_id, menu_doc_id, after_body_data, css, lng, right_menu_doc_id, base_css_path, object_a_doc_id, object_b_doc_id, object_c_doc_id, object_d_doc_id, available_groups, template_install_name, disable_spam_protection, templates_group_id, inline_editing_mode) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
if (t_form.getTempId() > 0)
sql = "UPDATE templates SET temp_name=?, forward=?, header_doc_id=?, footer_doc_id=?, menu_doc_id=?, after_body_data=?, css=?, lng=?, right_menu_doc_id=?, base_css_path=?, object_a_doc_id=?, object_b_doc_id=?, object_c_doc_id=?, object_d_doc_id=?, available_groups=?, template_install_name=?, disable_spam_protection=?, templates_group_id=?, inline_editing_mode=? WHERE temp_id=?";
ps = db_conn.prepareStatement(sql);
ps.setString(1, t_form.getTempName());
ps.setString(2, t_form.getForward());
ps.setInt(3, t_form.getHeaderDocId());
ps.setInt(4, t_form.getFooterDocId());
ps.setInt(5, t_form.getMenuDocId());
DB.setClob(ps, 6, t_form.getAfterBodyData());
ps.setString(7, t_form.getCss());
ps.setString(8, t_form.getLng());
ps.setInt(9, t_form.getRightMenuDocId());
ps.setString(10, t_form.getBaseCssPath());
ps.setInt(11, t_form.getObjectADocId());
ps.setInt(12, t_form.getObjectBDocId());
ps.setInt(13, t_form.getObjectCDocId());
ps.setInt(14, t_form.getObjectDDocId());
ps.setString(15, t_form.getAvailableGroups());
ps.setString(16, t_form.getTemplateInstallName());
ps.setBoolean(17, t_form.isDisableSpamProtection());
long tempGroupId = 1; //1==nepriradene
if (t_form.getTemplatesGroupId()!=null) tempGroupId = t_form.getTemplatesGroupId();
ps.setLong(18, tempGroupId);
ps.setString(19, t_form.getInlineEditingMode());
if (t_form.getTempId() > 0)
{
ps.setInt(20, t_form.getTempId());
}
ps.execute();
ps.close();
if (t_form.getTempId() < 1)
{
ps = db_conn.prepareStatement("SELECT max(temp_id) AS temp_id FROM templates WHERE temp_name=?");
ps.setString(1, t_form.getTempName());
rs = ps.executeQuery();
if (rs.next())
{
t_form.setTempId(rs.getInt("temp_id"));
}
rs.close();
ps.close();
rs = null;
}
db_conn.close();
db_conn = null;
ps = null;
//refreshni DB
TemplatesDB.getInstance(true);
logChanges(t_form, oldTemplate);
return true;
}
catch (Exception ex)
{
Logger.error(TemplatesDB.class, ex);
}
finally
{
try
{
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (db_conn != null)
db_conn.close();
}
catch (Exception ex2)
{
//
}
}
return false;
}
private void logChanges(TemplateDetails t_form, TemplateDetails oldTemplate)
{
StringBuilder log = new StringBuilder();
if (oldTemplate != null)
{
log.append("Zmenena sablona: ").append(t_form.getTempName());
BeanDiff diff = new BeanDiff().setNew(t_form).setOriginal(oldTemplate).
blacklist("footerDocData", "pocetPouziti", "headerDocData", "menuDocData", "objectADocData", "objectBDocData", "objectCDocData", "objectDDocData");
log.append('\n').append(new BeanDiffPrinter(diff));
Adminlog.add(Adminlog.TYPE_TEMPLATE_UPDATE, log.toString(), t_form.getTempId(), 0);
}
else
{
log.append("Vytvorena sablona: ").append(t_form.getTempName());
Adminlog.add(Adminlog.TYPE_TEMPLATE_INSERT, log.toString(), t_form.getTempId(), 0);
}
}
/**
* Odfiltruje sablony podla prav pouzivatela (pristupne adresare)
* @param user
* @param allTemps
* @return
*/
public static List<TemplateDetails> filterTemplatesByUser(UserDetails user, List<TemplateDetails> allTemps)
{
List<TemplateDetails> ret = new ArrayList<>();
GroupsDB groupsDB = GroupsDB.getInstance();
int[] userEditableGroups = groupsDB.expandGroupIdsToChilds(Tools.getTokensInt(user.getEditableGroups(true), ","), true);
if ((userEditableGroups == null || userEditableGroups.length<1)) return allTemps;
for (TemplateDetails temp : allTemps)
{
//toto je automaticky vytvorena device sablona
if (temp.getTempId()<1) continue;
boolean pridaj = false;
if (temp.getAvailableGroupsInt().length==0)
{
pridaj = true;
}
else if (userEditableGroups.length>0)
{
if (Tools.containsOneItem(temp.getAvailableGroupsInt(), userEditableGroups)) pridaj = true;
}
if (pridaj) ret.add(temp);
}
return ret;
}
/**
* Vrati zoznam pouzitych jazykov v sablonach kvoli filtrovaniu
*/
public static List<String> getDistinctLngs()
{
return new SimpleQuery().forListString("SELECT DISTINCT lng FROM templates");
}
/**
* Vrati zoznam ulozenych sablon, aby sa nezobrazovali automaticky generovane device templaty v zozname sablon
* @return
*/
public List<TemplateDetails> getTemplatesSaved()
{
List<TemplateDetails> all = new ArrayList<>();
for (TemplateDetails t : getTemplates())
{
if (t.getTempId()<1) continue;
all.add(t);
}
return all;
}
public boolean remove(int tempId) {
Connection db_conn = null;
PreparedStatement ps = null;
try {
db_conn = DBPool.getConnection();
//over ci existuje
TemplateDetails temp1 = TemplatesDB.getInstance().getTemplate(tempId);
if (temp1 != null) {
ps = db_conn.prepareStatement("DELETE FROM templates WHERE temp_id=?");
ps.setInt(1, tempId);
ps.execute();
ps.close();
Adminlog.add(Adminlog.TYPE_TEMPLATE_DELETE, "Delete template :" + " name= " + temp1.getTempName(), temp1.getTempId(), -1);
return true;
}
} catch (Exception ex) {
sk.iway.iwcm.Logger.error(ex);
} finally {
try
{
if (db_conn != null)
db_conn.close();
if (ps != null)
ps.close();
}
catch (Exception ex2)
{
//
}
}
return false;
}
public static String getDocData(int docId) {
if (docId > 0) {
DocDetails doc = DocDB.getInstance().getDocAndAddToCacheIfNot(docId);
if (doc != null) {
return doc.getData();
}
}
return "";
}
}