TemplateDetailsService.java
package sk.iway.iwcm.components.templates;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.doc.*;
import sk.iway.iwcm.system.multidomain.MultiDomainFilter;
import sk.iway.iwcm.users.UserDetails;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class TemplateDetailsService {
private final DocDetailsRepository docDetailsRepository;
@Autowired
public TemplateDetailsService(DocDetailsRepository docDetailsRepository) {
this.docDetailsRepository = docDetailsRepository;
}
public TemplateDetails getOne(int templateId) {
TemplatesDB templatesDB = TemplatesDB.getInstance();
return templatesDB.getTemplate(templateId);
}
public List<TemplateDetails> getAllTemplateDetails(UserDetails currentUser) {
Map<Integer, Integer> tableOfUsage = TemplatesDB.getInstance().numberOfPages();
TemplatesDB templatesDB = TemplatesDB.getInstance();
List<TemplateDetails> templateDetails = filterByCurrentDomainAndUser(currentUser, templatesDB.getTemplatesSaved());
for (TemplateDetails detail : templateDetails) {
Integer number = tableOfUsage.get(detail.getTempId());
if (null != number) {
detail.setPocetPouziti(number);
}
}
return templateDetails;
}
/**
* Filter templates by current domain
* @param templateDetails
* @return
*/
public List<TemplateDetails> filterByCurrentDomainAndUser(UserDetails currentUser, List<TemplateDetails> templateDetails) {
templateDetails = TemplatesDB.filterTemplatesByUser(currentUser, templateDetails);
if (Constants.getBoolean("multiDomainEnabled")) {
//show templates available only on current domain
List<TemplateDetails> filtered = new ArrayList<>();
String currentDomain = CloudToolsForCore.getDomainName();
if (Tools.isNotEmpty(currentDomain)) {
for (TemplateDetails temp : templateDetails) {
List<GroupDetails> groups = temp.getAvailableGrooupsList();
if (groups==null || groups.isEmpty()) {
filtered.add(temp);
continue;
}
for (GroupDetails group : groups) {
if (Tools.isEmpty(group.getDomainName()) || currentDomain.equals(group.getDomainName())) {
filtered.add(temp);
break;
}
}
}
}
templateDetails = filtered;
}
return templateDetails;
}
TemplateDetails insertTemplateDetail(TemplateDetails templateDetails) {
try {
templateDetails.setTempId(-1);
TemplatesDB.getInstance().saveTemplate(templateDetails);
} catch (Exception e) {
Logger.error(getClass(), "Error while saving templateDetail with name " + templateDetails.getTempName() +
". Error message: " + e.getMessage() + ".");
}
return templateDetails;
}
TemplateDetails editTemplateDetail(TemplateDetails templateDetails, long id) {
templateDetails.setTempId((int) id);
try {
TemplatesDB.getInstance().saveTemplate(templateDetails);
} catch (Exception e) {
Logger.error(getClass(), "Error while editing templateDetail [" + id + ", " + templateDetails.getTempName() +
"]. Error message: " + e.getMessage() + ".");
}
return templateDetails;
}
boolean deleteTemplateDetails(long id) {
boolean deleted = TemplatesDB.getInstance().remove((int) id);
if (deleted) {
TemplatesDB.getInstance(true);
GroupsDB.getInstance(true);
DocDB.getInstance(true);
}
return deleted;
}
/**
* Vrati zoznam moznych JSP sablon pre zadanu sablonu
* Hlada v adresaroch:
* /templates/INSTALL_NAME/TEMPLATE_GROUP_DIR - pre taketo vrati len TEMPLATE_GROUP_DIR/cesta.jsp
* /templates/INSTALL_NAME
* /templates/DOMAIN_ALIAS/ - pre tieto vrati cestu aj s DOMAIN_ALIAS
*
* @param installName - hodnota installName zadana v editore sablony
* @param templatesGroupId - ID skupiny sablon (alebo null)
* @param searchTerm - zadany hladany vyraz (autocomplete filter)
* @return
*/
public List<String> getTemplateForwards(String installNameParam, Integer templatesGroupId, String searchTerm) {
List<String> forwards = new ArrayList<>();
String installName = installNameParam;
if (Tools.isEmpty(installName)) installName = Constants.getInstallName();
File dir = new File(sk.iway.iwcm.Tools.getRealPath("/templates"));
if (dir.isDirectory())
{
String templatesGroupDir = "";
if (templatesGroupId != null && templatesGroupId.intValue()>0) templatesGroupDir = (new SimpleQuery().forString("SELECT directory FROM templates_group WHERE templates_group_id = ?", templatesGroupId));
// nepriradena skupina ma directory = "/"
if ("/".equals(templatesGroupDir)) templatesGroupDir = "";
File dirSpec = new File(sk.iway.iwcm.Tools.getRealPath("/templates/" + installName + "/" + templatesGroupDir)); //NOSONAR
if (dirSpec.exists() && dirSpec.isDirectory()){
dir = dirSpec;
} else {
dirSpec = new File(sk.iway.iwcm.Tools.getRealPath("/templates/" + templatesGroupDir));
if (Tools.isNotEmpty(templatesGroupDir) && dirSpec.exists() && dirSpec.isDirectory()){
dir = dirSpec;
} else {
// ak nenajde templaters/{INSTALL NAME}/{templatesGroupDir} ide o directory vyssie a resetne templatesGroupDir
dirSpec = new File(sk.iway.iwcm.Tools.getRealPath("/templates/"+installName));
templatesGroupDir = "";
//out.println("<br/>dir2="+dir+" dirSpec="+dirSpec+" exists="+dirSpec.exists()+" isDir="+dirSpec.isDirectory()+" templatesGroupDir="+templatesGroupDir);
if (dirSpec.exists() && dirSpec.isDirectory())
dir = dirSpec;
}
}
String domainAlias = MultiDomainFilter.getDomainAlias(CloudToolsForCore.getDomainName());
//installNameParam (from editor) owerwrites domainAlias
if (Tools.isEmpty(installNameParam) && Tools.isNotEmpty(domainAlias) && domainAlias.equals(installName)==false)
{
dirSpec = new File(sk.iway.iwcm.Tools.getRealPath("/templates/"+domainAlias));
//out.println("dir3="+dir+" dirSpec="+dirSpec+" templatesGroupDir="+templatesGroupDir);
if (dirSpec.exists() && dirSpec.isDirectory())
{
templatesGroupDir = domainAlias;
dir = dirSpec;
}
}
forwards.addAll(getTemplateForwards(dir, templatesGroupDir, searchTerm));
}
return forwards;
}
/**
* Ziska zoznam JSP suborov sablony
* @param dir - zakladny adresar z ktoreho sa citaju JSP
* @param baseDir - meno adresara pridaneho na zaciatok do vystupu (pretoze listujeme /templates/DOMAIN_ALIAS/ a DOMAIN_ALIAS chceme mat ako prefix v subore)
* @return
*/
private List<String> getTemplateForwards(File dir, String baseDir, String searchTerm)
{
List<String> forwards = new ArrayList<>();
File[] files = dir.listFiles();
if (files!=null)
{
int i;
for (i = 0; i < files.length; i++)
{
if (!files[i].isDirectory() && files[i].canRead())
{
// upravene pre zobrazenie sablon aj s koncovkou .html
if (files[i].getName().startsWith(".") || (files[i].getName().endsWith(".jsp")==false && files[i].getName().endsWith(".html")==false))
{
continue;
}
String fName;
if (Tools.isNotEmpty(baseDir)) fName = baseDir+"/"+files[i].getName();
else fName = files[i].getName();
forwards.add(fName);
}
}
//pridaj podadresare
for (i = 0; i < files.length; i++)
{
if (files[i].isDirectory() && files[i].canRead())
{
if ("includes".equals(files[i].getName())) continue;
if ("node_modules".equals(files[i].getName())) continue;
if ("pagebuilder".equals(files[i].getName())) continue;
String newBaseDir = baseDir;
if (Tools.isNotEmpty(baseDir)) newBaseDir = baseDir + "/" + files[i].getName();
else newBaseDir = files[i].getName();
forwards.addAll(getTemplateForwards(files[i], newBaseDir, searchTerm));
}
}
}
if(forwards != null && forwards.size() > 0)
{
Collections.sort(forwards, new Comparator<String>()
{
public int compare(String lvd1, String lvd2)
{
return lvd1.compareToIgnoreCase(lvd2);
}
}
);
}
if(forwards != null && forwards.size() > 0 && Tools.isNotEmpty(searchTerm) && searchTerm.equals("*")==false && searchTerm.equals("%")==false) {
forwards = forwards.stream()
.filter(lvb -> lvb!=null && lvb.toLowerCase().contains(searchTerm.toLowerCase()))
.collect(Collectors.toList());
}
return forwards;
}
public void mergeTemplate(long oldTemplateId, long mergeToTempId) {
//Replace template id in DOCUMENTS
docDetailsRepository.replaceTemplate(mergeToTempId, oldTemplateId);
//Replace template id in GROUPS
(new SimpleQuery()).execute("UPDATE groups SET temp_id=? WHERE temp_id=?", mergeToTempId, oldTemplateId);
//Delete OLD template
deleteTemplateDetails(oldTemplateId);
}
}