package platformSpecific.fakeInternet; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; import platformSpecific.javaTranslation.Resources; import facade.Configuration; import facade.L42; import facade.Parser; import sugarVisitors.Desugar; import sugarVisitors.InjectionOnCore; import tools.Assertions; import tools.Map; import ast.Ast; import ast.ErrorMessage; import ast.ExpCore; import ast.Expression; import ast.Ast.Doc; import ast.Ast.MethodSelector; import ast.Ast.NormType; import ast.Ast.SignalKind; import ast.Ast.Stage; import ast.ExpCore.ClassB; import ast.ExpCore.Using; import auxiliaryGrammar.EncodingHelper; import programReduction.Program; import auxiliaryGrammar.WellFormedness; public interface OnLineCode { public Expression.ClassB code(); public static Expression.ClassB getCode(String url){ assert url.startsWith("reuse"); url=url.substring("reuse".length()); url=url.trim(); if(url.startsWith("L42.is/")){return OnLineCodeHelper.getL42Code(url.substring("L42.is/".length()));} throw Assertions.codeNotReachable(); } static PluginWithPart _isPluginWithPart(Doc doc){ String url=doc._getParameterForPlugin(); String part=doc._getParameterForPluginPart(); if (url==null || part==null){return null;} url=url.trim(); part=part.trim(); return new PluginWithPart(url,part); } static PluginType _isWellKnownPlugin(Doc doc){ String url=doc._getParameterForPlugin(); if (url==null){return null;} url=url.trim(); if(url.startsWith("L42.is/connected/")){ PluginType plugin= OnLineCodeHelper.getWellKnownPluginType(url.substring("L42.is/connected/".length())); return plugin; } return null; } public static PluginType plugin(Program p,ExpCore.Using u){ Doc d=p.extractClassB(u.getPath()).getDoc1(); PluginType pt =_isPluginWithPart(d); if(pt!=null){return pt;} pt = _isWellKnownPlugin(d); if(pt!=null){return pt;} throw Assertions.codeNotReachable("Other plugings not supported yet"); } public static ExpCore pluginAction(Program p,ExpCore.Using u){ try{ Object o= plugin(p,u).execute(p,u); return EncodingHelper.wrapResource(o); } catch(Resources.Error err){return EncodingHelper.wrapResource(err);} } public static List<NormType> pluginType(Program p,ExpCore.Using u){ return plugin(p,u).typeOf(p,u); } //Unuseful variant, since program not availabe at desugaring time public static List<NormType> pluginType(Program p,Expression.Using u){ MethodSelector ms = MethodSelector.of(u.getName(),u.getPs().getXs()); ExpCore.Using uCore=new ExpCore.Using(u.getPath(),ms,Doc.empty(),Collections.emptyList(),new ExpCore._void()); return plugin(p,uCore).typeOf(p,uCore); } } class OnLineCodeHelper{ static PluginType getWellKnownPluginType(String url){ String className="is.L42.connected."+url+".Plugin"; try { Class<?> clazz=Class.forName(className); return (PluginType)clazz.newInstance(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { throw new ErrorMessage.InvalidURL("L42.is/connected/"+url,null); } //is.L42.connected.withSystem.Plugin; /*if(url.startsWith("withSandboxingOver/")){ return new?? withSandboxingOver.Plugin(getPluginType(url.substring("withSandboxingOver/".length()))); } switch (url){//TODO: NO NONO case "withAlu": return new Plugin(); case "withHtml": return new Plugin(); case "withIntrospection": return new Plugin(); default: throw new ErrorMessage.InvalidURL("L42.is/connected/"+url); }*/ } static Expression.ClassB getL42Code(String url){ try{ Expression data=load(url);//can be classB or classBReuse data=Desugar.of(data);//TODO: can be removed later, but now allows librares to be real source code // Configuration.reduction.of((ClassB) data.accept(new InjectionOnCore())); return (Expression.ClassB)data; } catch( org.antlr.v4.runtime.misc.ParseCancellationException pce){ System.err.println("Url is: "+url); throw pce; } } private static Expression load(String name) { //URL res = OnLineCode.class.getResource(name+".L42"); //Path res = L42.path.resolve(name+".L42"); Path res = Paths.get("localhost",name+".L42"); assert res!=null:name; String s= L42.pathToString(res); Expression e=Parser.parse(res.toString(),s); assert WellFormedness.checkAll(e); return e; } }