Skip to content

Commit

Permalink
Cache InstanceDeclarationHierarchy instances in NodeFactory
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinherron committed Dec 2, 2019
1 parent eecf88b commit 7550610
Showing 1 changed file with 41 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.eclipse.milo.opcua.sdk.core.Reference;
import org.eclipse.milo.opcua.sdk.server.ObjectTypeManager;
import org.eclipse.milo.opcua.sdk.server.VariableTypeManager;
Expand All @@ -36,9 +40,24 @@
import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId;
import org.eclipse.milo.opcua.stack.core.types.builtin.NodeId;
import org.eclipse.milo.opcua.stack.core.util.Tree;
import org.slf4j.LoggerFactory;

public class NodeFactory {

private static final Cache<NodeId, InstanceDeclarationHierarchy> IDH_CACHE = CacheBuilder.newBuilder()
.maximumSize(1024)
.expireAfterAccess(1, TimeUnit.HOURS)
.build();

/**
* Invalidate the cached {@link InstanceDeclarationHierarchy} for {@code typeDefinitionId}.
*
* @param typeDefinitionId the {@link NodeId} type definition to invalidate.
*/
public static void invalidateCachedIdh(NodeId typeDefinitionId) {
IDH_CACHE.invalidate(typeDefinitionId);
}

private final UaNodeContext context;
private final ObjectTypeManager objectTypeManager;
private final VariableTypeManager variableTypeManager;
Expand Down Expand Up @@ -107,12 +126,28 @@ public Tree<UaNode> createNodeTree(

NamespaceTable namespaceTable = context.getServer().getNamespaceTable();

InstanceDeclarationHierarchy idh = InstanceDeclarationHierarchy.create(
addressSpaceManager,
namespaceTable,
typeDefinitionId,
includeOptionalNodes
);
InstanceDeclarationHierarchy idh;

try {
idh = IDH_CACHE.get(
typeDefinitionId,
() -> {
LoggerFactory.getLogger(getClass()).info(
"InstanceDeclarationHierarchy cache " +
"miss for typeDefinitionId={}", typeDefinitionId
);

return InstanceDeclarationHierarchy.create(
addressSpaceManager,
namespaceTable,
typeDefinitionId,
includeOptionalNodes
);
}
);
} catch (ExecutionException e) {
throw new UaException(StatusCodes.Bad_InternalError, e);
}

NodeTable nodeTable = idh.getNodeTable();
ReferenceTable referenceTable = idh.getReferenceTable();
Expand Down

0 comments on commit 7550610

Please sign in to comment.