summaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-sdc-versioning-lib/openecomp-sdc-versioning-core/src/main/java/org/openecomp/sdc/versioning/impl/VersionCalculatorImpl.java
blob: b7008de8677ab9030eafbfad2f105cff2bce7a8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package org.openecomp.sdc.versioning.impl;

import org.openecomp.core.utilities.CommonMethods;
import org.openecomp.sdc.versioning.VersionCalculator;
import org.openecomp.sdc.versioning.dao.types.Version;
import org.openecomp.sdc.versioning.dao.types.VersionStatus;
import org.openecomp.sdc.versioning.types.VersionCreationMethod;

import java.util.HashSet;
import java.util.Set;

public class VersionCalculatorImpl implements VersionCalculator {

  private static final String INITIAL_VERSION = "1.0";
  private static final String VERSION_STRING_VIOLATION_MSG =
      "Version string must be in the format of: {integer}.{integer}";
  private static final String PARENT_LEVEL_VERSION_CANNOT_BE_CREATED_FROM_TOP_LEVEL =
      "Creation of parent level version on top level version is invalid.";
  private static final String SUB_LEVEL_VERSION_CANNOT_BE_CREATED_FROM_LOWEST_LEVEL =
      "Creation of parent level version on top level version is invalid.";

  private static final String VERSION_CALCULATION_ERROR_MSG =
      "Version calculation error.";

  private static final String INVALID_CREATION_METHOD_MSG = "Invalid creation method-";


  @Override
  public String calculate(String baseVersion, VersionCreationMethod creationMethod) {

    if (baseVersion == null) {
      return INITIAL_VERSION;
    }

    String[] versionLevels = baseVersion.split("\\.");
    if (versionLevels.length != 2) {
      throw new IllegalArgumentException(VERSION_STRING_VIOLATION_MSG);
    }

    int index;
    switch (creationMethod) {
      case major:
        index = Integer.parseInt(versionLevels[0]);
        index++;
        versionLevels[0] = Integer.toString(index);
        versionLevels[1] = "0";
        break;
      case minor:
        index = Integer.parseInt(versionLevels[1]);
        index++;
        versionLevels[1] = Integer.toString(index);
        break;
    }
    return CommonMethods.arrayToSeparatedString(versionLevels, '.');
  }


  // version calculator when there are no version restrictions
 /* @Override
  public String calculate(String baseVersion, VersionCreationMethod creationMethod) {

    return calculate(baseVersion,creationMethod,2);
  }

  private String calculate(String baseVersion, VersionCreationMethod creationMethod,int
      maxVersionLevels) {
    if (baseVersion == null) {
      return INITIAL_VERSION;
    }

    String[] versionLevels = baseVersion.split("\\.");
    if (versionLevels.length > maxVersionLevels) {
      throw new IllegalArgumentException(VERSION_STRING_VIOLATION_MSG);
    }

    int index;
    int versionLevel = calcVersionLevel(versionLevels);
    if (versionLevel == -1) {
      throw new IllegalArgumentException(
          VERSION_STRING_VIOLATION_MSG + " given version:" + baseVersion);
    }
    int requiredVersionLevelIncrease;
    switch (creationMethod) {
      case parent_level:
        if (versionLevel == 0) {
          throw new IllegalArgumentException(
              PARENT_LEVEL_VERSION_CANNOT_BE_CREATED_FROM_TOP_LEVEL + " version:" + baseVersion);

        }
        requiredVersionLevelIncrease = versionLevel - 1;
        versionLevels[versionLevel] = "0";
        index = Integer.getInteger(versionLevels[requiredVersionLevelIncrease]);
        index++;
        versionLevels[requiredVersionLevelIncrease] = Integer.toString(index);
        break;
      case same_level:
        requiredVersionLevelIncrease = versionLevel;
        index = Integer.valueOf(versionLevels[requiredVersionLevelIncrease]);
        index++;
        versionLevels[requiredVersionLevelIncrease] = Integer.toString(index);
        break;
      case sub_level:
        if (versionLevel == versionLevels.length - 1) {
          throw new IllegalArgumentException(
              SUB_LEVEL_VERSION_CANNOT_BE_CREATED_FROM_LOWEST_LEVEL + " version:" + baseVersion);
        }
        requiredVersionLevelIncrease = versionLevel + 1;
        if(requiredVersionLevelIncrease>maxVersionLevels){
          throw new IllegalArgumentException(INVALID_CREATION_METHOD_MSG+" max " +
              "levels:"+maxVersionLevels + "requested level:"+requiredVersionLevelIncrease);
        }
        String newVersion = baseVersion + ".1";
        versionLevels = newVersion.split("\\.");

        break;
      default:
        throw new IllegalArgumentException(VERSION_CALCULATION_ERROR_MSG + " base " +
            "version:" + baseVersion + " creation method:" + creationMethod);

    }

    return CommonMethods.arrayToSeparatedString(versionLevels, '.');
  }*/


  @Override
  public void injectAdditionalInfo(Version version, Set<String> existingVersions) {
    String optionalVersion;
    Set<VersionCreationMethod> optionalCreationMethods = new HashSet<>();
    if(version.getStatus().equals(VersionStatus.Certified)) {
      for (VersionCreationMethod versionCreationMethod : VersionCreationMethod.values()) {
        try {
          optionalVersion = calculate(version.getName(), versionCreationMethod);
          if (!existingVersions.contains(optionalVersion)) {
            optionalCreationMethods.add(versionCreationMethod);
          }
        } catch (IllegalArgumentException iae) {
          //not a valid creation method.
        }
      }
    }
    version.getAdditionalInfo().put("OptionalCreationMethods", optionalCreationMethods);

  }


  private int calcVersionLevel(String[] versionLevels) {
    for (int i = versionLevels.length - 1; i >= 0; i--) {
      if (!versionLevels[i].equals("0")) {
        return i;
      }
    }
    return -1;
  }
}