Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(bdio): Added bdio model object and helper classes from integrati…
…on-bdio. (Progresses IDETECT-1763)
- Loading branch information
1 parent
84fe96d
commit 56f8596
Showing
27 changed files
with
2,078 additions
and
0 deletions.
There are no files selected for viewing
127 changes: 127 additions & 0 deletions
127
.../main/java/com/synopsys/integration/detectable/detectable/dependency/BdioNodeFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/** | ||
* integration-bdio | ||
* | ||
* Copyright (c) 2019 Synopsys, Inc. | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package com.synopsys.integration.detectable.detectable.dependency; | ||
|
||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.nio.charset.StandardCharsets; | ||
import java.time.Instant; | ||
import java.time.ZoneOffset; | ||
import java.time.format.DateTimeFormatter; | ||
import java.util.UUID; | ||
|
||
import org.apache.commons.io.IOUtils; | ||
import org.apache.commons.lang3.StringUtils; | ||
|
||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioBillOfMaterials; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioComponent; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioCreationInfo; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioExternalIdentifier; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioId; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioProject; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.SpdxCreator; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.externalid.ExternalId; | ||
|
||
public class BdioNodeFactory { | ||
public static final String UNKNOWN_LIBRARY_VERSION = "UnknownVersion"; | ||
|
||
private static final String VERSION_RESOURCE_PATH = "com/synopsys/integration/bdio/version.txt"; | ||
|
||
private final BdioPropertyHelper bdioPropertyHelper; | ||
|
||
public BdioNodeFactory(final BdioPropertyHelper bdioPropertyHelper) { | ||
this.bdioPropertyHelper = bdioPropertyHelper; | ||
} | ||
|
||
public BdioBillOfMaterials createBillOfMaterials(final String projectName, final String projectVersion) { | ||
final String codeLocationName = String.format("%s/%s Black Duck I/O Export", projectName, projectVersion); | ||
|
||
return createBillOfMaterials(codeLocationName, projectName, projectVersion); | ||
} | ||
|
||
public BdioBillOfMaterials createBillOfMaterials(final String codeLocationName, final String projectName, final String projectVersion) { | ||
final BdioBillOfMaterials billOfMaterials = new BdioBillOfMaterials(); | ||
billOfMaterials.id = BdioId.createFromUUID(UUID.randomUUID().toString()); | ||
if (StringUtils.isNotBlank(codeLocationName)) { | ||
billOfMaterials.spdxName = codeLocationName; | ||
} else { | ||
billOfMaterials.spdxName = String.format("%s/%s Black Duck I/O Export", projectName, projectVersion); | ||
} | ||
billOfMaterials.bdioSpecificationVersion = "1.1.0"; | ||
|
||
billOfMaterials.creationInfo = new BdioCreationInfo(); | ||
billOfMaterials.creationInfo.created = Instant.now().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT); | ||
String version = BdioNodeFactory.UNKNOWN_LIBRARY_VERSION; | ||
try (final InputStream inputStream = getClass().getClassLoader().getResourceAsStream(BdioNodeFactory.VERSION_RESOURCE_PATH)) { | ||
if (inputStream != null) { | ||
version = IOUtils.toString(inputStream, StandardCharsets.UTF_8); | ||
} | ||
} catch (final IOException ignored) { | ||
// Library version is not critical to BdioBillOfMaterials creation. | ||
} | ||
billOfMaterials.creationInfo.addSpdxCreator(SpdxCreator.createToolSpdxCreator("IntegrationBdio", version)); | ||
|
||
return billOfMaterials; | ||
} | ||
|
||
public BdioProject createProject(final String projectName, final String projectVersion, final BdioId bdioId, final ExternalId externalId) { | ||
final BdioExternalIdentifier externalIdentifier = bdioPropertyHelper.createExternalIdentifier(externalId); | ||
return createProject(projectName, projectVersion, bdioId, externalIdentifier); | ||
} | ||
|
||
public BdioProject createProject(final String projectName, final String projectVersion, final BdioId bdioId, final BdioExternalIdentifier externalIdentifier) { | ||
final BdioProject project = createProject(projectName, projectVersion, bdioId); | ||
project.bdioExternalIdentifier = externalIdentifier; | ||
|
||
return project; | ||
} | ||
|
||
public BdioProject createProject(final String projectName, final String projectVersion) { | ||
return createProject(projectName, projectVersion, BdioId.createFromPieces(projectName, projectVersion)); | ||
} | ||
|
||
public BdioProject createProject(final String projectName, final String projectVersion, final BdioId bdioId) { | ||
final BdioProject project = new BdioProject(); | ||
project.id = bdioId; | ||
project.name = projectName; | ||
project.version = projectVersion; | ||
|
||
return project; | ||
} | ||
|
||
public BdioComponent createComponent(final String componentName, final String componentVersion, final ExternalId externalId) { | ||
final BdioExternalIdentifier externalIdentifier = bdioPropertyHelper.createExternalIdentifier(externalId); | ||
return createComponent(componentName, componentVersion, externalId.createBdioId(), externalIdentifier); | ||
} | ||
|
||
public BdioComponent createComponent(final String componentName, final String componentVersion, final BdioId bdioId, final BdioExternalIdentifier externalIdentifier) { | ||
final BdioComponent component = new BdioComponent(); | ||
component.id = bdioId; | ||
component.name = componentName; | ||
component.version = componentVersion; | ||
component.bdioExternalIdentifier = externalIdentifier; | ||
|
||
return component; | ||
} | ||
|
||
} |
54 changes: 54 additions & 0 deletions
54
...in/java/com/synopsys/integration/detectable/detectable/dependency/BdioPropertyHelper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/** | ||
* integration-bdio | ||
* | ||
* Copyright (c) 2019 Synopsys, Inc. | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package com.synopsys.integration.detectable.detectable.dependency; | ||
|
||
import java.util.List; | ||
|
||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioExternalIdentifier; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioNode; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioRelationship; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.externalid.ExternalId; | ||
|
||
public class BdioPropertyHelper { | ||
public void addRelationships(final BdioNode node, final List<? extends BdioNode> children) { | ||
for (final BdioNode child : children) { | ||
addRelationship(node, child); | ||
} | ||
} | ||
|
||
public void addRelationship(final BdioNode node, final BdioNode child) { | ||
final BdioRelationship relationship = new BdioRelationship(); | ||
relationship.related = child.id; | ||
relationship.relationshipType = "DYNAMIC_LINK"; | ||
node.relationships.add(relationship); | ||
} | ||
|
||
public BdioExternalIdentifier createExternalIdentifier(final ExternalId externalId) { | ||
final BdioExternalIdentifier externalIdentifier = new BdioExternalIdentifier(); | ||
externalIdentifier.externalId = externalId.createExternalId(); | ||
externalIdentifier.forge = externalId.getForge().getName(); | ||
externalIdentifier.externalIdMetaData = externalId; | ||
return externalIdentifier; | ||
} | ||
|
||
} |
57 changes: 57 additions & 0 deletions
57
...java/com/synopsys/integration/detectable/detectable/dependency/graph/DependencyGraph.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/** | ||
* integration-bdio | ||
* | ||
* Copyright (c) 2019 Synopsys, Inc. | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package com.synopsys.integration.detectable.detectable.dependency.graph; | ||
|
||
import java.util.Set; | ||
|
||
import com.synopsys.integration.detectable.detectable.dependency.model.dependency.Dependency; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.externalid.ExternalId; | ||
|
||
public interface DependencyGraph { | ||
Set<Dependency> getRootDependencies(); | ||
|
||
Set<ExternalId> getRootDependencyExternalIds(); | ||
|
||
boolean hasDependency(Dependency dependency); | ||
|
||
boolean hasDependency(ExternalId dependency); | ||
|
||
Dependency getDependency(ExternalId dependency); | ||
|
||
Set<Dependency> getChildrenForParent(Dependency parent); | ||
|
||
Set<ExternalId> getChildrenExternalIdsForParent(Dependency parent); | ||
|
||
Set<Dependency> getChildrenForParent(ExternalId parent); | ||
|
||
Set<ExternalId> getChildrenExternalIdsForParent(ExternalId parent); | ||
|
||
Set<ExternalId> getParentExternalIdsForChild(Dependency child); | ||
|
||
Set<Dependency> getParentsForChild(ExternalId child); | ||
|
||
Set<Dependency> getParentsForChild(Dependency child); | ||
|
||
Set<ExternalId> getParentExternalIdsForChild(ExternalId child); | ||
|
||
} |
58 changes: 58 additions & 0 deletions
58
.../synopsys/integration/detectable/detectable/dependency/graph/DependencyGraphCombiner.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/** | ||
* integration-bdio | ||
* | ||
* Copyright (c) 2019 Synopsys, Inc. | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package com.synopsys.integration.detectable.detectable.dependency.graph; | ||
|
||
import java.util.HashSet; | ||
import java.util.Set; | ||
|
||
import com.synopsys.integration.detectable.detectable.dependency.model.dependency.Dependency; | ||
|
||
public class DependencyGraphCombiner { | ||
public void addGraphAsChildrenToRoot(final MutableDependencyGraph destinationGraph, final DependencyGraph sourceGraph) { | ||
final Set<Dependency> encountered = new HashSet<>(); | ||
for (final Dependency dependency : sourceGraph.getRootDependencies()) { | ||
destinationGraph.addChildToRoot(dependency); | ||
copyDependencyFromGraph(destinationGraph, dependency, sourceGraph, encountered); | ||
} | ||
} | ||
|
||
public void addGraphAsChildrenToParent(final MutableDependencyGraph destinationGraph, final Dependency parent, final DependencyGraph sourceGraph) { | ||
final Set<Dependency> encountered = new HashSet<>(); | ||
for (final Dependency dependency : sourceGraph.getRootDependencies()) { | ||
destinationGraph.addChildWithParent(dependency, parent); | ||
copyDependencyFromGraph(destinationGraph, dependency, sourceGraph, encountered); | ||
} | ||
} | ||
|
||
public void copyDependencyFromGraph(final MutableDependencyGraph destinationGraph, final Dependency parentDependency, final DependencyGraph sourceGraph, final Set<Dependency> encountered) { | ||
for (final Dependency dependency : sourceGraph.getChildrenForParent(parentDependency)) { | ||
if (!encountered.contains(dependency)) { | ||
encountered.add(dependency); | ||
|
||
copyDependencyFromGraph(destinationGraph, dependency, sourceGraph, encountered); | ||
} | ||
destinationGraph.addChildWithParent(dependency, parentDependency); | ||
} | ||
} | ||
|
||
} |
75 changes: 75 additions & 0 deletions
75
...nopsys/integration/detectable/detectable/dependency/graph/DependencyGraphTransformer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/** | ||
* integration-bdio | ||
* | ||
* Copyright (c) 2019 Synopsys, Inc. | ||
* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
package com.synopsys.integration.detectable.detectable.dependency.graph; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Set; | ||
|
||
import com.synopsys.integration.detectable.detectable.dependency.BdioNodeFactory; | ||
import com.synopsys.integration.detectable.detectable.dependency.BdioPropertyHelper; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioComponent; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioExternalIdentifier; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioId; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.BdioNode; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.dependency.Dependency; | ||
import com.synopsys.integration.detectable.detectable.dependency.model.externalid.ExternalId; | ||
|
||
// TODO: Convert for bdio-2 | ||
public class DependencyGraphTransformer { | ||
private final BdioPropertyHelper bdioPropertyHelper; | ||
private final BdioNodeFactory bdioNodeFactory; | ||
|
||
public DependencyGraphTransformer(final BdioPropertyHelper bdioPropertyHelper, final BdioNodeFactory bdioNodeFactory) { | ||
this.bdioPropertyHelper = bdioPropertyHelper; | ||
this.bdioNodeFactory = bdioNodeFactory; | ||
} | ||
|
||
public List<BdioComponent> transformDependencyGraph(final DependencyGraph graph, final BdioNode currentNode, final Set<Dependency> dependencies, final Map<ExternalId, BdioNode> existingComponents) { | ||
final List<BdioComponent> addedComponents = new ArrayList<>(); | ||
for (final Dependency dependency : dependencies) { | ||
if (!existingComponents.containsKey(dependency.getExternalId())) { | ||
final BdioComponent addedNode = componentFromDependency(dependency); | ||
addedComponents.add(addedNode); | ||
existingComponents.put(dependency.getExternalId(), addedNode); | ||
final List<BdioComponent> addedChildren = transformDependencyGraph(graph, addedNode, graph.getChildrenForParent(dependency), existingComponents); | ||
addedComponents.addAll(addedChildren); | ||
} | ||
bdioPropertyHelper.addRelationship(currentNode, existingComponents.get(dependency.getExternalId())); | ||
} | ||
|
||
return addedComponents; | ||
} | ||
|
||
private BdioComponent componentFromDependency(final Dependency dependency) { | ||
final String componentName = dependency.getName(); | ||
final String componentVersion = dependency.getVersion(); | ||
final BdioId componentId = dependency.getExternalId().createBdioId(); | ||
final BdioExternalIdentifier componentExternalIdentifier = bdioPropertyHelper.createExternalIdentifier(dependency.getExternalId()); | ||
|
||
final BdioComponent component = bdioNodeFactory.createComponent(componentName, componentVersion, componentId, componentExternalIdentifier); | ||
return component; | ||
} | ||
|
||
} |
Oops, something went wrong.