Skip to content

Commit

Permalink
#20: java/lang/Number added to JavaTypeWrapper. Tests fixed.
Browse files Browse the repository at this point in the history
  • Loading branch information
Zdenek Vales committed Jan 21, 2020
1 parent 6bf8fec commit be3cbd8
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package cz.zcu.kiv.crce.apicomp;

import cz.zcu.kiv.crce.apicomp.result.CompatibilityCheckResult;
import cz.zcu.kiv.crce.metadata.Capability;
import cz.zcu.kiv.crce.metadata.Resource;

import java.util.Set;

/**
* A service responsible for calling correct compatibility comparator for
* given metadata.
Expand All @@ -17,4 +20,20 @@ public interface ApiCompatibilityCheckerService {
* @return Comparison result.
*/
CompatibilityCheckResult compareApis(Resource api1, Resource api2);

/**
* Returns checker compatible for given resource.
*
* @param resource Resource.
* @return Checker able to compare this resource.
*/
ApiCompatibilityChecker pickChecker(Resource resource);

/**
* Returns checker compatible for given set of metadata representing API.
*
* @param apiMetadata API metadata.
* @return Checker able to compare this resource.
*/
ApiCompatibilityChecker pickChecker(Set<Capability> apiMetadata);
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,64 @@
package cz.zcu.kiv.crce.apicomp.impl;

import cz.zcu.kiv.crce.apicomp.ApiCompatibilityChecker;
import cz.zcu.kiv.crce.apicomp.ApiCompatibilityCheckerService;
import cz.zcu.kiv.crce.apicomp.impl.restimpl.RestApiCompatibilityChecker;
import cz.zcu.kiv.crce.apicomp.impl.webservice.WebservicesCompatibilityChecker;
import cz.zcu.kiv.crce.apicomp.result.CompatibilityCheckResult;
import cz.zcu.kiv.crce.metadata.Capability;
import cz.zcu.kiv.crce.metadata.Resource;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
* A service responsible for fetching resources' metadata and passing them to
* the correct compatibility checker.
*/
public class ApiCompatibilityCheckerServiceImpl implements ApiCompatibilityCheckerService {

private List<ApiCompatibilityChecker> availableCheckers;

public ApiCompatibilityCheckerServiceImpl() {
availableCheckers = new ArrayList<>();
availableCheckers.add(new RestApiCompatibilityChecker());
availableCheckers.add(new WebservicesCompatibilityChecker());
}

@Override
public CompatibilityCheckResult compareApis(Resource api1, Resource api2) {
// todo: determine which checker to use

// todo: actually use the checker
return new CompatibilityCheckResult();
// todo: pass only resource to every layer?
Set<Capability> metadata1 = new HashSet<>(api1.getCapabilities());
Set<Capability> metadata2 = new HashSet<>(api2.getCapabilities());

ApiCompatibilityChecker c1 = pickChecker(metadata1),
c2 = pickChecker(metadata2);

if (c1 == null || c2 == null || !c1.equals(c2)) {
// todo: log error or something
return null;
}

return c1.compareApis(metadata1, metadata2);
}

@Override
public ApiCompatibilityChecker pickChecker(Resource resource) {
Set<Capability> metadata = new HashSet<>(resource.getCapabilities());
return availableCheckers.stream()
.filter(checker -> checker.isApiSupported(metadata))
.findFirst()
.orElse(null);
}

@Override
public ApiCompatibilityChecker pickChecker(Set<Capability> apiMetadata) {
return availableCheckers.stream()
.filter(checker -> checker.isApiSupported(apiMetadata))
.findFirst()
.orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ protected Difference compareDateTypeAttributes(Property p1, Property p2) {
|| type2.fitsInto(type1)
) {
return Difference.NON;
} else if (type1.isExtendedBy(type2)) {
return Difference.SPE;
} else if (type2.isExtendedBy(type1)){
return Difference.GEN;
}

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
* - float: F
* - double: D
*
* Also handles java/lang/Number.
*/
// todo: test
public class JavaTypeWrapper {

private final static String[] primitiveTypeNames = new String[]{
Expand All @@ -29,6 +29,9 @@ public class JavaTypeWrapper {

private final String typeName;

// is java/lang/Number
private final boolean isLangNumber;

/**
* Index into the type arrays. Used to compare types between each other.
* -1 if type is not in any array.
Expand All @@ -38,6 +41,8 @@ public class JavaTypeWrapper {
public JavaTypeWrapper(@NotNull String typeName) {
this.typeName = typeName;

isLangNumber = typeName.equals("java/lang/Number");

typeIndex = -1;
for (int i = 0; i < primitiveTypeNames.length; i++) {
if (primitiveTypeNames[i].equals(typeName) || boxTypeNames[i].equals(typeName)) {
Expand All @@ -63,7 +68,8 @@ public boolean fitsInto(@NotNull JavaTypeWrapper otherType) {
}

// same types fits into each other
if (typeIndex == otherType.typeIndex) {
// if langNumber => both will have same typeIndex
if (typeIndex != -1 && typeIndex == otherType.typeIndex) {
return true;
}

Expand All @@ -80,13 +86,29 @@ public boolean fitsInto(@NotNull JavaTypeWrapper otherType) {
return false;
}

/**
* Checks whether otherType extends this type.
*
* Currently works only for java lang number extensions.
*
* @param otherType Other type. Must not be null.
* @return True if this type extends other type.
*/
public boolean isExtendedBy(@NotNull JavaTypeWrapper otherType) {
if (!isComparableType() || !otherType.isComparableType()) {
return false;
}

return isLangNumber && otherType.typeIndex >= 1;
}

/**
* Checks if this type is comparable = either primitive or java-lang.*type.
*
* @return True if the type is comparable.
*/
public boolean isComparableType() {
return typeIndex != -1;
return typeIndex != -1 || isLangNumber;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ private Capability createEndpoint5() {
* @return
*/
private void addResponse1(Capability endpoint) {
TestUtil.addResponseMetadata(endpoint, "r1", 0L, "java.lang.Integer", 200L);
TestUtil.addResponseParameter(endpoint, "r1", "param1", "java.lang.Integer", "FORM", 0L);
TestUtil.addResponseParameter(endpoint, "r1", "param2", "java.lang.String", "FORM", 0L);
TestUtil.addResponseMetadata(endpoint, "r1", 0L, "java/lang/Integer", 200L);
TestUtil.addResponseParameter(endpoint, "r1", "param1", "java/lang/Integer", "FORM", 0L);
TestUtil.addResponseParameter(endpoint, "r1", "param2", "java/lang/String", "FORM", 0L);
}

/**
Expand All @@ -172,9 +172,9 @@ private void addResponse2(Capability endpoint) {
* @param endpoint
*/
private void addResponse3(Capability endpoint) {
TestUtil.addResponseMetadata(endpoint, "r3", 0L, "java.lang.Number", 200L);
TestUtil.addResponseParameter(endpoint, "r3", "param1", "java.lang.Number", "FORM", 0L);
TestUtil.addResponseParameter(endpoint, "r3", "param2", "java.lang.String", "FORM", 0L);
TestUtil.addResponseMetadata(endpoint, "r3", 0L, "java/lang/Number", 200L);
TestUtil.addResponseParameter(endpoint, "r3", "param1", "java/lang/Number", "FORM", 0L);
TestUtil.addResponseParameter(endpoint, "r3", "param2", "java/lang/String", "FORM", 0L);
}

/**
Expand All @@ -185,6 +185,6 @@ private void addResponse3(Capability endpoint) {
* @param endpoint
*/
private void addResponse4(Capability endpoint) {
TestUtil.addResponseMetadata(endpoint, "r4", 0L, "java.lang.Integer", 200L);
TestUtil.addResponseMetadata(endpoint, "r4", 0L, "java/lang/Integer", 200L);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,13 @@ public void testFitsIntoDouble() {
other = new JavaTypeWrapper("other");
assertFalse("Other should not fit into double!", other.fitsInto(doubleType));
}

@Test
public void testNumber() {
JavaTypeWrapper numberWrapper = new JavaTypeWrapper("java/lang/Number");
JavaTypeWrapper integerWrapper = new JavaTypeWrapper("java/lang/Integer");

assertTrue("Integer should extend number!", numberWrapper.isExtendedBy(integerWrapper));
assertFalse("Number should not extend integer!", integerWrapper.isExtendedBy(numberWrapper));
}
}

0 comments on commit be3cbd8

Please sign in to comment.