Skip to content

Commit 39defcb

Browse files
committed
add context type same throughout
Signed-off-by: Vivek Kumar Sahu <[email protected]>
1 parent 32cc408 commit 39defcb

23 files changed

+139
-128
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ require (
2727
)
2828

2929
require (
30-
github.com/fsnotify/fsnotify v1.8.0 // indirect
30+
github.com/fsnotify/fsnotify v1.8.0
3131
github.com/google/uuid v1.6.0
3232
github.com/hashicorp/hcl v1.0.0 // indirect
3333
github.com/inconshreveable/mousetrap v1.1.0 // indirect

pkg/adapter/factory.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ type Adapter interface {
4040
ParseAndValidateParams(cmd *cobra.Command) error
4141

4242
// Fetch SBOMs lazily using iterator
43-
FetchSBOMs(ctx *tcontext.TransferMetadata) (iterator.SBOMIterator, error)
43+
FetchSBOMs(ctx tcontext.TransferMetadata) (iterator.SBOMIterator, error)
4444

4545
// Outputs SBOMs (uploading)
46-
UploadSBOMs(ctx *tcontext.TransferMetadata, iterator iterator.SBOMIterator) error
46+
UploadSBOMs(ctx tcontext.TransferMetadata, iterator iterator.SBOMIterator) error
4747

4848
// Dry-Run: to be used to display fetched and uploaded SBOMs by input and output adapter respectively.
49-
DryRun(ctx *tcontext.TransferMetadata, iterator iterator.SBOMIterator) error
49+
DryRun(ctx tcontext.TransferMetadata, iterator iterator.SBOMIterator) error
5050
}
5151

5252
// NewAdapter initializes and returns the correct adapters (both input & output)
53-
func NewAdapter(ctx *tcontext.TransferMetadata, config types.Config) (map[types.AdapterRole]Adapter, string, string, error) {
53+
func NewAdapter(ctx tcontext.TransferMetadata, config types.Config) (map[types.AdapterRole]Adapter, string, string, error) {
5454
adapters := make(map[types.AdapterRole]Adapter)
5555
var inputAdp, outputAdp string
5656

pkg/engine/transfer.go

+16-16
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TransferRun(ctx context.Context, cmd *cobra.Command, config types.Config) e
4242
var inputAdapterInstance, outputAdapterInstance adapter.Adapter
4343
var err error
4444

45-
adapters, iAdp, oAdp, err := adapter.NewAdapter(transferCtx, config)
45+
adapters, iAdp, oAdp, err := adapter.NewAdapter(*transferCtx, config)
4646
if err != nil {
4747
return fmt.Errorf("failed to initialize adapters: %v", err)
4848
}
@@ -77,12 +77,12 @@ func TransferRun(ctx context.Context, cmd *cobra.Command, config types.Config) e
7777
// Fetch SBOMs lazily using the iterator
7878
if config.Daemon {
7979
if ma, ok := inputAdapterInstance.(monitor.MonitorAdapter); ok {
80-
sbomIterator, err = ma.Monitor(transferCtx)
80+
sbomIterator, err = ma.Monitor(*transferCtx)
8181
} else {
8282
return fmt.Errorf("input adapter %s does not support daemon mode", config.SourceAdapter)
8383
}
8484
} else {
85-
sbomIterator, err = inputAdapterInstance.FetchSBOMs(transferCtx)
85+
sbomIterator, err = inputAdapterInstance.FetchSBOMs(*transferCtx)
8686
if err != nil {
8787
return fmt.Errorf("failed to fetch SBOMs: %w", err)
8888
}
@@ -97,10 +97,10 @@ func TransferRun(ctx context.Context, cmd *cobra.Command, config types.Config) e
9797
}
9898

9999
var convertedIterator iterator.SBOMIterator
100-
convertedIterator = sbomProcessing(transferCtx, config, sbomIterator)
100+
convertedIterator = sbomProcessing(*transferCtx, config, sbomIterator)
101101

102102
// Process & Upload SBOMs Sequentially
103-
if err := outputAdapterInstance.UploadSBOMs(transferCtx, convertedIterator); err != nil {
103+
if err := outputAdapterInstance.UploadSBOMs(*transferCtx, convertedIterator); err != nil {
104104
return fmt.Errorf("failed to output SBOMs: %w", err)
105105
}
106106

@@ -112,7 +112,7 @@ func dryRun(ctx tcontext.TransferMetadata, sbomIterator iterator.SBOMIterator, i
112112
// Step 1: Store SBOMs in memory (avoid consuming iterator)
113113
var sboms []*iterator.SBOM
114114
for {
115-
sbom, err := sbomIterator.Next(ctx.Context)
115+
sbom, err := sbomIterator.Next(ctx)
116116
if err == io.EOF {
117117
break
118118
}
@@ -126,14 +126,14 @@ func dryRun(ctx tcontext.TransferMetadata, sbomIterator iterator.SBOMIterator, i
126126

127127
fmt.Println("-----------------🌐 INPUT ADAPTER DRY-RUN OUTPUT 🌐-----------------")
128128
// Step 2: Use stored SBOMs for input dry-run
129-
if err := input.DryRun(&ctx, iterator.NewMemoryIterator(sboms)); err != nil {
129+
if err := input.DryRun(ctx, iterator.NewMemoryIterator(sboms)); err != nil {
130130
return fmt.Errorf("failed to execute dry-run mode for input adapter: %v", err)
131131
}
132132
fmt.Println()
133133
fmt.Println("-----------------🌐 OUTPUT ADAPTER DRY-RUN OUTPUT 🌐-----------------")
134134

135135
// Step 3: Use the same stored SBOMs for output dry-run
136-
if err := output.DryRun(&ctx, iterator.NewMemoryIterator(sboms)); err != nil {
136+
if err := output.DryRun(ctx, iterator.NewMemoryIterator(sboms)); err != nil {
137137
return fmt.Errorf("failed to execute dry-run mode for output adapter: %v", err)
138138
}
139139

@@ -147,7 +147,7 @@ func sbomConversion(sbomIterator iterator.SBOMIterator, transferCtx tcontext.Tra
147147
var totalMinifiedSBOM int
148148
var totalSBOM int
149149
for {
150-
sbom, err := sbomIterator.Next(transferCtx.Context)
150+
sbom, err := sbomIterator.Next(transferCtx)
151151
if err == io.EOF {
152152
break
153153
}
@@ -184,20 +184,20 @@ func sbomConversion(sbomIterator iterator.SBOMIterator, transferCtx tcontext.Tra
184184
return convertedSBOMs
185185
}
186186

187-
func sbomProcessing(transferCtx *tcontext.TransferMetadata, config types.Config, sbomIterator iterator.SBOMIterator) iterator.SBOMIterator {
188-
logger.LogDebug(transferCtx.Context, "Checking adapter eligibility for undergoing conversion layer", "adapter type", config.DestinationAdapter)
187+
func sbomProcessing(ctx tcontext.TransferMetadata, config types.Config, sbomIterator iterator.SBOMIterator) iterator.SBOMIterator {
188+
logger.LogDebug(ctx.Context, "Checking adapter eligibility for undergoing conversion layer", "adapter type", config.DestinationAdapter)
189189

190190
// convert sbom to cdx for DTrack adapter only
191191
if types.AdapterType(config.DestinationAdapter) == types.DtrackAdapterType {
192-
logger.LogDebug(transferCtx.Context, "Adapter eligible for conversion layer", "adapter type", config.DestinationAdapter)
192+
logger.LogDebug(ctx.Context, "Adapter eligible for conversion layer", "adapter type", config.DestinationAdapter)
193193

194-
logger.LogDebug(transferCtx.Context, "SBOM conversion will take place")
195-
convertedSBOMs := sbomConversion(sbomIterator, *transferCtx)
194+
logger.LogDebug(ctx.Context, "SBOM conversion will take place")
195+
convertedSBOMs := sbomConversion(sbomIterator, ctx)
196196

197197
return iterator.NewMemoryIterator(convertedSBOMs)
198198
} else {
199-
logger.LogDebug(transferCtx.Context, "Adapter accept both SPDX and CDX SBOM, therefore doesn't require conversion layer", "adapter type", config.DestinationAdapter)
200-
logger.LogDebug(transferCtx.Context, "SBOM conversion will not take place")
199+
logger.LogDebug(ctx.Context, "Adapter accept both SPDX and CDX SBOM, therefore doesn't require conversion layer", "adapter type", config.DestinationAdapter)
200+
logger.LogDebug(ctx.Context, "SBOM conversion will not take place")
201201
return sbomIterator
202202
}
203203
}

pkg/iterator/iterator.go

+32-3
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
package iterator
1717

1818
import (
19-
"context"
2019
"io"
20+
21+
"github.com/interlynk-io/sbommv/pkg/converter"
22+
"github.com/interlynk-io/sbommv/pkg/logger"
23+
"github.com/interlynk-io/sbommv/pkg/tcontext"
2124
)
2225

2326
// SBOM represents a single SBOM file
@@ -31,7 +34,7 @@ type SBOM struct {
3134

3235
// SBOMIterator provides a way to lazily fetch SBOMs one by one
3336
type SBOMIterator interface {
34-
Next(ctx context.Context) (*SBOM, error) // Fetch the next SBOM
37+
Next(ctx tcontext.TransferMetadata) (*SBOM, error) // Fetch the next SBOM
3538
}
3639

3740
// MemoryIterator is an iterator that iterates over a preloaded slice of SBOMs.
@@ -49,7 +52,7 @@ func NewMemoryIterator(sboms []*SBOM) SBOMIterator {
4952
}
5053

5154
// Next retrieves the next SBOM in memory.
52-
func (it *MemoryIterator) Next(ctx context.Context) (*SBOM, error) {
55+
func (it *MemoryIterator) Next(ctx tcontext.TransferMetadata) (*SBOM, error) {
5356
if it.index >= len(it.sboms) {
5457
return nil, io.EOF // No more SBOMs left
5558
}
@@ -58,3 +61,29 @@ func (it *MemoryIterator) Next(ctx context.Context) (*SBOM, error) {
5861
it.index++
5962
return sbom, nil
6063
}
64+
65+
type ConvertedIterator struct {
66+
inner SBOMIterator
67+
targetFormat converter.FormatSpec
68+
}
69+
70+
func NewConvertedIterator(inner SBOMIterator, targetFormat converter.FormatSpec) *ConvertedIterator {
71+
return &ConvertedIterator{
72+
inner: inner,
73+
targetFormat: targetFormat,
74+
}
75+
}
76+
77+
func (ci *ConvertedIterator) Next(ctx tcontext.TransferMetadata) (*SBOM, error) {
78+
sbom, err := ci.inner.Next(ctx)
79+
if err != nil {
80+
return nil, err
81+
}
82+
convertedData, err := converter.ConvertSBOM(ctx, sbom.Data, ci.targetFormat)
83+
if err != nil {
84+
logger.LogInfo(ctx.Context, "Failed to convert SBOM", "file", sbom.Path, "error", err)
85+
return sbom, nil // Fallback to original on error
86+
}
87+
sbom.Data = convertedData
88+
return sbom, nil
89+
}

pkg/monitor/monitor.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ import (
2222
// MonitorAdapter only for input adapter
2323
type MonitorAdapter interface {
2424
// it watches sboms and triggers as soon as the new sbom comes
25-
Monitor(ctx *tcontext.TransferMetadata) (iterator.SBOMIterator, error)
25+
Monitor(ctx tcontext.TransferMetadata) (iterator.SBOMIterator, error)
2626
}

pkg/source/folder/adapter.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ func (f *FolderAdapter) ParseAndValidateParams(cmd *cobra.Command) error {
107107
}
108108

109109
// FetchSBOMs initializes the Folder SBOM iterator using the unified method
110-
func (f *FolderAdapter) FetchSBOMs(ctx *tcontext.TransferMetadata) (iterator.SBOMIterator, error) {
110+
func (f *FolderAdapter) FetchSBOMs(ctx tcontext.TransferMetadata) (iterator.SBOMIterator, error) {
111111
logger.LogDebug(ctx.Context, "Initializing SBOM fetching", "mode", f.Config.ProcessingMode)
112112
return f.Fetcher.Fetch(ctx, f.Config)
113113
}
114114

115-
func (f *FolderAdapter) Monitor(ctx *tcontext.TransferMetadata) (iterator.SBOMIterator, error) {
115+
func (f *FolderAdapter) Monitor(ctx tcontext.TransferMetadata) (iterator.SBOMIterator, error) {
116116
if !f.Config.Daemon {
117117
return nil, fmt.Errorf("daemon mode not enabled for folder adapter")
118118
}
@@ -122,12 +122,12 @@ func (f *FolderAdapter) Monitor(ctx *tcontext.TransferMetadata) (iterator.SBOMIt
122122
}
123123

124124
// OutputSBOMs should return an error since Folder does not support SBOM uploads
125-
func (f *FolderAdapter) UploadSBOMs(ctx *tcontext.TransferMetadata, iterator iterator.SBOMIterator) error {
125+
func (f *FolderAdapter) UploadSBOMs(ctx tcontext.TransferMetadata, iterator iterator.SBOMIterator) error {
126126
return fmt.Errorf("Folder adapter does not support SBOM uploading")
127127
}
128128

129129
// DryRun for Folder Adapter: Displays all fetched SBOMs from folder adapter
130-
func (f *FolderAdapter) DryRun(ctx *tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
130+
func (f *FolderAdapter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
131131
reporter := NewFolderReporter(false, "")
132-
return reporter.DryRun(ctx.Context, iter)
132+
return reporter.DryRun(ctx, iter)
133133
}

pkg/source/folder/fetcher.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
)
3232

3333
type SBOMFetcher interface {
34-
Fetch(ctx *tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error)
34+
Fetch(ctx tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error)
3535
}
3636

3737
type SequentialFetcher struct{}
@@ -40,7 +40,7 @@ type SequentialFetcher struct{}
4040
// 1. Walks through the folder file-by-file
4141
// 2. Detects valid SBOMs using source.IsSBOMFile().
4242
// 3. Reads the content & adds it to the iterator along with path.
43-
func (f *SequentialFetcher) Fetch(ctx *tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
43+
func (f *SequentialFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
4444
logger.LogDebug(ctx.Context, "Fetching SBOMs Sequentially")
4545

4646
var sbomList []*iterator.SBOM
@@ -89,7 +89,7 @@ type ParallelFetcher struct{}
8989
// Fetch scans the folder for SBOMs concurrently.
9090
// It walks through the directory to collect file paths, then spawns a fixed number of worker goroutines
9191
// to read and process those files concurrently.
92-
func (f *ParallelFetcher) Fetch(ctx *tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
92+
func (f *ParallelFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
9393
logger.LogDebug(ctx.Context, "Fetching SBOMs Parallely")
9494
filePaths := make(chan string, 100)
9595
var wg sync.WaitGroup

pkg/source/folder/iterator.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
package folder
1616

1717
import (
18-
"context"
1918
"fmt"
2019
"io"
2120

2221
"github.com/interlynk-io/sbommv/pkg/iterator"
22+
"github.com/interlynk-io/sbommv/pkg/tcontext"
2323
)
2424

2525
// FolderIterator iterates over SBOMs found in a folder
@@ -37,7 +37,7 @@ func NewFolderIterator(sboms []*iterator.SBOM) *FolderIterator {
3737
}
3838

3939
// Next retrieves the next SBOM in the iteration
40-
func (it *FolderIterator) Next(ctx context.Context) (*iterator.SBOM, error) {
40+
func (it *FolderIterator) Next(ctx tcontext.TransferMetadata) (*iterator.SBOM, error) {
4141
if it.index >= len(it.sboms) {
4242
return nil, io.EOF
4343
}
@@ -52,7 +52,7 @@ type WatcherIterator struct {
5252
sbomChan chan *iterator.SBOM
5353
}
5454

55-
func (it *WatcherIterator) Next(ctx context.Context) (*iterator.SBOM, error) {
55+
func (it *WatcherIterator) Next(ctx tcontext.TransferMetadata) (*iterator.SBOM, error) {
5656
select {
5757
case sbom, ok := <-it.sbomChan:
5858
if !ok {

pkg/source/folder/reporter.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616
package folder
1717

1818
import (
19-
"context"
2019
"fmt"
2120
"io"
2221

2322
"github.com/interlynk-io/sbommv/pkg/iterator"
2423
"github.com/interlynk-io/sbommv/pkg/logger"
2524
"github.com/interlynk-io/sbommv/pkg/sbom"
25+
"github.com/interlynk-io/sbommv/pkg/tcontext"
2626
)
2727

2828
type FolderReporter struct {
@@ -34,8 +34,8 @@ func NewFolderReporter(verbose bool, outputDir string) *FolderReporter {
3434
return &FolderReporter{verbose: verbose, outputDir: outputDir}
3535
}
3636

37-
func (r *FolderReporter) DryRun(ctx context.Context, iter iterator.SBOMIterator) error {
38-
logger.LogDebug(ctx, "Dry-run mode: Displaying SBOMs fetched from folder")
37+
func (r *FolderReporter) DryRun(ctx tcontext.TransferMetadata, iter iterator.SBOMIterator) error {
38+
logger.LogDebug(ctx.Context, "Dry-run mode: Displaying SBOMs fetched from folder")
3939
processor := sbom.NewSBOMProcessor(r.outputDir, r.verbose)
4040
sbomCount := 0
4141
fmt.Println("\n📦 Details of all Fetched SBOMs by Folder Input Adapter")
@@ -46,18 +46,18 @@ func (r *FolderReporter) DryRun(ctx context.Context, iter iterator.SBOMIterator)
4646
break
4747
}
4848
if err != nil {
49-
logger.LogError(ctx, err, "Error retrieving SBOM from iterator")
49+
logger.LogError(ctx.Context, err, "Error retrieving SBOM from iterator")
5050
return err
5151
}
5252
processor.Update(sbom.Data, "", sbom.Path)
5353
doc, err := processor.ProcessSBOMs()
5454
if err != nil {
55-
logger.LogError(ctx, err, "Failed to process SBOM")
55+
logger.LogError(ctx.Context, err, "Failed to process SBOM")
5656
return err
5757
}
5858
if r.outputDir != "" {
5959
if err := processor.WriteSBOM(doc, ""); err != nil {
60-
logger.LogError(ctx, err, "Failed to write SBOM")
60+
logger.LogError(ctx.Context, err, "Failed to write SBOM")
6161
return err
6262
}
6363
}

pkg/source/folder/watcher.go

+1-17
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func NewWatcherFetcher() *WatcherFetcher {
3535
return &WatcherFetcher{}
3636
}
3737

38-
func (f *WatcherFetcher) Fetch(ctx *tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
38+
func (f *WatcherFetcher) Fetch(ctx tcontext.TransferMetadata, config *FolderConfig) (iterator.SBOMIterator, error) {
3939
logger.LogDebug(ctx.Context, "Starting folder watcher", "path", config.FolderPath, "recurssive", config.ProcessingMode)
4040

4141
// Create new watcher.
@@ -122,19 +122,3 @@ func (f *WatcherFetcher) Fetch(ctx *tcontext.TransferMetadata, config *FolderCon
122122

123123
return &WatcherIterator{sbomChan: sbomChan}, nil
124124
}
125-
126-
// type WatcherIterator struct {
127-
// sbomChan chan *iterator.SBOM
128-
// }
129-
130-
// func (it *WatcherIterator) Next(ctx context.Context) (*iterator.SBOM, error) {
131-
// select {
132-
// case sbom, ok := <-it.sbomChan:
133-
// if !ok {
134-
// return nil, fmt.Errorf("watcher channel closed")
135-
// }
136-
// return sbom, nil
137-
// case <-ctx.Done():
138-
// return nil, ctx.Err()
139-
// }
140-
// }

0 commit comments

Comments
 (0)