package org.xmlsh.modules.datamapping; import java.util.HashMap; import java.util.Map; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.xmlsh.core.CoreException; import org.xmlsh.core.XClassLoader; import org.xmlsh.core.XValue; import org.xmlsh.sh.module.ModuleConfig; import org.xmlsh.sh.module.PackageModule; import org.xmlsh.util.JavaUtils; @org.xmlsh.annotations.Module(name="java") public class DataMappingModule extends PackageModule { protected static Logger mLogger = LogManager.getLogger(); @SuppressWarnings("serial") static Map<String,Class<?>> mClassAlias = new HashMap<String,Class<?>>(){ { add(java.lang.String.class,"string", "str","text" ); add( java.lang.Integer.class, "int","integer" ); add( java.lang.Double.class , "double","number"); } private void add( Class<?> cls , String... names){ for( String n : names) put( n , cls ); } }; public DataMappingModule(ModuleConfig config, XClassLoader loader) throws CoreException { super(config, loader); } static Class<?> newType(String name, Class<Object> baseClass, ClassLoader classLoader) { mLogger.entry(name,baseClass,classLoader); DynamicType.Builder<?> b = new ByteBuddy().subclass(baseClass).name(name); Class<?> cls = b.make() .load(classLoader, ClassLoadingStrategy.Default.INJECTION) .getLoaded(); return mLogger.exit(cls) ; } static Class<?> lookup(String name) { if( name.contains(".")) return null ; Class<?> cls = JavaUtils.fromPrimativeName(name); if( cls != null ) return cls ; // Standard synonms return DataMappingModule.mClassAlias.get( name.toLowerCase()); } static Class<?> resolveClass(String name, XValue xcls, ClassLoader classLoader) throws ClassNotFoundException, CoreException { Class<?> cls = null; if( xcls.isInstanceOf(Class.class)) cls = xcls.asInstanceOf(Class.class); if( cls == null ){ if( xcls.isString()) cls = lookup( xcls.toString()); if( cls == null ) cls = JavaUtils.convertToClass(xcls, classLoader); } if( cls == null ){ if( name == null ) name = xcls.toString(); cls = newType( name , Object.class , classLoader ); } return cls; } }