AdminPropRestController.java
package sk.iway.iwcm.admin;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.i18n.IwayProperties;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.system.ConfDB;
/**
* 53128 - preklady pre admin cast (JS subory)
*/
@RestController
@PreAuthorize("@WebjetSecurityService.isAdmin()")
public class AdminPropRestController {
@RequestMapping(path={"/admin/rest/properties/{lng}/"})
public Map<String, String> getKeys(HttpServletRequest request, @PathVariable String lng, @RequestParam(required = false) Long since)
{
return getKeys(lng, null, since);
}
@RequestMapping(path={"/admin/rest/properties/{lng}/{prefix:.+}"})
public Map<String, String> getKeysWithPrefix(HttpServletRequest request, @PathVariable String lng, @PathVariable String prefix, @RequestParam(required = false) Long since)
{
return getKeys(lng, prefix, since);
}
@RequestMapping(path={"/admin/rest/properties/lastmodified/{lng}/"})
public long getLastModifiedResr(@PathVariable String lng)
{
return getLastModified(lng);
}
/**
* Vrati datum poslednej zmeny .properties suborov alebo kluca v databaze
* @param lng
* @return
*/
public static long getLastModified(String lng) {
long lastUpdate = 0;
if (isLngCorrect(lng)==false) return lastUpdate;
//ziskaj datum z DB
Date updateDateDB = (new SimpleQuery()).forDate("SELECT max(update_date) FROM "+ConfDB.PROPERTIES_TABLE_NAME+" WHERE lng=?", lng);
if (updateDateDB != null) lastUpdate = updateDateDB.getTime();
//over prekladove texty v properties suboroch
String lngSuffix = "";
if ("sk".equals(lng)==false) lngSuffix = "_"+lng;
lastUpdate = getLastModified("/WEB-INF/classes/text"+lngSuffix+".properties", lastUpdate);
lastUpdate = getLastModified("/WEB-INF/classes/text"+lngSuffix+"-webjet9.properties", lastUpdate);
lastUpdate = getLastModified("/WEB-INF/classes/text"+lngSuffix+"-"+Constants.getInstallName()+".properties", lastUpdate);
lastUpdate = getLastModified("/WEB-INF/classes/text"+lngSuffix+"-"+Constants.getLogInstallName()+".properties", lastUpdate);
Logger.debug(AdminPropRestController.class, "getLastUpdate="+Tools.formatDateTimeSeconds(lastUpdate));
return lastUpdate;
}
/**
* Vrati mapu prekladovych klucov so suffixom .js alebo definovanych v
* konf. premennej propertiesAdminKeys (kluce oddelene novym riadkom alebo ciarkou)
* ak zadany kluc konci na znak * vratia sa vsetky kluce
* @param lng
* @param prefix
* @param since
* @return
*/
private Map<String, String> getKeys(String lng, String prefix, Long since) {
Map<String, String> result = new HashMap<>();
if ("cs".equals(lng)) lng = "cz";
long lastModified = getLastModified(lng);
if (since != null && since.longValue() > 0) {
if (lastModified <= since.longValue()) return result;
}
result.put("lastmodified", String.valueOf(lastModified));
Prop prop = Prop.getInstance(lng);
//bezpecnost, lng moze mat max. 2-3 znaky
if (isLngCorrect(lng)==false) return result;
List<String> prefixes = new ArrayList<>();
if (Tools.isNotEmpty(prefix)) {
//prefix tiez moze byt tokenizovany
String[] keys = Tools.getTokens(prefix, ",", true);
for (String key : keys) {
prefixes.add(key);
}
}
//pridaj vsetky kluce podla constants premennej
String[] keys = Tools.getTokens(Constants.getString("propertiesAdminKeys"), ",\n", true);
for (String key : keys) {
if (key.endsWith("*") && key.length()>2) {
prefixes.add(key.substring(0, key.length()-1));
} else {
result.put(key, prop.getText(key));
}
}
IwayProperties properties = prop.getRes(lng);
IwayProperties skProperties = prop.getRes("sk");
if (properties.isEmpty()) properties = skProperties;
//pridaj vsetky konciace na .js alebo zacinajuce na prefix
for (String key : skProperties.keySet())
{
if (key.endsWith(".js")) {
result.put(key, getText(key, properties, skProperties));
} else {
for (String p : prefixes) {
if (key.startsWith(p)) result.put(key, getText(key, properties, skProperties));
}
}
}
return result;
}
private String getText(String key, IwayProperties properties, IwayProperties skProperties) {
String text = properties.get(key);
if (Tools.isEmpty(text)) text = skProperties.get(key);
return text;
}
/**
* Ziska datum poslednej zmeny suboru na zadanej URL, vrati len cislo vacsie ako currentLastModified
* @param url
* @param currentLastModified
* @return
*/
private static long getLastModified(String url, long currentLastModified) {
IwcmFile f = new IwcmFile(Tools.getRealPath(url));
if (f.exists()) {
Logger.debug(AdminPropRestController.class, "Last modified "+f.getAbsolutePath()+"="+Tools.formatDateTimeSeconds(f.lastModified()));
if (f.lastModified()>currentLastModified) return f.lastModified();
}
return currentLastModified;
}
/**
* Overi, ci zadany jazy vyhovuje pravidlam
* @param lng
* @return
*/
private static boolean isLngCorrect(String lng) {
if (lng == null || lng.length()<2 || lng.length()>3) return false;
return true;
}
}