LayoutService.java
package sk.iway.iwcm.admin.layout;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import sk.iway.iwcm.*;
import sk.iway.iwcm.admin.AdminPropRestController;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.doc.GroupsDB;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.stripes.CSRF;
import sk.iway.iwcm.users.UsersDB;
/**
* LayoutService - sluzby pre zakladny layout WJ
* Primarne do modelu pre Thymeleaf nastavi potrebne data
*/
public class LayoutService
{
private HttpServletRequest request;
private Identity user;
LayoutBean layout;
public LayoutService(HttpServletRequest request) {
this.request = request;
user = UsersDB.getCurrentUser(request);
}
public LayoutBean getLayoutBean() {
if (layout == null && user != null) {
layout = new LayoutBean();
HeaderBean header = new HeaderBean();
layout.setHeader(header);
setGlobalData();
setHeaderData();
setMenuData();
}
return layout;
}
public LayoutService setGlobalData() {
String brand = InitServlet.getBrandSuffix();
//if (request.getParameter("brand")!=null) brand = request.getParameter("brand");
layout.setBrand(brand);
layout.setVersion(InitServlet.getActualVersionLong());
setUser();
String lng = Prop.getLngForJavascript(request);
layout.setLng(lng);
String lngWebjet = lng;
if ("cs".equals(lngWebjet)) lngWebjet = "cz";
layout.setLngWebjet(lngWebjet);
layout.setCsrfToken(CSRF.getCsrfToken(request.getSession(), true));
layout.setPropertiesLastModified(AdminPropRestController.getLastModified(layout.getLngWebjet()));
setNopermsCss();
return this;
}
public LayoutService setHeaderData() {
setDomainNameSelect();
return this;
}
public LayoutService setMenuData() {
MenuService menuService = new MenuService(request);
layout.setMenu(menuService.getMenu());
return this;
}
/************************* GLOBAL *************************/
private void setUser()
{
layout.setUser(user);
}
private void setNopermsCss() {
StringBuilder css = new StringBuilder();
StringBuilder javascript = new StringBuilder("var nopermsJavascript = new Array();\n");
if (user != null && user.getDisabledItemsTable() != null && user.isAdmin()) {
try {
Iterator<String> e = user.getDisabledItemsTable().keySet().iterator();
String name;
while (e.hasNext()) {
name = e.next();
name = Tools.replace(name, ".", "_");
css.append(".noperms-").append(name).append(" { display: none !important; }\n");
javascript.append("nopermsJavascript[\"").append(name).append("\"]=true;\n");
}
if ("B".equals(Constants.getString("wjVersion"))) {
css.append(".noperms-ver-bas { display: none !important; }\n");
javascript.append("nopermsJavascript[\"ver-bas\"]=true;\n");
} else if ("P".equals(Constants.getString("wjVersion"))) {
css.append(".noperms-ver-pro { display: none !important; }\n");
javascript.append("nopermsJavascript[\"ver-pro\"]=true;\n");
}
} catch (Exception ex) {
Logger.error(LayoutService.class, ex);
}
}
javascript.append("window.nopermsJavascript=nopermsJavascript;\n");
layout.setNopermsCss(css.toString());
layout.setNopermsJavascript(javascript.toString());
}
/************************* HEADER *************************/
/**
* Pripravi data pre select box vyberu aktualnej domeny
*/
private void setDomainNameSelect()
{
List<String> userDomains;
String currentDomain = CloudToolsForCore.getDomainName();
//tu pouzijeme multiDomainEnabled a nie enableStaticFilesExternalDir aby sa vyberove menu zobrazovalo aj v multidomain prostredi pre filtrovanie vo web strankach
if (InitServlet.isTypeCloud()==false && Constants.getBoolean("multiDomainEnabled"))
{
userDomains = GroupsDB.getInstance().getUserRootDomainNames(user.getEditableGroups());
}
else
{
userDomains = new ArrayList<>();
userDomains.add(currentDomain);
}
if (Constants.getBoolean("multiDomainEnabled") && userDomains.isEmpty()==false) {
//over, ze currentDomain je v zozname, ak nie, setni ako current prvu v zozname
boolean found = false;
for (String domainName : userDomains) {
if (domainName.equals(currentDomain)) {
found = true;
break;
}
}
if (found==false) {
String firstDomain = userDomains.get(0);
if (Tools.isNotEmpty(firstDomain)) {
//musime setnut domenu do session
request.getSession().setAttribute("preview.editorDomainName", firstDomain);
RequestBean rb = SetCharacterEncodingFilter.getCurrentRequestBean();
if (rb != null) {
rb.setDomain(firstDomain);
}
}
}
}
layout.getHeader().setDomains(userDomains);
layout.getHeader().setCurrentDomain(currentDomain);
}
/**
* Vrati zoznam dostupnych jazykov, prvy v poradi bude jazyk podla konf. premennej defaultLanguage
* @param addFirstEmpty - ak je true, prida na zaciatok prazdnu hodnotu
* @param translateValue - ak je true prelozi aj hodnotu (namiesto sk vypise Slovensky)
* @return
*/
public List<LabelValueDetails> getLanguages(boolean addFirstEmpty, boolean translateValue) {
return getLanguages(addFirstEmpty, translateValue, null);
}
/**
* Vrati zoznam dostupnych jazykov, prvy v poradi bude jazyk podla konf. premennej defaultLanguage
* @param addFirstEmpty - ak je true, prida na zaciatok prazdnu hodnotu
* @param translateValue - ak je true prelozi aj hodnotu (namiesto sk vypise Slovensky)
* @param appendTextKey - textovy kluc, ktoreho text sa prida za hodnotu (value)
* @return
*/
public List<LabelValueDetails> getLanguages(boolean addFirstEmpty, boolean translateValue, String appendTextKey) {
List<LabelValueDetails> languages = new ArrayList<>();
String[] lngArr = Constants.getArray("languages");
String defaultLang = Constants.getString("defaultLanguage");
Prop prop = Prop.getInstance(request);
String appendText = null;
if (Tools.isNotEmpty(appendTextKey)) appendText = prop.getText(appendTextKey);
for (String lng : lngArr) {
LabelValueDetails lvd = new LabelValueDetails(lng, lng);
if (translateValue) lvd.setLabel(prop.getText("language."+lng));
if (appendText != null) lvd.setLabel(lvd.getLabel()+" "+appendText);
if (lng.equals(defaultLang)) languages.add(0, lvd);
else languages.add(lvd);
}
if (addFirstEmpty) languages.add(0, new LabelValueDetails("", ""));
return languages;
}
/**
* Vrati Locale objekt pre prihlaseneho pouzivatela (alebo predvoleny jazyk)
* @param request
* @return
*/
public static Locale getUserLocale(HttpServletRequest request) {
String lng = Prop.getLng(request, false);
return getUserLocale(lng);
}
/**
* Vrati Locale objekt pre zadany jazyk, riesi aj problem cz/cs
* @param lng
* @return
*/
public static Locale getUserLocale(String lng) {
String[] isoLocale = Tools.getTokens(PageLng.getUserLngIso(lng), "-");
Locale loc;
if (isoLocale.length==2) {
loc = new Locale(isoLocale[0], isoLocale[1]);
} else {
loc = Locale.getDefault();
}
return loc;
}
}