Unable to build component browser resources set

Hey everyone,

We are developing our first SCADA system using Ignition Perspective (running Linux Gateway) and have ran into an odd issue. We recently updated the folder structure of our views, and after a restart of the Gateway a large number of folders are missing.

My best theory is that it is a result of duplicate names, but I do not know how to confirm or resolve that.

  • The missing folders all followed a similar structure of this example, where the bolded text is a view name and the rest are folders.
  • Ex: BMS/Pages/BMSOverview/BMSOverview

The following error is logged in the Gateway logs for all similarly structured portions of the project

  • Unable to build component browser resources set for ViewConfig 'BMS/Pages/BMSOverview'

  • Full logged error text:

    java.lang.NullPointerException: Cannot read field "children" because "component" is null
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig.collectAllChildren(ProjectConfig.java:212)
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig.buildComponentResourceSet(ProjectConfig.java:182)
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig.lambda$new$0(ProjectConfig.java:147)
    
    at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:181)
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig.getComponentResources(ProjectConfig.java:281)
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig$RuntimeGsonAdapter.serialize(ProjectConfig.java:316)
    
    at com.inductiveautomation.perspective.gateway.config.ProjectConfig$RuntimeGsonAdapter.serialize(ProjectConfig.java:289)
    
    at com.inductiveautomation.ignition.common.gson.internal.bind.TreeTypeAdapter.write(TreeTypeAdapter.java:88)
    
    at com.inductiveautomation.ignition.common.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:70)
    
    at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:196)
    
    at com.inductiveautomation.ignition.common.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:368)
    
    at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:842)
    
    at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:812)
    
    at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:759)
    
    at com.inductiveautomation.ignition.common.gson.Gson.toJson(Gson.java:736)
    
    at com.inductiveautomation.perspective.gateway.comm.Routes.getProject(Routes.java:1953)
    
    at com.inductiveautomation.perspective.gateway.comm.Routes$AuthenticatedRouteHandlerWrapper.handle(Routes.java:1792)
    
    at com.inductiveautomation.ignition.gateway.dataroutes.Route.service(Route.java:355)
    
    at com.inductiveautomation.ignition.gateway.dataroutes.RouteGroupImpl.service(RouteGroupImpl.java:117)
    
    at com.inductiveautomation.ignition.gateway.dataroutes.RouteGroupCollectionServlet.serviceInternal(RouteGroupCollectionServlet.java:151)
    
    at com.inductiveautomation.ignition.gateway.dataroutes.AbstractRouteGroupServlet.service(AbstractRouteGroupServlet.java:40)
    
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
    
    at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1387)
    
    at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:753)
    
    at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1624)
    
    at com.inductiveautomation.catapult.filters.GatewayFilter.doFilter(GatewayFilter.java:119)
    
    at jakarta.servlet.http.HttpFilter.doFilter(HttpFilter.java:97)
    
    at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:205)
    
    at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1596)
    
    at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1557)
    
    at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:828)
    
    at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:438)
    
    at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:470)
    
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
    
    at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:717)
    
    at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1102)
    
    at org.eclipse.jetty.rewrite.handler.RewriteHandler$LastRuleHandler.handle(RewriteHandler.java:159)
    
    at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
    
    at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
    
    at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
    
    at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
    
    at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
    
    at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
    
    at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
    
    at org.eclipse.jetty.rewrite.handler.HeaderPatternRule$1.handle(HeaderPatternRule.java:89)
    
    at org.eclipse.jetty.rewrite.handler.Rule$Handler.handle(Rule.java:108)
    
    at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:143)
    
    at org.eclipse.jetty.server.Handler$Sequence.handle(Handler.java:805)
    
    at org.eclipse.jetty.server.Handler$Sequence.handle(Handler.java:805)
    
    at org.eclipse.jetty.server.Server.handle(Server.java:182)
    
    at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:721)
    
    at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416)
    
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:323)
    
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    
    at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
    
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492)
    
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428)
    
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401)
    
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255)
    
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204)
    
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
    
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:981)
    
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1212)
    
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1166)
    
    at java.base/java.lang.Thread.run(Unknown Source)
    

Can anyone help provide a path forward or point of investigation? We would like to avoid recreating these pages from scratch, as a large amount of work has gone into them.