/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.nbstudio.core.cls;
import com.intersys.cache.CacheObject;
import com.intersys.classes.CacheRootObject;
import com.intersys.classes.Dictionary.ClassDefinition;
import com.intersys.classes.Dictionary.ParameterDefinition;
import com.intersys.classes.Dictionary.PropertyDefinition;
import com.intersys.objects.CacheException;
import com.intersys.objects.Database;
import com.intersys.objects.Id;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Pattern;
import org.nbstudio.syntax.cls.clsParser;
/**
*
* @author daimor
*/
public class CLSUtils {
private static final ArrayList<String> propertiesExcludeList = new ArrayList<String>() {
{
add("Name");
add("Description");
add("SequenceNumber");
add("Parameters");
addList("%Dictionary.PropertyDefinition", new String[]{"Aliases", "Identity", "OnDelete", "Relationship", "Collection"});
addList("%Dictionary.ParameterDefinition", new String[]{"Default", "Expression"});
addList("%Dictionary.MethodDefinition", new String[]{"ClassMethod", "ClientMethod", "ReturnType", "FormalSpec", "Implementation", "Hash"});
addList("%Dictionary.XDataDefinition", new String[]{"Data"});
addList("%Dictionary.QueryDefinition", new String[]{"SqlQuery", "FormalSpec"});
addList("%Dictionary.TriggerDefinition", new String[]{"Code"});
addList("%Dictionary.IndexDefinition", new String[]{"Properties"});
addList("%Dictionary.ForeignKeyDefinition", new String[]{"Properties", "ReferencedClass", "ReferencedKey"});
addList("%Dictionary.ProjectionDefinition", new String[]{"Type"});
}
public void addList(String clsName, String[] excludeList) {
for (String string : excludeList) {
add(clsName + "||" + string);
}
}
};
private static CacheObject getmInternal(CacheRootObject obj) {
CacheObject mInternal = null;
try {
Field privateStringField = CacheRootObject.class.getDeclaredField("mInternal");
privateStringField.setAccessible(true);
mInternal = (CacheObject) privateStringField.get(obj);
} catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException | SecurityException ignoredException) {
}
return mInternal;
}
public static void setParameters(CacheRootObject obj, List<clsParser.ParameterContext> parametersList) {
try {
HashMap<String, String> params = CLSUtils.getParameters(obj);
params.clear();
if (parametersList == null) {
return;
}
for (clsParser.ParameterContext parameterContext : parametersList) {
String paramName = parameterContext.paramName.getText();
String paramVal = parameterContext.paramVal.getText();
paramVal = paramVal.replaceAll("\"\"", "\"");
paramVal = Pattern.compile("^\"(.*)\"$").matcher(paramVal).replaceAll("$1");
params.put(paramName, paramVal);
}
} catch (CacheException ignoredException) {
}
}
public static HashMap<String, String> getParameters(CacheRootObject obj) throws com.intersys.objects.CacheException {
// CacheObject mInternal = getmInternal(obj);
// com.intersys.cache.Dataholder dh = mInternal.getProperty("Parameters", true);
// com.intersys.cache.CacheObject cobj = dh.getCacheObject();
// if (cobj == null) {
// return null;
// }
// return (HashMap<String, String>) (cobj.newJavaInstance());
HashMap<String, String> result = new java.util.HashMap<>();
try {
Database db = obj.getDatabase();
String className = obj._className(true);
ClassDefinition objDef = (ClassDefinition) ClassDefinition.open(db, new Id(className), 0);
List<ParameterDefinition> objParams = objDef.getParameters().asList();
for (ParameterDefinition param : objParams) {
String paramName = param.getName();
String paramDef = param.getDefault();
result.put(paramName, paramDef);
}
} catch (CacheException ex) {
}
return result;
}
public static void setProperty(CacheRootObject obj, String propName, boolean value) {
try {
CacheObject mInternal = getmInternal(obj);
com.intersys.cache.Dataholder dh = new com.intersys.cache.Dataholder(value);
mInternal.setProperty(propName, dh);
} catch (CacheException ignoredException) {
}
}
public static void setProperty(CacheRootObject obj, String propName, String value) {
try {
CacheObject mInternal = getmInternal(obj);
value = value.replaceAll("^\"(.*)\"$", "$1");
value = ((value == null) || (value.isEmpty())) ? null : value;
com.intersys.cache.Dataholder dh = new com.intersys.cache.Dataholder(value);
mInternal.setProperty(propName, dh);
} catch (CacheException ignoredException) {
}
}
public static String getProperty(CacheRootObject obj, String propName, String defaultValue) {
try {
CacheObject mInternal = getmInternal(obj);
com.intersys.cache.Dataholder dh = mInternal.getProperty(propName, false);
return dh.getString();
} catch (CacheException ignoredException) {
return defaultValue;
}
}
public static Boolean getProperty(CacheRootObject obj, String propName, Boolean defaultValue) {
try {
CacheObject mInternal = getmInternal(obj);
com.intersys.cache.Dataholder dh = mInternal.getProperty(propName, false);
return dh.getBoolean();
} catch (CacheException ignoredException) {
return defaultValue;
}
}
public static HashMap<String, Object> getProperties(CacheRootObject obj) {
HashMap<String, Object> result = new java.util.HashMap<>();
try {
Database db = obj.getDatabase();
String className = obj._className(true);
ClassDefinition objDef = (ClassDefinition) ClassDefinition.open(db, new Id(className), 0);
List<PropertyDefinition> objProps = objDef.getProperties().asList();
for (PropertyDefinition prop : objProps) {
String propName = prop.getName();
String propType = prop.getType();
String defaultValue = prop.getInitialExpression();
if ((propName.startsWith("%"))
|| propertiesExcludeList.contains(propName)
|| propertiesExcludeList.contains(className + "||" + propName)
|| (("InitialExpression".equals(propName)) && (obj instanceof PropertyDefinition) && (((PropertyDefinition) obj).getInitialExpression().equals("\"\"")))
|| (!propType.matches("(%(Library.)?CacheString)|(%(Library.)?Boolean)"))) {
continue;
}
defaultValue = defaultValue.replaceAll("^\"(.*)\"$", "$1");
defaultValue = defaultValue.replaceAll("\"\"", "\"");
if (propType.matches("%(Library.)?CacheString")) {
result.put(propName, defaultValue);
} else if (propType.matches("%(Library.)?Boolean")) {
result.put(propName, ("1".equals(defaultValue)));
}
}
} catch (CacheException ex) {
}
return result;
}
}