diff --git a/Dockerfile b/Dockerfile index 1ea79e6..f1e03f4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # stage 1 FROM maven:3.9.1-amazoncorretto-20-debian-bullseye as build -MAINTAINER Ian Laird +LABEL maintainer = "Ian Laird" WORKDIR /build diff --git a/pom.xml b/pom.xml index fe4aa37..ec92e96 100644 --- a/pom.xml +++ b/pom.xml @@ -136,6 +136,13 @@ spotless-maven-plugin ${spotless.maven} + + + com.google.guava + guava + 32.1.3-jre + + diff --git a/src/main/java/calculator/DTO/DerivativeRequest.java b/src/main/java/calculator/DTO/DerivativeRequest.java index 5b57788..8ad7d5f 100644 --- a/src/main/java/calculator/DTO/DerivativeRequest.java +++ b/src/main/java/calculator/DTO/DerivativeRequest.java @@ -6,6 +6,9 @@ import lombok.Data; import lombok.NoArgsConstructor; +/** + * A request for a mathematical expression. + */ @Data @NoArgsConstructor @AllArgsConstructor diff --git a/src/main/java/calculator/controller/CalculatorController.java b/src/main/java/calculator/controller/CalculatorController.java index 88a571f..fd157f5 100644 --- a/src/main/java/calculator/controller/CalculatorController.java +++ b/src/main/java/calculator/controller/CalculatorController.java @@ -3,26 +3,22 @@ import calculator.DTO.DerivativeRequest; import calculator.DTO.DerivativeResponse; import calculator.service.CalculatorService; +import com.google.common.collect.ImmutableList; import java.time.LocalTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; -/** -Controller handling calculator requests. - */ +/** Controller handling calculator requests. */ @RestController public final class CalculatorController { @Autowired private CalculatorService calculatorServiceImpl; - /** - * Health check for the calculator. - */ + /** Health check for the calculator. */ @GetMapping("/health") @ResponseStatus(HttpStatus.OK) public String healthCheck() { @@ -30,21 +26,31 @@ public String healthCheck() { } /** - * Calculates the anti-derivative of a mathematical expression and then evaluates it at a specific point. + * Calculates the anti-derivative of a mathematical expression and then evaluates it at a specific + * point. + * + * @param request The request. + * + * @return the anti-derivative and result at a specific point. */ @GetMapping(value = "/derivative") @ResponseStatus(HttpStatus.OK) - public DerivativeResponse generateDerivative( - @RequestBody DerivativeRequest request) { - return calculatorServiceImpl.evaluateDerivative(request.getExpression(), request.getPoints()); + public DerivativeResponse generateDerivative(@RequestBody DerivativeRequest request) { + return calculatorServiceImpl.evaluateDerivative( + request.getExpression(), ImmutableList.copyOf(request.getPoints())); } /** * Evaluates a mathematical expression. - */ + * + * @param request the request. + * + * @return The evaluation of a mathametical expression at specific points. + * */ @GetMapping(value = "/expression") @ResponseStatus(HttpStatus.OK) - public double generateDerivative(@RequestParam("expression") final String expression) { - return calculatorServiceImpl.evaluateExpression(expression); + public double evaluateExpression(@RequestBody DerivativeRequest request) { + return calculatorServiceImpl.evaluateExpression( + request.getExpression(), ImmutableList.copyOf(request.getPoints())); } } diff --git a/src/main/java/calculator/controller/UserController.java b/src/main/java/calculator/controller/UserController.java index bf8942a..5597b0b 100644 --- a/src/main/java/calculator/controller/UserController.java +++ b/src/main/java/calculator/controller/UserController.java @@ -18,8 +18,11 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +/** + * Controller for user management. + */ @RestController -public class UserController { +public final class UserController { @Autowired private AuthenticationManager authenticationManager; @@ -27,12 +30,24 @@ public class UserController { @Autowired private UserService userService; + /** + * Registers a user. + * @param u the user to register. + * @return JWT for the registered user. + * @throws Exception if the user already exists. + */ @PostMapping("/register") public ResponseEntity registerUser(@RequestBody @Valid UserGeneration u) throws Exception { userService.register(u.getEmail(), u.getPassword(), "STANDARD"); return createAuthenticationToken(new JwtRequest(u.getEmail(), u.getPassword())); } + /** + * Logins in a user. + * @param authenticationRequest the users login credentials. + * @return JWT for the logged in user. + * @throws Exception If login fails. + */ @PostMapping("/authenticate") public ResponseEntity createAuthenticationToken(@RequestBody JwtRequest authenticationRequest) throws Exception { diff --git a/src/main/java/calculator/security/JwtRequestFilter.java b/src/main/java/calculator/security/JwtRequestFilter.java index 4c937a5..ec3368d 100644 --- a/src/main/java/calculator/security/JwtRequestFilter.java +++ b/src/main/java/calculator/security/JwtRequestFilter.java @@ -15,8 +15,11 @@ import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; +/** + * Handles JWT tokens. + */ @Component -public class JwtRequestFilter extends OncePerRequestFilter { +public final class JwtRequestFilter extends OncePerRequestFilter { @Autowired private UserDetailsService jwtUserDetailsService; @Override @@ -43,20 +46,24 @@ protected void doFilterInternal( } // Once we get the token validate it. - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username); + if (username != null && + SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = + this.jwtUserDetailsService.loadUserByUsername(username); // if token is valid configure Spring Security to manually set // authentication if (JwtTokenUtil.validateToken(jwtToken, userDetails)) { - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken.setDetails( + authenticationToken.setDetails( new WebAuthenticationDetailsSource().buildDetails(request)); // After setting the Authentication in the context, we specify // that the current user is authenticated. So it passes the // Spring Security Configurations successfully. - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + SecurityContextHolder + .getContext() + .setAuthentication(authenticationToken); } } chain.doFilter(request, response); diff --git a/src/main/java/calculator/security/JwtTokenUtil.java b/src/main/java/calculator/security/JwtTokenUtil.java index 6a9cb0b..52e9dcc 100644 --- a/src/main/java/calculator/security/JwtTokenUtil.java +++ b/src/main/java/calculator/security/JwtTokenUtil.java @@ -20,12 +20,15 @@ @Component public final class JwtTokenUtil implements Serializable { private static final long serialVersionUID = 8562677648L; - public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; + public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60 * 1000; private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS512); /** * Gets the username from a JWT. + * + * @param token JWT token. + * @return the username. */ public static String getUsernameFromToken(String token) { return getClaimFromToken(token, Claims::getSubject); @@ -33,6 +36,9 @@ public static String getUsernameFromToken(String token) { /** * Gets the expiration date for a token. + * + * @param token JWT token. + * @return the expiration date of the token. */ public static Date getExpirationDateFromToken(String token) { return getClaimFromToken(token, Claims::getExpiration); @@ -40,6 +46,10 @@ public static Date getExpirationDateFromToken(String token) { /** * Gets all claims for a token. + * + * @param token JWT token. + * @param claimsResolver claimsResolver + * @return the claims for the token. */ public static T getClaimFromToken(String token, Function claimsResolver) { final Claims claims = getAllClaimsFromToken(token); @@ -57,8 +67,11 @@ private static Boolean isTokenExpired(String token) { /** * Generates a JWT. + * + * @param userDetails the users login credentials. + * @return JWT token. */ - public static String generateToken(UserDetails userDetails) { + public static String generateToken(final UserDetails userDetails) { Map claims = new HashMap<>(); return doGenerateToken(claims, userDetails.getUsername()); } @@ -74,7 +87,8 @@ private static String doGenerateToken(Map claims, String subject .setClaims(claims) .setSubject(subject) .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) + .setExpiration( + new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY)) .signWith(SECRET_KEY) .compact(); } diff --git a/src/main/java/calculator/service/CalculatorService.java b/src/main/java/calculator/service/CalculatorService.java index a11722b..cd11aa4 100644 --- a/src/main/java/calculator/service/CalculatorService.java +++ b/src/main/java/calculator/service/CalculatorService.java @@ -1,10 +1,11 @@ package calculator.service; import calculator.DTO.DerivativeResponse; -import java.util.List; +import com.google.common.collect.ImmutableList; public interface CalculatorService { - DerivativeResponse evaluateDerivative(String expression, List evalPoints); - double evaluateExpression(String expression); + DerivativeResponse evaluateDerivative(String expression, ImmutableList evalPoints); + + double evaluateExpression(String expression, ImmutableList evalPoints); } diff --git a/src/main/java/calculator/service/impl/CalculatorServiceImpl.java b/src/main/java/calculator/service/impl/CalculatorServiceImpl.java index 97b1fe3..4369ff9 100644 --- a/src/main/java/calculator/service/impl/CalculatorServiceImpl.java +++ b/src/main/java/calculator/service/impl/CalculatorServiceImpl.java @@ -3,31 +3,34 @@ import calculator.DTO.DerivativeResponse; import calculator.service.CalculatorService; -import calculator.util.ast.AbstractSyntaxTree; import calculator.util.StringToStream; +import calculator.util.ast.AbstractSyntaxTree; import calculator.util.terms.Term; -import java.util.List; +import com.google.common.collect.ImmutableList; import org.springframework.stereotype.Service; /** - * TO USE: 1) create the Parser using an input stream 2) Call get root to get the term at the - * base of the AST. + * TO USE: 1) create the Parser using an input stream 2) Call get root to get the term at the base + * of the AST. * *

TO GET DERIVATIVE: call getDerivative on the term returned from getRoot() */ @Service public class CalculatorServiceImpl implements CalculatorService { @Override - public DerivativeResponse evaluateDerivative(String expression, List evalPoints) { - AbstractSyntaxTree abstractSyntaxTree = new AbstractSyntaxTree(StringToStream.convertStringToStream(expression)); + public DerivativeResponse evaluateDerivative( + String expression, ImmutableList evalPoints) { + AbstractSyntaxTree abstractSyntaxTree = + new AbstractSyntaxTree(StringToStream.convertStringToStream(expression)); Term derivative = abstractSyntaxTree.getDeriv(); return new DerivativeResponse(derivative.toString(), derivative.evaluate(evalPoints)); } @Override - public double evaluateExpression(String expression) { - AbstractSyntaxTree abstractSyntaxTree = new AbstractSyntaxTree(StringToStream.convertStringToStream(expression)); + public double evaluateExpression(String expression, ImmutableList evalPoints) { + AbstractSyntaxTree abstractSyntaxTree = + new AbstractSyntaxTree(StringToStream.convertStringToStream(expression)); Term root = abstractSyntaxTree.getRoot(); - return root.evaluate(null); + return root.evaluate(evalPoints); } } diff --git a/src/main/java/calculator/util/rules/AdditionRule.java b/src/main/java/calculator/util/rules/AdditionRule.java index 2a1c779..8a530c7 100644 --- a/src/main/java/calculator/util/rules/AdditionRule.java +++ b/src/main/java/calculator/util/rules/AdditionRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.makeAdditionRule; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; import java.util.stream.Collectors; /** @@ -50,7 +50,7 @@ public AdditionRule addTerm(Term t) { * @param dims the variable values to use when evaulating * @return the result */ - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return this.terms.stream().map(x -> x.evaluate(dims)).reduce(0.0, Double::sum); } diff --git a/src/main/java/calculator/util/rules/ArcCosRule.java b/src/main/java/calculator/util/rules/ArcCosRule.java index f7ebcde..f608616 100644 --- a/src/main/java/calculator/util/rules/ArcCosRule.java +++ b/src/main/java/calculator/util/rules/ArcCosRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class ArcCosRule extends TrigRule { @@ -28,7 +28,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/ArcCotRule.java b/src/main/java/calculator/util/rules/ArcCotRule.java index 297f2c1..fa1778c 100644 --- a/src/main/java/calculator/util/rules/ArcCotRule.java +++ b/src/main/java/calculator/util/rules/ArcCotRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class ArcCotRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/ArcSinRule.java b/src/main/java/calculator/util/rules/ArcSinRule.java index f7e843e..f832bfa 100644 --- a/src/main/java/calculator/util/rules/ArcSinRule.java +++ b/src/main/java/calculator/util/rules/ArcSinRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class ArcSinRule extends TrigRule { @@ -28,7 +28,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/ArcTanRule.java b/src/main/java/calculator/util/rules/ArcTanRule.java index f27bbe5..2be3cd0 100644 --- a/src/main/java/calculator/util/rules/ArcTanRule.java +++ b/src/main/java/calculator/util/rules/ArcTanRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class ArcTanRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/ChainRule.java b/src/main/java/calculator/util/rules/ChainRule.java index dd90dc8..d689664 100644 --- a/src/main/java/calculator/util/rules/ChainRule.java +++ b/src/main/java/calculator/util/rules/ChainRule.java @@ -2,8 +2,8 @@ package calculator.util.rules; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class ChainRule extends DerivationRule { @@ -26,7 +26,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return this.terms.get(0).evaluate(dims); } diff --git a/src/main/java/calculator/util/rules/CosRule.java b/src/main/java/calculator/util/rules/CosRule.java index 4f5e3a8..31f6315 100644 --- a/src/main/java/calculator/util/rules/CosRule.java +++ b/src/main/java/calculator/util/rules/CosRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CosRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.cos(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/CoshRule.java b/src/main/java/calculator/util/rules/CoshRule.java index bd41f22..7fb402c 100644 --- a/src/main/java/calculator/util/rules/CoshRule.java +++ b/src/main/java/calculator/util/rules/CoshRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CoshRule extends TrigRule { @@ -23,7 +23,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.cosh(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/CotRule.java b/src/main/java/calculator/util/rules/CotRule.java index ba2a998..b166497 100644 --- a/src/main/java/calculator/util/rules/CotRule.java +++ b/src/main/java/calculator/util/rules/CotRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CotRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 1.0 / Math.tan(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/CothRule.java b/src/main/java/calculator/util/rules/CothRule.java index 8ff5cd3..b0429ed 100644 --- a/src/main/java/calculator/util/rules/CothRule.java +++ b/src/main/java/calculator/util/rules/CothRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CothRule extends TrigRule { @@ -25,7 +25,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/CscRule.java b/src/main/java/calculator/util/rules/CscRule.java index eaf93f7..0f3cd01 100644 --- a/src/main/java/calculator/util/rules/CscRule.java +++ b/src/main/java/calculator/util/rules/CscRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CscRule extends TrigRule { @@ -25,7 +25,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 1.0 / Math.sin(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/CschRule.java b/src/main/java/calculator/util/rules/CschRule.java index a95991b..34744be 100644 --- a/src/main/java/calculator/util/rules/CschRule.java +++ b/src/main/java/calculator/util/rules/CschRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class CschRule extends TrigRule { @@ -23,7 +23,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/LogRule.java b/src/main/java/calculator/util/rules/LogRule.java index 46a62e1..1286633 100644 --- a/src/main/java/calculator/util/rules/LogRule.java +++ b/src/main/java/calculator/util/rules/LogRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; /** * Log Rule @@ -37,7 +37,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.log(this.terms.get(BASE_INDEX).evaluate(dims)) / Math.log(this.terms.get(ARGUMENT_INDEX).evaluate(dims)); } diff --git a/src/main/java/calculator/util/rules/NaturalLogRule.java b/src/main/java/calculator/util/rules/NaturalLogRule.java index 3b2741e..684a97b 100644 --- a/src/main/java/calculator/util/rules/NaturalLogRule.java +++ b/src/main/java/calculator/util/rules/NaturalLogRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class NaturalLogRule extends DerivationRule { public static final int ARGUMENT_INDEX = 0; @@ -27,7 +27,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.log(this.terms.get(ARGUMENT_INDEX).evaluate(dims)); } diff --git a/src/main/java/calculator/util/rules/PowerFracRule.java b/src/main/java/calculator/util/rules/PowerFracRule.java index 2e6d22a..929d796 100644 --- a/src/main/java/calculator/util/rules/PowerFracRule.java +++ b/src/main/java/calculator/util/rules/PowerFracRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class PowerFracRule extends DerivationRule { @@ -28,7 +28,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } diff --git a/src/main/java/calculator/util/rules/PowerRule.java b/src/main/java/calculator/util/rules/PowerRule.java index 46308dc..a00ccf1 100644 --- a/src/main/java/calculator/util/rules/PowerRule.java +++ b/src/main/java/calculator/util/rules/PowerRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; /** * POWER RULE @@ -45,7 +45,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.pow(this.terms.get(1).evaluate(dims), this.terms.get(0).evaluate(dims)); } diff --git a/src/main/java/calculator/util/rules/ProductRule.java b/src/main/java/calculator/util/rules/ProductRule.java index 024698a..060c789 100644 --- a/src/main/java/calculator/util/rules/ProductRule.java +++ b/src/main/java/calculator/util/rules/ProductRule.java @@ -6,8 +6,8 @@ import calculator.util.ast.Tokenizer; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; import java.util.stream.Collectors; /** @@ -58,7 +58,7 @@ public ProductRule addTerm(Term t) { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return this.terms.stream().map(x -> x.evaluate(dims)).reduce((x, y) -> x * y).get(); } diff --git a/src/main/java/calculator/util/rules/QuotientRule.java b/src/main/java/calculator/util/rules/QuotientRule.java index 6f402dd..a4c5cdd 100644 --- a/src/main/java/calculator/util/rules/QuotientRule.java +++ b/src/main/java/calculator/util/rules/QuotientRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; /** * QUOTIENT RULE @@ -51,7 +51,7 @@ public Term getDerivative() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { double numeratorEvaluated = this.terms.get(NUMERATOR_POS).evaluate(dims); double denominatorEvaluated = this.terms.get(DENOM_POS).evaluate(dims); return numeratorEvaluated / denominatorEvaluated; diff --git a/src/main/java/calculator/util/rules/Rule.java b/src/main/java/calculator/util/rules/Rule.java index a7b8ae4..3dfac17 100644 --- a/src/main/java/calculator/util/rules/Rule.java +++ b/src/main/java/calculator/util/rules/Rule.java @@ -1,40 +1,39 @@ package calculator.util.rules; import calculator.util.terms.Term; - -import java.util.List; +import com.google.common.collect.ImmutableList; public abstract sealed class Rule extends Term permits DerivationRule, TrigRule { - /** - * gets the result of the expression using {@link calculator.util.rules.DerivationRule#getResult(List)} - * and negates it if necessary. - * - * @param dims values to use for the variables - * @return the result - */ - public double evaluate(List dims){ - double toReturn = this.getResult(dims); - if(this.negative){ - toReturn = toReturn * -1; - } - return toReturn; + /** + * gets the result of the expression using {@link Rule#getResult(ImmutableList)} and negates it if + * necessary. + * + * @param dims values to use for the variables + * @return the result + */ + public double evaluate(ImmutableList dims) { + double toReturn = this.getResult(dims); + if (this.negative) { + toReturn = toReturn * -1; } + return toReturn; + } - /** - * getResult - * - * returns the result after evaluating the expression. Does not account for the negative flag and that is why this - * method is not intended to be called publicly. - * - * @param dims values to use for the variables - * @return evaluated expression for dims - */ - abstract double getResult(List dims); + /** + * getResult + * + *

returns the result after evaluating the expression. Does not account for the negative flag + * and that is why this method is not intended to be called publicly. + * + * @param dims values to use for the variables + * @return evaluated expression for dims + */ + abstract double getResult(ImmutableList dims); - @Override - public abstract Term getDerivative(); + @Override + public abstract Term getDerivative(); - @Override - public abstract String toString(); + @Override + public abstract String toString(); } diff --git a/src/main/java/calculator/util/rules/SecRule.java b/src/main/java/calculator/util/rules/SecRule.java index e1c78b1..11f6547 100644 --- a/src/main/java/calculator/util/rules/SecRule.java +++ b/src/main/java/calculator/util/rules/SecRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class SecRule extends TrigRule { @@ -25,7 +25,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 1.0 / Math.cos(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/SechRule.java b/src/main/java/calculator/util/rules/SechRule.java index 55fa11a..b0b86a2 100644 --- a/src/main/java/calculator/util/rules/SechRule.java +++ b/src/main/java/calculator/util/rules/SechRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class SechRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return 0; } } diff --git a/src/main/java/calculator/util/rules/SinRule.java b/src/main/java/calculator/util/rules/SinRule.java index 5ed255e..8a08649 100644 --- a/src/main/java/calculator/util/rules/SinRule.java +++ b/src/main/java/calculator/util/rules/SinRule.java @@ -4,8 +4,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class SinRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.sin(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/SinhRule.java b/src/main/java/calculator/util/rules/SinhRule.java index 32f7c46..94996d6 100644 --- a/src/main/java/calculator/util/rules/SinhRule.java +++ b/src/main/java/calculator/util/rules/SinhRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class SinhRule extends TrigRule { @@ -23,7 +23,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.sinh(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/TanRule.java b/src/main/java/calculator/util/rules/TanRule.java index f70f003..245ba5a 100644 --- a/src/main/java/calculator/util/rules/TanRule.java +++ b/src/main/java/calculator/util/rules/TanRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class TanRule extends TrigRule { @@ -24,7 +24,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.tan(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/rules/TanhRule.java b/src/main/java/calculator/util/rules/TanhRule.java index 39e40be..52081d8 100644 --- a/src/main/java/calculator/util/rules/TanhRule.java +++ b/src/main/java/calculator/util/rules/TanhRule.java @@ -3,8 +3,8 @@ import static calculator.util.rules.RuleFactory.*; import calculator.util.terms.Term; +import com.google.common.collect.ImmutableList; import java.util.LinkedList; -import java.util.List; public final class TanhRule extends TrigRule { @@ -23,7 +23,7 @@ public Term getDerivPart() { } @Override - public double getResult(List dims) { + public double getResult(ImmutableList dims) { return Math.tanh(this.t.evaluate(dims)); } } diff --git a/src/main/java/calculator/util/terms/Term.java b/src/main/java/calculator/util/terms/Term.java index 9d5c372..15c5815 100644 --- a/src/main/java/calculator/util/terms/Term.java +++ b/src/main/java/calculator/util/terms/Term.java @@ -1,6 +1,6 @@ package calculator.util.terms; -import java.util.List; +import com.google.common.collect.ImmutableList; public class Term { private int num; @@ -52,7 +52,7 @@ public Term flipSign() { * @param dims evaluation dims * @return the evaluated expression */ - public double evaluate(List dims) { + public double evaluate(ImmutableList dims) { return this.getNum(); } diff --git a/src/main/java/calculator/util/terms/Variable.java b/src/main/java/calculator/util/terms/Variable.java index 3cd9e67..05681bf 100644 --- a/src/main/java/calculator/util/terms/Variable.java +++ b/src/main/java/calculator/util/terms/Variable.java @@ -2,7 +2,7 @@ package calculator.util.terms; import calculator.util.token.AbstractMath; -import java.util.List; +import com.google.common.collect.ImmutableList; public class Variable extends Term implements AbstractMath { @@ -23,7 +23,7 @@ public Term getTermFromOp(Term one, Term two) { return this; } - public double evaluate(List dims) { + public double evaluate(ImmutableList dims) { return (this.negative ? dims.get(0) * -1 : dims.get(0)); } diff --git a/src/test/java/DerivativeTester.java b/src/test/java/DerivativeTester.java index 42f1146..f92bc41 100644 --- a/src/test/java/DerivativeTester.java +++ b/src/test/java/DerivativeTester.java @@ -1,8 +1,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import calculator.service.CalculatorService; +import com.google.common.collect.ImmutableList; import java.util.Collections; -import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,7 +26,7 @@ public class DerivativeTester { @DisplayName("Single Derivative Testing") @ParameterizedTest(name = "{0}") @MethodSource("singleVariable") - public void test1(String inputString, List evaluationPoints, double expected) { + public void test1(String inputString, ImmutableList evaluationPoints, double expected) { double result = (calculatorServiceImpl.evaluateDerivative(inputString, evaluationPoints)).result; assertEquals(expected, result); @@ -36,11 +36,13 @@ private static Stream singleVariable() { return Stream.of( // first test the polynomials Arguments.of(" 1 ", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), - Arguments.of(" - 1 ", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), + Arguments.of( + " - 1 ", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), Arguments.of("1", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), Arguments.of("10", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), Arguments.of("-100", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), - Arguments.of("1000 + 10000 - 1 + 0", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), + Arguments.of( + "1000 + 10000 - 1 + 0", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), Arguments.of("0", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 0.0), Arguments.of("x", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 1.0), Arguments.of("- x", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), -1.0), @@ -54,7 +56,8 @@ private static Stream singleVariable() { Arguments.of("2 * x", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 2.0), Arguments.of("2x - 3x", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), -1.0), Arguments.of("2x + 3x - 16", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 5.0), - Arguments.of("- 2x + 3x - 16", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 1.0), + Arguments.of( + "- 2x + 3x - 16", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 1.0), Arguments.of("- 2x - - 3x", createSingleList(DOES_NOT_AFFECT_DERIVATIVE_CALCULATION), 1.0), Arguments.of("2x + 3x * 5x", createSingleList(1), 32.0), Arguments.of("2x * 3x * 5x", createSingleList(2), 360.0), @@ -119,17 +122,19 @@ private static Stream singleVariable() { createSingleList(3), (1 + Math.sin(3.0)) * Math.pow(1.0 / Math.cos(Math.cos(3.0) - 3.0), 2)), Arguments.of( - "14x^3 + 135x - sin x + cos(x^4)", - createSingleList(3), - (-4.0 * Math.pow(3.0, 3) * Math.sin(Math.pow(3.0, 4))) - Math.cos(3.0) + (42 * Math.pow(3.0, 2)) + 135), + "14x^3 + 135x - sin x + cos(x^4)", + createSingleList(3), + (-4.0 * Math.pow(3.0, 3) * Math.sin(Math.pow(3.0, 4))) + - Math.cos(3.0) + + (42 * Math.pow(3.0, 2)) + + 135), Arguments.of( - "135x - sin x + cos(x^4)", - createSingleList(3), - (-4.0 * Math.pow(3.0, 3) * Math.sin(Math.pow(3.0, 4))) - Math.cos(3.0) + 135) - ); + "135x - sin x + cos(x^4)", + createSingleList(3), + (-4.0 * Math.pow(3.0, 3) * Math.sin(Math.pow(3.0, 4))) - Math.cos(3.0) + 135)); } - private static List createSingleList(Integer xVal) { - return Collections.singletonList(xVal); + private static ImmutableList createSingleList(Integer xVal) { + return ImmutableList.copyOf(Collections.singletonList(xVal)); } } diff --git a/src/test/java/ExpressionTester.java b/src/test/java/ExpressionTester.java index 4703d1f..3bfe2d1 100644 --- a/src/test/java/ExpressionTester.java +++ b/src/test/java/ExpressionTester.java @@ -1,6 +1,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import calculator.service.CalculatorService; +import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -25,7 +26,7 @@ public class ExpressionTester { @ParameterizedTest(name = "{0}") @MethodSource("expression") public void test(String inputString, double expected) { - double result = calculatorServiceImpl.evaluateExpression(inputString); + double result = calculatorServiceImpl.evaluateExpression(inputString, ImmutableList.of()); assertEquals(result, expected); }