privateTransletgetTransletInstance()throwsTransformerConfigurationException{try{if(_name==null)returnnull;if(_class==null)defineTransletClasses();// The translet needs to keep a reference to all its auxiliary // class to prevent the GC from collecting them AbstractTranslet translet = (AbstractTranslet) _class[_transletIndex].getConstructor().newInstance();translet.postInitialization();translet.setTemplates(this);translet.setOverrideDefaultParser(_overrideDefaultParser);translet.setAllowedProtocols(_accessExternalStylesheet);if(_auxClasses!=null){translet.setAuxiliaryClasses(_auxClasses);}returntranslet;}catch(InstantiationException|IllegalAccessException|NoSuchMethodException|InvocationTargetExceptione){ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_OBJECT_ERR,_name);thrownewTransformerConfigurationException(err.toString(),e);}}
privatevoiddefineTransletClasses()throwsTransformerConfigurationException{if(_bytecodes==null){ErrorMsgerr=newErrorMsg(ErrorMsg.NO_TRANSLET_CLASS_ERR);thrownewTransformerConfigurationException(err.toString());}TransletClassLoaderloader=AccessController.doPrivileged(newPrivilegedAction<TransletClassLoader>(){publicTransletClassLoaderrun(){returnnewTransletClassLoader(ObjectFactory.findClassLoader(),_tfactory.getExternalExtensionsMap());}});try{finalintclassCount=_bytecodes.length;_class=newClass<?>[classCount];if(classCount>1){_auxClasses=newHashMap<>();}// create a module for the translet Stringmn="jdk.translet";Stringpn=_tfactory.getPackageName();assertpn!=null&&pn.length()>0;ModuleDescriptordescriptor=ModuleDescriptor.newModule(mn,Set.of(ModuleDescriptor.Modifier.SYNTHETIC)).requires("java.xml").exports(pn,Set.of("java.xml")).build();Modulem=createModule(descriptor,loader);// the module needs access to runtime classes ModulethisModule=TemplatesImpl.class.getModule();// the module also needs permission to access each package // that is exported to it PermissionCollection perms = newRuntimePermission("*").newPermissionCollection();Arrays.asList(Constants.PKGS_USED_BY_TRANSLET_CLASSES).forEach(p->{thisModule.addExports(p,m);perms.add(newRuntimePermission("accessClassInPackage."+p));});CodeSourcecodeSource=newCodeSource(null,(CodeSigner[])null);ProtectionDomainpd=newProtectionDomain(codeSource,perms,loader,null);// java.xml needs to instantiate the translet class thisModule.addReads(m);for(inti=0;i<classCount;i++){_class[i]=loader.defineClass(_bytecodes[i],pd);finalClass<?>superClass=_class[i].getSuperclass();// Check if this is the main class if(superClass.getName().equals(ABSTRACT_TRANSLET)){_transletIndex=i;}else{_auxClasses.put(_class[i].getName(),_class[i]);}}if(_transletIndex<0){ErrorMsgerr=newErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR,_name);thrownewTransformerConfigurationException(err.toString());}}catch(ClassFormatErrore){ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_CLASS_ERR,_name);thrownewTransformerConfigurationException(err.toString(),e);}catch(LinkageErrore){ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_OBJECT_ERR,_name);thrownewTransformerConfigurationException(err.toString(),e);}}