Skip to content

Commit

Permalink
Merge pull request #249 from eclipse-passage/564328
Browse files Browse the repository at this point in the history
Bug 564328 API revision | conditions | rethink key interfaces
  • Loading branch information
eparovyshnaya authored Jun 18, 2020
2 parents 9e9f0ac + 34ed865 commit 2d54c4b
Show file tree
Hide file tree
Showing 13 changed files with 494 additions and 3 deletions.
3 changes: 2 additions & 1 deletion bundles/org.eclipse.passage.lic.base/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ Export-Package: org.eclipse.passage.lic.base,
org.eclipse.passage.lic.internal.base.permission.observatory;x-internal:=true,
org.eclipse.passage.lic.internal.base.registry;x-internal:=true,
org.eclipse.passage.lic.internal.base.requirements;x-internal:=true,
org.eclipse.passage.lic.internal.base.restrictions;x-internal:=true
org.eclipse.passage.lic.internal.base.restrictions;x-internal:=true,
org.eclipse.passage.lic.internal.base.version;x-internal:=true
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.base.version;

import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import org.eclipse.passage.lic.internal.api.version.SemanticVersion;

@SuppressWarnings("restriction")
public final class BaseSemanticVersion implements SemanticVersion {

private final int major;
private final int minor;
private final int service;
private final Optional<String> qualifier;

public BaseSemanticVersion(int major, int minor, int service, Optional<String> qualifier) {
Objects.requireNonNull(qualifier, "SemanticVersion::qualifier"); //$NON-NLS-1$
this.major = major;
this.minor = minor;
this.service = service;
this.qualifier = qualifier;
}

public BaseSemanticVersion(int major, int minor, int service, String qualifier) {
this(major, minor, service, Optional.ofNullable(qualifier));
}

public BaseSemanticVersion(int major, int minor, int service) {
this(major, minor, service, Optional.empty());
}

@Override
public int major() {
return major;
}

@Override
public int minor() {
return minor;
}

@Override
public int service() {
return service;
}

@Override
public boolean hasQualifier() {
return qualifier.isPresent();
}

@Override
public String qualifier() {
return qualifier.get();
}

@Override
public String toString() {
String numerical = new NumericalVersion(this).get().stream()//
.map(i -> i.toString())//
.collect(Collectors.joining(".")); //$NON-NLS-1$
return numerical + (hasQualifier() ? '.' + qualifier() : ""); //$NON-NLS-1$
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.base.version;

import java.util.Objects;

import org.eclipse.passage.lic.internal.api.version.Version;

/**
*
*/
@SuppressWarnings("restriction")
public abstract class BaseVersion implements Version {

@Override
public final int hashCode() {
return Objects.hash(value());
}

@Override
public final boolean equals(Object obj) {
if (!Version.class.isInstance(obj)) {
return false;
}
return value().equals(((Version) obj).value());
}

@Override
public final String toString() {
return value();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.base.version;

import org.eclipse.passage.lic.internal.api.version.SemanticVersion;

@SuppressWarnings("restriction")
public final class DefaultVersion extends BaseVersion {

@Override
public String value() {
return "0.0.0"; //$NON-NLS-1$
}

@Override
public SemanticVersion semantic() {
return new BaseSemanticVersion(0, 0, 0);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.base.version;

import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

import org.eclipse.passage.lic.internal.api.version.SemanticVersion;

/**
* Auxiliary unit operating over {@linkplain SemanticVersion} collects it's
* numerical fields in a list.
*/
@SuppressWarnings("restriction")
public final class NumericalVersion implements Supplier<List<Integer>> {

private final SemanticVersion version;

public NumericalVersion(SemanticVersion version) {
this.version = version;
}

@Override
public List<Integer> get() {
return Arrays.asList(version.major(), version.minor(), version.service());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.base.version;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import org.eclipse.passage.lic.internal.api.version.SemanticVersion;

/**
* <p>
* Builds a {@linkplain SemanticVersion} instance of the given {@code source}.
* </p>
* <p>
* Provides the famous {@code default} version in case of any {@code source}
* inconsistency.
* </p>
*/
@SuppressWarnings("restriction")
public final class SafeVersion extends BaseVersion {

private final Object source;
private static String seprators = "\\."; //$NON-NLS-1$

public SafeVersion(Object source) {
this.source = source;
}

@Override
public String value() {
return semantic().toString();
}

@Override
public SemanticVersion semantic() {
String version = source.toString().trim();
List<String> segments = Arrays.stream(version.split(seprators))//
.map(String::trim)//
.collect(Collectors.toList());
Optional<String> qualifier = (segments.size() > 3) //
? Optional.of(segments.get(3)) //
: Optional.empty();
return build( //
extractSegment(segments, 0), // major
extractSegment(segments, 1), // minor
extractSegment(segments, 2), // service
qualifier);
}

private int extractSegment(List<String> split, int index) {
if (split.size() > index) {
try {
return Integer.parseInt(split.get(index));
} catch (Exception e) {
// ignore
}
}
return 0;
}

private SemanticVersion build(int major, int minor, int service, Optional<String> qualifier) {
return new BaseSemanticVersion(//
major, //
minor, //
service, //
qualifier.isPresent() && (major + minor + service > 0) ? qualifier : Optional.empty());
}

}
3 changes: 2 additions & 1 deletion tests/org.eclipse.passage.lic.api.tests/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.junit;bundle-version="4.12.0",
org.eclipse.passage.lic.api;bundle-version="0.7.0"
Export-Package: org.eclipse.passage.lic.api.conditions.tests;x-internal:=true,
org.eclipse.passage.lic.api.tests;x-internal:=true
org.eclipse.passage.lic.api.tests;x-internal:=true,
org.eclipse.passage.lic.api.version.tests;x-internal:=true
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.api.version.tests;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;

import org.eclipse.passage.lic.internal.api.version.SemanticVersion;
import org.junit.Test;

@SuppressWarnings("restriction")
public abstract class SemanticVersionContractTest {

@Test(expected = RuntimeException.class)
public void notExistingQualifierRetrievalMustFail() {
SemanticVersion version = withoutQualifier();
assumeFalse(version.hasQualifier());
version.qualifier();
}

@Test
public void existingQualifierMustPresent() {
SemanticVersion version = withQualifier();
assumeTrue(version.hasQualifier());
assertNotNull(version.qualifier());
}

protected abstract SemanticVersion withoutQualifier();

protected abstract SemanticVersion withQualifier();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.api.version.tests;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.eclipse.passage.lic.internal.api.version.Version;
import org.junit.Test;

@SuppressWarnings("restriction")
public abstract class VersionContractTest {

@Test
public void sameValuedVersionsAreEqual() {
assertTrue(fromString("1.0.0").equals(fromString("1.0.0"))); //$NON-NLS-1$//$NON-NLS-2$
}

@Test
public void differentValuedVersionsAreNotEqual() {
assertFalse(fromString("1.0.0").equals(fromString("1.0.1"))); //$NON-NLS-1$//$NON-NLS-2$
}

protected abstract Version fromString(String source);

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ Bundle-Vendor: %Bundle-Vendor
Bundle-Copyright: %Bundle-Copyright
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.junit;bundle-version="0.0.0",
org.eclipse.passage.lic.base;bundle-version="0.0.0"
org.eclipse.passage.lic.base;bundle-version="0.0.0",
org.eclipse.passage.lic.api.tests;bundle-version="0.1.0"
Export-Package: org.eclipse.passage.lic.base.tests.requirements
Loading

0 comments on commit 2d54c4b

Please sign in to comment.