Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    problem with custom skins in latest builds

    Hello, I wanted to ask what might have changed in version 13.1 after the 20250329 build (the last working one) in the March 31 and April 1 builds. Basically, my custom skins no longer load the load_skin.js file.

    The file is located at a path like:
    ./isomorphic/skins/1.1.9-13.1-p20250329/mySkin/load_skin.js?isc_version=13.1-p20250331.js

    I load them using the skinDir attribute of the loadISC tag. The generated path in the script tag is correct, but in the browser, the file appears empty (while in the deployment, I can see that it is not empty).

    Regular skins are loading normally.

    #2
    now I've verified that if I deploy the custom skins directly under isomorphic/skins without the "versioning" subfolder, then everything works. But why the above path stopped working after 20250329 build?

    Comment


      #3
      I just realized that I'm using the FileDownload servlet with this mapping:
      Code:
      <servlet-mapping>
              <servlet-name>FileDownload</servlet-name>
              <url-pattern>/isomorphic/skins/*</url-pattern>
          </servlet-mapping>
      so something must've changed there.

      Comment


        #4
        hi Claudio, thanks for the report.

        We're not immediately seeing an issue delivering load_skin content for custom skins, even with the skin-dir being inside a sub-dir of skins/, which is indeed the most likely cause of an issue here - we're still investigating and will get back to you.

        Can you confirm, is your custom skin from the Skin Editor? Did you "Export as a base skin" and, if not, what is the baseSkin?

        Comment


          #5
          Hello, yes it's from the skin editor, *not* exported as a base skin, the base skin is Shiva.

          Comment


            #6
            Hello, I’d like to add that I was hoping a possible workaround could be adding the subdirectory to the FileDownload servlet mappings:

            Code:
            <servlet-mapping>
                    <servlet-name>FileDownload</servlet-name>
                    <url-pattern>/isomorphic/skins/mysubdirectory/*</url-pattern>
                </servlet-mapping>
            but it actually doesn’t change anything.

            Comment


              #7
              hi Claudio - we'll get a fix in for this for tomorrow's builds.

              The existing code has always technically expected "custom" skins, from and for the Skin Editor, to be in a direct subdir of the skins/ dir, but not more deeply nested. Since it worked for you in earlier builds, we did try putting an export in a subdir with the same name as yours, and it worked as expected.

              However, there were indeed changes to this server code around your reported date, so we'll go over those changes and get it fixed for your use-case.
              Last edited by Isomorphic; 7 Apr 2025, 09:07.

              Comment


                #8
                hi Claudio - following up, unfortunately changes didn't make it into the build queue in time for today's builds.

                However, a change is now in. This does correct a situation where requests for files from skins in a subdir of skins/, like skins/mySkins/SkinOne, could try to return content from the wrong place and showed an error in the server log.

                Please delay re-testing until builds dated April 9 - if you still see issues, please let us know about any logs you see at the server.
                Last edited by Isomorphic; 8 Apr 2025, 03:12.

                Comment


                  #9
                  v13.1p_2025-04-09/Enterprise Deployment

                  Hello, now I got this error:

                  Code:
                  INFORMAZIONI: 2025-04-09T16:07:02,454 [ ] INFO DSRequest Executing isc_userSkin.fetch rows: 0->-1 with
                  criteria: {name:"1.1.9-13.1-p20250401.4"}
                  2025-04-09T16:07:02,466 [ ] DEBUG PoolableSQLConnectionFactory makeObject() created an unpooled Connection '1778331919'
                  2025-04-09T16:07:02,466 [ ] DEBUG SQLConnectionManager Borrowed connection '1778331919' from DBCP
                  2025-04-09T16:07:02,468 [ ] INFO DSRequest Executing isc_userSkin.fetch rows: 0->-1 with
                  criteria: {name:"1.1.9-13.1-p20250401.4"}
                  2025-04-09T16:07:02,468 [ ] DEBUG AppBase No userTypes defined, allowing anyone access to all operations for this application
                  2025-04-09T16:07:02,469 [ ] DEBUG AppBase No public zero-argument method named '_null' found, performing generic datasource operation
                  2025-04-09T16:07:02,474 [ ] DEBUG SQLOrderClause no data; returning empty string
                  2025-04-09T16:07:02,477 [ ] DEBUG SQL 1372: Executing SQL query on 'dbJas': SELECT isc_userSkin.pk, isc_userSkin.name, isc_userSkin.baseSkin, isc_userSkin.userSettings, isc_userSkin.skinStylesCSS, isc_userSkin.thumbnail, isc_userSkin.created_by, isc_userSkin.created_at, isc_userSkin.modified_by, isc_userSkin.modified_at, isc_userSkin.version FROM isc_userSkin WHERE (LOWER(isc_userSkin.name)='1.1.9-13.1-p20250401.4')
                  2025-04-09T16:07:02,592 [ ] DEBUG PoolableSQLConnectionFactory makeObject() created an unpooled Connection '31135143'
                  2025-04-09T16:07:02,592 [ ] DEBUG SQLConnectionManager Borrowed connection '31135143' from DBCP
                  2025-04-09T16:07:02,592 [ ] INFO SQL Executing SQL query on 'dbJas': SELECT isc_userSkin.pk, isc_userSkin.name, isc_userSkin.baseSkin, isc_userSkin.userSettings, isc_userSkin.skinStylesCSS, isc_userSkin.thumbnail, isc_userSkin.created_by, isc_userSkin.created_at, isc_userSkin.modified_by, isc_userSkin.modified_at, isc_userSkin.version FROM isc_userSkin WHERE (LOWER(isc_userSkin.name)='1.1.9-13.1-p20250401.4')
                  2025-04-09T16:07:02,605 [ ] INFO SQLDriver Execute of select: SELECT isc_userSkin.pk, isc_userSkin.name, isc_userSkin.baseSkin, isc_userSkin.userSettings, isc_userSkin.skinStylesCSS, isc_userSkin.thumbnail, isc_userSkin.created_by, isc_userSkin.created_at, isc_userSkin.modified_by, isc_userSkin.modified_at, isc_userSkin.version FROM isc_userSkin WHERE (LOWER(isc_userSkin.name)='1.1.9-13.1-p20250401.4') on db: dbJas threw exception: java.sql.SQLSyntaxErrorException: ORA-00942: tabella o vista inesistente
                   - assuming stale connection and retrying query.
                  2025-04-09T16:07:02,605 [ ] DEBUG SQLConnectionManager About to close PoolGuardConnectionWrapper with hashcode "31135143"
                  2025-04-09T16:07:02,617 [ ] DEBUG PoolableSQLConnectionFactory makeObject() created an unpooled Connection '305446370'
                  2025-04-09T16:07:02,642 [ ] DEBUG SQL_ERROR Failed to execute query: SELECT isc_userSkin.pk, isc_userSkin.name, isc_userSkin.baseSkin, isc_userSkin.userSettings, isc_userSkin.skinStylesCSS, isc_userSkin.thumbnail, isc_userSkin.created_by, isc_userSkin.created_at, isc_userSkin.modified_by, isc_userSkin.modified_at, isc_userSkin.version FROM isc_userSkin WHERE (LOWER(isc_userSkin.name)='1.1.9-13.1-p20250401.4'), SQL error: ORA-00942: tabella o vista inesistente
                  
                  2025-04-09T16:07:02,643 [ ] DEBUG SQLConnectionManager About to close PoolGuardConnectionWrapper with hashcode "305446370"
                  2025-04-09T16:07:02,646 [ ] DEBUG SQLConnectionManager About to close PoolGuardConnectionWrapper with hashcode "1778331919"
                  2025-04-09T16:07:02,650 [ ] ERROR Download Problem sending static file: /Users/bosticco/iscSDK/tools/visualBuilder/wsmvn/Jat/target/Jat/isomorphic/skins/1.1.9-13.1-p20250401.4/JLight_Pink/load_skin.js
                  javax.script.ScriptException: java.sql.SQLSyntaxErrorException: ORA-00942: tabella o vista inesistente
                  
                      at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-jsr223-3.0.13.jar:3.0.13]
                      at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:71) ~[groovy-jsr223-3.0.13.jar:3.0.13]
                      at DataSource isc_userSkin, operation: fetch, operationId: null.(Unknown Source) ~[?:?]
                      at com.isomorphic.scripting.ScriptXBase.evalScript(ScriptXBase.java:551) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.scripting.ScriptXBase.eval(ScriptXBase.java:76) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.rpc.Scripting.evalServerScript(Scripting.java:141) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.rpc.BuiltinRPC.evalServerScript(BuiltinRPC.java:763) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.datasource.DataSourceDMI.evalInlineScript(DataSourceDMI.java:1010) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.datasource.DataSourceDMI.evalInlineScript(DataSourceDMI.java:836) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:236) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.datasource.DataSourceDMI.execute(DataSourceDMI.java:64) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:4777) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.util.SkinUtil.getSkinConfigMap(SkinUtil.java:521) ~[isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.servlet.ServletTools.sendStaticFile(ServletTools.java:1620) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.servlet.ServletTools.sendStaticFile(ServletTools.java:1525) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.servlet.FileDownload.doGet(FileDownload.java:225) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [servlet-api.jar:?]
                      at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:178) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [servlet-api.jar:?]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at com.juve.spring.FrameOriginFilter.doFilter(FrameOriginFilter.java:36) [classes/:build 20250409133610]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at com.juve.utils.Log4j2SessionFilter.doFilter(Log4j2SessionFilter.java:72) [classes/:build 20250409133610]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at com.isomorphic.servlet.CompressionFilter._doFilter(CompressionFilter.java:263) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at com.isomorphic.servlet.BaseFilter.doFilter(BaseFilter.java:91) [isomorphic-core-rpc-13.1-p20250409.jar:?]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:209) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:185) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:8.5.23]
                      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [catalina.jar:8.5.23]
                      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [catalina.jar:8.5.23]
                      at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) [catalina.jar:8.5.23]
                      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [catalina.jar:8.5.23]
                      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [catalina.jar:8.5.23]
                      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-coyote.jar:8.5.23]
                      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:8.5.23]
                      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-coyote.jar:8.5.23]
                      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-coyote.jar:8.5.23]
                      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:8.5.23]
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_252]
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_252]
                      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.5.23]
                      at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
                  besides the fact that it is not using the correct skin name, but is using the subdirectory name, I don't understand why that query is being executed outside of the skin editor

                  Comment


                    #10
                    hi Claudio,

                    In terms of what's going on, user-skins can be used directly from the database outside of the Skin Editor, so the server-code that deals with user-skins isn't specific to the Skin Editor, and it currently expects user-skins to be directly in a sub-dir of skins, like skins/skinName. When the server receives a request for file-paths in the skins/ dir, if the isc_userSkin DS is available, it filters for a skin-name matching the first sub-dir in the path, hence it using your versioning-dir's name. In your case it looks like the DS is available but the table doesn't exist - adding the table or removing the DS should fix the error.

                    For the moment, you could also put your custom-skins directly in skins/, or move your versioning-dir outside of skins/, which will avoid the userSkin flow altogether (including the error you hit). If you move it outside of skins/ but at the same level, that will also address another issue you may have hit but not noticed, which is that the Shiva font is probably not being loaded due to a relative path in the CSS.

                    We'll look at better supporting skins nested inside the skins/ dir and address the relative-path issue.

                    Comment


                      #11
                      Hello, thanks for the clarification. Removing the isc_userSkin DataSource from the deployment solved the problem (and I don't need it in the application anyway).

                      So, if I understand correctly, it should be possible to load a custom skin from the database without including it in the deployment, right?

                      One last thing - sorry, but I think I’ve found a bug in the Skin Editor with version v13.1p_2025-04-09/Enterprise Development Only (the version from April 8 works fine). When trying to load a custom skin, I get the following error in the browser console:

                      Code:
                      *15:38:02.323:ERROR:FileLoader:CSS file https://localhost:8443/CustomSkins/isomorphic/skins/JLight_Pink/skin_styles_editor.css?isc_version=v13.1p_2025-04-09.css failed to load
                      Stack trace:
                      
                      
                          anonymous([object Event])
                              "isc.FileLoader.logError("CSS file "+_1+" failed to load");isc.FileLoader.fileLoaded(_2)"
                      ISC_Core.js:1478:85
                      And in the Tomcat logs:

                      Code:
                      INFORMAZIONI: === 2025-04-10 15:38:02,314 [ec-6] INFO RequestContext - URL: '/CustomSkins/isomorphic/skins/JLight_Pink/skin_styles_editor.css', User-Agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0': Moz (Gecko) with Accept-Encoding header
                      === 2025-04-10 15:38:02,316 [ec-6] INFO Download - File /Users/bosticco/iscSDK/tools/visualBuilder/wsmvn/CustomSkins/target/CustomSkins/isomorphic/skins/JLight_Pink/skin_styles_editor.css not found, sending 404
                      In the previous version, it would correctly fetch the skin record from isc_userSkin.

                      Comment


                        #12
                        It's possible to load a custom skin from the database if the DS is available, yes, without exporting it to disk - in other words, you can create a skin in the Skin Editor and then just use it in some other app - once you've saved in Skin Editor, your latest skin is available right away.

                        Note that this capability is enhanced by new features which allow you to enter customCSS and customJS directly in the Skin Editor, rather than exporting the skin and modifying files - this content is injected into the skin at runtime by the server - so you can customize load_skin JS, skin_styles CSS and SVG content directly in the Skin Editor, click Save and then change to another page that uses that skin, and your changes will be in effect right away.

                        Note that these features probably won't be exposed in 13.1, but they are actually present in that branch - drop a note to support if you want to try it out in 13.1.

                        We'll take a look at the most recent error you hit and let you know when we have a fix.

                        Comment


                          #13
                          hi Claudio - apologies for the delay in updating about this crash - it's been fixed now.

                          The crash itself should be fixed in yesterday's builds, April 14, and there have now also been a bunch of changes for fonts in exports, which will hit tomorrow's builds. Specifically, if you export from Skin Editor and look in your export's fonts/ dir, you'll see that skins have always been exported with whatever fonts the base-skin had, and not the ones your user-skin actually uses. This was obviously wrong, but it probably wasn't noticed generally, because user-skins typically load fonts from the central repo in helpers/fonts ([FONTS] in a src-string), via relative-paths. However, this means that your user-skin MUST be in your declared "skinsDir", or those font-files won't load.

                          We've made changes so that all fonts/font-variants used by a user-skin can be exported into the skin's fonts/ dir when exporting to disk. For base-skins, fonts go to disk. But for user-skins, this will shortly be controlled by a new advanced property in the Skin Editor, which will let you choose whether you want your exported skin to have resources locally - in the case of fonts, this will affect your export file-structure, and your export CSS, which will load from {skinName}/fonts if you choose that option - otherwise, fonts will not be exported to the custom-skin and will instead be loaded from helpers/fonts ([FONTS]), and that means your skin MUST live directly in your declared "skinsDir" (skins plural, not the skinDir you passed to loadISC).

                          Note that this area is a little tricky - as well as base-skins, and user-skins either on disk or in the DS, there is a new, single-file approach for skins in the latest branches - this is essentially a skin file-format, like a .project.xml or .screen.xml, and is how we'll deliver skins longer-term. This approach is not yet documented and won't be in 13.1.

                          Comment


                            #14
                            Hello, thanks for the fix! I still need to test the changes, but I just wanted to mention that I'm already loading the Roboto font from fonts.googleapis.com, like this:
                            - in the skin editor, I’m adding it to registeredFonts.json using the cssFileUrl attribute.
                            - In my application, I’m loading it with the following line:
                            Code:
                             <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap"/>
                            And it seems to work just fine. Is this approach officially supported?

                            Comment


                              #15
                              I've now tested the export with v13.1p_2025-04-15/Enterprise Development Only, and I noticed that a "Roboto" folder is created inside the fonts directory, containing two files:Roboto-Light-Vivid.ttf
                              Roboto-Light-Vivid.woff2

                              I don't think this is intended.

                              Comment

                              Working...
                              X