org.automagic.deps.doctor.editor.PomEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.automagic.deps.doctor.editor.PomEditor.java

Source

/*
 * Copyright 2015 Jose Carrizo
 * Licensed under the Apache License, Version 2.0 
 * See accompanying file LICENSE or get a copy at http://www.apache.org/licenses/LICENSE-2.0
 */
package org.automagic.deps.doctor.editor;

import java.util.List;

import org.automagic.deps.doctor.TransitiveDependency;
import org.automagic.deps.doctor.spy.PomSpy;

import com.google.common.base.Optional;

public class PomEditor {

    private final PomSpy pomSpy;
    private final PomWriter pomWriter;

    public PomEditor(PomSpy pomSpy, PomWriter pomWriter) {
        this.pomSpy = pomSpy;
        this.pomWriter = pomWriter;
    }

    public Result updateDependencies(List<TransitiveDependency> depsToUpdate) {

        final Result result = new Result();
        for (TransitiveDependency dependency : depsToUpdate) {

            final boolean isNewDependency;
            boolean isBrandNew = pomSpy.isBrandNew(dependency);
            boolean canBeManaged = isBrandNew || !pomSpy.getVersion(dependency).isPresent();

            if (canBeManaged && pomSpy.isParentAvailable()) {

                PomSpy parentSpy = pomSpy.getParentSpy();
                if (parentSpy.isLowerThanCurrent(dependency)) {
                    // needed because maybe a sibling project already updated
                    // the parent pom and the current value in memory doesn't
                    // reflect this change
                    continue;
                }

                PomWriter parentWriter = pomWriter.getParentWriter();
                isNewDependency = updateParentProjectDep(dependency, isBrandNew, parentSpy, parentWriter);
                result.setParentProjectModified(true);
                result.setProjectModified(true);
            } else {
                isNewDependency = updateProjectDep(dependency);
                result.setProjectModified(true);
            }
            if (isNewDependency) {
                result.addNewDependency(dependency);
            } else {
                result.addModifiedDependency(dependency);
            }
        }
        return result;
    }

    private boolean updateProjectDep(TransitiveDependency dependency) {

        if (pomSpy.isBrandNew(dependency)) {
            pomWriter.writeFullDependency(dependency);
            return true;
        }
        Optional<String> version = pomSpy.getVersion(dependency);
        if (version.isPresent()) {
            updateVersion(pomSpy, pomWriter, dependency, version.get());
        } else {
            pomWriter.addExplicitDependencyVersion(dependency);
        }
        return false;
    }

    private boolean updateParentProjectDep(TransitiveDependency dependency, boolean isBrandNew, PomSpy parentSpy,
            PomWriter parentWriter) {

        if (!parentSpy.isBrandNew(dependency) && parentSpy.getVersion(dependency).isPresent()) {
            updateVersion(parentSpy, parentWriter, dependency, parentSpy.getVersion(dependency).get());
            return false;
        } else if (parentSpy.isManaged(dependency)) {
            String managedVersion = parentSpy.getManagedVersion(dependency);
            Optional<String> propertyName = parentSpy.getVersionPropertyName(managedVersion);
            if (propertyName.isPresent()) {
                parentWriter.setVersionProperty(propertyName.get(), dependency.getVersion());
            } else {
                parentWriter.setManagedDependencyVersion(dependency);
            }
            if (isBrandNew) {
                pomWriter.writeDependencyWithoutVersion(dependency);
            }
            return false;
        } else {
            if (!parentSpy.hasDepsManagement()) {
                parentWriter.addDepsMamagement();
            }
            parentWriter.writeFullManagedDependency(dependency);
            if (isBrandNew) {
                pomWriter.writeDependencyWithoutVersion(dependency);
            }
            return true;
        }
    }

    private static void updateVersion(PomSpy spy, PomWriter writer, TransitiveDependency dependency,
            String version) {
        Optional<String> propertyName = spy.getVersionPropertyName(version);
        if (propertyName.isPresent()) {
            writer.setVersionProperty(propertyName.get(), dependency.getVersion());
        } else {
            writer.setDependencyVersion(dependency);
        }
    }
}