aboutsummaryrefslogtreecommitdiff
path: root/rdfloader/parser2v2/parse_package.go
diff options
context:
space:
mode:
Diffstat (limited to 'rdfloader/parser2v2/parse_package.go')
-rw-r--r--rdfloader/parser2v2/parse_package.go20
1 files changed, 20 insertions, 0 deletions
diff --git a/rdfloader/parser2v2/parse_package.go b/rdfloader/parser2v2/parse_package.go
index 5be9631..dde6e70 100644
--- a/rdfloader/parser2v2/parse_package.go
+++ b/rdfloader/parser2v2/parse_package.go
@@ -12,6 +12,26 @@ import (
func (parser *rdfParser2_2) getPackageFromNode(packageNode *gordfParser.Node) (pkg *spdx.Package2_2, err error) {
pkg = &spdx.Package2_2{} // new package which will be returned
+ currState := parser.cache[packageNode.ID]
+ if currState == nil {
+ // there is no entry about the state of current package node.
+ // this is the first time we're seeing this node.
+ parser.cache[packageNode.ID] = &nodeState{
+ object: pkg,
+ Color: WHITE,
+ }
+ } else if currState.Color == GREY {
+ // we have already started parsing this package node and we needn't parse it again.
+ return currState.object.(*spdx.Package2_2), nil
+ }
+
+ // setting color of the state to grey to indicate that we've started to
+ // parse this node once.
+ parser.cache[packageNode.ID].Color = GREY
+
+ // setting state color to black to indicate when we're done parsing this node.
+ defer func(){parser.cache[packageNode.ID].Color = BLACK}();
+
// setting the SPDXIdentifier for the package.
eId, err := ExtractElementID(getLastPartOfURI(packageNode.ID))
if err != nil {