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.