Skip to content

Commit

Permalink
feat(bdio): Added bdio model object and helper classes from integrati…
Browse files Browse the repository at this point in the history
…on-bdio. (Progresses IDETECT-1763)
  • Loading branch information
JakeMathews committed Nov 11, 2019
1 parent 84fe96d commit 56f8596
Show file tree
Hide file tree
Showing 27 changed files with 2,078 additions and 0 deletions.
@@ -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;
}

}
@@ -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;
}

}
@@ -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);

}
@@ -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);
}
}

}
@@ -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;
}

}

0 comments on commit 56f8596

Please sign in to comment.