From 9ffbc5d4a13a7157c33f9fcc7d845712bc330480 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Tue, 4 Feb 2025 23:18:43 -0500 Subject: [PATCH 1/4] Add logic to annotate entrypoint methods in codeanalyzer output. This attempts to address the feature request #86 Signed-off-by: Rahul Krishna --- build.gradle | 2 +- gradle.properties | 2 +- src/main/java/com/ibm/cldk/SymbolTable.java | 487 ++- .../com/ibm/cldk/entities/CRUDOperation.java | 39 + .../java/com/ibm/cldk/entities/Callable.java | 3 + src/main/java/com/ibm/cldk/entities/Type.java | 1 + .../java/com/ibm/cldk/utils/BuildProject.java | 6 +- .../utils/annotations/NotImplemented.java | 12 + .../EntrypointTestApp/analysis.json | 2828 +++++++++++++++++ .../EntrypointTestApp/build.gradle | 37 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../EntrypointTestApp/gradlew | 244 ++ .../EntrypointTestApp/gradlew.bat | 92 + .../EntrypointTestApp/settings.gradle | 0 .../entrypoints/SpringBootApplication.java | 0 .../org/entrypoints/camel/CamelProcessor.java | 16 + .../entrypoints/camel/CustomRouteBuilder.java | 21 + .../entrypoints/camel/MessageConsumer.java | 15 + .../entrypoints/camel/RestRouteBuilder.java | 19 + .../jakarta/JavaEEEntrypoints.java | 242 ++ .../org/entrypoints/jaxrs/JaxRsResource.java | 17 + .../spring/CustomApplicationRunner.java | 14 + .../spring/CustomCommandLineRunner.java | 13 + .../spring/SpringBootController.java | 14 + .../entrypoints/spring/SpringController.java | 13 + .../entrypoints/spring/WebSecurityConfig.java | 27 + .../struts/InterceptorExample.java | 15 + .../org/entrypoints/struts/UserAction.java | 24 + 28 files changed, 4028 insertions(+), 181 deletions(-) create mode 100644 src/main/java/com/ibm/cldk/entities/CRUDOperation.java create mode 100644 src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/analysis.json create mode 100644 src/test/resources/test-applications/EntrypointTestApp/build.gradle create mode 100644 src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties create mode 100755 src/test/resources/test-applications/EntrypointTestApp/gradlew create mode 100644 src/test/resources/test-applications/EntrypointTestApp/gradlew.bat create mode 100644 src/test/resources/test-applications/EntrypointTestApp/settings.gradle create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java create mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java diff --git a/build.gradle b/build.gradle index a979aa27..a3e91d4d 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ plugins { // Apply the application plugin to add support for building a CLI application in Java. id 'eclipse' id 'application' - id 'org.graalvm.buildtools.native' version '0.9.28' + id 'org.graalvm.buildtools.native' version '0.10.4' } // Get the version from the property file first diff --git a/gradle.properties b/gradle.properties index fb7cb539..29e611a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=2.0.2 \ No newline at end of file +version=2.1.0-dev \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index a589ec7c..97a4535c 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -6,14 +6,18 @@ import com.github.javaparser.Problem; import com.github.javaparser.ast.AccessSpecifier; import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.Node; import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.nodeTypes.NodeWithName; import com.github.javaparser.ast.stmt.*; +import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.ReferenceType; import com.github.javaparser.ast.type.Type; +import com.github.javaparser.resolution.UnsolvedSymbolException; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; +import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; import com.github.javaparser.resolution.types.ResolvedType; import com.github.javaparser.symbolsolver.JavaSymbolSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; @@ -28,7 +32,8 @@ import org.apache.commons.lang3.tuple.Pair; import java.io.IOException; -import java.nio.file.*; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -99,109 +104,220 @@ private static JavaCompilationUnit processCompilationUnit(CompilationUnit parseR cUnit.setImports(parseResult.getImports().stream().map(NodeWithName::getNameAsString).collect(Collectors.toList())); // create array node for type declarations - cUnit.setTypeDeclarations(parseResult.findAll(TypeDeclaration.class) - .stream().filter(typeDecl -> typeDecl.getFullyQualifiedName().isPresent()) - .map(typeDecl -> { - // get type name and initialize the type object - String typeName = typeDecl.getFullyQualifiedName().get().toString(); - com.ibm.cldk.entities.Type typeNode = new com.ibm.cldk.entities.Type(); - - if (typeDecl instanceof ClassOrInterfaceDeclaration) { - ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDecl; - - // Add interfaces implemented by class - typeNode.setImplementsList(classDecl.getImplementedTypes().stream().map(SymbolTable::resolveType) - .collect(Collectors.toList())); - - // Add class modifiers - typeNode.setModifiers(classDecl.getModifiers().stream().map(m -> m.toString().strip()) - .collect(Collectors.toList())); - - // Add class annotations - typeNode.setAnnotations(classDecl.getAnnotations().stream().map(a -> a.toString().strip()) - .collect(Collectors.toList())); - - // add booleans indicating interfaces and inner/local classes - typeNode.setInterface(classDecl.isInterface()); - typeNode.setInnerClass(classDecl.isInnerClass()); - typeNode.setLocalClass(classDecl.isLocalClassDeclaration()); - - // Add extends - typeNode.setExtendsList(classDecl.getExtendedTypes().stream() - .map(SymbolTable::resolveType) - .collect(Collectors.toList())); - - } else if (typeDecl instanceof EnumDeclaration) { - EnumDeclaration enumDecl = (EnumDeclaration) typeDecl; - - // Add interfaces implemented by enum - typeNode.setImplementsList(enumDecl.getImplementedTypes().stream().map(SymbolTable::resolveType) - .collect(Collectors.toList())); - - // Add enum modifiers - typeNode.setModifiers(enumDecl.getModifiers().stream().map(m -> m.toString().strip()) - .collect(Collectors.toList())); - - // Add enum annotations - typeNode.setAnnotations(enumDecl.getAnnotations().stream().map(a -> a.toString().strip()) - .collect(Collectors.toList())); - - // Add enum constants - typeNode.setEnumConstants(enumDecl.getEntries().stream() - .map(SymbolTable::processEnumConstantDeclaration).collect(Collectors.toList())); - - } else { - // TODO: handle AnnotationDeclaration, RecordDeclaration - // set the common type attributes only - Log.warn("Found unsupported type declaration: " + typeDecl.toString()); - typeNode = new com.ibm.cldk.entities.Type(); - } + cUnit.setTypeDeclarations(parseResult.findAll(TypeDeclaration.class).stream().filter(typeDecl -> typeDecl.getFullyQualifiedName().isPresent()).map(typeDecl -> { + // get type name and initialize the type object + String typeName = typeDecl.getFullyQualifiedName().get().toString(); + com.ibm.cldk.entities.Type typeNode = new com.ibm.cldk.entities.Type(); + + if (typeDecl instanceof ClassOrInterfaceDeclaration) { + ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDecl; + + // Add interfaces implemented by class + typeNode.setImplementsList(classDecl.getImplementedTypes().stream().map(SymbolTable::resolveType).collect(Collectors.toList())); + + // Add class modifiers + typeNode.setModifiers(classDecl.getModifiers().stream().map(m -> m.toString().strip()).collect(Collectors.toList())); + + // Add class annotations + typeNode.setAnnotations(classDecl.getAnnotations().stream().map(a -> a.toString().strip()).collect(Collectors.toList())); + + // add booleans indicating interfaces and inner/local classes + typeNode.setInterface(classDecl.isInterface()); + typeNode.setInnerClass(classDecl.isInnerClass()); + typeNode.setLocalClass(classDecl.isLocalClassDeclaration()); + + // Add extends + typeNode.setExtendsList(classDecl.getExtendedTypes().stream().map(SymbolTable::resolveType).collect(Collectors.toList())); + + } else if (typeDecl instanceof EnumDeclaration) { + EnumDeclaration enumDecl = (EnumDeclaration) typeDecl; + + // Add interfaces implemented by enum + typeNode.setImplementsList(enumDecl.getImplementedTypes().stream().map(SymbolTable::resolveType).collect(Collectors.toList())); + + // Add enum modifiers + typeNode.setModifiers(enumDecl.getModifiers().stream().map(m -> m.toString().strip()).collect(Collectors.toList())); + + // Add enum annotations + typeNode.setAnnotations(enumDecl.getAnnotations().stream().map(a -> a.toString().strip()).collect(Collectors.toList())); + + // Add enum constants + typeNode.setEnumConstants(enumDecl.getEntries().stream().map(SymbolTable::processEnumConstantDeclaration).collect(Collectors.toList())); + + } else { + // TODO: handle AnnotationDeclaration, RecordDeclaration + // set the common type attributes only + Log.warn("Found unsupported type declaration: " + typeDecl.toString()); + typeNode = new com.ibm.cldk.entities.Type(); + } /* set common attributes of types that available in type declarations: is nested type, is class or interface declaration, is enum declaration, comments, parent class, callable declarations, field declarations */ - // Set fields indicating nested, class/interface, enum, annotation, and record types - typeNode.setNestedType(typeDecl.isNestedType()); - typeNode.setClassOrInterfaceDeclaration(typeDecl.isClassOrInterfaceDeclaration()); - typeNode.setEnumDeclaration(typeDecl.isEnumDeclaration()); - typeNode.setAnnotationDeclaration(typeDecl.isAnnotationDeclaration()); - typeNode.setRecordDeclaration(typeDecl.isRecordDeclaration()); - - // Add class comment - typeNode.setComment(typeDecl.getComment().isPresent() ? typeDecl.getComment().get().asString() : ""); - - // add parent class (for nested type declarations) - typeNode.setParentType(typeDecl.getParentNode().get() instanceof TypeDeclaration - ? ((TypeDeclaration>) typeDecl.getParentNode().get()).getFullyQualifiedName().get() : ""); - - typeNode.setNestedTypeDeclarations(typeDecl.findAll(TypeDeclaration.class).stream() - .filter(typ -> typ.isClassOrInterfaceDeclaration() || typ.isEnumDeclaration()) - .filter(typ -> typ.getParentNode().isPresent() && typ.getParentNode().get() == typeDecl) - .map(typ -> typ.getFullyQualifiedName().get().toString()).collect(Collectors.toList())); - - // Add information about declared fields (filtering to fields declared in the - // type, not in a nested type) - typeNode.setFieldDeclarations(typeDecl.findAll(FieldDeclaration.class).stream() - .filter(f -> f.getParentNode().isPresent() && f.getParentNode().get() == typeDecl) - .map(SymbolTable::processFieldDeclaration).collect(Collectors.toList())); - List fieldNames = new ArrayList<>(); - typeNode.getFieldDeclarations().stream().map(fd -> fd.getVariables()).forEach(fieldNames::addAll); - - // Add information about declared methods (filtering to methods declared in the class, not in a nested class) - typeNode.setCallableDeclarations(typeDecl.findAll(CallableDeclaration.class).stream() - .filter(c -> c.getParentNode().isPresent() && c.getParentNode().get() == typeDecl) - .map(meth -> { - Pair callableDeclaration = processCallableDeclaration(meth, fieldNames, typeName, parseResult.getStorage().map(s -> s.getPath().toString()).orElse("")); - declaredMethodsAndConstructors.put(typeName, callableDeclaration.getLeft(), callableDeclaration.getRight()); - return callableDeclaration; - }).collect(Collectors.toMap(p -> p.getLeft(), p -> p.getRight()))); - - return Pair.of(typeName, typeNode); - }).collect(Collectors.toMap(p -> p.getLeft(), p -> p.getRight()))); + // Set fields indicating nested, class/interface, enum, annotation, and record types + typeNode.setNestedType(typeDecl.isNestedType()); + typeNode.setClassOrInterfaceDeclaration(typeDecl.isClassOrInterfaceDeclaration()); + typeNode.setEnumDeclaration(typeDecl.isEnumDeclaration()); + typeNode.setAnnotationDeclaration(typeDecl.isAnnotationDeclaration()); + typeNode.setRecordDeclaration(typeDecl.isRecordDeclaration()); + + // Add class comment + typeNode.setComment(typeDecl.getComment().isPresent() ? typeDecl.getComment().get().asString() : ""); + + // add parent class (for nested type declarations) + typeNode.setParentType(typeDecl.getParentNode().get() instanceof TypeDeclaration ? ((TypeDeclaration>) typeDecl.getParentNode().get()).getFullyQualifiedName().get() : ""); + + typeNode.setNestedTypeDeclarations(typeDecl.findAll(TypeDeclaration.class).stream().filter(typ -> typ.isClassOrInterfaceDeclaration() || typ.isEnumDeclaration()).filter(typ -> typ.getParentNode().isPresent() && typ.getParentNode().get() == typeDecl).map(typ -> typ.getFullyQualifiedName().get().toString()).collect(Collectors.toList())); + + // Add information about declared fields (filtering to fields declared in the + // type, not in a nested type) + typeNode.setFieldDeclarations(typeDecl.findAll(FieldDeclaration.class).stream().filter(f -> f.getParentNode().isPresent() && f.getParentNode().get() == typeDecl).map(SymbolTable::processFieldDeclaration).collect(Collectors.toList())); + List fieldNames = new ArrayList<>(); + typeNode.getFieldDeclarations().stream().map(fd -> fd.getVariables()).forEach(fieldNames::addAll); + + // Add information about declared methods (filtering to methods declared in the class, not in a nested class) + typeNode.setCallableDeclarations(typeDecl.findAll(CallableDeclaration.class).stream().filter(c -> c.getParentNode().isPresent() && c.getParentNode().get() == typeDecl).map(meth -> { + Pair callableDeclaration = processCallableDeclaration(meth, fieldNames, typeName, parseResult.getStorage().map(s -> s.getPath().toString()).orElse("")); + declaredMethodsAndConstructors.put(typeName, callableDeclaration.getLeft(), callableDeclaration.getRight()); + return callableDeclaration; + }).collect(Collectors.toMap(p -> p.getLeft(), p -> p.getRight()))); + + // Add information about if the TypeNode is an entry point class + typeNode.setEntryPointClass(isEntryPointClass(typeDecl)); + + return Pair.of(typeName, typeNode); + + + }).collect(Collectors.toMap(p -> p.getLeft(), p -> p.getRight()))); return cUnit; } + private static boolean isEntryPointClass(TypeDeclaration typeDecl) { + return isSpringEntrypointClass(typeDecl) || isStrutsEntryPointClass(typeDecl) || isCamelEntryPointClass(typeDecl) || isJaxRSEntrypointClass(typeDecl) || isJakartaServletEntryPointClass(typeDecl); + + } + + private static boolean isSpringEntrypointClass(TypeDeclaration typeDeclaration) { + List annotations = typeDeclaration.getAnnotations(); + for (AnnotationExpr annotation : annotations) { + // Existing checks + if (annotation.getNameAsString().contains("RestController") || annotation.getNameAsString().contains("Controller") || annotation.getNameAsString().contains("HandleInterceptor") || annotation.getNameAsString().contains("HandlerInterceptor")) { + return true; + } + + // Spring Boot specific checks + if (annotation.getNameAsString().contains("SpringBootApplication") || annotation.getNameAsString().contains("Configuration") || annotation.getNameAsString().contains("Component") || annotation.getNameAsString().contains("Service") || annotation.getNameAsString().contains("Repository")) { + return true; + } + } + + // Check if class implements CommandLineRunner or ApplicationRunner + if (typeDeclaration instanceof ClassOrInterfaceDeclaration) { + ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDeclaration; + for (ClassOrInterfaceType implementedType : classDecl.getImplementedTypes()) { + String typeName = implementedType.getNameAsString(); + if (typeName.equals("CommandLineRunner") || typeName.equals("ApplicationRunner")) { + return true; + } + } + } + + return false; + } + + private static boolean isJaxRSEntrypointClass(TypeDeclaration typeDeclaration) { + List callableDeclarations = typeDeclaration.findAll(CallableDeclaration.class); + for (CallableDeclaration callableDeclaration : callableDeclarations) { + if (callableDeclaration.getAnnotations().stream().anyMatch(a -> a.toString().contains("POST")) || callableDeclaration.getAnnotations().stream().anyMatch(a -> a.toString().contains("PUT")) || callableDeclaration.getAnnotations().stream().anyMatch(a -> a.toString().contains("GET")) || callableDeclaration.getAnnotations().stream().anyMatch(a -> a.toString().contains("HEAD")) || callableDeclaration.getAnnotations().stream().anyMatch(a -> a.toString().contains("DELETE"))) { + return true; + } + } + + return false; + } + + private static boolean isStrutsEntryPointClass(TypeDeclaration typeDeclaration) { + if (!(typeDeclaration instanceof ClassOrInterfaceDeclaration)) { + return false; + } + + ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDeclaration; + + // Check class-level Struts annotations + if (classDecl.getAnnotations().stream().anyMatch(a -> a.getNameAsString().contains("Action") || a.getNameAsString().contains("Namespace") || a.getNameAsString().contains("InterceptorRef"))) { + return true; + } + + // Check if extends ActionSupport or implements Interceptor + try { + ResolvedReferenceTypeDeclaration resolved = classDecl.resolve(); + return resolved.getAllAncestors().stream().anyMatch(ancestor -> { + String name = ancestor.getQualifiedName(); + return name.contains("ActionSupport") || name.contains("Interceptor"); + }); + } catch (UnsolvedSymbolException e) { + Log.warn("Could not resolve class: " + e.getMessage()); + } + + return false; + } + + private static boolean isCamelEntryPointClass(TypeDeclaration typeDeclaration) { + if (!(typeDeclaration instanceof ClassOrInterfaceDeclaration)) { + return false; + } + + ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDeclaration; + + // Check Camel class annotations + if (classDecl.getAnnotations().stream().anyMatch(a -> a.getNameAsString().contains("Component"))) { + return true; + } + + // Check Camel parent classes and interfaces + try { + ResolvedReferenceTypeDeclaration resolved = classDecl.resolve(); + return resolved.getAllAncestors().stream().anyMatch(ancestor -> { + String name = ancestor.getQualifiedName(); + return name.contains("RouteBuilder") || name.contains("Processor") || name.contains("Producer") || name.contains("Consumer"); + }); + } catch (UnsolvedSymbolException e) { + Log.warn("Could not resolve class: " + e.getMessage()); + } + + return false; + } + + /** + * Checks if the given class is a Jakarta Servlet entry point class. + * + * @param typeDecl Type declaration to check + * @return True if the class is a Jakarta Servlet entry point class, false otherwise + */ + private static boolean isJakartaServletEntryPointClass(TypeDeclaration typeDecl) { + if (!(typeDecl instanceof ClassOrInterfaceDeclaration)) { + return false; + } + + ClassOrInterfaceDeclaration classDecl = (ClassOrInterfaceDeclaration) typeDecl; + + // Check annotations + if (classDecl.getAnnotations().stream().anyMatch(a -> a.getNameAsString().contains("WebServlet") || a.getNameAsString().contains("WebFilter") || a.getNameAsString().contains("WebListener") || a.getNameAsString().contains("ServerEndpoint") || a.getNameAsString().contains("MessageDriven") || a.getNameAsString().contains("WebService"))) { + return true; + } + + // Check types + return classDecl.getExtendedTypes().stream() + .map(ClassOrInterfaceType::getNameAsString) + .anyMatch(name -> name.contains("HttpServlet") || name.contains("GenericServlet")) + || classDecl.getImplementedTypes().stream().map( + ClassOrInterfaceType::asString).anyMatch(name -> name.contains("ServletContextListener") + || name.contains("HttpSessionListener") + || name.contains("ServletRequestListener") + || name.contains("MessageListener")); + } + /** * Process enum constant declaration. * @@ -215,8 +331,7 @@ private static EnumConstant processEnumConstantDeclaration(EnumConstantDeclarati enumConstant.setName(enumConstDecl.getNameAsString()); // add enum constant arguments - enumConstant.setArguments(enumConstDecl.getArguments().stream().map(a -> a.toString()) - .collect(Collectors.toList())); + enumConstant.setArguments(enumConstDecl.getArguments().stream().map(a -> a.toString()).collect(Collectors.toList())); return enumConstant; } @@ -228,7 +343,6 @@ private static EnumConstant processEnumConstantDeclaration(EnumConstantDeclarati */ private static ParameterInCallable processParameterDeclaration(Parameter paramDecl) { ParameterInCallable parameter = new ParameterInCallable(); - parameter.setType(resolveType(paramDecl.getType())); parameter.setName(paramDecl.getName().toString()); parameter.setAnnotations(paramDecl.getAnnotations().stream().map(a -> a.toString().strip()).collect(Collectors.toList())); @@ -245,8 +359,7 @@ private static ParameterInCallable processParameterDeclaration(Parameter paramDe * @return Callable object containing extracted information */ @SuppressWarnings("unchecked") - private static Pair processCallableDeclaration(CallableDeclaration callableDecl, - List classFields, String typeName, String filePath) { + private static Pair processCallableDeclaration(CallableDeclaration callableDecl, List classFields, String typeName, String filePath) { Callable callableNode = new Callable(); // Set file path @@ -265,23 +378,18 @@ private static Pair processCallableDeclaration(CallableDeclara callableNode.setModifiers((List) callableDecl.getModifiers().stream().map(mod -> mod.toString().strip()).collect(Collectors.toList())); // add exceptions declared in "throws" clause - callableNode.setThrownExceptions( - ((NodeList) callableDecl.getThrownExceptions()) - .stream() - .map(SymbolTable::resolveType) - .collect(Collectors.toList())); + callableNode.setThrownExceptions(((NodeList) callableDecl.getThrownExceptions()).stream().map(SymbolTable::resolveType).collect(Collectors.toList())); // add the complete declaration string, including modifiers, throws, and // parameter names - callableNode.setDeclaration(callableDecl - .getDeclarationAsString(true, true, true) - .strip().replaceAll("//.*\n", "")); + callableNode.setDeclaration(callableDecl.getDeclarationAsString(true, true, true).strip().replaceAll("//.*\n", "")); // add information about callable parameters: for each parameter, type, name, // annotations, // modifiers callableNode.setParameters((List) callableDecl.getParameters().stream().map(param -> processParameterDeclaration((Parameter) param)).collect(Collectors.toList())); + callableNode.setEntryPoint(isEntryPointMethod(callableDecl)); // A method declaration may not have a body if it is an abstract method. A // constructor always // has a body. So, we need to check if the body is present before processing it @@ -291,8 +399,7 @@ private static Pair processCallableDeclaration(CallableDeclara // Same as above, a constructor declaration may not have a return type // and method declaration always has a return type. - callableNode.setReturnType((callableDecl instanceof MethodDeclaration) - ? resolveType(((MethodDeclaration) callableDecl).getType()) : null); + callableNode.setReturnType((callableDecl instanceof MethodDeclaration) ? resolveType(((MethodDeclaration) callableDecl).getType()) : null); callableNode.setConstructor(callableDecl instanceof ConstructorDeclaration); callableNode.setStartLine(callableDecl.getRange().isPresent() ? callableDecl.getRange().get().begin.line : -1); @@ -309,6 +416,70 @@ private static Pair processCallableDeclaration(CallableDeclara return Pair.of(callableSignature, callableNode); } + private static boolean isEntryPointMethod(CallableDeclaration callableDecl) { + return isServletEntrypointMethod(callableDecl) || isJaxRsEntrypointMethod(callableDecl) || isSpringEntrypointMethod(callableDecl) | isStrutsEntryPointMethod(callableDecl); + } + + private static boolean isServletEntrypointMethod(CallableDeclaration callableDecl) { + return ((NodeList) callableDecl.getParameters()).stream() + .anyMatch(parameter -> parameter.getType().asString().contains("HttpServletRequest") || + parameter.getType().asString().contains("HttpServletResponse")); + } + + private static boolean isJaxRsEntrypointMethod(CallableDeclaration callableDecl) { + return callableDecl.getAnnotations().stream().anyMatch(a -> a.toString().contains("POST") || a.toString().contains("PUT") || a.toString().contains("GET") || a.toString().contains("HEAD") || a.toString().contains("DELETE")); + } + + private static boolean isSpringEntrypointMethod(CallableDeclaration callableDecl) { + return callableDecl.getAnnotations().stream().anyMatch(a -> + a.toString().contains("GetMapping") || + a.toString().contains("PostMapping") || + a.toString().contains("PutMapping") || + a.toString().contains("DeleteMapping") || + a.toString().contains("PatchMapping") || + a.toString().contains("RequestMapping") || + a.toString().contains("EventListener") || + a.toString().contains("Scheduled") || + a.toString().contains("KafkaListener") || + a.toString().contains("RabbitListener") || + a.toString().contains("JmsListener") || + a.toString().contains("PreAuthorize") || + a.toString().contains("PostAuthorize") || + a.toString().contains("PostConstruct") || + a.toString().contains("PreDestroy") || + a.toString().contains("Around") || + a.toString().contains("Before") || + a.toString().contains("After") || + a.toString().contains("JobScope") || + a.toString().contains("StepScope") + ); + } + + private static boolean isStrutsEntryPointMethod(CallableDeclaration callableDecl) { + // First check if this method is in a Struts Action class + Optional parentNode = callableDecl.getParentNode(); + if (!parentNode.isPresent() || !(parentNode.get() instanceof ClassOrInterfaceDeclaration)) { + return false; + } + + ClassOrInterfaceDeclaration parentClass = (ClassOrInterfaceDeclaration) parentNode.get(); + if (parentClass.getExtendedTypes().stream() + .map(ClassOrInterfaceType::asString) + .noneMatch(type -> type.contains("ActionSupport") || type.contains("Action"))) + return false; + + return callableDecl.getAnnotations().stream().anyMatch(a -> + a.toString().contains("Action") || + a.toString().contains("Actions") || + a.toString().contains("ValidationMethod") || + a.toString().contains("InputConfig") || + a.toString().contains("BeforeResult") || + a.toString().contains("After") || + a.toString().contains("Before") || + a.toString().contains("Result") || + a.toString().contains("Results") + ) || callableDecl.getNameAsString().equals("execute"); // Check for execute() method which is the default action method of the Action class + } /** * Computes cyclomatic complexity for the given callable. * @@ -317,13 +488,8 @@ private static Pair processCallableDeclaration(CallableDeclara */ private static int getCyclomaticComplexity(CallableDeclaration callableDeclaration) { int ifStmtCount = callableDeclaration.findAll(IfStmt.class).size(); - int loopStmtCount = callableDeclaration.findAll(DoStmt.class).size() - + callableDeclaration.findAll(ForStmt.class).size() - + callableDeclaration.findAll(ForEachStmt.class).size() - + callableDeclaration.findAll(WhileStmt.class).size(); - int switchCaseCount = callableDeclaration.findAll(SwitchStmt.class).stream() - .map(stmt -> stmt.getEntries().size()) - .reduce(0, Integer::sum); + int loopStmtCount = callableDeclaration.findAll(DoStmt.class).size() + callableDeclaration.findAll(ForStmt.class).size() + callableDeclaration.findAll(ForEachStmt.class).size() + callableDeclaration.findAll(WhileStmt.class).size(); + int switchCaseCount = callableDeclaration.findAll(SwitchStmt.class).stream().map(stmt -> stmt.getEntries().size()).reduce(0, Integer::sum); int conditionalExprCount = callableDeclaration.findAll(ConditionalExpr.class).size(); int catchClauseCount = callableDeclaration.findAll(CatchClause.class).size(); return ifStmtCount + loopStmtCount + switchCaseCount + conditionalExprCount + catchClauseCount + 1; @@ -372,25 +538,16 @@ private static Field processFieldDeclaration(FieldDeclaration fieldDecl) { */ private static List getReferencedTypes(Optional blockStmt) { Set referencedTypes = new HashSet<>(); - blockStmt.ifPresent(bs -> bs.findAll(VariableDeclarator.class) - .stream() - .filter(vd -> vd.getType().isClassOrInterfaceType()) - .map(vd -> resolveType(vd.getType())) - .forEach(referencedTypes::add)); + blockStmt.ifPresent(bs -> bs.findAll(VariableDeclarator.class).stream().filter(vd -> vd.getType().isClassOrInterfaceType()).map(vd -> resolveType(vd.getType())).forEach(referencedTypes::add)); // add types of accessed fields to the set of referenced types - blockStmt.ifPresent(bs -> bs.findAll(FieldAccessExpr.class) - .stream() - .filter(faExpr -> faExpr.getParentNode().isPresent() && !(faExpr.getParentNode().get() instanceof FieldAccessExpr)) - .map(faExpr -> { - if (faExpr.getParentNode().isPresent() && faExpr.getParentNode().get() instanceof CastExpr) { - return resolveType(((CastExpr) faExpr.getParentNode().get()).getType()); - } else { - return resolveExpression(faExpr); - } - }) - .filter(type -> !type.isEmpty()) - .forEach(referencedTypes::add)); + blockStmt.ifPresent(bs -> bs.findAll(FieldAccessExpr.class).stream().filter(faExpr -> faExpr.getParentNode().isPresent() && !(faExpr.getParentNode().get() instanceof FieldAccessExpr)).map(faExpr -> { + if (faExpr.getParentNode().isPresent() && faExpr.getParentNode().get() instanceof CastExpr) { + return resolveType(((CastExpr) faExpr.getParentNode().get()).getType()); + } else { + return resolveExpression(faExpr); + } + }).filter(type -> !type.isEmpty()).forEach(referencedTypes::add)); // TODO: add resolved method access expressions return new ArrayList<>(referencedTypes); @@ -413,8 +570,7 @@ private static List getVariableDeclarations(Optional getVariableDeclarations(Optional getAccessedFields(Optional callableBody, List classFields, - String typeName) { + private static List getAccessedFields(Optional callableBody, List classFields, String typeName) { Set accessedFields = new HashSet<>(); // process field access expressions in the callable - callableBody.ifPresent(cb -> cb.findAll(FieldAccessExpr.class) - .stream() - .filter(faExpr -> faExpr.getParentNode().isPresent() && !(faExpr.getParentNode().get() instanceof FieldAccessExpr)) - .map(faExpr -> { - String fieldDeclaringType = resolveExpression(faExpr.getScope()); - if (!fieldDeclaringType.isEmpty()) { - return fieldDeclaringType + "." + faExpr.getNameAsString(); - } else { - return faExpr.getNameAsString(); - } - }) - .forEach(accessedFields::add) - ); + callableBody.ifPresent(cb -> cb.findAll(FieldAccessExpr.class).stream().filter(faExpr -> faExpr.getParentNode().isPresent() && !(faExpr.getParentNode().get() instanceof FieldAccessExpr)).map(faExpr -> { + String fieldDeclaringType = resolveExpression(faExpr.getScope()); + if (!fieldDeclaringType.isEmpty()) { + return fieldDeclaringType + "." + faExpr.getNameAsString(); + } else { + return faExpr.getNameAsString(); + } + }).forEach(accessedFields::add)); // process all names expressions in callable and match against names of declared fields // in class TODO: handle local variable declarations with the same name @@ -499,8 +649,7 @@ private static List getCallSites(Optional callableBody) { if (declaringType.contains(" | ")) { declaringType = declaringType.split(" \\| ")[0]; } - String declaringTypeName = declaringType.contains(".") - ? declaringType.substring(declaringType.lastIndexOf(".") + 1) : declaringType; + String declaringTypeName = declaringType.contains(".") ? declaringType.substring(declaringType.lastIndexOf(".") + 1) : declaringType; if (declaringTypeName.equals(scopeExpr.toString())) { isStaticCall = true; } @@ -530,11 +679,9 @@ private static List getCallSites(Optional callableBody) { Log.debug("Could not resolve access specifier for method call: " + methodCallExpr + ": " + exception.getMessage()); } // resolve arguments of the method call to types - List arguments = methodCallExpr.getArguments().stream() - .map(SymbolTable::resolveExpression).collect(Collectors.toList()); + List arguments = methodCallExpr.getArguments().stream().map(SymbolTable::resolveExpression).collect(Collectors.toList()); // add a new call site object - callSites.add(createCallSite(methodCallExpr, methodCallExpr.getNameAsString(), receiverName, declaringType, - arguments, returnType, calleeSignature, isStaticCall, false, accessSpecifier)); + callSites.add(createCallSite(methodCallExpr, methodCallExpr.getNameAsString(), receiverName, declaringType, arguments, returnType, calleeSignature, isStaticCall, false, accessSpecifier)); } for (ObjectCreationExpr objectCreationExpr : callableBody.get().findAll(ObjectCreationExpr.class)) { @@ -542,8 +689,7 @@ private static List getCallSites(Optional callableBody) { String instantiatedType = resolveType(objectCreationExpr.getType()); // resolve arguments of the constructor call to types - List arguments = objectCreationExpr.getArguments().stream() - .map(SymbolTable::resolveExpression).collect(Collectors.toList()); + List arguments = objectCreationExpr.getArguments().stream().map(SymbolTable::resolveExpression).collect(Collectors.toList()); // resolve callee and get signature String calleeSignature = ""; @@ -554,9 +700,7 @@ private static List getCallSites(Optional callableBody) { } // add a new call site object - callSites.add(createCallSite(objectCreationExpr, "", - objectCreationExpr.getScope().isPresent() ? objectCreationExpr.getScope().get().toString() : "", - instantiatedType, arguments, instantiatedType, calleeSignature, false, true, AccessSpecifier.NONE)); + callSites.add(createCallSite(objectCreationExpr, "", objectCreationExpr.getScope().isPresent() ? objectCreationExpr.getScope().get().toString() : "", instantiatedType, arguments, instantiatedType, calleeSignature, false, true, AccessSpecifier.NONE)); } return callSites; @@ -575,9 +719,7 @@ private static List getCallSites(Optional callableBody) { * @param isConstructorCall * @return */ - private static CallSite createCallSite(Expression callExpr, String calleeName, String receiverExpr, - String receiverType, List arguments, String returnType, - String calleeSignature, boolean isStaticCall, boolean isConstructorCall, AccessSpecifier accessSpecifier) { + private static CallSite createCallSite(Expression callExpr, String calleeName, String receiverExpr, String receiverType, List arguments, String returnType, String calleeSignature, boolean isStaticCall, boolean isConstructorCall, AccessSpecifier accessSpecifier) { CallSite callSite = new CallSite(); callSite.setMethodName(calleeName); callSite.setReceiverExpr(receiverExpr); @@ -670,10 +812,7 @@ public static Pair, Map>> for (ParseResult parseResult : sourceRoot.tryToParse()) { if (parseResult.isSuccessful()) { CompilationUnit compilationUnit = parseResult.getResult().get(); - symbolTable.put( - compilationUnit.getStorage().get().getPath().toString(), - processCompilationUnit(compilationUnit) - ); + symbolTable.put(compilationUnit.getStorage().get().getPath().toString(), processCompilationUnit(compilationUnit)); } else { parseProblems.put(sourceRoot.getRoot().toString(), parseResult.getProblems()); } @@ -714,10 +853,7 @@ public static Pair, Map>> * @return * @throws IOException */ - public static Pair, Map>> extract( - Path projectRootPath, - List javaFilePaths - ) throws IOException { + public static Pair, Map>> extract(Path projectRootPath, List javaFilePaths) throws IOException { // create symbol solver and parser configuration SymbolSolverCollectionStrategy symbolSolverCollectionStrategy = new SymbolSolverCollectionStrategy(); @@ -737,8 +873,7 @@ public static Pair, Map>> ParseResult parseResult = javaParser.parse(javaFilePath); if (parseResult.isSuccessful()) { CompilationUnit compilationUnit = parseResult.getResult().get(); - symbolTable.put(compilationUnit.getStorage().get().getPath().toString(), - processCompilationUnit(compilationUnit)); + symbolTable.put(compilationUnit.getStorage().get().getPath().toString(), processCompilationUnit(compilationUnit)); } else { Log.error(parseResult.getProblems().toString()); parseProblems.put(javaFilePath.toString(), parseResult.getProblems()); diff --git a/src/main/java/com/ibm/cldk/entities/CRUDOperation.java b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java new file mode 100644 index 00000000..02290748 --- /dev/null +++ b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java @@ -0,0 +1,39 @@ +package com.ibm.cldk.entities; + +import com.ibm.cldk.utils.annotations.NotImplemented; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CRUDOperation { + public enum OperationType { + CREATE, + READ, + UPDATE, + DELETE, + UNKNOWN + } + + private OperationType operationType; + private String targetTable; + private int lineNumber; + private int startPosition; + private int endPosition; + + @NotImplemented + private String operationString; + @NotImplemented + private List involvedFields; + @NotImplemented + private String condition; + @NotImplemented + private List joinedTables; + @NotImplemented + private String technology; + @NotImplemented + private boolean isBatchOperation = false; +} \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/entities/Callable.java b/src/main/java/com/ibm/cldk/entities/Callable.java index ba481a23..68392d2b 100644 --- a/src/main/java/com/ibm/cldk/entities/Callable.java +++ b/src/main/java/com/ibm/cldk/entities/Callable.java @@ -2,6 +2,7 @@ import lombok.Data; +import java.util.ArrayList; import java.util.List; @Data @@ -25,4 +26,6 @@ public class Callable { private List callSites; private List variableDeclarations; private int cyclomaticComplexity; + private boolean isEntryPoint = false; + private List crudOperations = null; } diff --git a/src/main/java/com/ibm/cldk/entities/Type.java b/src/main/java/com/ibm/cldk/entities/Type.java index a27b6585..d46c64d6 100644 --- a/src/main/java/com/ibm/cldk/entities/Type.java +++ b/src/main/java/com/ibm/cldk/entities/Type.java @@ -25,4 +25,5 @@ public class Type { private Map callableDeclarations; private List fieldDeclarations; private List enumConstants; + private boolean isEntryPointClass = false; } \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/utils/BuildProject.java b/src/main/java/com/ibm/cldk/utils/BuildProject.java index 33c2a057..61ca639e 100644 --- a/src/main/java/com/ibm/cldk/utils/BuildProject.java +++ b/src/main/java/com/ibm/cldk/utils/BuildProject.java @@ -234,18 +234,18 @@ public static boolean downloadLibraryDependencies(String projectPath, String pro String[] mavenCommand = {MAVEN_CMD, "--no-transfer-progress", "-f", Paths.get(projectRoot, "pom.xml").toString(), "dependency:copy-dependencies", "-DoutputDirectory=" + libDownloadPath.toString()}; return buildWithTool(mavenCommand); } else if (new File(projectRoot, "build.gradle").exists() || new File(projectRoot, "build.gradle.kts").exists()) { - if (GRADLE_CMD == null || !commandExists(new File(GRADLE_CMD)).getKey()) { - libDownloadPath = Paths.get(projectPath, "build", LIB_DEPS_DOWNLOAD_DIR).toAbsolutePath(); + libDownloadPath = Paths.get(projectPath, "build", LIB_DEPS_DOWNLOAD_DIR).toAbsolutePath(); if (mkLibDepDirs(projectPath)) Log.debug("Dependencies found/created in " + libDownloadPath); else throw new IllegalStateException("Error creating library dependency directory in " + libDownloadPath); + if (GRADLE_CMD == null || !commandExists(new File(GRADLE_CMD)).getKey()) { String msg = GRADLE_CMD == null ? "Could not find Gradle or valid Gradle Wrapper" : MessageFormat.format("Could not verify that {0} exists", GRADLE_CMD); Log.error(msg); - throw new IllegalStateException("Unable to execute Maven command. " + + throw new IllegalStateException("Unable to execute Gradle command. " + (GRADLE_CMD == null ? "Could not find Gradle or valid Gradle Wrapper" : "Attempt failed with message\n" + commandExists(new File(GRADLE_CMD)).getValue() diff --git a/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java new file mode 100644 index 00000000..90aefaf0 --- /dev/null +++ b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java @@ -0,0 +1,12 @@ +package com.ibm.cldk.utils.annotations; + +import java.lang.annotation.*; + +@Documented +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface NotImplemented { + String value() default ""; + String since() default ""; + String ticketId() default ""; +} \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/analysis.json b/src/test/resources/test-applications/EntrypointTestApp/analysis.json new file mode 100644 index 00000000..b69db12e --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/analysis.json @@ -0,0 +1,2828 @@ +{ + "symbol_table": { + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java", + "comment": "", + "imports": [ + "org.apache.camel.Consume", + "org.apache.camel.Handler", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.camel.MessageConsumer": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "processMessage(String)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java", + "signature": "processMessage(String)", + "comment": "", + "annotations": [ + "@Consume(uri = \"direct:processMessage\")", + "@Handler" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void processMessage(String message)", + "parameters": [ + { + "type": "java.lang.String", + "name": "message", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n // Process message\n}", + "start_line": 10, + "end_line": 14, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java", + "comment": "", + "imports": [ + "org.apache.camel.builder.RouteBuilder", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.camel.CustomRouteBuilder": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [ + "RouteBuilder" + ], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "configure()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java", + "signature": "configure()", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.lang.Exception" + ], + "declaration": "public void configure() throws Exception", + "parameters": [], + "code": "{\n from(\"file:input/orders\").routeId(\"orderProcessingRoute\").to(\"direct:processOrder\");\n from(\"direct:processOrder\").process(exchange -> {\n // Process order\n }).to(\"file:output/processed\");\n}", + "start_line": 9, + "end_line": 20, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "to", + "receiver_expr": "from(\"file:input/orders\").routeId(\"orderProcessingRoute\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 13, + "end_column": 42 + }, + { + "method_name": "routeId", + "receiver_expr": "from(\"file:input/orders\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 12, + "end_column": 48 + }, + { + "method_name": "from", + "receiver_expr": "", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 11, + "end_column": 33 + }, + { + "method_name": "to", + "receiver_expr": "from(\"direct:processOrder\").process(exchange -> {\n // Process order\n})", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 19, + "end_column": 44 + }, + { + "method_name": "process", + "receiver_expr": "from(\"direct:processOrder\")", + "receiver_type": "", + "argument_types": [ + "" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 18, + "end_column": 18 + }, + { + "method_name": "from", + "receiver_expr": "", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 15, + "end_column": 35 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java", + "comment": "", + "imports": [ + "org.springframework.boot.ApplicationRunner", + "org.springframework.boot.ApplicationArguments", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.spring.CustomApplicationRunner": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [ + "ApplicationRunner" + ], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "run(ApplicationArguments)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java", + "signature": "run(ApplicationArguments)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void run(ApplicationArguments args)", + "parameters": [ + { + "type": "ApplicationArguments", + "name": "args", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n System.out.println(\"ApplicationRunner executed\");\n}", + "start_line": 10, + "end_line": 13, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [ + "java.io.PrintStream" + ], + "accessed_fields": [ + "java.lang.System.out" + ], + "call_sites": [ + { + "method_name": "println", + "receiver_expr": "System.out", + "receiver_type": "java.io.PrintStream", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "println(java.lang.String)", + "is_public": true, + "is_protected": false, + "is_private": false, + "is_unspecified": false, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 12, + "start_column": 9, + "end_line": 12, + "end_column": 56 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java", + "comment": "", + "imports": [ + "org.springframework.web.bind.annotation.RestController", + "org.springframework.web.bind.annotation.GetMapping" + ], + "type_declarations": { + "org.entrypoints.spring.SpringController": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@RestController" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "hello()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java", + "signature": "hello()", + "comment": "", + "annotations": [ + "@GetMapping(\"/hello\")" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String hello()", + "parameters": [], + "code": "{\n return \"Hello from Spring!\";\n}", + "start_line": 9, + "end_line": 12, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java", + "comment": "", + "imports": [], + "type_declarations": {}, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java", + "comment": "", + "imports": [ + "org.apache.camel.builder.RouteBuilder", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.camel.RestRouteBuilder": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [ + "RouteBuilder" + ], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "configure()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java", + "signature": "configure()", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.lang.Exception" + ], + "declaration": "public void configure() throws Exception", + "parameters": [], + "code": "{\n restConfiguration().component(\"servlet\").bindingMode(\"json\");\n rest(\"/api\").get(\"/status\").to(\"direct:getStatus\").post(\"/order\").to(\"direct:submitOrder\");\n}", + "start_line": 9, + "end_line": 18, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "bindingMode", + "receiver_expr": "restConfiguration().component(\"servlet\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 13, + "end_column": 36 + }, + { + "method_name": "component", + "receiver_expr": "restConfiguration()", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 12, + "end_column": 37 + }, + { + "method_name": "restConfiguration", + "receiver_expr": "", + "receiver_type": "", + "argument_types": [], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 11, + "end_column": 27 + }, + { + "method_name": "to", + "receiver_expr": "rest(\"/api\").get(\"/status\").to(\"direct:getStatus\").post(\"/order\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 17, + "end_column": 56 + }, + { + "method_name": "post", + "receiver_expr": "rest(\"/api\").get(\"/status\").to(\"direct:getStatus\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 17, + "end_column": 31 + }, + { + "method_name": "to", + "receiver_expr": "rest(\"/api\").get(\"/status\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 16, + "end_column": 54 + }, + { + "method_name": "get", + "receiver_expr": "rest(\"/api\")", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 16, + "end_column": 31 + }, + { + "method_name": "rest", + "receiver_expr": "", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 15, + "start_column": 9, + "end_line": 15, + "end_column": 20 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "comment": "", + "imports": [ + "jakarta.annotation.PostConstruct", + "jakarta.annotation.PreDestroy", + "jakarta.batch.api.Batchlet", + "jakarta.batch.api.chunk.ItemProcessor", + "jakarta.ejb", + "jakarta.jms.Message", + "jakarta.jms.MessageListener", + "jakarta.jws.WebService", + "jakarta.jws.WebMethod", + "jakarta.servlet", + "jakarta.servlet.annotation", + "jakarta.servlet.http", + "jakarta.websocket", + "jakarta.websocket.server.ServerEndpoint", + "jakarta.xml.ws.WebServiceProvider", + "java.io.IOException" + ], + "type_declarations": { + "org.entrypoints.jakarta.JavaEEEntrypoints": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [ + "HttpServlet" + ], + "comment": "", + "implements_list": [ + "ServletContextListener", + "MessageListener" + ], + "modifiers": [ + "public" + ], + "annotations": [ + "@WebServlet(urlPatterns = \"/example\", asyncSupported = true)", + "@WebService", + "@ServerEndpoint(\"/websocket\")" + ], + "parent_type": "", + "nested_type_declarations": [ + "org.entrypoints.jakarta.JavaEEEntrypoints.RemoteBusinessInterface" + ], + "callable_declarations": { + "doTrace(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doTrace(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 56, + "end_line": 59, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "postPersist()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "postPersist()", + "comment": "", + "annotations": [ + "@PostPersist" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void postPersist()", + "parameters": [], + "code": "{\n}", + "start_line": 219, + "end_line": 221, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doPost(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doPost(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 31, + "end_line": 34, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onMessage(Session, String)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onMessage(Session, String)", + "comment": "", + "annotations": [ + "@OnMessage" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void onMessage(Session session, String message)", + "parameters": [ + { + "type": "Session", + "name": "session", + "annotations": [], + "modifiers": [] + }, + { + "type": "java.lang.String", + "name": "message", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 100, + "end_line": 102, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onClose(Session)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onClose(Session)", + "comment": "", + "annotations": [ + "@OnClose" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void onClose(Session session)", + "parameters": [ + { + "type": "Session", + "name": "session", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 104, + "end_line": 106, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "preRemove()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "preRemove()", + "comment": "", + "annotations": [ + "@PreRemove" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void preRemove()", + "parameters": [], + "code": "{\n}", + "start_line": 231, + "end_line": 233, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "contextDestroyed(ServletContextEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "contextDestroyed(ServletContextEvent)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void contextDestroyed(ServletContextEvent sce)", + "parameters": [ + { + "type": "ServletContextEvent", + "name": "sce", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 129, + "end_line": 131, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doDelete(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doDelete(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 41, + "end_line": 44, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "scheduledTask()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "scheduledTask()", + "comment": "// EJB Timer Methods", + "annotations": [ + "@Schedule(second = \"*/10\", minute = \"*\", hour = \"*\", persistent = false)" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void scheduledTask()", + "parameters": [], + "code": "{\n}", + "start_line": 150, + "end_line": 152, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "webServiceOperation(String)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "webServiceOperation(String)", + "comment": "// Web Service Methods", + "annotations": [ + "@WebMethod" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String webServiceOperation(String input)", + "parameters": [ + { + "type": "java.lang.String", + "name": "input", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n return input;\n}", + "start_line": 185, + "end_line": 188, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "programmaticTimeout(Timer)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "programmaticTimeout(Timer)", + "comment": "", + "annotations": [ + "@Timeout" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void programmaticTimeout(Timer timer)", + "parameters": [ + { + "type": "Timer", + "name": "timer", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 154, + "end_line": 156, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "getResource()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "getResource()", + "comment": "// JAX-RS Resource Methods (REST)", + "annotations": [ + "@GET", + "@Path(\"/resource\")" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String getResource()", + "parameters": [], + "code": "{\n return \"resource\";\n}", + "start_line": 195, + "end_line": 199, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "process()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "process()", + "comment": "// Batch Processing", + "annotations": [ + "@Batchlet" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String process()", + "parameters": [], + "code": "{\n return \"COMPLETED\";\n}", + "start_line": 113, + "end_line": 116, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doHead(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doHead(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 46, + "end_line": 49, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "destroy()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "destroy()", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void destroy()", + "parameters": [], + "code": "{\n super.destroy();\n}", + "start_line": 67, + "end_line": 70, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "destroy", + "receiver_expr": "super", + "receiver_type": "", + "argument_types": [], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 69, + "start_column": 9, + "end_line": 69, + "end_column": 23 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onComplete(AsyncEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onComplete(AsyncEvent)", + "comment": "// Async Servlet Methods", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.io.IOException" + ], + "declaration": "public void onComplete(AsyncEvent event) throws IOException", + "parameters": [ + { + "type": "AsyncEvent", + "name": "event", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 79, + "end_line": 81, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "handleRequest(String)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "handleRequest(String)", + "comment": "", + "annotations": [ + "@WebServiceProvider" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void handleRequest(String request)", + "parameters": [ + { + "type": "java.lang.String", + "name": "request", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 190, + "end_line": 192, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "automaticTimeout()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "automaticTimeout()", + "comment": "", + "annotations": [ + "@AutomaticTimeout" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void automaticTimeout()", + "parameters": [], + "code": "{\n}", + "start_line": 158, + "end_line": 160, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "postConstruct()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "postConstruct()", + "comment": "// Lifecycle Callbacks", + "annotations": [ + "@PostConstruct" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void postConstruct()", + "parameters": [], + "code": "{\n}", + "start_line": 163, + "end_line": 165, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onMessage(Message)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onMessage(Message)", + "comment": "// Message-Driven Bean Methods", + "annotations": [ + "@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"jakarta.jms.Queue\") })", + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void onMessage(Message message)", + "parameters": [ + { + "type": "Message", + "name": "message", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 172, + "end_line": 182, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onOpen(Session)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onOpen(Session)", + "comment": "// WebSocket Methods", + "annotations": [ + "@OnOpen" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void onOpen(Session session)", + "parameters": [ + { + "type": "Session", + "name": "session", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 96, + "end_line": 98, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "contextInitialized(ServletContextEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "contextInitialized(ServletContextEvent)", + "comment": "// ServletContext Listener Methods", + "annotations": [ + "@Override", + "@WebListener" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void contextInitialized(ServletContextEvent sce)", + "parameters": [ + { + "type": "ServletContextEvent", + "name": "sce", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 124, + "end_line": 127, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "postUpdate()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "postUpdate()", + "comment": "", + "annotations": [ + "@PostUpdate" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void postUpdate()", + "parameters": [], + "code": "{\n}", + "start_line": 227, + "end_line": 229, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doOptions(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doOptions(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 51, + "end_line": 54, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doFilter(ServletRequest, ServletResponse, FilterChain)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doFilter(ServletRequest, ServletResponse, FilterChain)", + "comment": "// Filter Methods", + "annotations": [ + "@WebFilter(\"/path/*\")" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.io.IOException", + "ServletException" + ], + "declaration": "public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException", + "parameters": [ + { + "type": "ServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "ServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + }, + { + "type": "FilterChain", + "name": "chain", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 73, + "end_line": 76, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "requestInitialized(ServletRequestEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "requestInitialized(ServletRequestEvent)", + "comment": "// Request Listener Methods", + "annotations": [ + "@WebListener" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void requestInitialized(ServletRequestEvent sre)", + "parameters": [ + { + "type": "ServletRequestEvent", + "name": "sre", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 142, + "end_line": 144, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onTimeout(AsyncEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onTimeout(AsyncEvent)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.io.IOException" + ], + "declaration": "public void onTimeout(AsyncEvent event) throws IOException", + "parameters": [ + { + "type": "AsyncEvent", + "name": "event", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 83, + "end_line": 85, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "processItem(Object)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "processItem(Object)", + "comment": "", + "annotations": [ + "@ItemProcessor" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public Object processItem(Object item)", + "parameters": [ + { + "type": "java.lang.Object", + "name": "item", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n return item;\n}", + "start_line": 118, + "end_line": 121, + "return_type": "java.lang.Object", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "securedMethod()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "securedMethod()", + "comment": "// Security Related Methods", + "annotations": [ + "@DeclareRoles({ \"admin\", \"user\" })", + "@RolesAllowed({ \"admin\" })" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void securedMethod()", + "parameters": [], + "code": "{\n}", + "start_line": 209, + "end_line": 212, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "postLoad()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "postLoad()", + "comment": "", + "annotations": [ + "@PostLoad" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void postLoad()", + "parameters": [], + "code": "{\n}", + "start_line": 239, + "end_line": 241, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doGet(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doGet(HttpServletRequest, HttpServletResponse)", + "comment": "// Servlet HTTP Methods", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 26, + "end_line": 29, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onError(AsyncEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onError(AsyncEvent)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.io.IOException" + ], + "declaration": "public void onError(AsyncEvent event) throws IOException", + "parameters": [ + { + "type": "AsyncEvent", + "name": "event", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 87, + "end_line": 89, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "sessionDestroyed(HttpSessionEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "sessionDestroyed(HttpSessionEvent)", + "comment": "", + "annotations": [], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void sessionDestroyed(HttpSessionEvent se)", + "parameters": [ + { + "type": "HttpSessionEvent", + "name": "se", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 138, + "end_line": 139, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "postRemove()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "postRemove()", + "comment": "", + "annotations": [ + "@PostRemove" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void postRemove()", + "parameters": [], + "code": "{\n}", + "start_line": 235, + "end_line": 237, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "requestDestroyed(ServletRequestEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "requestDestroyed(ServletRequestEvent)", + "comment": "", + "annotations": [], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void requestDestroyed(ServletRequestEvent sre)", + "parameters": [ + { + "type": "ServletRequestEvent", + "name": "sre", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 146, + "end_line": 147, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "init(ServletConfig)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "init(ServletConfig)", + "comment": "// Servlet Lifecycle Methods", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "ServletException" + ], + "declaration": "public void init(ServletConfig config) throws ServletException", + "parameters": [ + { + "type": "ServletConfig", + "name": "config", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n super.init(config);\n}", + "start_line": 62, + "end_line": 65, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "init", + "receiver_expr": "super", + "receiver_type": "", + "argument_types": [ + "" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 64, + "start_column": 9, + "end_line": 64, + "end_column": 26 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onStartAsync(AsyncEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onStartAsync(AsyncEvent)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.io.IOException" + ], + "declaration": "public void onStartAsync(AsyncEvent event) throws IOException", + "parameters": [ + { + "type": "AsyncEvent", + "name": "event", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 91, + "end_line": 93, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "onError(Session, Throwable)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "onError(Session, Throwable)", + "comment": "", + "annotations": [ + "@OnError" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void onError(Session session, Throwable throwable)", + "parameters": [ + { + "type": "Session", + "name": "session", + "annotations": [], + "modifiers": [] + }, + { + "type": "java.lang.Throwable", + "name": "throwable", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 108, + "end_line": 110, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "prePersist()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "prePersist()", + "comment": "// JPA Entity Lifecycle Methods", + "annotations": [ + "@PrePersist" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void prePersist()", + "parameters": [], + "code": "{\n}", + "start_line": 215, + "end_line": 217, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "doPut(HttpServletRequest, HttpServletResponse)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "doPut(HttpServletRequest, HttpServletResponse)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "protected" + ], + "thrown_exceptions": [ + "ServletException", + "java.io.IOException" + ], + "declaration": "protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", + "parameters": [ + { + "type": "HttpServletRequest", + "name": "request", + "annotations": [], + "modifiers": [] + }, + { + "type": "HttpServletResponse", + "name": "response", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 36, + "end_line": 39, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "sessionCreated(HttpSessionEvent)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "sessionCreated(HttpSessionEvent)", + "comment": "// Session Listener Methods", + "annotations": [ + "@WebListener" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void sessionCreated(HttpSessionEvent se)", + "parameters": [ + { + "type": "HttpSessionEvent", + "name": "se", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n}", + "start_line": 134, + "end_line": 136, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "preUpdate()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "preUpdate()", + "comment": "", + "annotations": [ + "@PreUpdate" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void preUpdate()", + "parameters": [], + "code": "{\n}", + "start_line": 223, + "end_line": 225, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "preDestroy()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "preDestroy()", + "comment": "", + "annotations": [ + "@PreDestroy" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void preDestroy()", + "parameters": [], + "code": "{\n}", + "start_line": 167, + "end_line": 169, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + }, + "org.entrypoints.jakarta.JavaEEEntrypoints.RemoteBusinessInterface": { + "is_nested_type": true, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": true, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "// EJB Remote Business Interface Methods", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Remote" + ], + "parent_type": "org.entrypoints.jakarta.JavaEEEntrypoints", + "nested_type_declarations": [], + "callable_declarations": { + "businessMethod()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", + "signature": "businessMethod()", + "comment": "", + "annotations": [], + "modifiers": [], + "thrown_exceptions": [], + "declaration": "abstract void businessMethod()", + "parameters": [], + "code": "", + "start_line": 205, + "end_line": 205, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": false + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java", + "comment": "", + "imports": [ + "jakarta.ws.rs.GET", + "jakarta.ws.rs.Path", + "jakarta.ws.rs.Produces", + "jakarta.ws.rs.core.MediaType" + ], + "type_declarations": { + "org.entrypoints.jaxrs.JaxRsResource": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Path(\"/api\")" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "hello()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java", + "signature": "hello()", + "comment": "", + "annotations": [ + "@GET", + "@Path(\"/hello\")", + "@Produces(MediaType.TEXT_PLAIN)" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String hello()", + "parameters": [], + "code": "{\n return \"Hello from JAX-RS!\";\n}", + "start_line": 11, + "end_line": 16, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java", + "comment": "", + "imports": [ + "org.springframework.boot.CommandLineRunner", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.spring.CustomCommandLineRunner": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [ + "CommandLineRunner" + ], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "run(String[])": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java", + "signature": "run(String[])", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public void run(String... args)", + "parameters": [ + { + "type": "java.lang.String", + "name": "args", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n System.out.println(\"CommandLineRunner executed\");\n}", + "start_line": 9, + "end_line": 12, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [ + "java.io.PrintStream" + ], + "accessed_fields": [ + "java.lang.System.out" + ], + "call_sites": [ + { + "method_name": "println", + "receiver_expr": "System.out", + "receiver_type": "java.io.PrintStream", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "println(java.lang.String)", + "is_public": true, + "is_protected": false, + "is_private": false, + "is_unspecified": false, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 9, + "end_line": 11, + "end_column": 56 + } + ], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java", + "comment": "", + "imports": [ + "org.springframework.web.bind.annotation.RestController", + "org.springframework.web.bind.annotation.PostMapping", + "org.springframework.web.bind.annotation.RequestBody" + ], + "type_declarations": { + "org.entrypoints.spring.SpringBootController": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@RestController" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "processData(String)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java", + "signature": "processData(String)", + "comment": "", + "annotations": [ + "@PostMapping(\"/api/data\")" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String processData(@RequestBody String data)", + "parameters": [ + { + "type": "java.lang.String", + "name": "data", + "annotations": [ + "@RequestBody" + ], + "modifiers": [] + } + ], + "code": "{\n return \"Processed: \" + data;\n}", + "start_line": 10, + "end_line": 13, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", + "comment": "", + "imports": [ + "com.opensymphony.xwork2.ActionSupport", + "org.apache.struts2.convention.annotation.Action", + "org.apache.struts2.convention.annotation.Namespace", + "org.apache.struts2.convention.annotation.Result" + ], + "type_declarations": { + "org.entrypoints.struts.UserAction": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [ + "ActionSupport" + ], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [ + "@Namespace(\"/user\")" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "listUsers()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", + "signature": "listUsers()", + "comment": "", + "annotations": [ + "@Action(value = \"list\", results = { @Result(name = \"success\", location = \"/user/list.jsp\") })" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String listUsers()", + "parameters": [], + "code": "{\n return SUCCESS;\n}", + "start_line": 11, + "end_line": 16, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + }, + "addUser()": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", + "signature": "addUser()", + "comment": "", + "annotations": [ + "@Action(value = \"add\", results = { @Result(name = \"success\", location = \"/user/add.jsp\") })" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [], + "declaration": "public String addUser()", + "parameters": [], + "code": "{\n return SUCCESS;\n}", + "start_line": 18, + "end_line": 23, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [], + "accessed_fields": [], + "call_sites": [], + "variable_declarations": [], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java", + "comment": "", + "imports": [ + "org.apache.camel.Exchange", + "org.apache.camel.Processor", + "org.springframework.stereotype.Component" + ], + "type_declarations": { + "org.entrypoints.camel.CamelProcessor": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [], + "comment": "", + "implements_list": [ + "Processor" + ], + "modifiers": [ + "public" + ], + "annotations": [ + "@Component" + ], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "process(Exchange)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java", + "signature": "process(Exchange)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.lang.Exception" + ], + "declaration": "public void process(Exchange exchange) throws Exception", + "parameters": [ + { + "type": "Exchange", + "name": "exchange", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n // Process message\n String body = exchange.getIn().getBody(String.class);\n exchange.getMessage().setBody(\"Processed: \" + body);\n}", + "start_line": 10, + "end_line": 15, + "return_type": "void", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [ + "java.lang.String" + ], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "getBody", + "receiver_expr": "exchange.getIn()", + "receiver_type": "", + "argument_types": [ + "java.lang.Class" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 13, + "start_column": 23, + "end_line": 13, + "end_column": 60 + }, + { + "method_name": "getIn", + "receiver_expr": "exchange", + "receiver_type": "", + "argument_types": [], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 13, + "start_column": 23, + "end_line": 13, + "end_column": 38 + }, + { + "method_name": "setBody", + "receiver_expr": "exchange.getMessage()", + "receiver_type": "", + "argument_types": [ + "java.lang.String" + ], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 14, + "start_column": 9, + "end_line": 14, + "end_column": 59 + }, + { + "method_name": "getMessage", + "receiver_expr": "exchange", + "receiver_type": "", + "argument_types": [], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 14, + "start_column": 9, + "end_line": 14, + "end_column": 29 + } + ], + "variable_declarations": [ + { + "name": "body", + "type": "java.lang.String", + "initializer": "exchange.getIn().getBody(String.class)", + "start_line": 13, + "start_column": 16, + "end_line": 13, + "end_column": 60 + } + ], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": true + } + }, + "is_modified": false + }, + "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java", + "comment": "", + "imports": [ + "com.opensymphony.xwork2.ActionInvocation", + "com.opensymphony.xwork2.interceptor.AbstractInterceptor" + ], + "type_declarations": { + "org.entrypoints.struts.InterceptorExample": { + "is_nested_type": false, + "is_class_or_interface_declaration": true, + "is_enum_declaration": false, + "is_annotation_declaration": false, + "is_record_declaration": false, + "is_interface": false, + "is_inner_class": false, + "is_local_class": false, + "extends_list": [ + "AbstractInterceptor" + ], + "comment": "", + "implements_list": [], + "modifiers": [ + "public" + ], + "annotations": [], + "parent_type": "", + "nested_type_declarations": [], + "callable_declarations": { + "intercept(ActionInvocation)": { + "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java", + "signature": "intercept(ActionInvocation)", + "comment": "", + "annotations": [ + "@Override" + ], + "modifiers": [ + "public" + ], + "thrown_exceptions": [ + "java.lang.Exception" + ], + "declaration": "public String intercept(ActionInvocation invocation) throws Exception", + "parameters": [ + { + "type": "ActionInvocation", + "name": "invocation", + "annotations": [], + "modifiers": [] + } + ], + "code": "{\n // Pre-processing\n String result = invocation.invoke();\n // Post-processing\n return result;\n}", + "start_line": 8, + "end_line": 14, + "return_type": "java.lang.String", + "is_implicit": false, + "is_constructor": false, + "referenced_types": [ + "java.lang.String" + ], + "accessed_fields": [], + "call_sites": [ + { + "method_name": "invoke", + "receiver_expr": "invocation", + "receiver_type": "", + "argument_types": [], + "return_type": "", + "callee_signature": "", + "is_public": false, + "is_protected": false, + "is_private": false, + "is_unspecified": true, + "is_static_call": false, + "is_constructor_call": false, + "is_database": false, + "start_line": 11, + "start_column": 25, + "end_line": 11, + "end_column": 43 + } + ], + "variable_declarations": [ + { + "name": "result", + "type": "java.lang.String", + "initializer": "invocation.invoke()", + "start_line": 11, + "start_column": 16, + "end_line": 11, + "end_column": 43 + } + ], + "cyclomatic_complexity": 1, + "is_entry_point": false + } + }, + "field_declarations": [], + "is_entry_point_class": false + } + }, + "is_modified": false + } + }, + "version": "2.1.0" +} \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/build.gradle b/src/test/resources/test-applications/EntrypointTestApp/build.gradle new file mode 100644 index 00000000..bfb6acbb --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.2.2' + id 'io.spring.dependency-management' version '1.1.4' +} + +group 'org.entrypoints' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + // Spring Boot + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + // Apache Struts + implementation 'org.apache.struts:struts2-core:6.1.2' + implementation 'org.apache.struts:struts2-convention-plugin:6.1.2' + + // Apache Camel + implementation 'org.apache.camel:camel-core:4.3.0' + implementation 'org.apache.camel.springboot:camel-spring-boot-starter:4.9.0' + implementation 'org.apache.camel:camel-rest:4.3.0' + + // Jakarta EE API + implementation 'jakarta.platform:jakarta.jakartaee-api:9.1.0' + + // JAX-RS API + implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' + + // Test dependencies + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties b/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c7d437bb --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradlew b/src/test/resources/test-applications/EntrypointTestApp/gradlew new file mode 100755 index 00000000..65dcd68d --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat b/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat new file mode 100644 index 00000000..6689b85b --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/test/resources/test-applications/EntrypointTestApp/settings.gradle b/src/test/resources/test-applications/EntrypointTestApp/settings.gradle new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java new file mode 100644 index 00000000..e69de29b diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java new file mode 100644 index 00000000..0a298791 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java @@ -0,0 +1,16 @@ +package org.entrypoints.camel; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.springframework.stereotype.Component; + +@Component +public class CamelProcessor implements Processor { + + @Override + public void process(Exchange exchange) throws Exception { + // Process message + String body = exchange.getIn().getBody(String.class); + exchange.getMessage().setBody("Processed: " + body); + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java new file mode 100644 index 00000000..d440b10d --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java @@ -0,0 +1,21 @@ +package org.entrypoints.camel; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class CustomRouteBuilder extends RouteBuilder { + + @Override + public void configure() throws Exception { + from("file:input/orders") + .routeId("orderProcessingRoute") + .to("direct:processOrder"); + + from("direct:processOrder") + .process(exchange -> { + // Process order + }) + .to("file:output/processed"); + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java new file mode 100644 index 00000000..91f4ccd3 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java @@ -0,0 +1,15 @@ +package org.entrypoints.camel; + +import org.apache.camel.Consume; +import org.apache.camel.Handler; +import org.springframework.stereotype.Component; + +@Component +public class MessageConsumer { + + @Consume(uri = "direct:processMessage") + @Handler + public void processMessage(String message) { + // Process message + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java new file mode 100644 index 00000000..96979b98 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java @@ -0,0 +1,19 @@ +package org.entrypoints.camel; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class RestRouteBuilder extends RouteBuilder { + + @Override + public void configure() throws Exception { + restConfiguration() + .component("servlet") + .bindingMode("json"); + + rest("/api") + .get("/status").to("direct:getStatus") + .post("/order").to("direct:submitOrder"); + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java new file mode 100644 index 00000000..c1c514cb --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java @@ -0,0 +1,242 @@ +package org.entrypoints.jakarta; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; +import jakarta.batch.api.Batchlet; +import jakarta.batch.api.chunk.ItemProcessor; +import jakarta.ejb.*; +import jakarta.jms.Message; +import jakarta.jms.MessageListener; +import jakarta.jws.WebService; +import jakarta.jws.WebMethod; +import jakarta.servlet.*; +import jakarta.servlet.annotation.*; +import jakarta.servlet.http.*; +import jakarta.websocket.*; +import jakarta.websocket.server.ServerEndpoint; +import jakarta.xml.ws.WebServiceProvider; +import java.io.IOException; + +@WebServlet(urlPatterns = "/example", asyncSupported = true) +@WebService +@ServerEndpoint("/websocket") +public class JavaEEEntrypoints extends HttpServlet implements ServletContextListener, MessageListener { + + // Servlet HTTP Methods + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doPut(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doDelete(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doHead(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doOptions(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + @Override + protected void doTrace(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + } + + // Servlet Lifecycle Methods + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } + + @Override + public void destroy() { + super.destroy(); + } + + // Filter Methods + @WebFilter("/path/*") + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + } + + // Async Servlet Methods + @Override + public void onComplete(AsyncEvent event) throws IOException { + } + + @Override + public void onTimeout(AsyncEvent event) throws IOException { + } + + @Override + public void onError(AsyncEvent event) throws IOException { + } + + @Override + public void onStartAsync(AsyncEvent event) throws IOException { + } + + // WebSocket Methods + @OnOpen + public void onOpen(Session session) { + } + + @OnMessage + public void onMessage(Session session, String message) { + } + + @OnClose + public void onClose(Session session) { + } + + @OnError + public void onError(Session session, Throwable throwable) { + } + + // Batch Processing + @Batchlet + public String process() { + return "COMPLETED"; + } + + @ItemProcessor + public Object processItem(Object item) { + return item; + } + + // ServletContext Listener Methods + @Override + @WebListener + public void contextInitialized(ServletContextEvent sce) { + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + } + + // Session Listener Methods + @WebListener + public void sessionCreated(HttpSessionEvent se) { + } + + public void sessionDestroyed(HttpSessionEvent se) { + } + + // Request Listener Methods + @WebListener + public void requestInitialized(ServletRequestEvent sre) { + } + + public void requestDestroyed(ServletRequestEvent sre) { + } + + // EJB Timer Methods + @Schedule(second = "*/10", minute = "*", hour = "*", persistent = false) + public void scheduledTask() { + } + + @Timeout + public void programmaticTimeout(Timer timer) { + } + + @AutomaticTimeout + public void automaticTimeout() { + } + + // Lifecycle Callbacks + @PostConstruct + public void postConstruct() { + } + + @PreDestroy + public void preDestroy() { + } + + // Message-Driven Bean Methods + @MessageDriven( + activationConfig = { + @ActivationConfigProperty( + propertyName = "destinationType", + propertyValue = "jakarta.jms.Queue" + ) + } + ) + @Override + public void onMessage(Message message) { + } + + // Web Service Methods + @WebMethod + public String webServiceOperation(String input) { + return input; + } + + @WebServiceProvider + public void handleRequest(String request) { + } + + // JAX-RS Resource Methods (REST) + @GET + @Path("/resource") + public String getResource() { + return "resource"; + } + + // EJB Remote Business Interface Methods + @Remote + public interface RemoteBusinessInterface { + + void businessMethod(); + } + + // Security Related Methods + @DeclareRoles({"admin", "user"}) + @RolesAllowed({"admin"}) + public void securedMethod() { + } + + // JPA Entity Lifecycle Methods + @PrePersist + public void prePersist() { + } + + @PostPersist + public void postPersist() { + } + + @PreUpdate + public void preUpdate() { + } + + @PostUpdate + public void postUpdate() { + } + + @PreRemove + public void preRemove() { + } + + @PostRemove + public void postRemove() { + } + + @PostLoad + public void postLoad() { + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java new file mode 100644 index 00000000..9a9869c0 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java @@ -0,0 +1,17 @@ +package org.entrypoints.jaxrs; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +@Path("/api") +public class JaxRsResource { + + @GET + @Path("/hello") + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + return "Hello from JAX-RS!"; + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java new file mode 100644 index 00000000..e63cf304 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java @@ -0,0 +1,14 @@ +package org.entrypoints.spring; + +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.ApplicationArguments; +import org.springframework.stereotype.Component; + +@Component +public class CustomApplicationRunner implements ApplicationRunner { + + @Override + public void run(ApplicationArguments args) { + System.out.println("ApplicationRunner executed"); + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java new file mode 100644 index 00000000..f5a9bf3f --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java @@ -0,0 +1,13 @@ +package org.entrypoints.spring; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class CustomCommandLineRunner implements CommandLineRunner { + + @Override + public void run(String... args) { + System.out.println("CommandLineRunner executed"); + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java new file mode 100644 index 00000000..e58d4e9a --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java @@ -0,0 +1,14 @@ +package org.entrypoints.spring; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@RestController +public class SpringBootController { + + @PostMapping("/api/data") + public String processData(@RequestBody String data) { + return "Processed: " + data; + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java new file mode 100644 index 00000000..b130ca1b --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java @@ -0,0 +1,13 @@ +package org.entrypoints.spring; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; + +@RestController +public class SpringController { + + @GetMapping("/hello") + public String hello() { + return "Hello from Spring!"; + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java new file mode 100644 index 00000000..30186471 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java @@ -0,0 +1,27 @@ +package org.entrypoints.spring; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebSecurityConfig implements WebMvcConfigurer { + // Configuration methods +} +package org.example.jaxrs; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; + +import jakarta.ws.rs.core.MediaType; + +@Path("/api") +public class JaxRsResource { + + @GET + @Path("/hello") + @Produces(MediaType.TEXT_PLAIN) + public String hello() { + return "Hello from JAX-RS!"; + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java new file mode 100644 index 00000000..0dd8330f --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java @@ -0,0 +1,15 @@ +package org.entrypoints.struts; + +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.interceptor.AbstractInterceptor; + +public class InterceptorExample extends AbstractInterceptor { + + @Override + public String intercept(ActionInvocation invocation) throws Exception { + // Pre-processing + String result = invocation.invoke(); + // Post-processing + return result; + } +} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java new file mode 100644 index 00000000..6434d068 --- /dev/null +++ b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java @@ -0,0 +1,24 @@ +package org.entrypoints.struts; + +import com.opensymphony.xwork2.ActionSupport; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.Result; + +@Namespace("/user") +public class UserAction extends ActionSupport { + + @Action(value = "list", + results = { + @Result(name = "success", location = "/user/list.jsp")}) + public String listUsers() { + return SUCCESS; + } + + @Action(value = "add", + results = { + @Result(name = "success", location = "/user/add.jsp")}) + public String addUser() { + return SUCCESS; + } +} From e48cd883d70b95f89f190676c27c6c19af109f61 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Tue, 4 Feb 2025 23:52:30 -0500 Subject: [PATCH 2/4] Feature request #86: Added a new test case to verify functionality. Signed-off-by: Rahul Krishna --- .../ibm/cldk/CodeAnalyzerIntegrationTest.java | 22 +- .../EntrypointTestApp/analysis.json | 2828 ----------------- .../EntrypointTestApp/build.gradle | 37 - .../gradle/wrapper/gradle-wrapper.properties | 6 - .../EntrypointTestApp/gradlew | 244 -- .../EntrypointTestApp/gradlew.bat | 92 - .../EntrypointTestApp/settings.gradle | 0 .../entrypoints/SpringBootApplication.java | 0 .../org/entrypoints/camel/CamelProcessor.java | 16 - .../entrypoints/camel/CustomRouteBuilder.java | 21 - .../entrypoints/camel/MessageConsumer.java | 15 - .../entrypoints/camel/RestRouteBuilder.java | 19 - .../jakarta/JavaEEEntrypoints.java | 242 -- .../org/entrypoints/jaxrs/JaxRsResource.java | 17 - .../spring/CustomApplicationRunner.java | 14 - .../spring/CustomCommandLineRunner.java | 13 - .../spring/SpringBootController.java | 14 - .../entrypoints/spring/SpringController.java | 13 - .../entrypoints/spring/WebSecurityConfig.java | 27 - .../struts/InterceptorExample.java | 15 - .../org/entrypoints/struts/UserAction.java | 24 - 21 files changed, 21 insertions(+), 3658 deletions(-) delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/analysis.json delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/build.gradle delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties delete mode 100755 src/test/resources/test-applications/EntrypointTestApp/gradlew delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/gradlew.bat delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/settings.gradle delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java delete mode 100644 src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java diff --git a/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java b/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java index fa2fa86f..c5f060c4 100644 --- a/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java +++ b/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java @@ -1,5 +1,8 @@ package com.ibm.cldk; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; @@ -15,8 +18,11 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; +import java.util.Map; import java.util.Properties; +import static com.ibm.cldk.CodeAnalyzer.gson; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertThrows; @Testcontainers @@ -61,7 +67,8 @@ public class CodeAnalyzerIntegrationTest { .withCommand("-c", "while true; do sleep 1; done") .withCopyFileToContainer(MountableFile.forHostPath(Paths.get(System.getProperty("user.dir")).resolve("build/libs")), "/opt/jars") .withCopyFileToContainer(MountableFile.forHostPath(Paths.get(System.getProperty("user.dir")).resolve("src/test/resources/test-applications/mvnw-corrupt-test")), "/test-applications/mvnw-corrupt-test") - .withCopyFileToContainer(MountableFile.forHostPath(Paths.get(System.getProperty("user.dir")).resolve("src/test/resources/test-applications/mvnw-working-test")), "/test-applications/mvnw-working-test"); + .withCopyFileToContainer(MountableFile.forHostPath(Paths.get(System.getProperty("user.dir")).resolve("src/test/resources/test-applications/mvnw-working-test")), "/test-applications/mvnw-working-test") + .withCopyFileToContainer(MountableFile.forHostPath(Paths.get(System.getProperty("user.dir")).resolve("src/test/resources/test-applications/daytrader8")), "/test-applications/daytrader8"); @BeforeAll @@ -145,4 +152,17 @@ void corruptMavenShouldNotTerminateWithErrorWhenMavenIsNotPresentUnlessAnalysisL Assertions.assertEquals(1, runCodeAnalyzer.getExitCode()); Assertions.assertTrue(runCodeAnalyzer.getStderr().contains("java.lang.RuntimeException")); } + + @Test + void shouldBeAbleToGenerateAnalysisArtifactForDaytrader8() throws Exception { + var runCodeAnalyzerOnDaytrader8 = mavenContainer.execInContainer( + "java", + "-jar", + String.format("/opt/jars/codeanalyzer-%s.jar", codeanalyzerVersion), + "--input=/test-applications/daytrader8", + "--analysis-level=1" + ); + Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entry_point_class\": true"), "No entry point classes found"); + Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entry_point\": true"), "No entry point methods found"); + } } \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/analysis.json b/src/test/resources/test-applications/EntrypointTestApp/analysis.json deleted file mode 100644 index b69db12e..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/analysis.json +++ /dev/null @@ -1,2828 +0,0 @@ -{ - "symbol_table": { - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java", - "comment": "", - "imports": [ - "org.apache.camel.Consume", - "org.apache.camel.Handler", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.camel.MessageConsumer": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "processMessage(String)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java", - "signature": "processMessage(String)", - "comment": "", - "annotations": [ - "@Consume(uri = \"direct:processMessage\")", - "@Handler" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void processMessage(String message)", - "parameters": [ - { - "type": "java.lang.String", - "name": "message", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n // Process message\n}", - "start_line": 10, - "end_line": 14, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java", - "comment": "", - "imports": [ - "org.apache.camel.builder.RouteBuilder", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.camel.CustomRouteBuilder": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [ - "RouteBuilder" - ], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "configure()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java", - "signature": "configure()", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.lang.Exception" - ], - "declaration": "public void configure() throws Exception", - "parameters": [], - "code": "{\n from(\"file:input/orders\").routeId(\"orderProcessingRoute\").to(\"direct:processOrder\");\n from(\"direct:processOrder\").process(exchange -> {\n // Process order\n }).to(\"file:output/processed\");\n}", - "start_line": 9, - "end_line": 20, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "to", - "receiver_expr": "from(\"file:input/orders\").routeId(\"orderProcessingRoute\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 13, - "end_column": 42 - }, - { - "method_name": "routeId", - "receiver_expr": "from(\"file:input/orders\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 12, - "end_column": 48 - }, - { - "method_name": "from", - "receiver_expr": "", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 11, - "end_column": 33 - }, - { - "method_name": "to", - "receiver_expr": "from(\"direct:processOrder\").process(exchange -> {\n // Process order\n})", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 19, - "end_column": 44 - }, - { - "method_name": "process", - "receiver_expr": "from(\"direct:processOrder\")", - "receiver_type": "", - "argument_types": [ - "" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 18, - "end_column": 18 - }, - { - "method_name": "from", - "receiver_expr": "", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 15, - "end_column": 35 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java", - "comment": "", - "imports": [ - "org.springframework.boot.ApplicationRunner", - "org.springframework.boot.ApplicationArguments", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.spring.CustomApplicationRunner": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [ - "ApplicationRunner" - ], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "run(ApplicationArguments)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java", - "signature": "run(ApplicationArguments)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void run(ApplicationArguments args)", - "parameters": [ - { - "type": "ApplicationArguments", - "name": "args", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n System.out.println(\"ApplicationRunner executed\");\n}", - "start_line": 10, - "end_line": 13, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [ - "java.io.PrintStream" - ], - "accessed_fields": [ - "java.lang.System.out" - ], - "call_sites": [ - { - "method_name": "println", - "receiver_expr": "System.out", - "receiver_type": "java.io.PrintStream", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "println(java.lang.String)", - "is_public": true, - "is_protected": false, - "is_private": false, - "is_unspecified": false, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 12, - "start_column": 9, - "end_line": 12, - "end_column": 56 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java", - "comment": "", - "imports": [ - "org.springframework.web.bind.annotation.RestController", - "org.springframework.web.bind.annotation.GetMapping" - ], - "type_declarations": { - "org.entrypoints.spring.SpringController": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@RestController" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "hello()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java", - "signature": "hello()", - "comment": "", - "annotations": [ - "@GetMapping(\"/hello\")" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String hello()", - "parameters": [], - "code": "{\n return \"Hello from Spring!\";\n}", - "start_line": 9, - "end_line": 12, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java", - "comment": "", - "imports": [], - "type_declarations": {}, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java", - "comment": "", - "imports": [ - "org.apache.camel.builder.RouteBuilder", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.camel.RestRouteBuilder": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [ - "RouteBuilder" - ], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "configure()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java", - "signature": "configure()", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.lang.Exception" - ], - "declaration": "public void configure() throws Exception", - "parameters": [], - "code": "{\n restConfiguration().component(\"servlet\").bindingMode(\"json\");\n rest(\"/api\").get(\"/status\").to(\"direct:getStatus\").post(\"/order\").to(\"direct:submitOrder\");\n}", - "start_line": 9, - "end_line": 18, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "bindingMode", - "receiver_expr": "restConfiguration().component(\"servlet\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 13, - "end_column": 36 - }, - { - "method_name": "component", - "receiver_expr": "restConfiguration()", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 12, - "end_column": 37 - }, - { - "method_name": "restConfiguration", - "receiver_expr": "", - "receiver_type": "", - "argument_types": [], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 11, - "end_column": 27 - }, - { - "method_name": "to", - "receiver_expr": "rest(\"/api\").get(\"/status\").to(\"direct:getStatus\").post(\"/order\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 17, - "end_column": 56 - }, - { - "method_name": "post", - "receiver_expr": "rest(\"/api\").get(\"/status\").to(\"direct:getStatus\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 17, - "end_column": 31 - }, - { - "method_name": "to", - "receiver_expr": "rest(\"/api\").get(\"/status\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 16, - "end_column": 54 - }, - { - "method_name": "get", - "receiver_expr": "rest(\"/api\")", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 16, - "end_column": 31 - }, - { - "method_name": "rest", - "receiver_expr": "", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 15, - "start_column": 9, - "end_line": 15, - "end_column": 20 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "comment": "", - "imports": [ - "jakarta.annotation.PostConstruct", - "jakarta.annotation.PreDestroy", - "jakarta.batch.api.Batchlet", - "jakarta.batch.api.chunk.ItemProcessor", - "jakarta.ejb", - "jakarta.jms.Message", - "jakarta.jms.MessageListener", - "jakarta.jws.WebService", - "jakarta.jws.WebMethod", - "jakarta.servlet", - "jakarta.servlet.annotation", - "jakarta.servlet.http", - "jakarta.websocket", - "jakarta.websocket.server.ServerEndpoint", - "jakarta.xml.ws.WebServiceProvider", - "java.io.IOException" - ], - "type_declarations": { - "org.entrypoints.jakarta.JavaEEEntrypoints": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [ - "HttpServlet" - ], - "comment": "", - "implements_list": [ - "ServletContextListener", - "MessageListener" - ], - "modifiers": [ - "public" - ], - "annotations": [ - "@WebServlet(urlPatterns = \"/example\", asyncSupported = true)", - "@WebService", - "@ServerEndpoint(\"/websocket\")" - ], - "parent_type": "", - "nested_type_declarations": [ - "org.entrypoints.jakarta.JavaEEEntrypoints.RemoteBusinessInterface" - ], - "callable_declarations": { - "doTrace(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doTrace(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 56, - "end_line": 59, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "postPersist()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "postPersist()", - "comment": "", - "annotations": [ - "@PostPersist" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void postPersist()", - "parameters": [], - "code": "{\n}", - "start_line": 219, - "end_line": 221, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doPost(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doPost(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 31, - "end_line": 34, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onMessage(Session, String)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onMessage(Session, String)", - "comment": "", - "annotations": [ - "@OnMessage" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void onMessage(Session session, String message)", - "parameters": [ - { - "type": "Session", - "name": "session", - "annotations": [], - "modifiers": [] - }, - { - "type": "java.lang.String", - "name": "message", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 100, - "end_line": 102, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onClose(Session)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onClose(Session)", - "comment": "", - "annotations": [ - "@OnClose" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void onClose(Session session)", - "parameters": [ - { - "type": "Session", - "name": "session", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 104, - "end_line": 106, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "preRemove()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "preRemove()", - "comment": "", - "annotations": [ - "@PreRemove" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void preRemove()", - "parameters": [], - "code": "{\n}", - "start_line": 231, - "end_line": 233, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "contextDestroyed(ServletContextEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "contextDestroyed(ServletContextEvent)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void contextDestroyed(ServletContextEvent sce)", - "parameters": [ - { - "type": "ServletContextEvent", - "name": "sce", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 129, - "end_line": 131, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doDelete(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doDelete(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 41, - "end_line": 44, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "scheduledTask()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "scheduledTask()", - "comment": "// EJB Timer Methods", - "annotations": [ - "@Schedule(second = \"*/10\", minute = \"*\", hour = \"*\", persistent = false)" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void scheduledTask()", - "parameters": [], - "code": "{\n}", - "start_line": 150, - "end_line": 152, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "webServiceOperation(String)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "webServiceOperation(String)", - "comment": "// Web Service Methods", - "annotations": [ - "@WebMethod" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String webServiceOperation(String input)", - "parameters": [ - { - "type": "java.lang.String", - "name": "input", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n return input;\n}", - "start_line": 185, - "end_line": 188, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "programmaticTimeout(Timer)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "programmaticTimeout(Timer)", - "comment": "", - "annotations": [ - "@Timeout" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void programmaticTimeout(Timer timer)", - "parameters": [ - { - "type": "Timer", - "name": "timer", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 154, - "end_line": 156, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "getResource()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "getResource()", - "comment": "// JAX-RS Resource Methods (REST)", - "annotations": [ - "@GET", - "@Path(\"/resource\")" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String getResource()", - "parameters": [], - "code": "{\n return \"resource\";\n}", - "start_line": 195, - "end_line": 199, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "process()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "process()", - "comment": "// Batch Processing", - "annotations": [ - "@Batchlet" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String process()", - "parameters": [], - "code": "{\n return \"COMPLETED\";\n}", - "start_line": 113, - "end_line": 116, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doHead(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doHead(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 46, - "end_line": 49, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "destroy()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "destroy()", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void destroy()", - "parameters": [], - "code": "{\n super.destroy();\n}", - "start_line": 67, - "end_line": 70, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "destroy", - "receiver_expr": "super", - "receiver_type": "", - "argument_types": [], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 69, - "start_column": 9, - "end_line": 69, - "end_column": 23 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onComplete(AsyncEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onComplete(AsyncEvent)", - "comment": "// Async Servlet Methods", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.io.IOException" - ], - "declaration": "public void onComplete(AsyncEvent event) throws IOException", - "parameters": [ - { - "type": "AsyncEvent", - "name": "event", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 79, - "end_line": 81, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "handleRequest(String)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "handleRequest(String)", - "comment": "", - "annotations": [ - "@WebServiceProvider" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void handleRequest(String request)", - "parameters": [ - { - "type": "java.lang.String", - "name": "request", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 190, - "end_line": 192, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "automaticTimeout()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "automaticTimeout()", - "comment": "", - "annotations": [ - "@AutomaticTimeout" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void automaticTimeout()", - "parameters": [], - "code": "{\n}", - "start_line": 158, - "end_line": 160, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "postConstruct()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "postConstruct()", - "comment": "// Lifecycle Callbacks", - "annotations": [ - "@PostConstruct" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void postConstruct()", - "parameters": [], - "code": "{\n}", - "start_line": 163, - "end_line": 165, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onMessage(Message)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onMessage(Message)", - "comment": "// Message-Driven Bean Methods", - "annotations": [ - "@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = \"destinationType\", propertyValue = \"jakarta.jms.Queue\") })", - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void onMessage(Message message)", - "parameters": [ - { - "type": "Message", - "name": "message", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 172, - "end_line": 182, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onOpen(Session)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onOpen(Session)", - "comment": "// WebSocket Methods", - "annotations": [ - "@OnOpen" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void onOpen(Session session)", - "parameters": [ - { - "type": "Session", - "name": "session", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 96, - "end_line": 98, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "contextInitialized(ServletContextEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "contextInitialized(ServletContextEvent)", - "comment": "// ServletContext Listener Methods", - "annotations": [ - "@Override", - "@WebListener" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void contextInitialized(ServletContextEvent sce)", - "parameters": [ - { - "type": "ServletContextEvent", - "name": "sce", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 124, - "end_line": 127, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "postUpdate()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "postUpdate()", - "comment": "", - "annotations": [ - "@PostUpdate" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void postUpdate()", - "parameters": [], - "code": "{\n}", - "start_line": 227, - "end_line": 229, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doOptions(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doOptions(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 51, - "end_line": 54, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doFilter(ServletRequest, ServletResponse, FilterChain)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doFilter(ServletRequest, ServletResponse, FilterChain)", - "comment": "// Filter Methods", - "annotations": [ - "@WebFilter(\"/path/*\")" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.io.IOException", - "ServletException" - ], - "declaration": "public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException", - "parameters": [ - { - "type": "ServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "ServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - }, - { - "type": "FilterChain", - "name": "chain", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 73, - "end_line": 76, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "requestInitialized(ServletRequestEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "requestInitialized(ServletRequestEvent)", - "comment": "// Request Listener Methods", - "annotations": [ - "@WebListener" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void requestInitialized(ServletRequestEvent sre)", - "parameters": [ - { - "type": "ServletRequestEvent", - "name": "sre", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 142, - "end_line": 144, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onTimeout(AsyncEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onTimeout(AsyncEvent)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.io.IOException" - ], - "declaration": "public void onTimeout(AsyncEvent event) throws IOException", - "parameters": [ - { - "type": "AsyncEvent", - "name": "event", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 83, - "end_line": 85, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "processItem(Object)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "processItem(Object)", - "comment": "", - "annotations": [ - "@ItemProcessor" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public Object processItem(Object item)", - "parameters": [ - { - "type": "java.lang.Object", - "name": "item", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n return item;\n}", - "start_line": 118, - "end_line": 121, - "return_type": "java.lang.Object", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "securedMethod()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "securedMethod()", - "comment": "// Security Related Methods", - "annotations": [ - "@DeclareRoles({ \"admin\", \"user\" })", - "@RolesAllowed({ \"admin\" })" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void securedMethod()", - "parameters": [], - "code": "{\n}", - "start_line": 209, - "end_line": 212, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "postLoad()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "postLoad()", - "comment": "", - "annotations": [ - "@PostLoad" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void postLoad()", - "parameters": [], - "code": "{\n}", - "start_line": 239, - "end_line": 241, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doGet(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doGet(HttpServletRequest, HttpServletResponse)", - "comment": "// Servlet HTTP Methods", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 26, - "end_line": 29, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onError(AsyncEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onError(AsyncEvent)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.io.IOException" - ], - "declaration": "public void onError(AsyncEvent event) throws IOException", - "parameters": [ - { - "type": "AsyncEvent", - "name": "event", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 87, - "end_line": 89, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "sessionDestroyed(HttpSessionEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "sessionDestroyed(HttpSessionEvent)", - "comment": "", - "annotations": [], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void sessionDestroyed(HttpSessionEvent se)", - "parameters": [ - { - "type": "HttpSessionEvent", - "name": "se", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 138, - "end_line": 139, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "postRemove()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "postRemove()", - "comment": "", - "annotations": [ - "@PostRemove" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void postRemove()", - "parameters": [], - "code": "{\n}", - "start_line": 235, - "end_line": 237, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "requestDestroyed(ServletRequestEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "requestDestroyed(ServletRequestEvent)", - "comment": "", - "annotations": [], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void requestDestroyed(ServletRequestEvent sre)", - "parameters": [ - { - "type": "ServletRequestEvent", - "name": "sre", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 146, - "end_line": 147, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "init(ServletConfig)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "init(ServletConfig)", - "comment": "// Servlet Lifecycle Methods", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "ServletException" - ], - "declaration": "public void init(ServletConfig config) throws ServletException", - "parameters": [ - { - "type": "ServletConfig", - "name": "config", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n super.init(config);\n}", - "start_line": 62, - "end_line": 65, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "init", - "receiver_expr": "super", - "receiver_type": "", - "argument_types": [ - "" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 64, - "start_column": 9, - "end_line": 64, - "end_column": 26 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onStartAsync(AsyncEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onStartAsync(AsyncEvent)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.io.IOException" - ], - "declaration": "public void onStartAsync(AsyncEvent event) throws IOException", - "parameters": [ - { - "type": "AsyncEvent", - "name": "event", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 91, - "end_line": 93, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "onError(Session, Throwable)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "onError(Session, Throwable)", - "comment": "", - "annotations": [ - "@OnError" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void onError(Session session, Throwable throwable)", - "parameters": [ - { - "type": "Session", - "name": "session", - "annotations": [], - "modifiers": [] - }, - { - "type": "java.lang.Throwable", - "name": "throwable", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 108, - "end_line": 110, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "prePersist()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "prePersist()", - "comment": "// JPA Entity Lifecycle Methods", - "annotations": [ - "@PrePersist" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void prePersist()", - "parameters": [], - "code": "{\n}", - "start_line": 215, - "end_line": 217, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "doPut(HttpServletRequest, HttpServletResponse)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "doPut(HttpServletRequest, HttpServletResponse)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "protected" - ], - "thrown_exceptions": [ - "ServletException", - "java.io.IOException" - ], - "declaration": "protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException", - "parameters": [ - { - "type": "HttpServletRequest", - "name": "request", - "annotations": [], - "modifiers": [] - }, - { - "type": "HttpServletResponse", - "name": "response", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 36, - "end_line": 39, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "sessionCreated(HttpSessionEvent)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "sessionCreated(HttpSessionEvent)", - "comment": "// Session Listener Methods", - "annotations": [ - "@WebListener" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void sessionCreated(HttpSessionEvent se)", - "parameters": [ - { - "type": "HttpSessionEvent", - "name": "se", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n}", - "start_line": 134, - "end_line": 136, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "preUpdate()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "preUpdate()", - "comment": "", - "annotations": [ - "@PreUpdate" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void preUpdate()", - "parameters": [], - "code": "{\n}", - "start_line": 223, - "end_line": 225, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "preDestroy()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "preDestroy()", - "comment": "", - "annotations": [ - "@PreDestroy" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void preDestroy()", - "parameters": [], - "code": "{\n}", - "start_line": 167, - "end_line": 169, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - }, - "org.entrypoints.jakarta.JavaEEEntrypoints.RemoteBusinessInterface": { - "is_nested_type": true, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": true, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "// EJB Remote Business Interface Methods", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Remote" - ], - "parent_type": "org.entrypoints.jakarta.JavaEEEntrypoints", - "nested_type_declarations": [], - "callable_declarations": { - "businessMethod()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java", - "signature": "businessMethod()", - "comment": "", - "annotations": [], - "modifiers": [], - "thrown_exceptions": [], - "declaration": "abstract void businessMethod()", - "parameters": [], - "code": "", - "start_line": 205, - "end_line": 205, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": false - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java", - "comment": "", - "imports": [ - "jakarta.ws.rs.GET", - "jakarta.ws.rs.Path", - "jakarta.ws.rs.Produces", - "jakarta.ws.rs.core.MediaType" - ], - "type_declarations": { - "org.entrypoints.jaxrs.JaxRsResource": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Path(\"/api\")" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "hello()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java", - "signature": "hello()", - "comment": "", - "annotations": [ - "@GET", - "@Path(\"/hello\")", - "@Produces(MediaType.TEXT_PLAIN)" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String hello()", - "parameters": [], - "code": "{\n return \"Hello from JAX-RS!\";\n}", - "start_line": 11, - "end_line": 16, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java", - "comment": "", - "imports": [ - "org.springframework.boot.CommandLineRunner", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.spring.CustomCommandLineRunner": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [ - "CommandLineRunner" - ], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "run(String[])": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java", - "signature": "run(String[])", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public void run(String... args)", - "parameters": [ - { - "type": "java.lang.String", - "name": "args", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n System.out.println(\"CommandLineRunner executed\");\n}", - "start_line": 9, - "end_line": 12, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [ - "java.io.PrintStream" - ], - "accessed_fields": [ - "java.lang.System.out" - ], - "call_sites": [ - { - "method_name": "println", - "receiver_expr": "System.out", - "receiver_type": "java.io.PrintStream", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "println(java.lang.String)", - "is_public": true, - "is_protected": false, - "is_private": false, - "is_unspecified": false, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 9, - "end_line": 11, - "end_column": 56 - } - ], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java", - "comment": "", - "imports": [ - "org.springframework.web.bind.annotation.RestController", - "org.springframework.web.bind.annotation.PostMapping", - "org.springframework.web.bind.annotation.RequestBody" - ], - "type_declarations": { - "org.entrypoints.spring.SpringBootController": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@RestController" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "processData(String)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java", - "signature": "processData(String)", - "comment": "", - "annotations": [ - "@PostMapping(\"/api/data\")" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String processData(@RequestBody String data)", - "parameters": [ - { - "type": "java.lang.String", - "name": "data", - "annotations": [ - "@RequestBody" - ], - "modifiers": [] - } - ], - "code": "{\n return \"Processed: \" + data;\n}", - "start_line": 10, - "end_line": 13, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", - "comment": "", - "imports": [ - "com.opensymphony.xwork2.ActionSupport", - "org.apache.struts2.convention.annotation.Action", - "org.apache.struts2.convention.annotation.Namespace", - "org.apache.struts2.convention.annotation.Result" - ], - "type_declarations": { - "org.entrypoints.struts.UserAction": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [ - "ActionSupport" - ], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [ - "@Namespace(\"/user\")" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "listUsers()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", - "signature": "listUsers()", - "comment": "", - "annotations": [ - "@Action(value = \"list\", results = { @Result(name = \"success\", location = \"/user/list.jsp\") })" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String listUsers()", - "parameters": [], - "code": "{\n return SUCCESS;\n}", - "start_line": 11, - "end_line": 16, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - }, - "addUser()": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java", - "signature": "addUser()", - "comment": "", - "annotations": [ - "@Action(value = \"add\", results = { @Result(name = \"success\", location = \"/user/add.jsp\") })" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [], - "declaration": "public String addUser()", - "parameters": [], - "code": "{\n return SUCCESS;\n}", - "start_line": 18, - "end_line": 23, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [], - "accessed_fields": [], - "call_sites": [], - "variable_declarations": [], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java", - "comment": "", - "imports": [ - "org.apache.camel.Exchange", - "org.apache.camel.Processor", - "org.springframework.stereotype.Component" - ], - "type_declarations": { - "org.entrypoints.camel.CamelProcessor": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [], - "comment": "", - "implements_list": [ - "Processor" - ], - "modifiers": [ - "public" - ], - "annotations": [ - "@Component" - ], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "process(Exchange)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java", - "signature": "process(Exchange)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.lang.Exception" - ], - "declaration": "public void process(Exchange exchange) throws Exception", - "parameters": [ - { - "type": "Exchange", - "name": "exchange", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n // Process message\n String body = exchange.getIn().getBody(String.class);\n exchange.getMessage().setBody(\"Processed: \" + body);\n}", - "start_line": 10, - "end_line": 15, - "return_type": "void", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [ - "java.lang.String" - ], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "getBody", - "receiver_expr": "exchange.getIn()", - "receiver_type": "", - "argument_types": [ - "java.lang.Class" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 13, - "start_column": 23, - "end_line": 13, - "end_column": 60 - }, - { - "method_name": "getIn", - "receiver_expr": "exchange", - "receiver_type": "", - "argument_types": [], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 13, - "start_column": 23, - "end_line": 13, - "end_column": 38 - }, - { - "method_name": "setBody", - "receiver_expr": "exchange.getMessage()", - "receiver_type": "", - "argument_types": [ - "java.lang.String" - ], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 14, - "start_column": 9, - "end_line": 14, - "end_column": 59 - }, - { - "method_name": "getMessage", - "receiver_expr": "exchange", - "receiver_type": "", - "argument_types": [], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 14, - "start_column": 9, - "end_line": 14, - "end_column": 29 - } - ], - "variable_declarations": [ - { - "name": "body", - "type": "java.lang.String", - "initializer": "exchange.getIn().getBody(String.class)", - "start_line": 13, - "start_column": 16, - "end_line": 13, - "end_column": 60 - } - ], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": true - } - }, - "is_modified": false - }, - "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java", - "comment": "", - "imports": [ - "com.opensymphony.xwork2.ActionInvocation", - "com.opensymphony.xwork2.interceptor.AbstractInterceptor" - ], - "type_declarations": { - "org.entrypoints.struts.InterceptorExample": { - "is_nested_type": false, - "is_class_or_interface_declaration": true, - "is_enum_declaration": false, - "is_annotation_declaration": false, - "is_record_declaration": false, - "is_interface": false, - "is_inner_class": false, - "is_local_class": false, - "extends_list": [ - "AbstractInterceptor" - ], - "comment": "", - "implements_list": [], - "modifiers": [ - "public" - ], - "annotations": [], - "parent_type": "", - "nested_type_declarations": [], - "callable_declarations": { - "intercept(ActionInvocation)": { - "file_path": "/Users/rkrsn/workspace/codellm-devkit/codenet-minerva-code-analyzer/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java", - "signature": "intercept(ActionInvocation)", - "comment": "", - "annotations": [ - "@Override" - ], - "modifiers": [ - "public" - ], - "thrown_exceptions": [ - "java.lang.Exception" - ], - "declaration": "public String intercept(ActionInvocation invocation) throws Exception", - "parameters": [ - { - "type": "ActionInvocation", - "name": "invocation", - "annotations": [], - "modifiers": [] - } - ], - "code": "{\n // Pre-processing\n String result = invocation.invoke();\n // Post-processing\n return result;\n}", - "start_line": 8, - "end_line": 14, - "return_type": "java.lang.String", - "is_implicit": false, - "is_constructor": false, - "referenced_types": [ - "java.lang.String" - ], - "accessed_fields": [], - "call_sites": [ - { - "method_name": "invoke", - "receiver_expr": "invocation", - "receiver_type": "", - "argument_types": [], - "return_type": "", - "callee_signature": "", - "is_public": false, - "is_protected": false, - "is_private": false, - "is_unspecified": true, - "is_static_call": false, - "is_constructor_call": false, - "is_database": false, - "start_line": 11, - "start_column": 25, - "end_line": 11, - "end_column": 43 - } - ], - "variable_declarations": [ - { - "name": "result", - "type": "java.lang.String", - "initializer": "invocation.invoke()", - "start_line": 11, - "start_column": 16, - "end_line": 11, - "end_column": 43 - } - ], - "cyclomatic_complexity": 1, - "is_entry_point": false - } - }, - "field_declarations": [], - "is_entry_point_class": false - } - }, - "is_modified": false - } - }, - "version": "2.1.0" -} \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/build.gradle b/src/test/resources/test-applications/EntrypointTestApp/build.gradle deleted file mode 100644 index bfb6acbb..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -plugins { - id 'java' - id 'org.springframework.boot' version '3.2.2' - id 'io.spring.dependency-management' version '1.1.4' -} - -group 'org.entrypoints' -version '1.0-SNAPSHOT' - -repositories { - mavenCentral() -} - -dependencies { - // Spring Boot - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - - // Apache Struts - implementation 'org.apache.struts:struts2-core:6.1.2' - implementation 'org.apache.struts:struts2-convention-plugin:6.1.2' - - // Apache Camel - implementation 'org.apache.camel:camel-core:4.3.0' - implementation 'org.apache.camel.springboot:camel-spring-boot-starter:4.9.0' - implementation 'org.apache.camel:camel-rest:4.3.0' - - // Jakarta EE API - implementation 'jakarta.platform:jakarta.jakartaee-api:9.1.0' - - // JAX-RS API - implementation 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0' - - // Test dependencies - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' -} \ No newline at end of file diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties b/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c7d437bb..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradlew b/src/test/resources/test-applications/EntrypointTestApp/gradlew deleted file mode 100755 index 65dcd68d..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/gradlew +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat b/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat deleted file mode 100644 index 6689b85b..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/test/resources/test-applications/EntrypointTestApp/settings.gradle b/src/test/resources/test-applications/EntrypointTestApp/settings.gradle deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/SpringBootApplication.java deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java deleted file mode 100644 index 0a298791..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CamelProcessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.entrypoints.camel; - -import org.apache.camel.Exchange; -import org.apache.camel.Processor; -import org.springframework.stereotype.Component; - -@Component -public class CamelProcessor implements Processor { - - @Override - public void process(Exchange exchange) throws Exception { - // Process message - String body = exchange.getIn().getBody(String.class); - exchange.getMessage().setBody("Processed: " + body); - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java deleted file mode 100644 index d440b10d..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/CustomRouteBuilder.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.entrypoints.camel; - -import org.apache.camel.builder.RouteBuilder; -import org.springframework.stereotype.Component; - -@Component -public class CustomRouteBuilder extends RouteBuilder { - - @Override - public void configure() throws Exception { - from("file:input/orders") - .routeId("orderProcessingRoute") - .to("direct:processOrder"); - - from("direct:processOrder") - .process(exchange -> { - // Process order - }) - .to("file:output/processed"); - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java deleted file mode 100644 index 91f4ccd3..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/MessageConsumer.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.entrypoints.camel; - -import org.apache.camel.Consume; -import org.apache.camel.Handler; -import org.springframework.stereotype.Component; - -@Component -public class MessageConsumer { - - @Consume(uri = "direct:processMessage") - @Handler - public void processMessage(String message) { - // Process message - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java deleted file mode 100644 index 96979b98..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/camel/RestRouteBuilder.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.entrypoints.camel; - -import org.apache.camel.builder.RouteBuilder; -import org.springframework.stereotype.Component; - -@Component -public class RestRouteBuilder extends RouteBuilder { - - @Override - public void configure() throws Exception { - restConfiguration() - .component("servlet") - .bindingMode("json"); - - rest("/api") - .get("/status").to("direct:getStatus") - .post("/order").to("direct:submitOrder"); - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java deleted file mode 100644 index c1c514cb..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jakarta/JavaEEEntrypoints.java +++ /dev/null @@ -1,242 +0,0 @@ -package org.entrypoints.jakarta; - -import jakarta.annotation.PostConstruct; -import jakarta.annotation.PreDestroy; -import jakarta.batch.api.Batchlet; -import jakarta.batch.api.chunk.ItemProcessor; -import jakarta.ejb.*; -import jakarta.jms.Message; -import jakarta.jms.MessageListener; -import jakarta.jws.WebService; -import jakarta.jws.WebMethod; -import jakarta.servlet.*; -import jakarta.servlet.annotation.*; -import jakarta.servlet.http.*; -import jakarta.websocket.*; -import jakarta.websocket.server.ServerEndpoint; -import jakarta.xml.ws.WebServiceProvider; -import java.io.IOException; - -@WebServlet(urlPatterns = "/example", asyncSupported = true) -@WebService -@ServerEndpoint("/websocket") -public class JavaEEEntrypoints extends HttpServlet implements ServletContextListener, MessageListener { - - // Servlet HTTP Methods - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doPut(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doDelete(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doHead(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doOptions(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - @Override - protected void doTrace(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - } - - // Servlet Lifecycle Methods - @Override - public void init(ServletConfig config) throws ServletException { - super.init(config); - } - - @Override - public void destroy() { - super.destroy(); - } - - // Filter Methods - @WebFilter("/path/*") - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - } - - // Async Servlet Methods - @Override - public void onComplete(AsyncEvent event) throws IOException { - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException { - } - - @Override - public void onError(AsyncEvent event) throws IOException { - } - - @Override - public void onStartAsync(AsyncEvent event) throws IOException { - } - - // WebSocket Methods - @OnOpen - public void onOpen(Session session) { - } - - @OnMessage - public void onMessage(Session session, String message) { - } - - @OnClose - public void onClose(Session session) { - } - - @OnError - public void onError(Session session, Throwable throwable) { - } - - // Batch Processing - @Batchlet - public String process() { - return "COMPLETED"; - } - - @ItemProcessor - public Object processItem(Object item) { - return item; - } - - // ServletContext Listener Methods - @Override - @WebListener - public void contextInitialized(ServletContextEvent sce) { - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - } - - // Session Listener Methods - @WebListener - public void sessionCreated(HttpSessionEvent se) { - } - - public void sessionDestroyed(HttpSessionEvent se) { - } - - // Request Listener Methods - @WebListener - public void requestInitialized(ServletRequestEvent sre) { - } - - public void requestDestroyed(ServletRequestEvent sre) { - } - - // EJB Timer Methods - @Schedule(second = "*/10", minute = "*", hour = "*", persistent = false) - public void scheduledTask() { - } - - @Timeout - public void programmaticTimeout(Timer timer) { - } - - @AutomaticTimeout - public void automaticTimeout() { - } - - // Lifecycle Callbacks - @PostConstruct - public void postConstruct() { - } - - @PreDestroy - public void preDestroy() { - } - - // Message-Driven Bean Methods - @MessageDriven( - activationConfig = { - @ActivationConfigProperty( - propertyName = "destinationType", - propertyValue = "jakarta.jms.Queue" - ) - } - ) - @Override - public void onMessage(Message message) { - } - - // Web Service Methods - @WebMethod - public String webServiceOperation(String input) { - return input; - } - - @WebServiceProvider - public void handleRequest(String request) { - } - - // JAX-RS Resource Methods (REST) - @GET - @Path("/resource") - public String getResource() { - return "resource"; - } - - // EJB Remote Business Interface Methods - @Remote - public interface RemoteBusinessInterface { - - void businessMethod(); - } - - // Security Related Methods - @DeclareRoles({"admin", "user"}) - @RolesAllowed({"admin"}) - public void securedMethod() { - } - - // JPA Entity Lifecycle Methods - @PrePersist - public void prePersist() { - } - - @PostPersist - public void postPersist() { - } - - @PreUpdate - public void preUpdate() { - } - - @PostUpdate - public void postUpdate() { - } - - @PreRemove - public void preRemove() { - } - - @PostRemove - public void postRemove() { - } - - @PostLoad - public void postLoad() { - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java deleted file mode 100644 index 9a9869c0..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/jaxrs/JaxRsResource.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.entrypoints.jaxrs; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -@Path("/api") -public class JaxRsResource { - - @GET - @Path("/hello") - @Produces(MediaType.TEXT_PLAIN) - public String hello() { - return "Hello from JAX-RS!"; - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java deleted file mode 100644 index e63cf304..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomApplicationRunner.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.entrypoints.spring; - -import org.springframework.boot.ApplicationRunner; -import org.springframework.boot.ApplicationArguments; -import org.springframework.stereotype.Component; - -@Component -public class CustomApplicationRunner implements ApplicationRunner { - - @Override - public void run(ApplicationArguments args) { - System.out.println("ApplicationRunner executed"); - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java deleted file mode 100644 index f5a9bf3f..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/CustomCommandLineRunner.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.entrypoints.spring; - -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -@Component -public class CustomCommandLineRunner implements CommandLineRunner { - - @Override - public void run(String... args) { - System.out.println("CommandLineRunner executed"); - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java deleted file mode 100644 index e58d4e9a..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringBootController.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.entrypoints.spring; - -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -@RestController -public class SpringBootController { - - @PostMapping("/api/data") - public String processData(@RequestBody String data) { - return "Processed: " + data; - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java deleted file mode 100644 index b130ca1b..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/SpringController.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.entrypoints.spring; - -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.GetMapping; - -@RestController -public class SpringController { - - @GetMapping("/hello") - public String hello() { - return "Hello from Spring!"; - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java deleted file mode 100644 index 30186471..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/spring/WebSecurityConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.entrypoints.spring; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebSecurityConfig implements WebMvcConfigurer { - // Configuration methods -} -package org.example.jaxrs; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; - -import jakarta.ws.rs.core.MediaType; - -@Path("/api") -public class JaxRsResource { - - @GET - @Path("/hello") - @Produces(MediaType.TEXT_PLAIN) - public String hello() { - return "Hello from JAX-RS!"; - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java deleted file mode 100644 index 0dd8330f..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/InterceptorExample.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.entrypoints.struts; - -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.interceptor.AbstractInterceptor; - -public class InterceptorExample extends AbstractInterceptor { - - @Override - public String intercept(ActionInvocation invocation) throws Exception { - // Pre-processing - String result = invocation.invoke(); - // Post-processing - return result; - } -} diff --git a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java b/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java deleted file mode 100644 index 6434d068..00000000 --- a/src/test/resources/test-applications/EntrypointTestApp/src/main/java/org/entrypoints/struts/UserAction.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.entrypoints.struts; - -import com.opensymphony.xwork2.ActionSupport; -import org.apache.struts2.convention.annotation.Action; -import org.apache.struts2.convention.annotation.Namespace; -import org.apache.struts2.convention.annotation.Result; - -@Namespace("/user") -public class UserAction extends ActionSupport { - - @Action(value = "list", - results = { - @Result(name = "success", location = "/user/list.jsp")}) - public String listUsers() { - return SUCCESS; - } - - @Action(value = "add", - results = { - @Result(name = "success", location = "/user/add.jsp")}) - public String addUser() { - return SUCCESS; - } -} From 8a4ab5364ed56c35d91cf2aa66c529d9c41b15b8 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 5 Feb 2025 00:12:24 -0500 Subject: [PATCH 3/4] Feature request #86: Fix typo in entrypoints. entry_point -> entrypoint. Signed-off-by: Rahul Krishna --- src/main/java/com/ibm/cldk/SymbolTable.java | 4 ++-- src/main/java/com/ibm/cldk/entities/CRUDOperation.java | 1 + src/main/java/com/ibm/cldk/entities/Callable.java | 2 +- src/main/java/com/ibm/cldk/entities/Type.java | 2 +- .../java/com/ibm/cldk/utils/annotations/NotImplemented.java | 2 +- src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java | 4 ++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index 97a4535c..e700f375 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -183,7 +183,7 @@ private static JavaCompilationUnit processCompilationUnit(CompilationUnit parseR }).collect(Collectors.toMap(p -> p.getLeft(), p -> p.getRight()))); // Add information about if the TypeNode is an entry point class - typeNode.setEntryPointClass(isEntryPointClass(typeDecl)); + typeNode.setEntrypointClass(isEntryPointClass(typeDecl)); return Pair.of(typeName, typeNode); @@ -389,7 +389,7 @@ private static Pair processCallableDeclaration(CallableDeclara // modifiers callableNode.setParameters((List) callableDecl.getParameters().stream().map(param -> processParameterDeclaration((Parameter) param)).collect(Collectors.toList())); - callableNode.setEntryPoint(isEntryPointMethod(callableDecl)); + callableNode.setEntrypoint(isEntryPointMethod(callableDecl)); // A method declaration may not have a body if it is an abstract method. A // constructor always // has a body. So, we need to check if the body is present before processing it diff --git a/src/main/java/com/ibm/cldk/entities/CRUDOperation.java b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java index 02290748..3a7fbb6c 100644 --- a/src/main/java/com/ibm/cldk/entities/CRUDOperation.java +++ b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java @@ -9,6 +9,7 @@ @Data @NoArgsConstructor @AllArgsConstructor +@NotImplemented public class CRUDOperation { public enum OperationType { CREATE, diff --git a/src/main/java/com/ibm/cldk/entities/Callable.java b/src/main/java/com/ibm/cldk/entities/Callable.java index 68392d2b..f854acff 100644 --- a/src/main/java/com/ibm/cldk/entities/Callable.java +++ b/src/main/java/com/ibm/cldk/entities/Callable.java @@ -26,6 +26,6 @@ public class Callable { private List callSites; private List variableDeclarations; private int cyclomaticComplexity; - private boolean isEntryPoint = false; + private boolean isEntrypoint = false; private List crudOperations = null; } diff --git a/src/main/java/com/ibm/cldk/entities/Type.java b/src/main/java/com/ibm/cldk/entities/Type.java index d46c64d6..33c18688 100644 --- a/src/main/java/com/ibm/cldk/entities/Type.java +++ b/src/main/java/com/ibm/cldk/entities/Type.java @@ -25,5 +25,5 @@ public class Type { private Map callableDeclarations; private List fieldDeclarations; private List enumConstants; - private boolean isEntryPointClass = false; + private boolean isEntrypointClass = false; } \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java index 90aefaf0..7a70b629 100644 --- a/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java +++ b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java @@ -3,7 +3,7 @@ import java.lang.annotation.*; @Documented -@Target({ElementType.METHOD, ElementType.FIELD}) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface NotImplemented { String value() default ""; diff --git a/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java b/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java index c5f060c4..0697d936 100644 --- a/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java +++ b/src/test/java/com/ibm/cldk/CodeAnalyzerIntegrationTest.java @@ -162,7 +162,7 @@ void shouldBeAbleToGenerateAnalysisArtifactForDaytrader8() throws Exception { "--input=/test-applications/daytrader8", "--analysis-level=1" ); - Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entry_point_class\": true"), "No entry point classes found"); - Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entry_point\": true"), "No entry point methods found"); + Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entrypoint_class\": true"), "No entry point classes found"); + Assertions.assertTrue(runCodeAnalyzerOnDaytrader8.getStdout().contains("\"is_entrypoint\": true"), "No entry point methods found"); } } \ No newline at end of file From 8a2be2d2afc3fdc848315732c7b144053b6ba45b Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Wed, 5 Feb 2025 16:57:36 -0500 Subject: [PATCH 4/4] Add daytrader8 to test cases, update servlet entrypoint method detection logic to check for @Override on methods in addition to checking for parameter types matches to HttpRequest/HttpResponse. Signed-off-by: Rahul Krishna --- src/main/java/com/ibm/cldk/SymbolTable.java | 2 +- .../com/ibm/cldk/entities/CRUDOperation.java | 10 +- .../utils/annotations/NotImplemented.java | 3 +- .../com/ibm/cldk/utils/annotations/Todo.java | 12 + .../test-applications/daytrader8/.gitignore | 11 + .../test-applications/daytrader8/Dockerfile | 14 + .../daytrader8/Dockerfile-db2 | 21 + .../test-applications/daytrader8/LICENSE | 202 ++ .../test-applications/daytrader8/README.md | 45 + .../daytrader8/README_LOAD_TEST.md | 151 + .../daytrader8/jmeter_files/README.txt | 54 + .../daytrader8/jmeter_files/daytrader8.jmx | 2607 +++++++++++++++++ .../jmeter_files/daytrader8_mojarra.jmx | 2600 ++++++++++++++++ .../jmeter_files/daytrader8_mojarra_no_ws.jmx | 2600 ++++++++++++++++ .../jmeter_files/daytrader8_no_ws.jmx | 2607 +++++++++++++++++ .../jmeter_files/daytrader_primitive.jmx | 203 ++ .../test-applications/daytrader8/pom.xml | 104 + .../tradedb/README_DO_NOT_TOUCH_FILES.txt | 9 + .../tradedb/log/README_DO_NOT_TOUCH_FILES.txt | 8 + .../resources/data/tradedb/log/log.ctrl | Bin 0 -> 48 bytes .../resources/data/tradedb/log/log286.dat | Bin 0 -> 1048576 bytes .../resources/data/tradedb/log/logmirror.ctrl | Bin 0 -> 48 bytes .../seg0/README_DO_NOT_TOUCH_FILES.txt | 8 + .../resources/data/tradedb/seg0/c10.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c101.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c111.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c121.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c130.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c141.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c150.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c161.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c171.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c180.dat | Bin 0 -> 40960 bytes .../resources/data/tradedb/seg0/c191.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c1a1.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c1b1.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c1c0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c1d1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c1e0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c1f1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c20.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c200.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c211.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c221.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c230.dat | Bin 0 -> 151552 bytes .../resources/data/tradedb/seg0/c241.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c251.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c260.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c271.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c281.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c290.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c2a1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c2b1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c2c1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c2d0.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c2e1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c2f0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c300.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c31.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c311.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c321.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c331.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c340.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c351.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c361.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c371.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c380.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c391.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3a1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3b1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3c0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3d1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3e1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c3f1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c400.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c41.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c411.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c421.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c430.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c441.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c451.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c461.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c470.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c481.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c490.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c4a1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c4b0.dat | Bin 0 -> 65536 bytes .../resources/data/tradedb/seg0/c4c1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c4d0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c4e1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c4f1.dat | Bin 0 -> 65536 bytes .../resources/data/tradedb/seg0/c51.dat | Bin 0 -> 16384 bytes .../resources/data/tradedb/seg0/c60.dat | Bin 0 -> 12288 bytes .../resources/data/tradedb/seg0/c71.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c720.dat | Bin 0 -> 200704 bytes .../resources/data/tradedb/seg0/c731.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c740.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c751.dat | Bin 0 -> 28672 bytes .../resources/data/tradedb/seg0/c760.dat | Bin 0 -> 135168 bytes .../resources/data/tradedb/seg0/c771.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c780.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c791.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c7a0.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c7b1.dat | Bin 0 -> 20480 bytes .../resources/data/tradedb/seg0/c7c0.dat | Bin 0 -> 331776 bytes .../resources/data/tradedb/seg0/c7d1.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c7e1.dat | Bin 0 -> 28672 bytes .../resources/data/tradedb/seg0/c7f1.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c801.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c81.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/c811.dat | Bin 0 -> 69632 bytes .../resources/data/tradedb/seg0/c821.dat | Bin 0 -> 135168 bytes .../resources/data/tradedb/seg0/c90.dat | Bin 0 -> 36864 bytes .../resources/data/tradedb/seg0/ca1.dat | Bin 0 -> 32768 bytes .../resources/data/tradedb/seg0/cb1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/cc0.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/cd1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/ce1.dat | Bin 0 -> 8192 bytes .../resources/data/tradedb/seg0/cf0.dat | Bin 0 -> 12288 bytes .../resources/data/tradedb/service.properties | 23 + .../daytrader8/scripts/buildAll.sh | 20 + .../daytrader8/scripts/switchFromPayara.sh | 16 + .../daytrader8/scripts/switchFromWF.sh | 17 + .../daytrader8/scripts/switchToPayara.sh | 16 + .../daytrader8/scripts/switchToWF.sh | 17 + .../src/main/java/META-INF/DEPENDENCIES | 15 + .../daytrader8/src/main/java/META-INF/LICENSE | 202 ++ .../daytrader8/src/main/java/build.properties | 17 + .../beans/MarketSummaryDataBean.java | 287 ++ .../daytrader/beans/RunStatsDataBean.java | 294 ++ .../daytrader/entities/AccountDataBean.java | 286 ++ .../entities/AccountProfileDataBean.java | 184 ++ .../daytrader/entities/HoldingDataBean.java | 204 ++ .../daytrader/entities/OrderDataBean.java | 339 +++ .../daytrader/entities/QuoteDataBean.java | 213 ++ .../daytrader/impl/direct/AsyncOrder.java | 71 + .../impl/direct/AsyncOrderSubmitter.java | 40 + .../impl/direct/KeySequenceDirect.java | 114 + .../daytrader/impl/direct/TradeDirect.java | 1837 ++++++++++++ .../impl/direct/TradeDirectDBUtils.java | 472 +++ .../impl/ejb3/AsyncScheduledOrder.java | 59 + .../ejb3/AsyncScheduledOrderSubmitter.java | 41 + .../impl/ejb3/MarketSummarySingleton.java | 138 + .../daytrader/impl/ejb3/TradeSLSBBean.java | 618 ++++ .../impl/session2direct/DirectSLSBBean.java | 237 ++ .../interfaces/MarketSummaryUpdate.java | 27 + .../interfaces/QuotePriceChange.java | 31 + .../daytrader/interfaces/RuntimeMode.java | 33 + .../samples/daytrader/interfaces/Trace.java | 33 + .../samples/daytrader/interfaces/TradeDB.java | 44 + .../daytrader/interfaces/TradeEJB.java | 32 + .../daytrader/interfaces/TradeJDBC.java | 32 + .../daytrader/interfaces/TradeServices.java | 338 +++ .../interfaces/TradeSession2Direct.java | 32 + .../daytrader/jaxrs/BroadcastResource.java | 70 + .../daytrader/jaxrs/JAXRSApplication.java | 28 + .../daytrader/jaxrs/QuoteResource.java | 84 + .../samples/daytrader/mdb/DTBroker3MDB.java | 159 + .../samples/daytrader/mdb/DTStreamer3MDB.java | 123 + .../samples/daytrader/util/Diagnostics.java | 77 + .../daytrader/util/FinancialUtils.java | 105 + .../samples/daytrader/util/KeyBlock.java | 140 + .../websphere/samples/daytrader/util/Log.java | 162 + .../samples/daytrader/util/MDBStats.java | 68 + .../util/RecentQuotePriceChangeList.java | 77 + .../samples/daytrader/util/TimerStat.java | 133 + .../daytrader/util/TraceInterceptor.java | 49 + .../samples/daytrader/util/TradeConfig.java | 752 +++++ .../util/TradeRunTimeModeLiteral.java | 35 + .../daytrader/web/jsf/AccountDataJSF.java | 327 +++ .../daytrader/web/jsf/HoldingData.java | 118 + .../daytrader/web/jsf/JSFLoginFilter.java | 88 + .../daytrader/web/jsf/LoginValidator.java | 55 + .../daytrader/web/jsf/MarketSummaryJSF.java | 166 ++ .../samples/daytrader/web/jsf/OrderData.java | 140 + .../daytrader/web/jsf/OrderDataJSF.java | 106 + .../daytrader/web/jsf/PortfolioJSF.java | 235 ++ .../samples/daytrader/web/jsf/QuoteData.java | 167 ++ .../samples/daytrader/web/jsf/QuoteJSF.java | 146 + .../daytrader/web/jsf/TradeAppJSF.java | 298 ++ .../daytrader/web/jsf/TradeConfigJSF.java | 331 +++ .../daytrader/web/prims/ExplicitGC.java | 158 + .../samples/daytrader/web/prims/PingBean.java | 41 + .../daytrader/web/prims/PingJDBCRead.java | 135 + .../daytrader/web/prims/PingJDBCRead2JSP.java | 128 + .../daytrader/web/prims/PingJDBCWrite.java | 140 + .../daytrader/web/prims/PingJSONPObject.java | 128 + .../web/prims/PingJSONPObjectFactory.java | 127 + .../web/prims/PingJSONPStreaming.java | 151 + .../web/prims/PingManagedExecutor.java | 120 + .../web/prims/PingManagedThread.java | 126 + .../web/prims/PingReentryServlet.java | 138 + .../daytrader/web/prims/PingServlet.java | 112 + .../daytrader/web/prims/PingServlet2DB.java | 114 + .../web/prims/PingServlet2Include.java | 104 + .../web/prims/PingServlet2IncludeRcv.java | 68 + .../daytrader/web/prims/PingServlet2JNDI.java | 109 + .../daytrader/web/prims/PingServlet2Jsp.java | 78 + .../daytrader/web/prims/PingServlet2PDF.java | 115 + .../web/prims/PingServlet2Servlet.java | 82 + .../web/prims/PingServlet2ServletRcv.java | 97 + .../web/prims/PingServlet30Async.java | 118 + .../web/prims/PingServlet31Async.java | 186 ++ .../web/prims/PingServlet31AsyncRead.java | 145 + .../prims/PingServletLargeContentLength.java | 95 + .../prims/PingServletSetContentLength.java | 121 + .../web/prims/PingServletWriter.java | 110 + .../daytrader/web/prims/PingSession1.java | 136 + .../daytrader/web/prims/PingSession2.java | 145 + .../daytrader/web/prims/PingSession3.java | 182 ++ .../web/prims/PingSession3Object.java | 92 + .../web/prims/PingUpgradeServlet.java | 157 + .../web/prims/PingWebSocketBinary.java | 65 + .../web/prims/PingWebSocketJson.java | 116 + .../web/prims/PingWebSocketTextAsync.java | 70 + .../web/prims/PingWebSocketTextSync.java | 67 + .../beanval/CDIMethodConstraintBean.java | 47 + .../prims/beanval/PingServletBeanValCDI.java | 107 + .../beanval/PingServletBeanValSimple1.java | 106 + .../beanval/PingServletBeanValSimple2.java | 106 + .../web/prims/beanval/SimpleBean1.java | 116 + .../web/prims/beanval/SimpleBean2.java | 47 + .../web/prims/cdi/CDIEventProducer.java | 49 + .../samples/daytrader/web/prims/cdi/Hit.java | 29 + .../daytrader/web/prims/cdi/HitAsync.java | 29 + .../daytrader/web/prims/cdi/PingCDIBean.java | 59 + .../web/prims/cdi/PingCDIJSFBean.java | 33 + .../daytrader/web/prims/cdi/PingEJBIFace.java | 24 + .../daytrader/web/prims/cdi/PingEJBLocal.java | 41 + .../web/prims/cdi/PingEJBLocalDecorator.java | 43 + .../web/prims/cdi/PingInterceptor.java | 42 + .../web/prims/cdi/PingInterceptorBinding.java | 33 + .../web/prims/cdi/PingServletCDI.java | 70 + ...ingServletCDIBeanManagerViaCDICurrent.java | 71 + .../cdi/PingServletCDIBeanManagerViaJNDI.java | 71 + .../web/prims/cdi/PingServletCDIEvent.java | 80 + .../prims/cdi/PingServletCDIEventAsync.java | 90 + .../web/prims/drive/PingServletDrive.java | 112 + .../web/prims/ejb3/PingServlet2Entity.java | 114 + .../web/prims/ejb3/PingServlet2MDBQueue.java | 147 + .../web/prims/ejb3/PingServlet2MDBTopic.java | 148 + .../web/prims/ejb3/PingServlet2Session.java | 121 + .../ejb3/PingServlet2Session2CMROne2Many.java | 114 + .../ejb3/PingServlet2Session2CMROne2One.java | 107 + .../ejb3/PingServlet2Session2Entity.java | 126 + .../ejb3/PingServlet2Session2Entity2JSP.java | 106 + .../PingServlet2Session2EntityCollection.java | 123 + .../web/prims/ejb3/PingServlet2TwoPhase.java | 118 + .../web/prims/http2/PingServletPush.java | 73 + .../web/prims/http2/PingServletSimple.java | 55 + .../web/prims/jaxrs/JAXRSSyncService.java | 63 + .../web/prims/jaxrs/ObjectFactory.java | 28 + .../web/prims/jaxrs/TestJSONObject.java | 134 + .../daytrader/web/prims/jaxrs/XMLObject.java | 152 + .../web/servlet/OrdersAlertFilter.java | 116 + .../daytrader/web/servlet/PrimFilter.java | 68 + .../daytrader/web/servlet/TestServlet.java | 122 + .../web/servlet/TradeAppServlet.java | 221 ++ .../web/servlet/TradeConfigServlet.java | 292 ++ .../web/servlet/TradeScenarioServlet.java | 297 ++ .../web/servlet/TradeServletAction.java | 654 +++++ .../web/servlet/TradeWebContextListener.java | 116 + .../web/websocket/ActionDecoder.java | 57 + .../web/websocket/ActionMessage.java | 85 + .../daytrader/web/websocket/JsonDecoder.java | 57 + .../daytrader/web/websocket/JsonEncoder.java | 46 + .../daytrader/web/websocket/JsonMessage.java | 40 + .../web/websocket/MarketSummaryWebSocket.java | 161 + .../QuotePriceChangeListEncoder.java | 67 + .../main/liberty/config/bootstrap.properties | 2 + .../src/main/liberty/config/server.env | 2 + .../src/main/liberty/config/server.xml | 79 + .../src/main/liberty/config/server.xml_db2 | 74 + .../src/main/webapp/META-INF/LICENSE | 202 ++ .../src/main/webapp/META-INF/MANIFEST.MF | 5 + .../src/main/webapp/PingCDIJSF.xhtml | 39 + .../daytrader8/src/main/webapp/PingHtml.html | 29 + .../daytrader8/src/main/webapp/PingJsf.xhtml | 145 + .../daytrader8/src/main/webapp/PingJsp.jsp | 39 + .../daytrader8/src/main/webapp/PingJspEL.jsp | 124 + .../src/main/webapp/PingServlet2Jsp.jsp | 39 + .../src/main/webapp/PingWebSocketBinary.html | 92 + .../src/main/webapp/PingWebSocketJson.html | 112 + .../main/webapp/PingWebSocketTextAsync.html | 90 + .../main/webapp/PingWebSocketTextSync.html | 90 + .../main/webapp/WAS_V7_64-bit_performance.pdf | Bin 0 -> 943593 bytes .../src/main/webapp/WEB-INF/beans.xml | 22 + .../WEB-INF/classes/META-INF/DEPENDENCIES | 15 + .../webapp/WEB-INF/classes/META-INF/LICENSE | 202 ++ .../webapp/WEB-INF/classes/META-INF/NOTICE | 8 + .../WEB-INF/classes/META-INF/persistence.xml | 34 + .../webapp/WEB-INF/classes/build.properties | 16 + .../webapp/WEB-INF/classes/persistence.xml | 34 + .../src/main/webapp/WEB-INF/ejb-jar.xml | 446 +++ .../src/main/webapp/WEB-INF/faces-config.xml | 120 + .../src/main/webapp/WEB-INF/ibm-web-bnd.xml | 28 + .../src/main/webapp/WEB-INF/ibm-web-ext.xml | 26 + .../src/main/webapp/WEB-INF/web.xml | 215 ++ .../daytrader8/src/main/webapp/account.jsp | 392 +++ .../daytrader8/src/main/webapp/account.xhtml | 430 +++ .../daytrader8/src/main/webapp/accountImg.jsp | 409 +++ .../daytrader8/src/main/webapp/config.jsp | 251 ++ .../daytrader8/src/main/webapp/config.xhtml | 232 ++ .../daytrader8/src/main/webapp/configure.html | 115 + .../src/main/webapp/configure.xhtml | 148 + .../src/main/webapp/contentHome.html | 87 + .../src/main/webapp/dbscripts/db2/Table.ddl | 289 ++ .../src/main/webapp/dbscripts/derby/Table.ddl | 104 + .../main/webapp/dbscripts/oracle/Table.ddl | 103 + .../src/main/webapp/docs/benchmarking.html | 67 + .../src/main/webapp/docs/documentation.html | 67 + .../src/main/webapp/docs/glossary.html | 98 + .../main/webapp/docs/rtCharacterisitics.html | 158 + .../src/main/webapp/docs/tradeFAQ.html | 190 ++ .../src/main/webapp/docs/tradeFAQ.xhtml | 209 ++ .../src/main/webapp/docs/tradeversion.html | 24 + .../daytrader8/src/main/webapp/error.jsp | 122 + .../daytrader8/src/main/webapp/favicon.ico | Bin 0 -> 2404 bytes .../daytrader8/src/main/webapp/footer.html | 38 + .../daytrader8/src/main/webapp/header.html | 96 + .../main/webapp/images/DayTraderHead_blue.gif | Bin 0 -> 3908 bytes .../main/webapp/images/DayTraderHead_red.gif | Bin 0 -> 3734 bytes .../src/main/webapp/images/Thumbs.db | Bin 0 -> 51200 bytes .../src/main/webapp/images/about.gif | Bin 0 -> 1311 bytes .../src/main/webapp/images/account.gif | Bin 0 -> 2241 bytes .../src/main/webapp/images/arrowdown.gif | Bin 0 -> 197 bytes .../src/main/webapp/images/arrowup.gif | Bin 0 -> 198 bytes .../src/main/webapp/images/bottomRedBar.gif | Bin 0 -> 108 bytes .../src/main/webapp/images/configuration.gif | Bin 0 -> 1430 bytes .../src/main/webapp/images/dayTraderLogo.gif | Bin 0 -> 3774 bytes .../webapp/images/daytrader_simple_arch.gif | Bin 0 -> 43988 bytes .../daytrader8/src/main/webapp/images/faq.gif | Bin 0 -> 1156 bytes .../src/main/webapp/images/favicon.ico | Bin 0 -> 2404 bytes .../src/main/webapp/images/graph.gif | Bin 0 -> 1123 bytes .../src/main/webapp/images/home.gif | Bin 0 -> 1185 bytes .../src/main/webapp/images/homeBanner.gif | Bin 0 -> 1184 bytes .../src/main/webapp/images/line.gif | Bin 0 -> 2346 bytes .../src/main/webapp/images/logout.gif | Bin 0 -> 2191 bytes .../src/main/webapp/images/lower_banner.gif | Bin 0 -> 2378 bytes .../src/main/webapp/images/menuHome.gif | Bin 0 -> 2096 bytes .../src/main/webapp/images/nav_bg.png | Bin 0 -> 938 bytes .../src/main/webapp/images/portfolio.gif | Bin 0 -> 2273 bytes .../src/main/webapp/images/primitives.gif | Bin 0 -> 1213 bytes .../src/main/webapp/images/quotes.gif | Bin 0 -> 2236 bytes .../src/main/webapp/images/reports.gif | Bin 0 -> 1220 bytes .../src/main/webapp/images/spacer.gif | Bin 0 -> 43 bytes .../src/main/webapp/images/ticker-anim.gif | Bin 0 -> 6035 bytes .../src/main/webapp/images/topRedBar.gif | Bin 0 -> 279 bytes .../src/main/webapp/images/topline.jpg | Bin 0 -> 645 bytes .../src/main/webapp/images/tradeOverview.png | Bin 0 -> 206781 bytes .../webapp/images/tradingAndPortfolios.gif | Bin 0 -> 1677 bytes .../daytrader8/src/main/webapp/index.html | 37 + .../daytrader8/src/main/webapp/index.xhtml | 93 + .../daytrader8/src/main/webapp/leftMenu.html | 56 + .../src/main/webapp/marketSummary.html | 283 ++ .../src/main/webapp/marketSummary.jsp | 156 + .../src/main/webapp/marketSummary.xhtml | 605 ++++ .../daytrader8/src/main/webapp/order.jsp | 233 ++ .../daytrader8/src/main/webapp/order.xhtml | 308 ++ .../daytrader8/src/main/webapp/orderImg.jsp | 248 ++ .../daytrader8/src/main/webapp/portfolio.jsp | 284 ++ .../src/main/webapp/portfolio.xhtml | 340 +++ .../src/main/webapp/portfolioImg.jsp | 296 ++ .../webapp/properties/daytrader.properties | 24 + .../daytrader8/src/main/webapp/quote.jsp | 234 ++ .../daytrader8/src/main/webapp/quote.xhtml | 291 ++ .../src/main/webapp/quoteDataPrimitive.jsp | 50 + .../daytrader8/src/main/webapp/quoteImg.jsp | 255 ++ .../daytrader8/src/main/webapp/quotes.html | 158 + .../daytrader8/src/main/webapp/register.jsp | 169 ++ .../daytrader8/src/main/webapp/register.xhtml | 205 ++ .../src/main/webapp/registerImg.jsp | 172 ++ .../daytrader8/src/main/webapp/runStats.jsp | 445 +++ .../daytrader8/src/main/webapp/sample.jsp | 26 + .../daytrader8/src/main/webapp/style-jsf.css | 253 ++ .../daytrader8/src/main/webapp/style.css | 82 + .../daytrader8/src/main/webapp/tradehome.jsp | 251 ++ .../src/main/webapp/tradehome.xhtml | 283 ++ .../src/main/webapp/tradehomeImg.jsp | 267 ++ .../daytrader8/src/main/webapp/web_prmtv.html | 449 +++ .../src/main/webapp/web_prmtv.xhtml | 584 ++++ .../daytrader8/src/main/webapp/welcome.jsp | 133 + .../daytrader8/src/main/webapp/welcome.xhtml | 93 + .../daytrader8/src/main/webapp/welcomeImg.jsp | 132 + .../daytrader8/zos_db2_files/RUNSTAT.JCL | 23 + .../daytrader8/zos_db2_files/dbbind.jcl | 42 + .../daytrader8/zos_db2_files/dbtable.jcl | 255 ++ 387 files changed, 45268 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/ibm/cldk/utils/annotations/Todo.java create mode 100644 src/test/resources/test-applications/daytrader8/.gitignore create mode 100644 src/test/resources/test-applications/daytrader8/Dockerfile create mode 100644 src/test/resources/test-applications/daytrader8/Dockerfile-db2 create mode 100644 src/test/resources/test-applications/daytrader8/LICENSE create mode 100644 src/test/resources/test-applications/daytrader8/README.md create mode 100644 src/test/resources/test-applications/daytrader8/README_LOAD_TEST.md create mode 100644 src/test/resources/test-applications/daytrader8/jmeter_files/README.txt create mode 100644 src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8.jmx create mode 100755 src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra.jmx create mode 100644 src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra_no_ws.jmx create mode 100644 src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_no_ws.jmx create mode 100644 src/test/resources/test-applications/daytrader8/jmeter_files/daytrader_primitive.jmx create mode 100644 src/test/resources/test-applications/daytrader8/pom.xml create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/README_DO_NOT_TOUCH_FILES.txt create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/README_DO_NOT_TOUCH_FILES.txt create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/log.ctrl create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/log286.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/logmirror.ctrl create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/README_DO_NOT_TOUCH_FILES.txt create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c10.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c101.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c111.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c121.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c130.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c141.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c150.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c161.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c171.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c180.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c191.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1a1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1b1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1c0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1d1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1e0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1f1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c20.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c200.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c211.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c221.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c230.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c241.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c251.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c260.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c271.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c281.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c290.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2a1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2b1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2c1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2d0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2e1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2f0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c300.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c31.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c311.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c321.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c331.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c340.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c351.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c361.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c371.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c380.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c391.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3a1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3b1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3c0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3d1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3e1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3f1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c400.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c41.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c411.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c421.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c430.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c441.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c451.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c461.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c470.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c481.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c490.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4a1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4b0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4c1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4d0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4e1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4f1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c51.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c60.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c71.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c720.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c731.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c740.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c751.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c760.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c771.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c780.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c791.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7a0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7b1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7c0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7d1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7e1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7f1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c801.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c81.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c811.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c821.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c90.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/ca1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cb1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cc0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cd1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/ce1.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cf0.dat create mode 100644 src/test/resources/test-applications/daytrader8/resources/data/tradedb/service.properties create mode 100755 src/test/resources/test-applications/daytrader8/scripts/buildAll.sh create mode 100755 src/test/resources/test-applications/daytrader8/scripts/switchFromPayara.sh create mode 100755 src/test/resources/test-applications/daytrader8/scripts/switchFromWF.sh create mode 100755 src/test/resources/test-applications/daytrader8/scripts/switchToPayara.sh create mode 100755 src/test/resources/test-applications/daytrader8/scripts/switchToWF.sh create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/META-INF/DEPENDENCIES create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/META-INF/LICENSE create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/build.properties create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/MarketSummaryDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/RunStatsDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountProfileDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/HoldingDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/OrderDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/QuoteDataBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrderSubmitter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/KeySequenceDirect.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrderSubmitter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/MarketSummarySingleton.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/session2direct/DirectSLSBBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/MarketSummaryUpdate.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/QuotePriceChange.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/RuntimeMode.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/Trace.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeDB.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeEJB.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeJDBC.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeServices.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeSession2Direct.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/BroadcastResource.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/JAXRSApplication.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/QuoteResource.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Diagnostics.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/FinancialUtils.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/KeyBlock.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Log.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/MDBStats.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/RecentQuotePriceChangeList.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TimerStat.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TraceInterceptor.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TradeConfig.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TradeRunTimeModeLiteral.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/AccountDataJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/HoldingData.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/JSFLoginFilter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/LoginValidator.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/MarketSummaryJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderData.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderDataJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/PortfolioJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteData.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeAppJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeConfigJSF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ExplicitGC.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead2JSP.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCWrite.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObject.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObjectFactory.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPStreaming.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedExecutor.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedThread.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingReentryServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2DB.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Include.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2IncludeRcv.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2JNDI.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Jsp.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2PDF.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Servlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2ServletRcv.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet30Async.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31Async.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31AsyncRead.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletLargeContentLength.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletSetContentLength.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletWriter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession1.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession2.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3Object.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingUpgradeServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketBinary.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketJson.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextAsync.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextSync.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/CDIMethodConstraintBean.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValCDI.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple1.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple2.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean1.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean2.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/CDIEventProducer.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/Hit.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/HitAsync.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIBean.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIJSFBean.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBIFace.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocal.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocalDecorator.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptor.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptorBinding.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDI.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaCDICurrent.java create mode 100755 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaJNDI.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEvent.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEventAsync.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/drive/PingServletDrive.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Entity.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2Many.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2One.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity2JSP.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2EntityCollection.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2TwoPhase.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletPush.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletSimple.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/JAXRSSyncService.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/ObjectFactory.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/TestJSONObject.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/XMLObject.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/OrdersAlertFilter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/PrimFilter.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TestServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeAppServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeConfigServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeScenarioServlet.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeServletAction.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeWebContextListener.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionDecoder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionMessage.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonDecoder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonEncoder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonMessage.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/MarketSummaryWebSocket.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/QuotePriceChangeListEncoder.java create mode 100644 src/test/resources/test-applications/daytrader8/src/main/liberty/config/bootstrap.properties create mode 100644 src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.env create mode 100644 src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml_db2 create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/LICENSE create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingCDIJSF.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingHtml.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsf.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsp.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingJspEL.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingServlet2Jsp.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketBinary.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketJson.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextAsync.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextSync.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WAS_V7_64-bit_performance.pdf create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/beans.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/DEPENDENCIES create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/LICENSE create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/NOTICE create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/persistence.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/build.properties create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/persistence.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ejb-jar.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-bnd.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-ext.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/web.xml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/account.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/account.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/accountImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/config.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/config.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/configure.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/configure.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/contentHome.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/db2/Table.ddl create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/derby/Table.ddl create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/oracle/Table.ddl create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/benchmarking.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/documentation.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/glossary.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/rtCharacterisitics.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeversion.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/error.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/favicon.ico create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/footer.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/header.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_blue.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_red.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/Thumbs.db create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/about.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/account.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowdown.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowup.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/bottomRedBar.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/configuration.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/dayTraderLogo.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/daytrader_simple_arch.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/faq.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/favicon.ico create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/graph.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/home.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/homeBanner.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/line.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/logout.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/lower_banner.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/menuHome.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/nav_bg.png create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/portfolio.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/primitives.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/quotes.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/reports.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/spacer.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/ticker-anim.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/topRedBar.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/topline.jpg create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradeOverview.png create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradingAndPortfolios.gif create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/index.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/index.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/leftMenu.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/order.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/order.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/orderImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/portfolioImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/properties/daytrader.properties create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/quote.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/quote.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/quoteDataPrimitive.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/quoteImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/quotes.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/register.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/register.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/registerImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/runStats.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/sample.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/style-jsf.css create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/style.css create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/tradehomeImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.html create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.jsp create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.xhtml create mode 100644 src/test/resources/test-applications/daytrader8/src/main/webapp/welcomeImg.jsp create mode 100644 src/test/resources/test-applications/daytrader8/zos_db2_files/RUNSTAT.JCL create mode 100644 src/test/resources/test-applications/daytrader8/zos_db2_files/dbbind.jcl create mode 100644 src/test/resources/test-applications/daytrader8/zos_db2_files/dbtable.jcl diff --git a/src/main/java/com/ibm/cldk/SymbolTable.java b/src/main/java/com/ibm/cldk/SymbolTable.java index e700f375..1de23f14 100644 --- a/src/main/java/com/ibm/cldk/SymbolTable.java +++ b/src/main/java/com/ibm/cldk/SymbolTable.java @@ -423,7 +423,7 @@ private static boolean isEntryPointMethod(CallableDeclaration callableDecl) { private static boolean isServletEntrypointMethod(CallableDeclaration callableDecl) { return ((NodeList) callableDecl.getParameters()).stream() .anyMatch(parameter -> parameter.getType().asString().contains("HttpServletRequest") || - parameter.getType().asString().contains("HttpServletResponse")); + parameter.getType().asString().contains("HttpServletResponse")) && callableDecl.getAnnotations().stream().anyMatch(a -> a.toString().contains("Override")); } private static boolean isJaxRsEntrypointMethod(CallableDeclaration callableDecl) { diff --git a/src/main/java/com/ibm/cldk/entities/CRUDOperation.java b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java index 3a7fbb6c..b230ceec 100644 --- a/src/main/java/com/ibm/cldk/entities/CRUDOperation.java +++ b/src/main/java/com/ibm/cldk/entities/CRUDOperation.java @@ -1,6 +1,7 @@ package com.ibm.cldk.entities; import com.ibm.cldk.utils.annotations.NotImplemented; +import com.ibm.cldk.utils.annotations.Todo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -19,6 +20,13 @@ public enum OperationType { UNKNOWN } + @Todo(comment = "Add more frameworks, and consider moving this outside because this may be generic.") + @NotImplemented + public enum JavaFramework { + JPA, + SPRING + } + private OperationType operationType; private String targetTable; private int lineNumber; @@ -34,7 +42,7 @@ public enum OperationType { @NotImplemented private List joinedTables; @NotImplemented - private String technology; + private JavaFramework framework; @NotImplemented private boolean isBatchOperation = false; } \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java index 7a70b629..9e658bcc 100644 --- a/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java +++ b/src/main/java/com/ibm/cldk/utils/annotations/NotImplemented.java @@ -8,5 +8,6 @@ public @interface NotImplemented { String value() default ""; String since() default ""; - String ticketId() default ""; + String issue() default ""; + String comment() default ""; } \ No newline at end of file diff --git a/src/main/java/com/ibm/cldk/utils/annotations/Todo.java b/src/main/java/com/ibm/cldk/utils/annotations/Todo.java new file mode 100644 index 00000000..21137622 --- /dev/null +++ b/src/main/java/com/ibm/cldk/utils/annotations/Todo.java @@ -0,0 +1,12 @@ +package com.ibm.cldk.utils.annotations; + +import java.lang.annotation.*; + +@Documented +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Todo { + String value() default ""; + String issue() default ""; + String comment() default ""; +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/.gitignore b/src/test/resources/test-applications/daytrader8/.gitignore new file mode 100644 index 00000000..cd2aeaff --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/.gitignore @@ -0,0 +1,11 @@ +/.apt_generated/ +/target/ +/build/ +/bin/ +.classpath +.project +/.settings/ +/wlp/ +/openliberty/ +.factorypath +.DS_Store \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/Dockerfile b/src/test/resources/test-applications/daytrader8/Dockerfile new file mode 100644 index 00000000..bce5ad82 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/Dockerfile @@ -0,0 +1,14 @@ +FROM open-liberty:full + +COPY --chown=1001:0 src/main/liberty/config/server.xml /config/server.xml +COPY --chown=1001:0 src/main/liberty/config/bootstrap.properties /config/bootstrap.properties +COPY --chown=1001:0 target/io.openliberty.sample.daytrader8.war /config/apps/ + +#Derby +COPY --chown=1001:0 target/liberty/wlp/usr/shared/resources/DerbyLibs/derby-10.14.2.0.jar /opt/ol/wlp/usr/shared/resources/DerbyLibs/derby-10.14.2.0.jar +COPY --chown=1001:0 target/liberty/wlp/usr/shared/resources/data /opt/ol/wlp/usr/shared/resources/data + +ENV MAX_USERS=1000 +ENV MAX_QUOTES=500 + +#RUN configure.sh diff --git a/src/test/resources/test-applications/daytrader8/Dockerfile-db2 b/src/test/resources/test-applications/daytrader8/Dockerfile-db2 new file mode 100644 index 00000000..c32a54e8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/Dockerfile-db2 @@ -0,0 +1,21 @@ +# Create folder db2jars/ and copy db2jcc4.jar and db2jcc_license_cu.jar to it. +# Set Env below + +FROM open-liberty:full + +COPY --chown=1001:0 src/main/liberty/config/server.xml_db2 /config/server.xml +COPY --chown=1001:0 src/main/liberty/config/bootstrap.properties /config/bootstrap.properties +COPY --chown=1001:0 target/io.openliberty.sample.daytrader8.war /config/apps/ + +# DB2 JARS +COPY --chown=1001:0 /db2jars /opt/ol/wlp/usr/shared/resources/db2jars + +ENV contextRoot=daytrader +ENV dbUser= +ENV dbPass= +ENV tradeDbHost= +ENV tradeDbPort= +ENV tradeDbName= + + +#RUN configure.sh diff --git a/src/test/resources/test-applications/daytrader8/LICENSE b/src/test/resources/test-applications/daytrader8/LICENSE new file mode 100644 index 00000000..8f71f43f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/src/test/resources/test-applications/daytrader8/README.md b/src/test/resources/test-applications/daytrader8/README.md new file mode 100644 index 00000000..595a96da --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/README.md @@ -0,0 +1,45 @@ +# Java EE8: DayTrader8 Sample + +This sample contains the DayTrader 8 benchmark, which is an application built around the paradigm of an online stock trading system. The application allows users to login, view their portfolio, lookup stock quotes, and buy or sell stock shares. With the aid of a Web-based load driver such as Apache JMeter, the real-world workload provided by DayTrader can be used to measure and compare the performance of Java Platform, Enterprise Edition (Java EE) application servers offered by a variety of vendors. In addition to the full workload, the application also contains a set of primitives used for functional and performance testing of various Java EE components and common design patterns. + +DayTrader is an end-to-end benchmark and performance sample application. It provides a real world Java EE workload. DayTrader's new design spans Java EE 8. + +This sample can be installed onto Liberty runtime versions 18.0.0.2 and later. A prebuilt derby database is provided in resources/data + + +To run this sample, first [download](https://github.com/OpenLiberty/sample.daytrader8/archive/master.zip) or clone this repo - to clone: +``` +git clone git@github.com:OpenLiberty/sample.daytrader8.git +``` + +From inside the sample.daytrader8 directory, build and start the application in Open Liberty with the following command: +``` +mvn clean package liberty:run +``` + +The server will listen on port 9080 by default. You can change the port (for example, to port 9081) by adding `mvn clean package liberty:run -DtestServerHttpPort=9081` to the end of the Maven command. + +Once the server is started, you should be able to access the application at: +http://localhost:9080/daytrader + + + +## Notice + +© Copyright IBM Corporation 2019. + +## License + +```text +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +```` diff --git a/src/test/resources/test-applications/daytrader8/README_LOAD_TEST.md b/src/test/resources/test-applications/daytrader8/README_LOAD_TEST.md new file mode 100644 index 00000000..23d468e1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/README_LOAD_TEST.md @@ -0,0 +1,151 @@ +# Daytrader8: Load Testing +This readme explains how to setup DB2 and load test the Daytrader 8 application with Open Liberty. + +## Prerequisites + +1. Open Liberty Machine (Server with Open Liberty unzipped at , and a default profile created) +2. DB2 Machine (Server running DB2) +3. Driver Machine (Server running JMeter with jmeter files copied to /bin, and the WebSocket plugin copied to /lib/ext, see jmeter_files) + +## Setup Open Liberty + +Build Daytrader8; +[Download](https://github.com/OpenLiberty/sample.daytrader8/archive/master.zip) or clone this repo - to clone: +``` +git clone git@github.com:OpenLiberty/sample.daytrader8.git +``` + +From inside the sample.daytrader8 directory, build the application: +``` +mvn clean package +``` +* Copy target/io.openliberty.sample.daytrader8.war to /usr/servers/defaultServer/apps +* Copy src/main/liberty/config/server.xml_db2 to /usr/servers/defaultServer/server.xml (overwrite) +* Copy db2 jars from the DB2 Machine to /usr/shared/db2jars +``` +db2jcc4.jar +db2jcc_license_cu.jar +``` + +Create /usr/servers/defaultServer/jvm.options and add any JVM Arguments desired. +``` +-Xms1024m +-Xmx1024m +``` + +Set these environment variables. matching your environment (or hard code them in the server.xml): +``` +contextRoot=daytrader +dbUser +dbPass +tradeDbHost +tradeDbPort +tradeDbName +``` + +## Set up DB2 +Sign in to DB2 machine as db2 user and create tradedb database +``` +db2 create db tradedb +``` + +Note: When creating the database, DB2_APM_PERFORMANCE needs to be off, or you'll get: SQL1803N The requested operation cannot be executed in "No Package Lock" +``` +db2set DB2_APM_PERFORMANCE= +db2stop +db2start +``` + +## Load Database + +Start OpenLiberty: +``` +/bin/server start --clean +``` + +With a web browser go to http://openliberty-hostname:9080/daytrader/configure.html +``` +Click (Re)-create DayTrader Database Tables and Indexes +Click (Re)-populate DayTrader Database +``` + +Stop Liberty Server +``` +/bin/server stop +``` + +On the DB2 Server, Put the following into a script (backupTradeDB.sh) and run as the db2 user +``` +DB=tradedb +mkdir -p ~/backups/${DB} +db2 update dbm cfg using notifylevel 0 +db2 update dbm cfg using diaglevel 1 +db2 update dbm cfg using NUM_POOLAGENTS 500 automatic MAX_COORDAGENTS 500 automatic MAX_CONNECTIONS 500 automatic + +db2 -v update db cfg for ${DB} using MAXLOCKS 100 LOCKLIST 100000 + +db2 connect to ${DB} +db2 update db cfg for ${DB} using maxappls 500 automatic +db2 update db cfg for ${DB} using logfilsiz 8000 +db2 update db cfg for ${DB} using logprimary 32 +db2 update db cfg for ${DB} using dft_queryopt 0 + +db2 update db cfg for ${DB} using softmax 3000 +db2 update db cfg for ${DB} using chngpgs_thresh 99 + +db2 -v alter bufferpool IBMDEFAULTBP size -1 +db2 -v connect reset +db2 -v update db cfg for ${DB} using BUFFPAGE 262144 + +db2set DB2_APM_PERFORMANCE=ON +db2set DB2_KEEPTABLELOCK=CONNECTION +db2set DB2_USE_ALTERNATE_PAGE_CLEANING=ON +db2set DB2_MINIMIZE_LISTPREFETCH=YES +db2set DB2_LOGGER_NON_BUFFERED_IO=OFF + +db2 connect reset +db2 terminate + +db2stop force +db2start + +db2 connect to ${DB} +db2 reorgchk update statistics +db2 connect reset + +db2 terminate +db2 backup db tradedb to ~/backups/${DB} +``` + +Put the following into a script (restoreTradeDB.sh) to run before each server restart. (To make sure the database is in the same state every time) +``` +db2stop force +db2start +db2 restore db tradedb from ~/backups/tradedb replace existing +``` + +Note: If disk writing/reading becomes a bottleneck, you may need to create a ramdisk and restore the database to the ramdisk. + +## Apply Load +On the DB2 Server, restore the database (as db2 user) +``` +restoreTradeDB.sh +``` + +Start Liberty +``` +/bin/server start +``` + +On the JMETER Server, Start JMeter: +``` +cd /bin +./jmeter -n -t daytrader8.jmx -JHOST=openliberty-hostname -JDURATION=180 +``` + +Preferably, do three 180 second warm up runs and then three 180 second measurement runs with a 30 second break in between each. + +Also, a best practice is to reset the database between each run, which can be done on the configuration tab of the application. +``` +http://openliberty-hostname:9080/daytrader/config?action=resetTrade +``` diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/README.txt b/src/test/resources/test-applications/daytrader8/jmeter_files/README.txt new file mode 100644 index 00000000..50566ce0 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/README.txt @@ -0,0 +1,54 @@ +# (C) Copyright IBM Corporation 2019, 2021. + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + + +daytrader8.jmx is an Apache JMeter script that may be used for running the DayTrader8 benchmark. + +Jmeter version 3.3 or later is highly recommended. +To use the script, you will need to put the the WebSocket Sampler (and dependencies) from WebSocket Samplers by Peter Doornbosch into lib/ext. +Use the Jmeter plugin manager or download via https://bitbucket.org/pjtr/jmeter-websocket-samplers. + + +The script has the following options: + -JHOST The name of the machine running the DayTrader Application. The default is localhost. + -JPORT The HTTP port of the server running the DayTrader Application. The default is 9080. + -JPROTOCOL The transport either http or https + -JTHREADS The number of jmeter threads to start. The default is 50. + -JRAMP The ramp up time for starting the threads. Set this to the same value as -JTHREADS for a smoother startup. The default is 0. + -JDURATION The time (in seconds) to run jmeter. + -JMAXTHINKTIME The time in milliseconds to wait between each call. The default is 0 ms + -JSTOCKS The total amount of stocks/quotes in the database, minus one. The default is 9999, which assumes there are 10,000 stocks in the database. + -JBOTUID The lowest user id. The default is 0. + -JTOPUID The highest user id. The default is 14999, which assumes there are 15,000 users in the database. + +Example: ./jmeter -n -t daytrader8.jmx -JHOST=myserver -JPORT=9080 -JPROTOCOL=http -JMAXTHINKTIME=100 -JDURATION=300 + +To see output every five seconds from JMeter, edit the following section in /bin/jmeter.properties + +#--------------------------------------------------------------------------- +# Summariser - Generate Summary Results - configuration (mainly applies to non-GUI mode) +#--------------------------------------------------------------------------- +# +# Define the following property to automatically start a summariser with that name +# (applies to non-GUI mode only) +summariser.name=summary +# +# interval between summaries (in seconds) default 30 seconds +summariser.interval=5 +# +# Write messages to log file +summariser.log=true +# +# Write messages to System.out +summariser.out=true diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8.jmx b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8.jmx new file mode 100644 index 00000000..cfe98684 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8.jmx @@ -0,0 +1,2607 @@ + + + + + + false + false + + + + + + + + + false + -1 + + ${__P(THREADS,50)} + ${__P(RAMP,0)} + 1355173676000 + 1355173676000 + true + continue + ${__P(DURATION, 180)} + + true + + + + + false + false + rfc2109 + + + + + + User-Agent + Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) + + + Accept + image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* + + + Accept-Language + en-us + + + + + + + + minimumuid + ${__P(BOTUID,0)} + = + + + maximumuid + ${__P(TOPUID,14999)} + = + + + hostname + ${__P(HOST,localhost)} + = + + + port + ${__P(PORT,9080)} + = + + + maxthinkingtime + ${__P(MAXTHINKTIME,0)} + = + + + maximumsid + ${__P(STOCKS,9999)} + = + + + protocol + ${__P(PROTOCOL,http)} + = + http | https + + + + + + ${minimumuid} + ${maximumuid} + 1 + logincounter + + false + + + + 1 + + + + 1 + true + 50 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + xxx + = + true + login:password + + + false + Log in + = + true + login:submit + + + false + uid:${logincounter} + = + true + login:uid + + + false + 1 + = + true + login_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Ready to Trade + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit2 + + + false + 1 + = + true + quotes_SUBMIT + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + true + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + true + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit2 + + + false + 1 + = + true + quotes_SUBMIT + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + false + tobuy + s:([0-9]+) + $1$ + 0 + 1 + all + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${tobuy} + = + true + quotes:symbols + + + false + ${__Random(1,200)} + = + true + quotes:quotes:0:quantity + + + false + buy + = + true + quotes:quotes:0:buy + + + false + 1 + = + true + quotes_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + false + numHoldings + of Holdings: </b>([1-9][0-9]*)</td> + $1$ + 0 + 0 + all + + + + ${maxthinkingtime} + + + + + ${__jexl("${numHoldings}" != "0")} + false + true + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + portfolio:holdings:0:sell + = + true + portfolio:_idcl + + + false + 1 + = + true + portfolio_SUBMIT + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + portfolio:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + uid:${logincounter} + = + true + updateProfile:uid + + + false + rnd${__threadNum}${logincounter} + = + true + updateProfile:fullname + + + false + xxx + = + true + updateProfile:password + + + false + rndAddress + = + true + updateProfile:address + + + false + xxx + = + true + updateProfile:cpassword + + + false + rndCC + = + true + updateProfile:ccn + + + false + rndEmail@email.com + = + true + updateProfile:email + + + false + 1 + = + true + updateProfile_SUBMIT + + + false + Update Profile + = + true + updateProfile:submit + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + updateProfile:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:fullname + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:address + + + false + uid${logincounter}@${__Random(0,100,)}.com + = + true + register:email + + + false + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + register:uid + + + false + yyy + = + true + register:password + + + false + yyy + = + true + register:cpassword + + + false + 1000000 + = + true + register:money + + + false + 123-fake-ccnum-456 + = + true + register:ccn + + + false + 1 + = + true + register_SUBMIT + + + false + Register + = + true + register:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + Registration operation succeeded + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + false + jsfViewState + <input type="hidden" name="javax\.faces\.ViewState" id="j_id__v_0:javax\.faces\.ViewState:1" value="([^"]+)".*/> + $1$ + + 0 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 70.0 + 0.0 + + + + + + + + true + uid:${logincounter} + = + true + uid + + + true + xxx + = + true + passwd + + + true + login + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Welcome to DayTrader + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + false + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + DayTrader: Quotes and Trading + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + true + home + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + false + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + use existing open connection + 20000 + false + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},tobuy)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + buy + = + true + action + + + true + s:${tobuy} + = + true + symbol + + + true + ${__Random(1,200)} + = + true + quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + false + firstHoldingID + holdingID=([0-9]+) + $1$ + NotFound + 0 + all + + + + false + firstHoldingIDBool + holdingID=([0-9]+) + true + false + 1 + all + + + + ${maxthinkingtime} + + + + + ${firstHoldingIDBool} + false + true + + + + + + + true + sell + = + true + action + + + true + ${firstHoldingID} + = + true + holdingID + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + update_profile + = + true + action + + + true + uid:${logincounter} + = + true + userID + + + true + rnd${__threadNum}${logincounter} + = + true + fullname + + + true + xxx + = + true + password + + + true + rndAddress + = + true + address + + + true + xxx + = + true + cpassword + + + true + rndCC + = + true + creditcard + + + true + rndEmail@email.com + = + true + email + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.jsp + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + register + = + true + action + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + Full Name + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + snail mail + + + true + uid${logincounter}@${__Random(0,100,)}.com + = + true + email + + + true + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + user id + + + true + yyy + = + true + passwd + + + true + yyy + = + true + confirm passwd + + + true + 1000000 + = + true + money + + + true + 123-fake-ccnum-456 + = + true + Credit Card Number + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + 4000 + 6000 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 20.0 + 0.0 + + + + + + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + daytrader/rest/quotes + POST + false + true + true + false + + + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + ${maxthinkingtime} + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.aggregateReport.csv + + + + true + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTree.csv + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTable.csv + + + + + diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra.jmx b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra.jmx new file mode 100755 index 00000000..bcb3d4fa --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra.jmx @@ -0,0 +1,2600 @@ + + + + + + false + false + + + + + + + + + false + -1 + + ${__P(THREADS,50)} + ${__P(RAMP,0)} + 1355173676000 + 1355173676000 + true + continue + ${__P(DURATION, 180)} + + true + + + + + false + false + rfc2109 + + + + + + User-Agent + Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) + + + Accept + image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* + + + Accept-Language + en-us + + + + + + + + minimumuid + ${__P(BOTUID,0)} + = + + + maximumuid + ${__P(TOPUID,14999)} + = + + + hostname + ${__P(HOST,localhost)} + = + + + port + ${__P(PORT,9080)} + = + + + maxthinkingtime + ${__P(MAXTHINKTIME,0)} + = + + + maximumsid + ${__P(STOCKS,9999)} + = + + + protocol + ${__P(PROTOCOL,http)} + = + http | https + + + + + + ${minimumuid} + ${maximumuid} + 1 + logincounter + + false + + + + 1 + + + + 1 + true + 50 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + + + false + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + xxx + = + true + login:password + + + false + Log in + = + true + login:submit + + + false + uid:${logincounter} + = + true + login:uid + + + false + login + = + true + login + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Ready to Trade + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit + + + false + quotes + = + true + quotes + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + true + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + true + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit + + + false + quotes + = + true + quotes + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + false + tobuy + s:([0-9]+) + $1$ + 0 + 1 + all + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${tobuy} + = + true + quotes:symbols + + + false + ${__Random(1,200)} + = + true + quotes:quotes:0:quantity + + + false + buy + = + true + quotes:quotes:0:buy + + + false + quotes + = + true + quotes + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + false + numHoldings + of Holdings: </b>([1-9][0-9]*)</td> + $1$ + 0 + 0 + all + + + + ${maxthinkingtime} + + + + + ${__jexl("${numHoldings}" != "0")} + false + true + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + portfolio:holdings:0:sell + = + true + portfolio:holdings:0:sell + + + false + portfolio + = + true + portfolio + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + portfolio:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + uid:${logincounter} + = + true + updateProfile:uid + + + false + rnd${__threadNum}${logincounter} + = + true + updateProfile:fullname + + + false + xxx + = + true + updateProfile:password + + + false + rndAddress + = + true + updateProfile:address + + + false + xxx + = + true + updateProfile:cpassword + + + false + rndCC + = + true + updateProfile:ccn + + + false + rndEmail@email.com + = + true + updateProfile:email + + + false + updateProfile + = + true + updateProfile + + + false + Update Profile + = + true + updateProfile:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:fullname + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:address + + + false + uid${logincounter}@${__Random(0,100,)}.com + = + true + register:email + + + false + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + register:uid + + + false + yyy + = + true + register:password + + + false + yyy + = + true + register:cpassword + + + false + 1000000 + = + true + register:money + + + false + 123-fake-ccnum-456 + = + true + register:ccn + + + false + register + = + true + register + + + false + Register + = + true + register:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + Registration operation succeeded + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + false + jsfViewState + <input type="hidden" name="javax\.faces\.ViewState" .* value="([^"]+)".*/> + $1$ + + 0 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 70.0 + 0.0 + + + + + + + + true + uid:${logincounter} + = + true + uid + + + true + xxx + = + true + passwd + + + true + login + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Welcome to DayTrader + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + false + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + DayTrader: Quotes and Trading + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + true + home + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + false + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + use existing open connection + 20000 + false + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},tobuy)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + buy + = + true + action + + + true + s:${tobuy} + = + true + symbol + + + true + ${__Random(1,200)} + = + true + quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + false + firstHoldingID + holdingID=([0-9]+) + $1$ + NotFound + 0 + all + + + + false + firstHoldingIDBool + holdingID=([0-9]+) + true + false + 1 + all + + + + ${maxthinkingtime} + + + + + ${firstHoldingIDBool} + false + true + + + + + + + true + sell + = + true + action + + + true + ${firstHoldingID} + = + true + holdingID + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + update_profile + = + true + action + + + true + uid:${logincounter} + = + true + userID + + + true + rnd${__threadNum}${logincounter} + = + true + fullname + + + true + xxx + = + true + password + + + true + rndAddress + = + true + address + + + true + xxx + = + true + cpassword + + + true + rndCC + = + true + creditcard + + + true + rndEmail@email.com + = + true + email + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.jsp + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + register + = + true + action + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + Full Name + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + snail mail + + + true + uid${logincounter}@${__Random(0,100,)}.com + = + true + email + + + true + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + user id + + + true + yyy + = + true + passwd + + + true + yyy + = + true + confirm passwd + + + true + 1000000 + = + true + money + + + true + 123-fake-ccnum-456 + = + true + Credit Card Number + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + 4000 + 6000 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 20.0 + 0.0 + + + + + + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + daytrader/rest/quotes + POST + false + true + true + false + + + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + ${maxthinkingtime} + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.aggregateReport.csv + + + + true + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTree.csv + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTable.csv + + + + + diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra_no_ws.jmx b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra_no_ws.jmx new file mode 100644 index 00000000..d294427d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_mojarra_no_ws.jmx @@ -0,0 +1,2600 @@ + + + + + + false + false + + + + + + + + + false + -1 + + ${__P(THREADS,50)} + ${__P(RAMP,0)} + 1355173676000 + 1355173676000 + true + continue + ${__P(DURATION, 180)} + + true + + + + + false + false + rfc2109 + + + + + + User-Agent + Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) + + + Accept + image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* + + + Accept-Language + en-us + + + + + + + + minimumuid + ${__P(BOTUID,0)} + = + + + maximumuid + ${__P(TOPUID,14999)} + = + + + hostname + ${__P(HOST,localhost)} + = + + + port + ${__P(PORT,9080)} + = + + + maxthinkingtime + ${__P(MAXTHINKTIME,0)} + = + + + maximumsid + ${__P(STOCKS,9999)} + = + + + protocol + ${__P(PROTOCOL,http)} + = + http | https + + + + + + ${minimumuid} + ${maximumuid} + 1 + logincounter + + false + + + + 1 + + + + 1 + true + 50 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + + + false + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + xxx + = + true + login:password + + + false + Log in + = + true + login:submit + + + false + uid:${logincounter} + = + true + login:uid + + + false + login + = + true + login + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Ready to Trade + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit + + + false + quotes + = + true + quotes + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + true + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + true + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit + + + false + quotes + = + true + quotes + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + false + tobuy + s:([0-9]+) + $1$ + 0 + 1 + all + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${tobuy} + = + true + quotes:symbols + + + false + ${__Random(1,200)} + = + true + quotes:quotes:0:quantity + + + false + buy + = + true + quotes:quotes:0:buy + + + false + quotes + = + true + quotes + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + false + numHoldings + of Holdings: </b>([1-9][0-9]*)</td> + $1$ + 0 + 0 + all + + + + ${maxthinkingtime} + + + + + ${__jexl("${numHoldings}" != "0")} + false + true + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + portfolio:holdings:0:sell + = + true + portfolio:holdings:0:sell + + + false + portfolio + = + true + portfolio + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + portfolio:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + uid:${logincounter} + = + true + updateProfile:uid + + + false + rnd${__threadNum}${logincounter} + = + true + updateProfile:fullname + + + false + xxx + = + true + updateProfile:password + + + false + rndAddress + = + true + updateProfile:address + + + false + xxx + = + true + updateProfile:cpassword + + + false + rndCC + = + true + updateProfile:ccn + + + false + rndEmail@email.com + = + true + updateProfile:email + + + false + updateProfile + = + true + updateProfile + + + false + Update Profile + = + true + updateProfile:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:fullname + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:address + + + false + uid${logincounter}@${__Random(0,100,)}.com + = + true + register:email + + + false + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + register:uid + + + false + yyy + = + true + register:password + + + false + yyy + = + true + register:cpassword + + + false + 1000000 + = + true + register:money + + + false + 123-fake-ccnum-456 + = + true + register:ccn + + + false + register + = + true + register + + + false + Register + = + true + register:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + Registration operation succeeded + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:logoff + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + tradeHome + = + true + tradeHome + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + false + jsfViewState + <input type="hidden" name="javax\.faces\.ViewState" .* value="([^"]+)".*/> + $1$ + + 0 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 70.0 + 0.0 + + + + + + + + true + uid:${logincounter} + = + true + uid + + + true + xxx + = + true + passwd + + + true + login + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Welcome to DayTrader + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + false + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + DayTrader: Quotes and Trading + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + true + home + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + false + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + use existing open connection + 20000 + false + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},tobuy)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + buy + = + true + action + + + true + s:${tobuy} + = + true + symbol + + + true + ${__Random(1,200)} + = + true + quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + false + firstHoldingID + holdingID=([0-9]+) + $1$ + NotFound + 0 + all + + + + false + firstHoldingIDBool + holdingID=([0-9]+) + true + false + 1 + all + + + + ${maxthinkingtime} + + + + + ${firstHoldingIDBool} + false + true + + + + + + + true + sell + = + true + action + + + true + ${firstHoldingID} + = + true + holdingID + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + update_profile + = + true + action + + + true + uid:${logincounter} + = + true + userID + + + true + rnd${__threadNum}${logincounter} + = + true + fullname + + + true + xxx + = + true + password + + + true + rndAddress + = + true + address + + + true + xxx + = + true + cpassword + + + true + rndCC + = + true + creditcard + + + true + rndEmail@email.com + = + true + email + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.jsp + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + register + = + true + action + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + Full Name + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + snail mail + + + true + uid${logincounter}@${__Random(0,100,)}.com + = + true + email + + + true + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + user id + + + true + yyy + = + true + passwd + + + true + yyy + = + true + confirm passwd + + + true + 1000000 + = + true + money + + + true + 123-fake-ccnum-456 + = + true + Credit Card Number + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + 4000 + 6000 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 20.0 + 0.0 + + + + + + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + daytrader/rest/quotes + POST + false + true + true + false + + + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + ${maxthinkingtime} + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.aggregateReport.csv + + + + true + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTree.csv + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTable.csv + + + + + diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_no_ws.jmx b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_no_ws.jmx new file mode 100644 index 00000000..026ca71e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader8_no_ws.jmx @@ -0,0 +1,2607 @@ + + + + + + false + false + + + + + + + + + false + -1 + + ${__P(THREADS,50)} + ${__P(RAMP,0)} + 1355173676000 + 1355173676000 + true + continue + ${__P(DURATION, 180)} + + true + + + + + false + false + rfc2109 + + + + + + User-Agent + Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) + + + Accept + image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* + + + Accept-Language + en-us + + + + + + + + minimumuid + ${__P(BOTUID,0)} + = + + + maximumuid + ${__P(TOPUID,14999)} + = + + + hostname + ${__P(HOST,localhost)} + = + + + port + ${__P(PORT,9080)} + = + + + maxthinkingtime + ${__P(MAXTHINKTIME,0)} + = + + + maximumsid + ${__P(STOCKS,9999)} + = + + + protocol + ${__P(PROTOCOL,http)} + = + http | https + + + + + + ${minimumuid} + ${maximumuid} + 1 + logincounter + + false + + + + 1 + + + + 1 + true + 50 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + xxx + = + true + login:password + + + false + Log in + = + true + login:submit + + + false + uid:${logincounter} + = + true + login:uid + + + false + 1 + = + true + login_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/welcome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Ready to Trade + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit2 + + + false + 1 + = + true + quotes_SUBMIT + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + true + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + true + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + open and close + 20000 + false + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${__Random(0,${maximumsid},)} + = + true + quotes:symbols + + + false + quotes + = + true + quotes:submit2 + + + false + 1 + = + true + quotes_SUBMIT + + + false + 100 + = + true + quotes:quotes:0:quantity + + + false + 100 + = + true + quotes:quotes:1:quantity + + + false + 100 + = + true + quotes:quotes:2:quantity + + + false + 100 + = + true + quotes:quotes:3:quantity + + + false + 100 + = + true + quotes:quotes:4:quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + DayTrader Quotes + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + false + tobuy + s:([0-9]+) + $1$ + 0 + 1 + all + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + s:${tobuy} + = + true + quotes:symbols + + + false + ${__Random(1,200)} + = + true + quotes:quotes:0:quantity + + + false + buy + = + true + quotes:quotes:0:buy + + + false + 1 + = + true + quotes_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/quote.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + GET + false + true + true + false + + HttpClient4 + + + + + + false + numHoldings + of Holdings: </b>([1-9][0-9]*)</td> + $1$ + 0 + 0 + all + + + + ${maxthinkingtime} + + + + + ${__jexl("${numHoldings}" != "0")} + false + true + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + portfolio:holdings:0:sell + = + true + portfolio:_idcl + + + false + 1 + = + true + portfolio_SUBMIT + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + portfolio:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/portfolio.faces + POST + false + true + true + false + + HttpClient4 + + + + + + + been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + uid:${logincounter} + = + true + updateProfile:uid + + + false + rnd${__threadNum}${logincounter} + = + true + updateProfile:fullname + + + false + xxx + = + true + updateProfile:password + + + false + rndAddress + = + true + updateProfile:address + + + false + xxx + = + true + updateProfile:cpassword + + + false + rndCC + = + true + updateProfile:ccn + + + false + rndEmail@email.com + = + true + updateProfile:email + + + false + 1 + = + true + updateProfile_SUBMIT + + + false + Update Profile + = + true + updateProfile:submit + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + updateProfile:symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/account.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:fullname + + + false + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + register:address + + + false + uid${logincounter}@${__Random(0,100,)}.com + = + true + register:email + + + false + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + register:uid + + + false + yyy + = + true + register:password + + + false + yyy + = + true + register:cpassword + + + false + 1000000 + = + true + register:money + + + false + 123-fake-ccnum-456 + = + true + register:ccn + + + false + 1 + = + true + register_SUBMIT + + + false + Register + = + true + register:submit + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + Registration operation succeeded + + Assertion.response_data + false + 2 + + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + GET + false + true + true + false + + HttpClient4 + + + + + + + + + true + ${jsfViewState} + = + true + javax.faces.ViewState + + + false + tradeHome:logoff + = + true + tradeHome:_idcl + + + false + s:0,s:1,s:2,s:3,s:4 + = + true + tradeHome:symbols + + + false + 1 + = + true + tradeHome_SUBMIT + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/tradehome.faces + POST + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + false + jsfViewState + <input type="hidden" name="javax\.faces\.ViewState" id="j_id__v_0:javax\.faces\.ViewState:1" value="([^"]+)".*/> + $1$ + + 0 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 70.0 + 0.0 + + + + + + + + true + uid:${logincounter} + = + true + uid + + + true + xxx + = + true + passwd + + + true + login + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + POST + false + true + true + false + + HttpClient4 + + + + + + + loop + + + + true + + + true + + + + + Welcome to DayTrader + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + ${__jexl3("${protocol}"== "http",)} + false + true + + + + false + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${__jexl3("${protocol}"== "https",)} + false + true + + + + true + ${hostname} + ${port} + /daytrader/marketsummary + 20000 + 20000 + + + + + ${loop} + + + + 1 + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 36.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + DayTrader: Quotes and Trading + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 16.0 + 0.0 + + + + + + + + true + home + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 15.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 10.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 8.0 + 0.0 + + + + + false + false + ${hostname} + ${port} + /daytrader/marketsummary + false + {"action":"updateMarketSummary"} + 20000 + use existing open connection + 20000 + false + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + quotes + = + true + action + + + true + s:${__Random(0,${maximumsid},tobuy)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + buy + = + true + action + + + true + s:${tobuy} + = + true + symbol + + + true + ${__Random(1,200)} + = + true + quantity + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + portfolio + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + false + firstHoldingID + holdingID=([0-9]+) + $1$ + NotFound + 0 + all + + + + false + firstHoldingIDBool + holdingID=([0-9]+) + true + false + 1 + all + + + + ${maxthinkingtime} + + + + + ${firstHoldingIDBool} + false + true + + + + + + + true + sell + = + true + action + + + true + ${firstHoldingID} + = + true + holdingID + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + + has been submitted + + Assertion.response_data + false + 2 + + + + + ${maxthinkingtime} + + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 2.0 + 0.0 + + + + + + + + true + account + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + update_profile + = + true + action + + + true + uid:${logincounter} + = + true + userID + + + true + rnd${__threadNum}${logincounter} + = + true + fullname + + + true + xxx + = + true + password + + + true + rndAddress + = + true + address + + + true + xxx + = + true + cpassword + + + true + rndCC + = + true + creditcard + + + true + rndEmail@email.com + = + true + email + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 1.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/register.jsp + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + register + = + true + action + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + Full Name + + + true + first:${__Random(0,999,)} last:${__Random(0,4999,)} + = + true + snail mail + + + true + uid${logincounter}@${__Random(0,100,)}.com + = + true + email + + + true + ru:${logincounter}${__threadNum}:${__time(HMS)}${__Random(0,999,)} + = + true + user id + + + true + yyy + = + true + passwd + + + true + yyy + = + true + confirm passwd + + + true + 1000000 + = + true + money + + + true + 123-fake-ccnum-456 + = + true + Credit Card Number + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + loop + + + + false + + + false + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 4.0 + 0.0 + + + + + + + + true + logout + = + true + action + + + + ${hostname} + ${port} + ${protocol} + + /daytrader/app + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + DayTrader Login + + Assertion.response_data + false + 2 + + + + + + + loop + + + + false + + + false + + + + + + + 4000 + 6000 + + + + + 1 + true + 1 + + ThroughputController.percentThroughput + 20.0 + 0.0 + + + + + + + + true + s:${__Random(0,${maximumsid},)} + = + true + symbols + + + + ${hostname} + ${port} + ${protocol} + + daytrader/rest/quotes + POST + false + true + true + false + + + + + + + + 200 + + Assertion.response_code + false + 2 + + + + + ${maxthinkingtime} + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.aggregateReport.csv + + + + true + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + true + true + + + daytrader8.resultsTree.csv + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + daytrader7.resultsTable.csv + + + + + diff --git a/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader_primitive.jmx b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader_primitive.jmx new file mode 100644 index 00000000..29ccdf4c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/jmeter_files/daytrader_primitive.jmx @@ -0,0 +1,203 @@ + + + + + + false + false + + + + + + + + + false + -1 + + ${__P(THREADS, 50)} + 0 + 1355173676000 + 1355173676000 + true + continue + ${__P(DURATION, 180)} + + true + + + + + false + false + rfc2109 + + + + + + User-Agent + Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322) + + + Accept + image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* + + + Accept-Language + en-us + + + + + + + + VIEWSTATE + + = + + + jsessionid + + = + + + minimumuid + ${__P(BOTUID,0)} + = + + + maximumuid + ${__P(TOPUID,14999)} + = + + + hostname + ${__P(HOST,)} + = + + + maxthinkingtime + 0 + = + + + maximumsid + ${__P(STOCKS,9999)} + = + + + url + ${__P(PRIMITIVE_URL,servlet/PingServlet)} + = + + + + + + true + -1 + + + + + + + ${hostname} + 9080 + http + + /daytrader/${url} + GET + false + true + true + false + + HttpClient4 + + + + + + ${maxthinkingtime} + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + + + + + true + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + true + false + false + false + false + false + 0 + true + true + true + true + + + C:\jmeter\jmeter_script\report.csv + + + + + diff --git a/src/test/resources/test-applications/daytrader8/pom.xml b/src/test/resources/test-applications/daytrader8/pom.xml new file mode 100644 index 00000000..cd631847 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/pom.xml @@ -0,0 +1,104 @@ + + + 4.0.0 + io.openliberty.samples + io.openliberty.sample.daytrader8 + 1.0-SNAPSHOT + war + + UTF-8 + UTF-8 + 1.8 + 1.8 + + 10.14.2.0 + ${user.home}/.m2/repository/org/apache/derby/derby + + 9080 + 9443 + + + + javax + javaee-api + 8.0 + provided + + + taglibs + standard + 1.1.1 + compile + + + javax.xml.bind + jaxb-api + 2.3.0 + provided + + + + org.apache.derby + derby + ${version.derby} + test + + + + ${project.artifactId} + + + + io.openliberty.tools + liberty-maven-plugin + 3.3-M4 + + + ${testServerHttpPort} + ${testServerHttpsPort} + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + copy-derby-dependency + package + + copy-dependencies + + + derby + ${project.build.directory}/liberty/wlp/usr/shared/resources/DerbyLibs/ + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + package + + copy-resources + + + ${project.build.directory}/liberty/wlp/usr/shared/resources/data + + + resources/data + false + + + + + + + + + diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/README_DO_NOT_TOUCH_FILES.txt b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/README_DO_NOT_TOUCH_FILES.txt new file mode 100644 index 00000000..a4bc1452 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/README_DO_NOT_TOUCH_FILES.txt @@ -0,0 +1,9 @@ + +# ************************************************************************* +# *** DO NOT TOUCH FILES IN THIS DIRECTORY! *** +# *** FILES IN THIS DIRECTORY AND SUBDIRECTORIES CONSTITUTE A DERBY *** +# *** DATABASE, WHICH INCLUDES THE DATA (USER AND SYSTEM) AND THE *** +# *** FILES NECESSARY FOR DATABASE RECOVERY. *** +# *** EDITING, ADDING, OR DELETING ANY OF THESE FILES MAY CAUSE DATA *** +# *** CORRUPTION AND LEAVE THE DATABASE IN A NON-RECOVERABLE STATE. *** +# ************************************************************************* \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/README_DO_NOT_TOUCH_FILES.txt b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/README_DO_NOT_TOUCH_FILES.txt new file mode 100644 index 00000000..56df292f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/README_DO_NOT_TOUCH_FILES.txt @@ -0,0 +1,8 @@ + +# ************************************************************************* +# *** DO NOT TOUCH FILES IN THIS DIRECTORY! *** +# *** FILES IN THIS DIRECTORY ARE USED BY THE DERBY DATABASE RECOVERY *** +# *** SYSTEM. EDITING, ADDING, OR DELETING FILES IN THIS DIRECTORY *** +# *** WILL CAUSE THE DERBY RECOVERY SYSTEM TO FAIL, LEADING TO *** +# *** NON-RECOVERABLE CORRUPT DATABASES. *** +# ************************************************************************* \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/log.ctrl b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/log/log.ctrl new file mode 100644 index 0000000000000000000000000000000000000000..5ae5e491e44940bbb1c74e5e69683926bbc6ce97 GIT binary patch literal 48 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

j5 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

-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 KKf%=5)!i#wdAM`{ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c121.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c121.dat new file mode 100644 index 0000000000000000000000000000000000000000..5f7789fe11492bdeb246e5cd9440b658dbcc0d9c GIT binary patch literal 8192 zcmeI1KX21O6u{p(RpO*goBm6oz<^YhDdKFOFBgfK5iv2a*=Kt|VuMPZV1Wr%gv8EA zU}0h6Bjh6>MkZEx_s*#zn)Jkkgx*PcKEM0<`TV;$k{vh$0D&LZB8pv#%V9CToWuUF zw*8S_yZaDFp5Z437%d=yC&&FO+vcj#_s9C&=a*_x;?8&62)T5U701&#9o z02^QfY=8~00XDz}*Z><~18m^`GVu1pxq#<*O^fII6F9=XTbHhKcq!u(-5$O&cm?sr zi-48Ai-Q->`2y~WxzCE*?WlY85aC1~z~eUa1GjEs(H9K82u|U|G?|vNOeQkXW|CF2 z>7;53HIdkoSyt;Zk)6u z$lDM<61&8!BsWH8x#x3Rs);U5>ets)+SC=T@2=P*-X?a2d==vN#J;bes=`PWtiLY~ zeEqa4kq_2C5QoI4xWHECWoSN!VoZFYN^7NVzi;cWcMM0w*U2TCdBvPy04#VykAtXehkOHekN1ogZ2AxgLtdb%E-L+xqkiw zxJkTHb#0_>*K0k$@&zIOYH(u%Y=8~00XDz}*Z><~1OL=ObPD*t^hVdk&PNwvPMO9< z@s;vp7o$%UA5q@(XVlj&0v#)Uy8Z@bI&1e z#(#s@U}8aRY;4EpFDbopjkBMes;`ax^78!r*;UH+7-Jc}!!aUUCp-xA{)27!eZM>Y zYwkULj6J(;@6MdGg*PA1PkKH#SG9kizHaTZe_EZ*TR)MX0b6vexSsAgez~G2HKhbn z0x5x%KuRDbkP=7cxG z?8~AzJayy02#@f^Hb(3wo64rv8eB00uJlY)rkqucl{3JD8&NCAA@H1Xxd&TEd1I0k zMr#i)PDM$tOAg?4RPqE#7I|eg_(7K@=NiECsN^O|a$)iA-bAVBvJs+^;L8{~7&T;RwDACS)Md8SW@#(r)^13WTUDTBbTrv^>(V>rp&54RMGerzU7l)P)>fe8 zu**6xQ8MoGG)d-pZh%9S8nOg#3&|lqJv$_6rObiz=zxNx7S5t%6U#h1Lz3PYEDm8? zYT=!nDW~&x_2^3Jx@uRC(O7JvEA`d9>?}!Y%e4fF8eu`MrUsX#X|U8K#CX{`l9bj8 zlpJ&^Y}ue>+~s+a1Se_<#h}Z^aRpGsU0xu`(w7oIMX6!nxtG#I(QPlQ1IjLvq^N{L z$>@NBB+gRlL8(}lY(kRUINXVZZ>cuSsc>Oq!Xr1<8(q+hFIPqn?-EH?7I#dLxaWo$ z@1cgeT&j#7-er5%12vi%()X6BqT=u z1SSS1{)GMsh`)dpo}ZH{q6uCRvZZ_Rec$Ka`MzgI^1%fF2s(UgaqMth4DN{IHoJQ;S#a5`_7)gAz{+8HgKF{+CGmJj(w%B3b zD3xQDWwG(^h+XDgRn-cm34GzK8kbh*;r;5m)J@IrcUSB&uT7>EDgyj`Sk3Q=edd)h zlK5!-eR04%TG=QpqV*5NA@dVAQHUkR#&akJ%*$F@;&qH4z>xW@vNS)X3%o%|i@^Hn zN-eL9t8~Hs4B?3R+RzF>MGM6HvzkAGW9F#@tuGa=e+(n$3tLV!7SZ}6IALBpnh{ve z{9HYr6F6mF)#a4<+51|}pN7AT6q5tVf#g7PAUTj6NDd?ik^}#i1MMrIZEfp~kK!B0 zDJxHXyw%|tl+V83e#A=Yqu?xjV&$EWt?#V=^s#-xeb(WMv*)ZcFG}tYe1r$^Jh<}l I-rX<10dV&O{r~^~ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c150.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c150.dat new file mode 100644 index 0000000000000000000000000000000000000000..db2ff892ae2734973c51574c959c519e6cd030c2 GIT binary patch literal 8192 zcmeI0J4?e*6vxj^YfT?MHV0hVzW zZQ-uN9A?V3>}WVCg^R1s6&QAM1Tko z0U|&IhyW2F0z`la5CI}U1pXI+v+I2Z6}+bK`#uQ?9R2)k4)bl7AC2Le*|Xg6HLjbsX1I=}xqe|*rC(GMF1I=wdQ?+jL2F$eXW~sI`xPE5g-CYfCvx)B0vO)01^0G0+9#E14MQMoe-+r d2kHl!6v__Z603TH3)H1R=U}o{XL{!9<{LqZ^S%H8 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c161.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c161.dat new file mode 100644 index 0000000000000000000000000000000000000000..a2af9876d07d74184971bfedc680db769fc802dc GIT binary patch literal 8192 zcmeI1y-LJD6ot=3NV3WP_y#tzR>6cUaaVi>+1hSpH-%WLU}s|~SlQV73N{v2_BQ(r zK7pO+&CL%%qA*}3=R(fR+cYm$!pbx!}PqrwykkN^pg011!)36KB@kN^pg z015mr0yp=U2Iull_5MCYvDI$&)6Lt~^(IkuTu+V+uHiQa0iC_(u6mzuuxr+3)-0-O zarEHGLJo0MRp!zb6Fbi$o`W&Avt%`$#AzPINj8nrBnD}N7xl|MjeY@((by@((ex@{i<;F-U*}NPq-LfCNZ@1W14cNPqW>K2N%>VxV5PRb>`KHi>w0Yd(UQvd(} literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c171.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c171.dat new file mode 100644 index 0000000000000000000000000000000000000000..b3e1217b32ccb3bdfb3ea034735ff62b630fce8c GIT binary patch literal 8192 zcmeI1y-ve06orq2l%(k&Z@_}eRN(|fTf{S<&PWV}v;!LwAhEG9va+zVure|*@d$ke zo`4O(weuqjg?eE^=SDfP?>&j_uajL|0Z?+A2&{%yU8(ABPTF5({7C=Wol50G?ig6F zOiBiq{>n(2sv9q#`$gXQmQ8HE%R^~rkcRi|nDI?Rg((ss0TLhq5+DH*AOR8}0TLhq z68K*P?jEicE@e&C{=N;f)vou`^=hknohTb&Bu56fi0gxZ##a4Swa-`BR?8x*&daJf zdI)49hd3%LQ+b+!gIAF#zyO5tKJ{d1qcg~ah^yFPz{w(Fny{B3j`f9myj&~^NocfDQoT)+0sr-#1lpZNTJ`NbF{ zKmsH{0wh2JBtQZrKmsH{0)Iw8Eg=7L2Lq$(&FY>}Jlgh$)zIp_%`dGU;H;R!@#)j^ EH%QclKmY&$ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c180.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c180.dat new file mode 100644 index 0000000000000000000000000000000000000000..e7b80ed0f9ab16ee7410bf75dd44b9c3617abc5e GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c191.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c191.dat new file mode 100644 index 0000000000000000000000000000000000000000..5e31e3bed2c2e5d2b5cdc59498a27d8fabc5ae3a GIT binary patch literal 16384 zcmeI2U5F%C703VmS=C=Ny|dpR*(94yHZe}pyOZ6W-6T5I)pvR;Q{7dms@~n%T`k=t z`=C#vSr9=YevrqAFY23w1bh=geG)}b5CVb^K|}vlw z)ZAP3yXTyH?#DURxDTK}U;dP3S(W8%F=?Nzqw9Z)s5OGI773I2OmXZ$hGPgi( zf!qSQ1#%1I7RW7-TOhYUZh_naxdn0y{O?=f2Z%_C7x4K+mFWF*|Co#aZ{bO5*4s6Z>I>w}u8 zC!o<_I7PJ3&_}efLWpfI5Ke!%BX$+0XrQT&;minOMngMtyrFLe)0#KIHO z6jH^CJ|xkqFQRDI7tV0oo7lHl!|Gl!G)e<2*qt>_p^mmbCK+!(@NCf=1%d`%sa0s= zfIesyEwZu#O(`bU^eM?$g}$&Ii@k8xd5R_u>XQxz^KQNv+IOi2;a;r*I;LI3uJ)HgHuRNvqNr>55@L zx~2qc;(2`vE!tyBIO;BF*uo3?ps_fih^7>2`4zmVPoZs*#fbviV#y&`Cka`_NAw}& zQ{7CTYU88&B=RXHW%$$qY;EbYPT&}`7M!ZP8zsjgb^xP_ElZzBPL)Dja4N&VR#%@% z!#HNndzE2g%ht!xIF2#%3f8dI+cSlHN>SJwj5@Z&o+*nyWi*x!?RiCRf!qSR7O1{Q z@10S-jn4p;5AZ1}-=_D_sKn?|c?veYg#Ha*m%oWEDzBqUWdl3(+WO}lGnc-Am#DnR z*TuiUq4FK{sr>b~8hSAaixww*& z704uVSSEj5Ac?Vzhj^Rk{jWqJfxc`PiiY}`d$#lFONj9%j&X(<+O}JCh9ECETbrv=#t)EEN({Ilw+BoE47q7 zLMD1qN;N1_%4$k3ArrMIr9@>)X{O{CGSMnf+YW@dC6@hgH6_WANqYz<6LZpmOrc^* zI{5T!7db@IBO56x2R$YoVIzkUXme=;$!w)0A2OLrYnF3FKgEeH+a_n{k!D)8nv#Ub zq^a5G45UBKrU=VvIfzWs<9IBw-wY`kXO5MY{4p&%k;zv6IA+iLqnVYcNQ>_2H&1h7 z&iG@hob{{>MjBj2#Lh5DLfEM*5p8)HIgJNGDeCa7UK|R06gbgt?0c?btHq%W-IG4CGS~#;08n0*zG+xn+6+EU-Q@Zl#j%guTZlGR$7^^tD58jM) zQ=XKsjmPzQYQ;@bT+#t2qiR<1gg!}~cj&A`y82ca-tdB+f*Clc4^u-*2}oy~7MDeu zi6`}G2e6tJi*nf zvvFB|y-y36_u*4S{cA33ceylw!O_0)6puozRhLxXWUwHxxV-TlZ)>%r??}pA@c%fq-=l0HR}C~d}rai^oxGfi!#e_hh;9T V$(aAAoC~1*!d(1s{rKHK{0C_JjD`RJ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1a1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1a1.dat new file mode 100644 index 0000000000000000000000000000000000000000..e578b73bc81acdbd462a632dfd356f34b850637d GIT binary patch literal 16384 zcmeI3IddFE6vyAp>~_zdk~zeUIgE@C;hwu294Nsdn9Ed=&B+%qik;wu5XwbL;+(`O zM6U7&Kp(;7gwz2EygpWzSV<3uxO%GgY1IAeo}T|q&-DLk1$zJx;74yG6PbyJ!>ayp z8Sek>wtp3$`0I77xrv_`U~>fpcyRpv)a|R|YJa?t4z~PIU#8&vBm5Bwdyw$BwpeD4 z8Q(gg))#vPyaHYUuYgy;E8rFI3U~#)0$u^HfLGwzQQ*N@_!_>$^I7@(pFrDXZPSl# ztNNp*Fk)zxoL_lNDj zYZ@Jx?kA@IiHAp*&qM9ug~%K2)(HRTie3msd49eD6U!GxAw)^_A8o+Y@>Nm^ zQBnMO4l~Qkw9G}465|ghFt@x)6y_|b{&@@w%lCPmi;C)hw1B1IleEC`D2k66Y*=0v zy%b4Hj6a;hrsZ4AwTOb`7jVY%LzPNVQ9Ry8&lx@yMb(O=p~f?T=PjQNLn{iBpTi55 zFQjTkN%5H1deQP#k+q_tc*bDM@~Y@sAt|0u;U&wrd5+`nsq@`{mn}au0>?w~Yyz(s zKI<}^Uzi>{Jx3NT;Z?)uBFpi9CYf6n1`%jZ4bZza`#G=n!RU)Gr6 zt0;aP!<&|u3hy^b@oW>$TD~iXT$D9&zR@PUW%we=np{YV=M#9_@-iJzPfSXlnxhP6 z@Q&qsnc?|T{FuYLhA&fv{VR%(V>oB|yl8V#48(ZCO?c1p#emO~lHx~G*tUGt34C5r zJe$IK%gYSsV^R|12^R3aC6Pb>%Z{l4O_e{JBAKI(bJo@9(5&wS~ zE?~`-wQETEf7c*9CKGU~|9^_V;hUw36lse2f`nQx#?JrCT(-ELqxgtB|1ZlF^9vQl zk5>L)%0zz$f#TWR`F~kwIDSR(eAD@V+15F(zbQW-#m@gLk>UDVQaoEY|F60lm#-zY z^c!*K|7(%fxL(gF{in|V*9p2YA*ufP%=!O1Z(8){RR7V+|JP+%;`*NA$ISWvS{CS^ zCB?I)^Z#{S;rS|xkGb>zb=M(ZQvQ52asIzaS{%Qmc)oD{zmYlSvl7a0hs^o^rXMih zR8jnR=KMd7y+FU(5!W}IIsf10X@~hBl3zOi-xdw})so^zvGf0JrSJ}_D4wnSe=Caw z^Kq0v4`b*5TUDdqmQ??I?)-l{WCi+Ls{irA`Twr%P|uR`=h4*p|6XL6k4P#)|6u9- ze~-^996!}R+i?EBFH+Q}r23B*&j0sihxv|*;>Roh-^&j5kra>bUF-k*4wHkTq}*^c zcm9764d&w{#j`Wc{|_?3=XpZ;`G7nBKlBMcpDT(V&ES%GAN7sE>xJJuJ3YS>&)~A* z+bqNRtEl-H&tb>#T_*8*De8WUm+*n@zZvj;Q`G%DS^p2ewO76`@CtYZyaHYUufVgd zfXxD|`+xNF=%3j&6Ss6cDGR{wnA&X}`F$O2M&P7e03Qs)bX?B}oRkarFIj-6^Z(VO HAEJK%Y4L8c literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1b1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1b1.dat new file mode 100644 index 0000000000000000000000000000000000000000..2e0681401d3f64d5a174cef555a958beec5207ef GIT binary patch literal 16384 zcmeI2O^6&t7>2*;pQ`Ha`Abavi7|;9vqm$f=dX7rSzu{N0Ya01^o)OD_6&@l`E6p(EbkW zH#tM+=-El%Wp1-!{+fNTu}cup@rVx5!Si{$JIM33R-Uh~wmL;`*vgkLoVQPLw7b3a zZce*s=h>%Ew}*MV-Oh)-qMP@-T?#2^Z1V8I{_qZX2fPE`0q=l!z&qd_@D6wfyaV0= z@4yY@z-NR%!LQJz@j1Q!$LH6s%m2^OlI=M)bH;P>KPhb^`y12ofAZFFGhJ_m{;dRW zQ@#$jNBBXjzuND%I)fK%jvq((;f1xqz!Bkl%ejs46-`D&88F3ABBQkNT@p%Vlny8< zWikr3HYyoaWt1K$RjSD-eNbvtmr)8(>eP@?mMtYv)Ra*MplI45qYObYv{OVGqIQFX zZjw<@yFp63WE9kHkkM`lrQb)@#fom0QBZZUrdvdm0^da$x>ZKOcTox5CZk{msFe21 zPT7@Rxu)fZ^3^l*8euCGVHP(Gl{R8Ve ztf!&zD(hZobd~jO)+bpbX!s@TE36%8@C)lltk1LVfmXg_eT(%8)&NRhuwG5O})^q=zoZI;IP!lf3Pw6g9QnTtrH_%0Qb+zTMZri% znIr#~qF|(>sw4lGq97_nHAnt0MM1s9W?ueZFfI2{FL5$2|1U~Gy~OFf{J$s#^%7^o z{9mA6Vrl*_P%p7G{}-Gs6&(<*M+HYqO?QeYysNFNbeD_*Uv!P`mQmn~uG2vo1-|G8 z-6NxL;%?F*83n7oQM4qZU``uN_sS@k)5g$Y83l9NBy^vQf;nwcx?e=$U2T)m5g7%w zYpT?eQBb?4Mi0m+s9jU1qcRF=*EA@XQMh)S)Rs|DyNQ}g2mYaV;D6&l_B%3g_9^Q+ o>j7x`BkOytXIKq1`I_}L)&gp?J#>L=zsPRFf0_S(x^immF9Jlcj{pDw literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1c0.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1c0.dat new file mode 100644 index 0000000000000000000000000000000000000000..c5b91e2c3fef26113800b2a821fa2bb19fdf1105 GIT binary patch literal 8192 zcmeI#u?@m75J1tpC<-o8(9=Lg%K*#}rA3TD3rJK@(l7zbumejVQ7{4=PD~;b3K|OZ zBiT9MS-$vnk+q1Zjpvj2IrDRS3iWo*;(Pr>>5t3OD$A-0<9P3_pmW_xQUDh(^bLUeR^QorsGgwRhxSeZerK=R_$3sS&>;9{Cwm(lE17DT= z%L&7~e#|&&;?Fg_>sjs^8XE{e00Izz00bZa0SG_<0uX?}KN2_`w?@`_v-rTyTvWW> zHRjuiywH)sUdnn9&>7WL@ttpEWNuzHRmj@WgPjG;WDzn~r|3|^1{ee&009U<00Izz X00bZa0SG_<0>2TM%F-89r%Uez@u)7| literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1e0.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1e0.dat new file mode 100644 index 0000000000000000000000000000000000000000..761408d3b3483e2cb3bc4d3d46e37c5e92d2a255 GIT binary patch literal 8192 zcmeI#u?@m75J1s8gMx)9XsIY^8GsoOEn*EoqGJIjUU*)|)wt@6|}sAD0WOtjp>!ZW>r~9~a-eZ+^K-&Z<6h zQdnN6BCjSb=Z2ns-%=rk00IagfB*srAb<{9 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1f1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c1f1.dat new file mode 100644 index 0000000000000000000000000000000000000000..78d701f45559f9fc67104563ad350118d55c794e GIT binary patch literal 8192 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 Ka8o0I{Qs|UeZ{u` literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c200.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c200.dat new file mode 100644 index 0000000000000000000000000000000000000000..c3a7808dd76bce2cfa24ab40d4e9e5d87dc76d32 GIT binary patch literal 8192 zcmeI$u?@m75J1s$1i=Lb3s50M%K*%PXb~gO0uod#zy$2W0xUtt2yk3-Nn}DnLxH}d zIQE_8i(i+>PDFysP}eC&nJma vuIq>4T8HfiLRaS1Ri_vsfB*srAb95yH6u_15*-aC4FwGwFa=XE155#DJC2+XkZ936 z$>;moC%?`o8xb+OoLH|juTvHCX-w^BDUI+)cdnV0u0o^}i;Ol`|EsjNzf2yza4NaW z2l{v2%qVFR>T25eEOxaR4g??o0SG_<0uX=z1Rwwb2teQ;2^`K_BWrzG{9s#eYevS+!R9<8rQYf;t#g zG2c#Pxn3FUrKm3gI%oA;@ju_l$Xr9z4yvrXdT`}uvZyld;R@Tco6!(J009ILKmY** W5I_I{1Q0;rCxNLf!~V;?yuASIbS~8Z literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c230.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c230.dat new file mode 100644 index 0000000000000000000000000000000000000000..207264a3f408e8d40df073c544cc882220f9e78f GIT binary patch literal 151552 zcmeEv31FO8asT)2%9d=eW5v!1g?yMpvLnknZ7H#ntfZB*v99c{?AR2Pm9(}+WXaLt z#5AR$G;N`@rPseFlu~F~dQl1iLuqMC3$%sOmbUbSLhk}S=zYNdH#6_O?|s*=SfhXxMx&JP|w zFn^}pcc2UZx(9nJhi1FGoNZ3?*~;4VNNJUd3{YBE*F5sfcO5u0fB5i$-pc#{6)EGt z+3vxvE`aV9sV76Tsr!q$vD|RU8_pI>Ui-xK*qE0sdMC1l;k&bi_U@j6ef#J`>C{wi zW;k2wpo}^1TNd4G4;Jl|BKZ;T zXs8mCg7&Fgd-u`qecoijyOR+-SyD)@ooFF=EPp)b-KlC6)CNAuV7;V#vD~@(;9_U# z(uK^Twx#n@Y?SLO-vR>as_Ybl#O#H5;cbWH;szv&n{8D*#u`;!?aB*R=a<)?c9Ju?9EpG_Sfwng4aC8P_ zhsM+t03G<0kGv&L(jD*QS52mpCS*#OZuh1-j}@{LC5&oZGb&98(`3%&k~8N(?e}#~ z74j!24?Xi^7%Te7l@V~1k}uBq?>0p2h#rXdcKvmXB%1F(@QYJpKIhBunsgmz za_v)V!IW?U=JO@nqbDGQ>4PFPMM<2BaV7)mw+cg zp_m3fm>JApO-HakwPEmh1!@mha;lC>2z&9hY!Vci^SVC~Pz+0m_QwV#SW5(yDz#Wx zkqMj#ikaWlK?&9p0i{YU7AP{A6G1U^y*entS|XrSsl@`tpVW!q_*pb11qja`C_k&N zEdrLGCAKyTG&R?CO{a8z{lVu2)$tUnCjwEmdI%g#h7ut`3lJ<#h{QlJ@oHYD6y>WK zjlUWgXkefY45a6`jUxL4ssF<7BhEo7`q%$+|JH#1pJGcubUQv-|7XSK@WA1@uCAW0 zs*24X=i24@*|`~LH~FRc%ES4kGs_#*qKs~T?6;dgr1YA5MuvuGiqk{)PUi}zL=Yie zo&+}GJgnHq{OgXLBaL(bZ z0Fp1A;yV4;aL%dhG3aurjsFOzj^@Woxx&owSPvjeGlkJ`&H^JYNr$&?7sK^Om z9UGe*FLn|}3i&B$)tw8g(@P5vu2@pG`Lz!W1j#oW?JDDLC}xf(X|f?Szs;kO{X?jkqK=tL*c2|Pyy;~BP)e8PU--iT{eO$ogp@szx@+kF16>1s(Eq!u>i^d| zyR`l<5`5jenyIwYw6#uwL0k?71_tK(x_Wx50ti0?$n8Uw)wRO%L;3m2(%QnAh02QP zT}JPy8)_%_@Ro}KC9;ZAG%KwaE32!}Z6bg9yBw97D4!>N5~U)#168kF77{8LFF(9+e*OH(h55B}Qi)QwiuuzK zuLiB$3{8(>7j9-OH*u_Vx2QLepM4SDR{U&e1HGh;eb3-qc>#>%hVyWV=!hghf6Nu~ z!_frgC=gB1YGyR0l%F_-V$lRq&7$AY2jC(MYbj5DB5_}frR?|=?Cs*45cVc;MYPGUHzZ{|8sbX$= zWD<54G7SYBP-M3ddOQ0dL^aLqkpB&;PO((T0=q?TZh2|dsF}xer;6SKl}r8?r4_M# zVuN}qS~7a*QL5j6B^3^;um6Em*BH%Ib;4Ikk4iE5uGCkq+3yPPnu>Zy-GD_ychX9U zD-+Ef3#QTzS#wtq=#pe?VhnLh3S|s|ox=L7KmANL-#+u?Y0#uVbNhEf_w<%myrtze zLA{WYng0u`6YGnM%J{Xf&b4AY8?!3|noK_E@)2f z!7a;yr9sb1I=LC!6YoEMeqr}t= z7y9z$>F9KEI6HqZw z#givHZFiWJ&@7`9xs%|RXFJOm%5&!`o%5BI*-M>sFu*S^pY1#rWnt}#b>t^TCk-E= zX}r%np*(=NHTp!JG*jYeAnk=MmsxuS3>uUD6yoceUs+a9AjjfMdp(r|`=NMf`g~3C zJpY3*It!UL;_6%zuH`jhZg6nEudBCQbxrV`XUFLe@ZvmQUbzGXqVCXJoaRc zuKe3FP*R){N4Wkq=o%JXRW+C^SM3y-#1ity9#!_H^BpNHrD_N~_e_CMd+f!{}*H%LFWe&7GSmh^u(Da${& z(BqG0_2xfxy8ng$g8zTYnS8?yFIPkw*b#UNx8#HET5KaC-H84Z%x?skh`M4@!u!WY zuAw64C7eqELQ1X$i0HgQ5Rh|bJbT~F$^1y^?wS0=%+RTlY+uJ}!M+q8+R!%uvqyV) zrKB~{D2z#pAZ--~feWgEdV_KUn&K6J8C~W#st9wxdV)jA@>8%=Q1xd>0-fR2JGN87 zEZPDQu0~e;V0$16fAtR*P>Vn1H*!EQhoYL1+^9t~c+&uUF|ax)B4`j$pV-u%b$}#_ z_m0h&9Cg5cG$PlUAgtBGit zYGcEC+|+z3?8gauuqe|JQJ`)UIBVaUCBz{iYHNLSBbQcv1hZl=y`(xw0^(N2-~6 zG_l1j)*Bl0h#>J)%tAw0;jShU6^S>|Rd|EqZa2J&Nn*zsS^GMwqiS16O|q~!tA`g) ze}p554H(pUtI2dMy8koBo|)PLFOb#FzDxyHwQQu9bS*L_c-$J{*@vAr1hK6IQ8_z3 zR^rVF|L`^+%hW6*u&82n^%hp`gWe%*YFm6ye;-Ja(cKoP;Wlq|t-P}4wRw*`;vG2P zmCjYXK!*L;Mk1fpRqtH+V#QlnnpwHx7{n?P}6uj!QC#I+XJHqS-())hoQ&l zw$b3NRL;XWK!&?USr8YMq$#LKM`mh}R3V^+h>UEaW@E-Ef6-+zM$1af6t7`KW_;LD zAWoiPRbv}35@vpr0E8pZvYdWYj1ZmGk4mOmJ?FC?wvyBB0ht zOT;1x5=}EEo`sR&Nzc&?v_@{N*KDY2rP&1Y2G#zEN)y3OaCRy7OB=cbsdkCyqsbdX zPhhg@UR$H#lZv%6sHhWcCN{$*>78rK#kCdk?cdkQjD7VacyGJcW;7_o@;I4=t3ej$ z!^snx*F|eY`G9fNAvIMABe3PIAaaw(ScW)8;In5zerf2^T4mKZ-NacLWA_ovP7)8f z9Wp^626Ixo1j7Nxd~5+2?+G%&YvVk-7FZtpY@V+g2}GB)HkB|#*s3orL=*Ht22v6o z)wyRgO#dC~$QTvuh|KVi)w}W9z(4~74Gc6e(7-?g0}Tv3?J#g;>)!~>y>EN-H39$s z`s4qxdrY}&un#Viy;a>~b~~-w|DSE;n>hXtGe+~~4gky#49*X9^&rS#m6(Iicb=;u zjGO|W;~_fks4y%xpB6oBr3jzXP`-+61b}gZEem+jRtL6Mh;7XJB=(0S zvxTGv3k6IO%6wr?kWeC=68ZC;-cYV|GKV;`a@3(mxiIpH2ZYs}fW;~fv9@V3aw@-0 zXIBYR+SgS+gtfB2>RO4@d`yVy0K{rvSKZ#NLyx6i5jgyiu+`%`_HslY!7t;L*s?hn zp$s{R2Ook9hGs{F90FaQ$c=Ps!=W~phBNfk%FwGbvW-@>bKTx_|D5JjI3l>kcN&lST%+ZrAWYZ|j^RPdjP9 z0dNBY4GesRW1wY6nl8foc(eHb|EQp2>c5YFBC!9zIsgBgr(@Myqfmyl%d4ckij+6A z0kw22k3&=xy$%ti^7j!m!7pKjSEm-?a~8}mU&8s}oe3d-hEExB%(=jaaBdPXbo6rl zw-z0$L=^Wh`&S$QRjT@Z)U7}aAFxsjP{39cwZ(aTYh33(zSuyWb*9u7)1t^v%f{kIWpbLDcg3ql6T=o;AUxrJ?Hq@X#BmFBk8#0AO zDRqNhgTZkl{|ObabOv`Ih=0u$lU}&i4bfewP?%$lP2!L<+c=F`H1sK4Vmv>QAIDK2 zAxLokz=ufg?0uo!_6JRwnzasjE$6da5cw8gIyyt+|w+#+1+=Ano#nx$?=d4z#Rd%K~rjIdRy zr_{}36zFn@qw0+PkuKtZtIu6EDl~~|b6bo)ROOBy^^`XXuiVjv|GK;Ob+osQAttLPVQ&;h+@XAl zqiz9&zK-6W!(Ck+ZTGdcwRPa9Ew*vfP*(?6F73$gU;;&xNZMewEmoG!uAOV^FtGJJnXu8o!~oXQ0e}22B3Sm=VmQ0?aMl`49>wk_ z8)0o7-GUzh2OH-tG5-HA`g`|(1N#3a{QvWBC-SvOf;-szWOfjsX~DQ33k3rmy_jMODizR{M%=9heJGL33(iwsrKO{SEgnuE*B=wAn_8 zNoi)@*3pmu;_BJxw~e*O2MOCc4t4bRY`8Ul>|#dE?pqL4&ErDtn9n`Lq)EGP>p0xe z(;LcmRaOK6ZWCb1(YUsbfqL*1Y)3kfFe;k{Osy5*FqnR_HW;4w)bfF$$;q)?b^?$b z0=tXr`$oT6IJ&}BHrS%3G@>)o4%#{fiK}$T%ZAqdn6=dxFh~h1058I+3U%jRnzRJ>H~-UR2y-KL=t)3^$K-t;Vd(gt#9Y;uTu(AVJ~Q`#`p_7ssh z7)FF5>wQYH3{sRyOc3Wna3mmAehCBW>L?xV zC=GO!20Ne!;s@#Aw9vfpgY@nJeG?;!($x}e3dLmyi6j{heile=aI5nlgrRgb}{;q`|R z#(Qn0ys)%Zw;SQ`YWhL#Mu?c%I1uXx&hGH?Blp?Ys4cCZpRKG+o|#-hB-F~ha_N`j zu`nx;gQeP4TVGpP?9AdKwM#hEZcYS;s-q|kQir~d3`cFnP(3+$ych`5svYOl(>T=W z1GexAHQ)R`)EVI%@F~wc_GQ)Htub-T6&P15cxMnXykTu0vDOhk?SSG(d2m!5aUFl0 z4){`Cd7O#R(1n*B-s&>H;Tpe{OB8ctY55^U zzF1tmgb=+x=L(9UG@@&qD=(b|D4r@tAvl(n zrM1c`N5Lr1&l9XG-h5@Tf;b|b9-{Mm<;90U*SZ*H-8$~lLu3*aSmT9IQoCP-uqNp3 zsyACXvy6Be_}KFz38S(9V4Y5ratlZAz+5k`2^px$CZ6Hk1pinysa6&)E-Y5gR#s=a zyJouUW(`BBl%rS!&jbnqr;mCwb?6r&4(v$C_LRKvwat?VsKy9DG;RZ`bsG>bzj24%p7dj5 z>gb6rh{8)|&FjPl9brCGsnR3geoYk)438qujRCA@7)?MrywWJ}%7uk7pAHs5N z>J}bI4gtnmr|h_gSL8#zIKAD~cc$u!ywllnELT!-ev7o?&UJP74s>$)uk^2burfa|U@n&*a1O!0aEy)-=7+{R;flgTQEZ1P9Kwb5W3_U$yG>+_ zjWp%D9AH19Uq6W-u6e!ly9nujP4jm;PSbqq&1mXKQ@b?y?ic6#0{VZmvjr(TBj627bjP$!n< zZno~h+44YF?_5%M z2NlInmkSsoc=)`jPBl?tVK9>@kU7WKj_5Hne!85Q3>v=h&_2~k8&-S8 zZfmIvun|KMbu!)^EPl^*&kcg{LXNH?-tBUBYN3lyDb>w#?|Ost`T)ySj{Up>5rg6d z$!BQxQpfyD!tyA8@3!KpiOGpm<0QC)eoDD)+;n z><_NQ|G#M~ZWWk(*{(-om^MkGxPWm(r;UiODh(syuY6$u1@E*-NGHtj5W%I_6R1WY^|ScGYi?JhJQO zMgRZin?H4XVE>;s^BpH6sn+j={r@KH|C5n-aG)}Wh{4sj<@Pw&!a6*>vb?%lsGNcK z{nA{eUJEhe80_5K1psqhXAT3z>IQ59@r2y2xLLo=?Dx9gqwFCnu7AJ|ZwJNk%^oU? z+<+SjkskCzgdcJ-H$5^rBSpgA$Jzz0y&GDPELk!8mLzJ`NJWM~UDk`*?mv+$6!Vi4 z0tY;SpNigIi4Q=X6Gis*%Y&fnuAWNOjgRY`-P#j)N{3>ue{X+iDurFkvD`2MeY5c_ zX5h%Y;Ky=)65?TFBWWf-F*RLM;VdC(nBBFHvwWJUDK5{|e?-@f#N zWCsrKJPo5@BRWH!6feH-hq}8e@UN=wX@|>Pz|5ysE9>*in`V@M=KhIA??&SG_xGME zUl#4^5@6Isr|oR@gjUHkZ?W!ZVt|8la(K#w`FLz5npYe`vydIh!v$3%1E!b|l+(rR zF>&IEdiNwnkvBNjT_PoXW^%ZcE6t4MCXSWvwpzp6Ch1AT8C&R(#%wTu9tE;!G zD!a`%+sTb;4wnd*>u0lf{j~FwW_`XpH=fmAH?r}oJfQ-EqX)sb&`4J0XlfABiCt#x zYanjIRS&31R%?$x)=90-Icy1SjXxV0Xkeg$fd&S?GBMEdP3|$r*}6UTwb=i^DfKVF z!Y5J#_rbz^?DJq_{*k*{S1Z(S!=CUesc%Uui9*#E2Z0 zSnH@=Yq3Y2t2%`xF9=&I7;rs<0*{;mvXb&y| z!s+z6H3{eKSvRbOs)bi+9o0@OXXn-yaQ28u_)B6l6Q!JkITyJzaS`h&!4oE^71IE=|#!a-f~LC>|-(K*C37$JM&3LW-Qcq1c& znnZTJ3-#2SUqVcTGJ-SY&!4Z%FO=6*~A> z#DN160s^)kI$e>^6}^`%FD!A`lA|2`+1uW(*{+3gI#mb@(eau52&PeFAPoM&afc8T zpVS{I5Kw-IKM(Op*@-@z3~|XY!$#EOvB~k`#@M5-%jb@YA=Zxw$p&%ot=&gA%!@{9Gh-k^hnEbGcu%C_O?(1&zwi}mp!F17EjjMqM zwus<2Yn8K?j!q!5eQpHNM&RLYSFLLB>)wchX)lNBk~BVZ>USCe6X=V^k#dQb#_+-m z6d}cHXVefr1NbutgSFZC=4Ira1Qe@&Aq*a-PBmyC&*8v1hvPw(LCHSCG44zhRM@T| ze8!mw$7bNsX&(p!#4KGSbyK{7MGkcqnSvTJl-w0FY)rtW5qkuDYUZ$uibdKCk^TOe z^nC$UcwUIXDF)?}JYuHjaDfj~o;r)ALKc=g#Dv;>BmOx1G-Gip#p>XO zyBUfMGr^uV&#GH+7wMn&D-KH5(!R$51 z*1fFnMrY%u(5_i~7!V*KgaOENfiIjbh7H;MPv%2*u6P{|!{e)kN=S)iL;`9&Ct{fG zBtC5Bm}uJ?@xX|u>aqL zSO|`@JyNd5{{KLC&mmatyQ^C5Z*p$Xo1|Cl1h8v!P5@nly$B-F+p|$Puh0`<_}cU? zC8GxdV1ULU)w3Q&e}r$L5{6*JZ|hZS#=+XmwiMTB-}-A(!cCY17gWT&gmbBuH*mvZ zz+-{x415UJ8{7z^?7=VL{6U8YWDkCjLw}yx(_xebux8=G>a5khjxfMsfMQ$J_sVEP zM#JYK5`FCoW4|aLjPBkFqOtW>owo47z^33Rf+CW6YO{ON$Ns4K54BoN`@eb*H?jjb zIz2I5g7=F=x6t|%8$2WcB*@g{QOr8qDfd;Y2$A%#a|sVW(Ye>6-MuQ4^$9z)CJRw> zC<}e!EQaVg12<(paRxIL{0!z3XE2AZ{0!z3XOJypl`6f_yU4x)rXAp#hW9?5ZVA1T z3;WP%zH@M|Sfs?>rKw3X3^s-m4RBWG?)s9|r!CUH=vS)(bL=~@G0bZ>i_X0?IHUsl zqRtBoMJT5grWRIws0!?9R(ywM>s_P z^}O^$NNCDqzYiE83GNu*kKn9TOh=f^Q4iPai4ISUk!Cetc#Oy$1t=qXy<5F*?*Q?p z@m%Td$r1X-<|Aox4E9)>1n~u}i~<{kU-TDu6i(88$CDEx`LrY8fidi&B|SKMq4yZ{ zMt4OnXrDYXg0q#F`_aZRC>Td=6t6KIo}qrJ~Np+aR?AA#exQAG8y%!P~rOPK?1 z*rd$5oL&=^+Nc*lD?8DUwXp5Q?T*KD-knwii|`6+-es-SBcV`kW37YqrvM2x9BCqI zUE{-73I>{fsO4+W*S|`?1HX?rKOy~o&-YzAb;bMtKfLR;mc*R6Qx9u08(7(jp ztY2kThpeq4Iwkl*Yx{?ILTl?0^ChraovNDAR;_TdGz(7T8+yQ#iKmaoxgykIVGGnb zO`$t^rSs)Kw4rP@TDP}MS)q;k#{NH+$*b)NVeiy8_WynNk$}$zNk)zR|Hl5mx+FnI zY1Vu+%&?;yf$^qwHhROFPrE1*z>K-0-pgRSUcxR^tRqBY|9?W=xdJ>^5z}p_2TL5c z1ooqFj4+}+4+?DtH=F=Y9SAw()b!g>!a~CdfGsJ?fN&)YB6jbs;RFzH6Wa(?YF~o5 zjqQdLK;>aFcfg}5e*QL`0FtiZ;dLjVhgmC3KmoJ9H=F<@7_F#_Pr4JpkzH>R{r_F> ze&9l2|6lI^+aame?;896{eyk8hz{FVb%Rc#!)Djul|H+^R;mBs-tc^S*0MAt@6GWp z7Fz_^;;e1o5xXwuQ?>z}7>ImsozJhj8JI1V3d#lyMF)-puZ{uxW>s?JM{I>|DpG#eq}@R z-|P~IRqzxP8*?yMsWn=4HCYuKP(I9Rn?>!{lOa%V_xtnGYi|$bz9)MkJ3N*x7P7rb2)Ga@G)M&rHk`&p%!aenvxREaO(}?wEYWCRSjyFDbyFq zESpGigQs?sLZ!G$0@K>4s_v^8S2uUX7EL6R?lC{rK9%L6r>R3xk-?f!O8_l(ZbOL& z%%Qy*yb$O-(8&S>c_KXHsg z_*h~?6>v~!=2&imtO(c)H>{la8so^HSTZPhZ`a;wZ6!qUyF&hbhpLey!I+SV6)P0v9h{Kr`I9U`?4;*h$B83VDyHRasiO-DZNbl z>7=RBN=I8;I=3cD2;1F3qxUzvZn))E1QQ*bmV9B*(Optj3aB zMWmAq+zJCuB8$E*>rQVdS2~%?O{f#0J#u`t{mvtIbkTtX+7ykOfD5bI9~3Hbof4gx zJ-WIF&VcV#zx4D*=X$V+uim7J?x zHFX~Q8OSe!W7vx`lwD{_F;G7*@lM;3nhz+byp+b?v4)Wbb8g@;g8>2nQ+0m(<_JSf zohB{zc!OPM;-y=~%?nRXrBruaUIA>QfQEeJZkE`yXUM z4k6k?s*S)pB_2x~Z2b8&#lV*S7K#FRr0Kt;1NVOHZ9f{&|5FZW`Yn;})zJTY2ImK` zJyAVKx?FxfwX$%&ymAQv>gwMB%sq3<%>e;8VK;y^gqVZ5;2@Hu?YVv&BwBzZO{S2g zFVF{TDO2gZi=j^f)Qo0hS2tbj7yzPnSs^ZT^D0t}u)U3V#cG|7yM^Ax1$5yEQ;006 zw-Jmpm>*X~DP_1kIib;N&Sq4zs=!no@SUU@dEi=x30dCcm}RShF%ISn7RV~SxfXq)exEx}F#u})~SD40QokYnOi z`@J;ECW;k#C`S{a=+W-4T93H^{gSXryrE1(Y0WNGwIwy_VYKFSa`+f4Q@o3N%*2m( zU{zq*F=G5!J_N9xVz#PeI9a!CEa#C`tMQ?Mfd&Q|7-(Rifq@1F8W?C`KrnD*%e&-{ zx4!0Awg>e8^yc*cL*11Dcs5nPGD>dk+1y^g>r5QGCihh7{#88yR3h1zH?aM$+#M;r zE}e3YuCJf^P4=V#SO}KNDI3oLcPs#Af*`MhANhGQ(8t`sJ*U& zyzMZ(dJAW~HI$_fv*p!__fUD&n_H>iVuE?^p@p?`UU|t|UYz$X$_2UJ@)=lJso)4j z8uQv$D-}d?EexGH(0#bCAGzn%Yk$w-K6sha2Wo&eU!~v~6|U2JXnCn^4Zl|&==4sm zlrK=e^MKSVd$QnoCM&lHrn2a*EqiAc9_A`dPddEH#mW-CEw7(F$4R>H(qefL9h$%7 zl~*bR{~A2-R12N56CLw=yC=sL2<~|$2ApNv-f*Fon77?UQc)5;l6?1Lw$$UwDCV^hFx0#KxK@23-du2cr77B zuF3S-mxdV(4)L8xp4h~Jr6_aoomb3^;%du z+rF=pdGG2;u*Y_SC7D2n{y6kYkNv~$aNmG?9D;+$Qgz7dr#yEHy z@RBfFc@Za2^FbPeNUWVd1KTv=O&80*GY~O`&;BI&ddk5d+a)o0ZpYe`4J7C>;0;lo zVs=89?&L-zeQHN`YQvM!$uxh;z1G=&;PAf7ZO%rWFkRd{|E#U79Y6i82uH5@oOB|6 z{cHICKhv*G`u`suJTuVM)mQ!2UOE1oUz)ExOb44bih0~f;1&tM+|-s0U5_r5AV+^~ zDg$E<5{X4+_u^_f{ENwumwCWwmgHrY;!1^S{6$x) zq4^1f5}%&P-#ZQ0KbhYN&JBFI)XcrpaCsWd=MX{Iv~O<`YOevwExj`9a8wkAz_(c8 zp_zo>wL$=i53Yb>ny7W*A=rmGKat?)5T1|J0l!d!uZ0q^mgb2Y`?#nd zP|c&W2n0++)HcEqfe97a;_%F5VTS6I!7(y|2!lL;!&!+pi!0ocGfm;jZn)bMR!tp| zRd+N$M)82r*%6L?Tt5%@H;c)*AzSHD7EeC@viJXzHKcrXKo%RUbvoAF;2?QapX42PfuPy~rMtlMNERC|q!2-$)zxWsNa{Ofj^ntG za$m5>aC1yU38n(7@CsnmIv|TP4%X3Cn~TTecBoAZH#1db)_$SHJ6}!`ZLz zdWjtP@;$(YSzoW;5A4`l^NO+s2X8`Q5tL>u{}H}ML}VLwmY_V=tISBRJy;vb=6np8 zYt$hV=*6Ujn=m$8%4J@{xm3#=xK{-^XXps-$^1y^Zg?Qg44o?BDo9kGY>-UqM4XmJ z#viSR39HxQy)UveHw;x8h%lo~Ct(|2uuSlT5_%B)5WK`iV5zcTHIDODF-?;LxzApc z4jeOeig&7}c9kXN5Np0wy?XGAMD) z|3d5_FdZ~AF-VJwTZ(!&c$^Ov#zSpeM)FHTmk?A7LkWNq*hWl1mg>g>)e%B0XWG3I zmc*r1BTBGiB`&G+zo?Z@!d;q`-xL5~*ac$%jqG8cB|J*?`%Zo=Sp?G=6=CT^DYhnz z1bhG?z34Su$uL~A-xZcrd5Ej<0zPh^+;yS{a@G?@j0U+zS&$e6uk`*WxyiAmz8u^%a;J9bDz~=o;#s4c#(%5(#* z`kAXV?Pp>QM04(|8zw~r`f^VX4sY~Tzg_KCXJ4W~FUAm@=-9M8|9JD88uI)oE`g_5 zJI6|Qvk0NL6$4DT)2JTt7pXPm`It?gfTT0(|-D1dSdwFwnrj zR|W>$|8BV-Jw4+7qV)II3-@dd=>JXFZFijQl4|{~asGe4+&ehX)mJ_Kf1C4sSX!Ti z?Vwz4%dlk^u!6lLT3#Dr0ONL$8v6!1iW7xk3ItnI_YLCx1|%?_vB_z&Hl8Vqpw1m7q> z5R$lmF|D%!mG+wplf$`@=>qNzq3^ixdMuC6ffUNCjY4`STps}{;QU$PL~f+JR)(Hh z8G3bw_P~u1k353=BH%&JaBcd22r%&~JC7Ii72p%gh05ys;u`fou$k$ji458S9-^Xb z89t%5-INoN<&^fHvE5`f(f7NLcGVlc)DrC)e>O1Cz(4~74GeraV_@4Z=dT=R>*3VL(90uR z{zv-y^XZ?s`D*C@m7YWM*#ED7v&ps2F07V$|BCUtS4^D2xM^#h%ejcDz2(CQ)ZJJ8 zf`aEbx5ODJWP6*P_zU;rN^s4O+((*)@%@qGVjUiRx7>u6*3ZvYRwmEz1=p2% zwWTg@T_{3&Xh0^@GMIWA*(^b?GtJ{@`^bGta*N1QVfQIIxJf$(1Zy6?wb~s_T%v;x zT9k(y$CihPe!eSWu&?@vta6$rF-D!-3+4-*w@65|k6NfRebRh2H}Cdf*CV1RNn6St zjnXLMyg6~CMx#!86!EgFXAl==^i>ZW-|oDi20d=p;bP>+n|>^yPgT(v8lJWdPup^* z72$k?;mNV4!Xcq?fk57=`{k z^&0#>;=DmB_}EY1`ccyVUA@0A@&B45)$8<7Leo~<7dZKbT^|c56G@vh$5}0mkIO%$ z5?Q`c0UTHxqwN`$M(@};@y|l}8AQrbcRY!^W&#wWHWd0rwW?pGq0!?pwJLeaK7|u6 z4h7&$I0}!Q#hGI6Ub7qIE6StCXQrp~OpN5la!&##>}szB6P6qe z{Mxk+*M;BV^6Ff9zM@PZ0a~ytovy3WVr7lOn_c0U@xaB8o`9xC5B=AZRGWzWIjWQR zWTj1&2ws&d6mlbQxF~V>{#+Y}%GfB0t@)-Og**zdppH*ODqpCl^8C`m+5$q2UCN(7 zUzuM(B(!=kX-W%#h@$2rGQ907aAt?{V+bH27QTf0HrO(FbToe-q6}?sSDbgWrxWKe zeajqah%gi$pUIDO;87ZqP4BFH6-MlHy&-cbKF9)z*Y>Cb6?!1UY*B?e=&_BMFk6}9 zKvT=Bz#+nNGDkGE`7F`rf|MAh8=s_lI)y+GlrAu+=pQw%d4%e>&pzYRtpa?wsvcyQ zdW?mWkqqn-nt>`&&wW%GykkjIg#wBE!tLu_Zyp->{O!&q8+wo4g57QX?=_{9Uw#C3wd>f>tKdt8_U?a z#Ao*gXBIn(+Oy(vRT1ODOp65|L_Q^%=7=_INq@}nNskP3R4wYWAd1Y%$p>_@0&2B_sWSm*)ZEC}u2QeC!EL61oVHo|8K+kzk}WQ0cKO|Z)r4jo>(2` zRd|@Xz^=nngKofS{L#Qb0|N~VG%(P>Km!8}3^Xv%z(4~74Gc6e(7-?g15W}5jyOl9 z)^GgWZ+$Z0|G&xj|9$0hFZ}<@2fDfs4IJp5A3S_u{!AI+0PwGSu(xt(w!6!DhI5k+ zA!m+)Zq|W$+|7JJ?R*6S)O7l%7wIq^IS-gqpKPK?%FPywV18x9NGicwH-QGk%n{6Q znQf_d>op-LG#`=lbJDBc6%W>If|yagffJl2CENs6W_J3_OE{N;aRbq*12L!xjKBv5 z`%5l}oxfF(80|YLPGgZh9&lIvF`TKNO?cmq&XzBaP zsB-;xIFGuljI!AGmL=XXhJ1<$u&tn}&vJ8k>M%Db+wDn|&pR-HHbDL{7hVP9VJFpg zG#UV#!YPXDO}BC_*Z}=R>mfQ(^~BsJxN&&=uoMDRuK)#@tg-Zw0rX%))%@m7CqI?& zcJJ5>c^Of?GsWqlO;1_A?JI&l6;m}jZ-(*{*#fS~FdiN%t~d%vl8#9qL`{Ib#C4sI z>QjG-f+JUUse4sI)H{_eV2h0|+<+bZRA}vu7pKNiOb4K0V)j4m|*L%%SheVbAHK3)JLa_!`U$m2Crz?bWcv<5vAglwSh$eC;z2%j&o#hMVxpS4ydAeb=b525SbRMg$ zg;j`l#Z_pd8KGT-#n24j=bcc;TsIVggf~{R_EvJ$pd*TvS?*3iPJo4}q);SHYj@VL zK*b)zJkdg~jmSDrM#(woo}Sr$gf*G1s;F&qnjsiWkCcjZ-g&O8yB8P!%tM(wGjO1P zw!im4&p;U`SNUJ}U}b(_z}(UHJZCR>!5DdFaj0^srv1(i&;MUym29M1xTPmJo<9jn z@mE5XJOA2w7y5Z*=bNRs=f3|(Ul-8-HyQtLusk<_C{S}%$!fdP0#eS>id;8cjo-NQ zdJ#pojUTuJ4!LIfuVz;&!}vfVRQtXTm0Y4%N-9{^lTT24sIE#WR5hGBiRvO2bmTZ%^)07%@&DO`hK!L_=!yi!@6zJS{i z;0TUOd2oO5!kGo!w5$qC2EbK4!}!9(h#F9(2Ghj7>&w7E&4#LHGtDJsgDWtY3A}-E zxAVO23qDS)pReGM!l=3c+Deg|RpSyat*%wh$0U>%&Q~B|S7MTimGa8mIjJ%S|N0A> zNB~0a;kA`A#djY*S6(U4ty#EUzi*KS*n*_!+DA#m`ow zGk(Szz40?{pgU9Q+(c!51Z&uu=39C;`pMH5=E3{I!^P{~=<-T@DlIniruUIiT%X15 zwkr!2;Bt8RJP2oDH9Cffi-S`gvfOE?_*-^yG4y%zLS<=qePwldWi>muvb?&AS}_l5 zVY;#g(rEH3kwj!8N# z5LHt78cSl;aYf~h%luN1>8g5lA`?!qNu3nr@S$=6HXKT0stwh-v;=9$nvbdo4^2V` z7_^v<$rMf~WJoI^UCo4q)WY&Z#f6t@lAd3#tYVDR$NbXV;`)4LXmNQ~ldW{Z40If< zhFSvnU<@U|z-gfW7z|IZR#xIlfi;z}0$Ph(eswvPnOa%66K&lcJso`=18p7)k9sx{ zOZNF)c4%Bt97-klS_+wH3RFgniwvV+-lVtn5V(K`Lj#JMDj~kcIu3`t$nV% zy5_YPN`?G5?HZK)fTTt;xa~H!zTr5`N!*(}GdVGK%EQ4fzJjZ}YafiEww)0lJOoB< zZ|gufO!{NvEfj|flVf9WUN7b#8DR#R z6sjrs+7I~+H-)MHDLY<*51nd_$xwN1?wl}WVCu}u@_DcQVtH{LA|7ZM43b1Zh>2>F zw(mP|2hnx~Lxf>!C#=xnw;}Uoyk1>etN?R8^RrObpwd^_u0_yZ$VYVKE?+F=hwHZm z9B^(8*#i8^f))W-2kPyJgwZOOD;1bCDpfm@akir)Vw0)A7l>LP>V>K)*oAuGf2yqw z*Sy_%ujB0ewDUpM|KB3*fAAw8{y;$g&p11fa;>CVzZ1+bIRC$cbon#0-G{om`n#%* zgAkOlZe5L`@GG-Mqu!yAIWf@NQ$`o6Uu(U?*#=UQ6G?U3Fo35JB}qjV=$oDhU9-KF zzOMf27clO2T4f?k74j$YV>w(!Uw0>>lN!^(ukXtGvW4eD86t z#mE$=uydE)^eWQl^n?Z{SYfa?n;V~<+@}gcoq`io55)>r48msiLt7Cg#vJ+^gBy*?Dm1>hW7;4pD>X6YT@lJ%{!>@DT`XUs$#A7}ZN?yBPeg z-uYgDUp?ICbF$f(Qo4ck|0|6D z=lq4cFN8lb82lyL+bX;Ec)QvCI(HDyE%@5B1Yt&ObTV zI5#`Z$||QTrWzl`5BY>_n`7%Z_CVZ&_;fQq?OIsPuCHM`Zf=G51vr6nU%O8GBec^# zbV>FgBq;`*-TC6ovD^d)X&DhS4=Shz6dF$g>ZYp%R4ahWPM0S06T@)8%1x9u57LcS z3#8)YbYVD0uEW_G61D>%-QcunCu3k|3!#X{F2&Et*xhiIVA>(1#KLX>oVqCK`l|$u zB5biwY#yBJt`ayq%{-$!q&5%Fo~s1U4$!oAGpqp(k4MFJwCgH?L^~P@Tq`=3RZw)zRf1=`P#l7DjRuet&$B)s zPgpyz5-`omzqbY?03vBZX08$>EwQ|zt`XXCl|Z>B=q(+u{WdJcV)aHbEii27FML{wz8X;>I^b1crzq@o z6JK4hleD8Z&wSu_2=JV+dFUyI+*O61XinpIn}7(7aq|F@23a?NBn>e_`i7#M8_(9DA)11Z;wQ!e)KHXxmqhF|6lJr1 zG!*3xSwb6%^72ZenYf`S$0#}tMY-1QLPJr;`H#d&)lig4vXL#ah^iTHoNg$}4Mo{? z5_SZ>c#85hAmp_3$3)I9KT`5&b!oHOx%mtDhbQd^(hfv3z1Q;(Wm;672?4PN)o7kv^9K70X%Z^lo;KY~y8Dd}0I4rFq7B6Iq^!3Xy+rJ-|w&%yux zzxPrJXTq7rf9{Q>&ZH7HyQ$2h_;H=n^rr<%e*9hczu@BEzx7SJJ3hPud&)iMxbOtv zf4`%i(Eo3V(f`|4Ui+%6p#KX9E_x-on0W7D}0a&%Yj%d59}+Q9 zlNf?MBWlBsO%M;_1O1}}GSp22G(Bkd^Eae@B06Z4meid@aN`|0P?MtVs(tl`B{HgZ zFPl&sy*KfY(9IPxuk=?jtPt%tR~u=4lIHC!Sc20f3nl-#~;BjyZK+7{t<0d!#|}zil3ylm*Bs8=~W%Zt_A@{2gvV0 zm5D}zB4uP&h$mr;+}UI?k%>$bjy!+p*klGjBrK2sybC|A_@SeeyYWM_|2q6!kDnXx zL(}sn{7@V6<2pwoe68|urL#QOKhSe#psTy@VLA}^aR1zF-@}Jy2YMdn=*k20hXyJ* z8v{TmU;P`Of7dU9qaR4WQffOW(bEoc^t6Mh?cfG$g9hq4J%A@z11=d}Jh=McB2_hq z_$LR&p_1+ezR2-vnjvjCTaQrGk2|26wC_8S0m`;+2kx4&i8s7FU%}qnh2>Q`=8Rj4 z*XO{e@dZwsi05EVhr3Q&`@XSg^W_T*+`P$nyX$mCvxT7?LO3KF#+|Nn-712sARx+l zMAle2L1(ZLuEuq?wC7I~%)6Y{?IehyGbL{7k298)j`g;jY_t4kXk-oAav&B{mctuxBzr z+xwkcsdxwclhGSPC9cz#+!d+I)Zz;vsISvGNLa-v-WsJ(YdCkt$vQ(joV%Q1kjGgJN>_V*t>wYk z7M9jpoMS*AMU5*hBb*Py*(_YFlyLRB>x@>f(Liodi8Z-pbZ#d$ly~kSq#g$w;(3L- z!Bg`YXWW^fVVwkV$78#)va-Aa+Ac56msjR<(Eq&{{XhHci{E?|^#6zFDi$eL;Lgog(uDV`8=A3x~1WR!XmO*BF#N4WOK8|RKM9(_sh!PiE zr@Pt+qiYMaBv4!*Q&qF`fPipvVSeo#h`c>7%kOz-X@|4uEW6IL;wvQ?1Pev8^B~wA z`XB-KT&KSV>o84QQ;&MF>a6W>R-E+~=b5f^IHAqT%Eg5_tQd>SWe8LUk5!fsE(*ci zhAypDNU~{m9v0?{_$=p^=UwM`4230)6=Dj-*DjTTo?q&G%?{_1^9YeoZ^n6l<9vfmyvJPUnTS8RT0%6tnCX;pzDXv@H&ZSB8Ru0}%eS;R`^6<* zIf=D6--eSkzSEex47SC2&DJ~rq?i8nZM|#Hf4=Met-pzaF@j@QcnC{8&CdUGotrTa zhSnD!;MhyWx$=_9<+|A<@+4C5g}dAD$>;M4gj@^7n=W_yg)dBMk^-$k=my!W9=sPk zjYE3g9%WY>`EvR+`i7s=r$Eg+v5vre&NrIX^}V+T$cB3a6hG zUcc%(-EE zP`;Z|2Q$ulB=r};Y&A2;z(mhI`(@XeX+K>Rk>SqO5V#`QN#godT5#S6@dW~j>%6%7 zP)BO08$G}7yr0nX0j&MLWMBl7X6H9rocpo3uuz5Tv_aFQWzrJyhtG4Iceme@Pr!_= z1c&As_>bSFFx}fRaT9B*!T2%R6Q^1gC^E2Ef0$goYa9zsX{oB{y1LPDcrNlPk{OI)6tr`1ec;5KBHS zLd$3P9c#`%3TOH!;#&}6{zdrK=QtUB?B68$-(9COK_;`7JE9?NL1=dV6I>P%rx8_o zoVW=1(0TB1L*IO+*=(f7oVvTio z!+KDsSkmlX2PqF>eG#~PjUmadtdwEJ>aQCRhz9`W2KPn+<)#+r9kS?|-nq_qL4?>O zZ6_5AN`j!{WX2gUmu1{%y0Dk*b)N-rp;lPn&ee^ABq-yX7KGj6dW5j&fMc1{B`xlA zA%mG$Eqc4p-+JfUy!ZX!n?5zY_0E5N_n||dd+T*1W6-MZ-pYhIkZ}>Oji?Oz|8rvW z|Gr(9Td#ut-$@e%6QfHe3QTU8D1#ZdR~ql5_nxkddr00fUs7ieXWT)_ej6uuXWS!_ ze6+=RPmA*h{Iw_JW_dwyhgzIZZ@ug0wr?(d=p8@nI?n)mo&aC2%#STEU!XAD*1G+- zo8Zogv}kdd5JOKaQiG$j03T(s`;rJI8G?*^%)J{7)+L)%rKdOJ9v4@ zn`n&c5Os?SiGwso^=`=aEHuUs4gKl|Kl|aWccuDYJ^hyh&*QpK_j##n3GZjSK`$4i zE$H~^N-y45C7rBbm0l3cMR|XS^W*)JP_$yHKav`X%Z*g0; z-u0a4wB7mfzk@7*8iB5Fk~FBpPKyh9fK?ycY?N_d%~l-uTe%2O`0dijYxw<;>%


i&THg9IBENo}6u;P@46*VHgih3ksJ$bxVC3+K+buXBGG+JgIfh8!gJ27v^c z=uXUfx)P2MnV-+NZ-N=r{eJhyI420`#|581LGOJan4grf`6+$}f&7fTgMW~4Nwv_i z`ta_GlG!uv&$(}<>VKY#gPz_l#h>8!Uf4O3)>j!eGi0_3?7q{zOn7}4DmmK?6F(pY z;k`%t2o>!bRvt)>B=}aF-S@gC%m74`e8&A1_gA;MzwDAWRp|o-{<@TXKh!%Ncq8L} zP%`}nXTr4pEy?sDR94DQoPtk6#{F%{^AXO2ss6i?=l7txirYfQ{e8*8+_(>8@iEEr zM-Y_@x$IcR{S(RXr(6ey;Ljz)$5F=!UyPM;|3b2SlCtz;RQ^)3{1re^hnX|(-$ET?AEL1@oL@iBR@+SK8B!Mvr^wrrNj-}RJoRk6 zpY6sh!PnkQ>N!%wUViV(q@E}5&*%64OsY-Z+xZ<`+b{1d$Q(k~4#+!14b+FOb;&!+ z8i&w>UU`SC(S&2pxlHO1(?SZIFI_o|E)7ZsNE=Obty(5^L^5E<3K`JHJ0-(ikiE=3 zo0-&*o@95#Uyif2udN?Kd@8x&&uqf#zen$^a z$ool5V=yO}KNl;R)G0ykY0iXhf3+a@MR-5kjm`pebpC!RimilnWdMDhlXqBJ@Q$vX zk@vHi)Qofj=6a-{6AuVbi~NpGEJ@B~en%%Bly@+FlcnWzbnexKz0etrj}KPc~5<&X|YUnlv0nBNDX zcP0pB!Utle=#Qk{0QR23Vx^Z&l_`^Y6ImMWN@2BXf?)*R{&C5RgQ8$ zm#TozcSu$5#EPo&F0+!HNxe(5!g5Hh0@Y$WOp)zSV4S>=Nxhd%C@I(utL|urmiFe< zuS&HTv0vk*H1+H90R!~`0qKLXG!ryq%S#~G-(+DR^;?n=Bluw{`P+U*x}77F`W@cX zO8qX@NUtUJQNW8kh89ZLnRT64)z}u272mAaw^tqXaOUbInIrXIssE;B z`G2H2Q1|}{m;5~D^4ab~^0_~gc6nUW&_vkNJ(F(Y#U;H(avaK}nZYjS9{6+`Mi}rw*e%k}6*NOnr4QYi^a}*5ZStWflinvE z_RELfOu9op9Dr=PhTG{@YtFwg7*(g#6=kkI|H4&g(g)LBJ5ujUcc;G&zRkpSW#f*v zlr!l*wl}3A2@q=fGU>yDs{#1{qQ6Zral3o~jUSZ{cgP1&@m=yED<43`!&1kHd;k@X z@=D1pWY)O-p(SQU$LLt8{l^!t^_xNnc1mxZSxe4GE7b#&E0&KGs`cqGkgKU6pBB z*Wfo3u|BXqUuExux32S>+eAn|oW2AbSNf%*{}*wAm`F;Q^dqUCg1I#PwX&5bDfy+< z3Ko9y#SYJS3U%uiU1`3ci7KVb~! zC(NAugn5&nuw(KQ#!G&}Xvt4lC;17>B0ph4hL{Dg&&pRft?6ZSuT!l=hj80h#3 zV;DbSisB~>P5gv`iJvem@e>vze!|GZPndQ12@?%JVTIu*EG_(mIfb9Fn(z~*5q`q_ z!B3bt_zCj`KVi1uC(IS}Bm)3Hq4@I?3O_%g&+`*{JU^ko^Aox`KcS8D6IwVwp?&ic zS~owTZSxaaHb0?V^Ak!mKcOr06FM+Iq5JX^Ixjz=>+%yiEL@>K{L$#qkpw8b6_X@e_&@KNY=`8pH3%c6 z%-fxPc)bHyIU}#L!PG~Csjm*czA^avOH_8tW#`YNsy|Y%s-e#YGyeyr8ZcZpkm_!4 zdXIZOz;k!)f1A52-SkfPX8ME6Y}voZea249K6{&!PQTOL8?2%~_<9GG z-Kv3ehv^lt3UKatF!PCE>gizWT<~>0`1&#`+uCeedIi7VY~EiP%>Et0*LSpTdymsk zJ%6|UD|O3O`ILIG`E)T*Dn*#bAf`UVm{0wNdi_0l{YWtNAtGo6@`gMpyO^ zt(aj7+SdCYYrT$NS|5C@^@i5#TLIYTxl|LVa)HBO5L_*&;RkF`Eqq4Gx_YxP=h0cQ8OCk0acH7|dq0qhz4oC^ZHaGm>r0Q{WR zZOGC3jMitiepTzUQ1I)xAeyB-t=lxjkMd`ve*^!~y2EX~sr6KAzIvV#Jc=&gIN-8Iy@Qwm*9e+>?jq+4&^|3vy_`qS5McizH$ zunFhEB76|%!GvLEfR7t!jNa+)(R}ln&R2zr)mg$(PhzmM``_m5YuexRgwy?Ar}wf0 z-Rr&1ZPz-?9B05gN7C5;e{PKazy9@)U6uI%`)8hTrr+tj5P;t?185Fhc4pGfDdOJ; z@H#tl*?9@(I{rEZu+r(v&V?rDvU4#_-}VVkQgm1#(#M-|oGpbu?!5KX?z`XVj9qr7 zT<514i7w`9b)-C69Vu8}o^ZbLoepz60{ay{*ss9rs}0z%jsg2o4K`e@>jV3K12)k> z!TC*E1>Ku@;Y3)8ssqU||A>X^*ZDBN4luvb!2CuF=Jz`Nr}l5%@`Ur_AP~GD(@$Z1 zFb;1`Ip6PqFFfHok2~L8yXjxB&~@2w`ZAjSCDZgTRd4!NVw%3LiD?JK`fF)W#s^dK zOXC>6$@SnkMINyA6ma2AuW88|6dXgN5HmQgX|U&`=%Xn$n_cJSv4z_p3{l}{0y%%w zw0|omsKUP{{Xdfa!9X2b!JMk#q>Y?YO`%b{eLtion)w*m%eaceiR8F09YF415_0iN zH~vGWaU+vC-=cWS*8%p=Hth%LB=Qy}$$zy-@}GUW_-7RV4?`FKVbO&~!DqJ^#F$U$ z;r}ta_^cj(I0n`?oNtKflf^Gxw|1Z0W}ntwfTTDYO1{nAuKVO}kM_xR71-oCSRdH$ zFkstMc!Q$C?FLnP=-v~T-z~`Cxug4Aw{A5=2M*v<;LK&WBRUP;8)}ZU+vAV4d(g+q zL12aW3iEll-@*zrpVr#k=X+|meY-Ux1Af~BX!{P+_8m3au7mwBBhrHj@3wjdGv&g+ zt)2ode4pcZ(DT&j--OXrEZoPG#e_Z`Te@BGkgo!chMQ1@PXlVcxx<>8{?XLnGlEwu zM(`-gk6Yz+;c+Y?JXzgw%;Xwu!Yx|FGvyE96e>Sq2JnP6fTkHe3h-d752^oFqf@72 zI(6D~>huOWb-zWGFY-I}B6MobbZRc9Q>S&O;8a&%r@ml1wG{=m2vJn?{#fmSSg~MU z_F-NI%g@N z(4n`v?@nJ%H8nX}lADaLJk`vVr^wWR<;~zJ)qFXHEnkJF)K0(hosT)N37r6fQ!h#A#Cd7wLb#ptfljRY?W|HKUL5SiZnDta zA*wit5+=A5bgj6#k@{X~?+3!|eQ%(>*ZS?fmfE`*Y;O;nr~C$YLjQkWjQ)RH>U(Yp z?Eh0pI0vgp_#b_Z`?u9~?)irVtnNtY;p?S`Y@D6BoO)bM)70xPr+&sCxi_;WNbDl@ zW<5`y_14rAj2HCy=X?zO+~dwO-kSOaodUH~)9~d0t!Bb3EM-*IR7hntEUXpkcMyOv zUOWEL&-w44d)(>q@x?qJ8UB6d)Gs@??MeOT<<$Q+ zVdY5uJ2>s;xv=JYjaFlLcSU&~~cCUdCGJk!_O6DfV8A(r%w zG?Bg#m`Lu;?@r%*YESx^??{u8k|tDoFRe-OO+H_mY!5g2e4EFnZ}pqJ75GbcUQYJ_ z+pU=<8GWMpbSLnFhI>`3MA3w)^r5sSKj*q&^5f2e&1I5c926Ljgkc;Ez<8$*pZ$DQpM#rvN~pXF~~Ed%lr#-w7weaP_Dd(zANP0+1P z$xozL`73gq_Xi1o!c133M=zR=UQFsJ%;j+-C30#LdG&_{Yxmi_ljyj+Nv?XU`)dkP z_m>O_yT6p4DN5>Z>eLVTsUK+4slTIBKkTP|c#BT`L!J6jKlP(qb?Tq#)Iau9|F~JF zeoCi)!cYA~i%$JJo%+{)>R-2-s{c_Zf7(y}bgQZR-*oc7_{sm$ipteS7dft1!&>T= zx4IgF)N@T8spm4*C{+WHdV!z%0>&DpYK*6_b)*;GeT+3q)fi88_^BP-HA>YOPr;I; z%O2#OQL4sxs>e_5VXPrFHK6*Pg4I)(?H8<3@*O()c0c)c!5Srx=;W-QoVBqAPx&y` z5bTBwBMvq?AmY8%)nlHT_3M}wtRYp8d8*>4Rs?HE)uWa==ck?n*7Tskkv-hJP3ozO z7UEy(SMgG59;pWLU+brStu&8RgZM}N)JJ8|kZKVB3P1G~GH6IO#PW@P>Nm=uA=MDe zEB(}0%Aj4e2JO{;>Z{eDA=wPtxBJQ8t_BUsX3)OVPySA8(8xnJj5P$&l0iF4%lrS| zCT2Eh#Div`pveX}O%KY7AX(7d8)yoP88~4GljQ`48YEh+JZ1>q7LE-~qrT2c!_;tz*)CTwIV%=aNmcXDneMMg-Dm!8wKVjIh(`SK#~7-h7v-$} zVj0JOogOb0|Le!ExaNC)g+z-pXv8Py&#yf0Tvq$_$#)O?@(bUEf*Zf{+elwH$tCS^ zPU*y#v>S?s3=A0mNP%X8~W*H>Wjx1CNf4 zf8`(;(;;0?UD3AMbVu40?kHPU<fiGRz zYMp9sazb92AO6|a z!CPGy%;ypx(gyg>)hq5#A@Gx!7Co<K> z$^Yviy#YS2Y~yq$`G2A4P4L#_j(N%di-4|yFRCKv{z(2`g!C5p&XgICSMvWNqPM{} zl{1`A$^V;*-T|+TTQM*Be>0$W!M9bl_{=cf|eei|pc!AC&|8FV!0DM`koYq$I|F)tJ!Mjv@ zUh@BTKp*vdZMZ*H^8b#ao8ap-piG zMHYOTHay?0Ptkd!5Xuzu{Z<%sw3M3nJd>;+krsF+XF3o}D{9mrj)}Ui(@XVKtptC=%kNNd`Z0WI)%=DLH2(3C2P?4 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c251.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c251.dat new file mode 100644 index 0000000000000000000000000000000000000000..c6fab1e70046b4255d1278d726c8d981944b3920 GIT binary patch literal 16384 zcmeHNOKclO82;=@ch`>dez;Bg06|-58`YsyP1093j+2_^RoiI^5=2hCX)QT+@S~3# z5-Po*!U1tdh*J+75C@PDCnO#hkSZi@oDc{E;zDo0|BtAjBBLSW=HS+EE~EW_D%+OghKCDOQ>1?j=ybp2q0Z^}KR3Hx?Y)gR z@0QCqVabAnKhuW@l{@j)YfELaPwTY?wYpd{pc&8%Xa+O`ngPv#Wo;z!zXT>>x0S`b9vWv951&#gMCQr-#YGNtuw;rS2_;OUW&+)_iK zP%1REmO61_=$Mllp~Fy;{#J%ZLm>!snN>*cTW^{H&46Y=GoTsJ3}^;41DXNNfM!55 zpc!~v82AWr8pFLdh61AKLWjUX?5~$&4N*PSegmC?6R8Khm`%T0A`dBBDCU#t zY*8U$pMfrcC$X_%9g98tMR3{;5q2~c4(CJdg6()M+^-LLulf`5v zcUfg(_FL!^*o7cB&!lNeMzd=<^7b~Id@-#y$9?D*=tB=fNl%a_&DC_qxvT`^_ai7U zfSq+Fe9=kKbW?!{8rb8eATKMPC<;XM z8rUo7-LrN|p>{V>$)MZ7K6ip`b)OXy5q^xi50Zu0d^j?>7>mRi;D0^?cN-WJXoZg+ zBnf+BMy;`llLFo7EI$MnV$qAynaH#nhJ{mdTGKN;9zGYDwUyHM;j}yvl)=<|EE1ib zJ0Dq6Lh$2^JBBKQ^h8&}XvJB1aZwiWg-AGRH?bzz9l-dwJeS0TJQazh1vM($FmAhS zFbK7e&P~m$Oow)iPsmH$oe#~O)DDb?-Ao8!){ZTyo|o#|nA=v7xgCZ=(N>7b(8O zziJDc6}a~oF7dvNC5mSdqaWaZlkpC0+TY+`;LT5P8t{F|Xr7~7ZvD-Dnb+n1r>xTb z9h{HvCP(W!=ZQZ#6Z0>r;Xfv&4_}zetuZdgRnCV>$0*X)@_umeKK;Lk*1RBzxOMYv zEvOv3`oD7Mt>XkV*8dObCwx~ES65>Ng>_iJ$#y__OGZ)IUm3v8l9na@s(B|I5i+?YC6lqr6L zbvn63)SO%*mAT-NQoO7eFFN@`Q%WyjvLN4&r*f&4)n!WJ;n+oVw;*wT1cw^J)-;*= zHPmaeW*@@ghUjIRN9sm(c%P4D{9!!%0Qja1ls=PHKHY{~aP|Cz)c8BmUxjGaEoe7b z=hGB&k(yE3UW3IxIVdhj_3o-Zv;nF5>E^NxOXbQ4Sgif&KJB73abX%#{cj?<=}WBL zZ170c#hL-lfM!55pc&8%JlYJHNAUvr1;4TyH$Gs$z*u6B!045(!Pi{7;})y;9f$BT z>G5x{OmQ8rQ0%97^C75fGQ8n=rt>fcFP>0lc@_W$>P3WUnc`gD+U^dv3AX b_k_7$lJ10$&$*WLf0SZX|G#zT-e>;;jOu!T literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c260.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c260.dat new file mode 100644 index 0000000000000000000000000000000000000000..25f81fde784105363c372eba91f6175388235f63 GIT binary patch literal 8192 zcmeI#u@b>R5P;#mn}{nEdX-A+0X&0YhQeq(1ZH$RfG6-+YQ4@Qur682oG3I3^Is;H z&F;-@?&~635pjAyhmUg}=lW#zdQRheIg<3p*NIlvMYU^-I@&zg%Qw$kSS*vh%Fi5J zHSdNZuO#5CmTJJ{onf-wck!@^`wyH wy1wVmRobsK&Sb3DTxM0C2mu5TKmY**5I_I{1Q0*~0R(<5Fp_@J@zR0f6#Y9cqTpT@tH{d|bj(Q4xw3HM?<81yW zJlgjPFMJ!7gNPWtsu9_k*cb+14|6(y)}xdDxLjyur&lI2@SBV_*Y(%Y+rF4RM((NL zT{bbk>&;ApCT?FV+Md~|m1BVb0tg_000IagfB*srAb`L>3S6#7BYXWa|AQUbS^D;^ zzTPb)sU8`eC2I}>dS}g3{y*Qy)RZn8ZR={R_p1F;=CZ15Ynu~^Z!SSZ009ILKmY** W5I_I{1Q0*~fu99(*|@z$K1^TR&n;~L literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c281.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c281.dat new file mode 100644 index 0000000000000000000000000000000000000000..cfed875dfceab65004fe1b91cbefd660cea0ccb7 GIT binary patch literal 8192 zcmeI$Ar8VY6oBE^iER>v#vwtWI0HeW&}bmRfk1KsZonnr0Ml>(Y%uf+c^G zy|wRkYxcQ4S&N9#%Z|jw)WtZ2dYsewvmA}|$K_NjOTBWDPS|Aha9w{Lt;e56kDh-j zdY4P|?|L)C=n%iJ7TuZoww7ao00IagfB*srAb{RQS&~GB8)4O?G9~wjOLRU?Q`!GItqmN?d$`hyVfzAbchAM`1#m1bdH?_b literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c290.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c290.dat new file mode 100644 index 0000000000000000000000000000000000000000..a85589e545d81d6ae0a080bcb44ba28d846f9987 GIT binary patch literal 8192 zcmeI#F$%&k6oBEEAT@}CcmX$E-CXntic1Ia8Y;MX0YT{KvAlqz(81YBpJ`)Dt%HM$ z{0T{u_tK>Kw#r6CjJ9X7zK?ug?n1sC)A2nomGH;uTr;aI+X;)>dbkUdZ=P4TSXTDR zKXY)=xEYGP4yoDKpXqir8A1pkfB*srAbwe_@>s%c3oQ?0Sqw0MUR0tg_000IagfB*srAbd`` MER$^4q<=d<0Mo1*Jpcdz literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2a1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2a1.dat new file mode 100644 index 0000000000000000000000000000000000000000..8e2ed6afe90b6e9bab82029f98a338a3cf455bf8 GIT binary patch literal 8192 zcmeI$yA8rH5P;#cizFp%Kt~A`6*C}eBo?3sBr0eqk?5&tnSv>p0j7Y9ACVIR5-s{I z%49v}E?KxD-)~u`K-V?%Zx)KyfWW literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2b1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2b1.dat new file mode 100644 index 0000000000000000000000000000000000000000..2a2969247718ad8c76b895d72b43a1f781e3cbd9 GIT binary patch literal 8192 zcmeI$p$@_@5P;$9mTZ$e0uBoXg~t&L2Ez*=fdq#^F2VB#I9>*g1jie|tzDOH41y+q zlik|8ZkK&-m5qoPy^0apnAjKwUk`ISf0m<>{?NxX0$OL)Q~p2S$iQ4&HaeHpSnoyqnM`C})($o&5?@_{hyVfzAbbTe~jZ7z9oJ zP1cXQc9;F!Dk~8&`s6LLePa8t^Z78Q^Jmd&;g8FSW)}KnA}znkXmMSCZH?uR!&}## z3f^S{y{itU9~5!>D!r|lZ7MMq2q1s}0tg_000IagfB*sr{G-6`ur{*PFY`axk)5S) z-|F-AM3U;2!B(>JBA{_rp7Q_sMh52WqS2|y#yZAYek>iC7P-BS`ISU`aRGV+5I_I{ a1Q0*~0R#|0009IL_*q~ibGNsBpFLh?bT1nK literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2d0.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c2d0.dat new file mode 100644 index 0000000000000000000000000000000000000000..c906363738017ffcd1a0316d56d8c226b6457a69 GIT binary patch literal 16384 zcmeI1&x_MQ6vy9WOSk(=L=W0MxYe$TNMX{X$pnh*MbLw?D0=bKq$#XmWpS%lPYZhx zPx}|>UA=mfJ$X<>58k{e;%WZ{eVH`fb<-vUWKsD}>6^)WFEjJ~WD*#L9ukq@e^h3) zEo-~qB=P+|ZvPyX1MZ2Js~p*gqeqjZc^F$eXG+%r|O?J+(^HzUteGrb^C#j~zSe{aW^ux@-S&S3(PEUxt3n1cZ<2>3#>ie~6UEfE z7~6MxEGGAz>4j#KpG>ak&~zSGu#tW=a%AT1yc=VxY z`8|HIySaIGv#Vq)J1-Hla6)`5w9K~0i`gE2A5eh+2!H?xfB*=900@AFU~6Ehc?bH2T%w>QT_CQ^VD zAO%PPQh*d71xNu>fD|AFNC8sd|5D)XyO#`};XO^?@87^loZUTim&XrTYJ)q%PX@2S zJNOVVcXV*_^gW+Jz`oX2=SSn^*mF$e9{wISzJ2V?Ckg%?Qyg=+3ga-EObQX_z6g}| z<06;7%5~@qY=JJ7u1aC!Vx1O3wa0OAPO$5P@Sb8fEN>?B0`rKv^3^J=gh+zcILvpA z-R#91S31%nkzKr}ncs`IQe`ehl63K&VYde1Jh;+B)(zLR$G zUV=M=@Lq;Z%UcCWBt_KhCkyTmpW{gtgqW}B%J&LvS>8g1r51778jrk1oKJ9l+v9NE z#`RwlAt^u#kOHItDL@L40)MZ7y9e6R9n4Olt0x<(HR3 zzqD7jZgjV}8%v)e75n;{$*v+p2mu5TKmY**5I_I{1Q0*~f&UWNpSDhGJ5zYUj{FyZ z@7M8=FCD)b+mk(a%fpR_-)$f}$Mf(7jh+<3 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c300.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c300.dat new file mode 100644 index 0000000000000000000000000000000000000000..2053e0105b40818ea4cc1ea3a6c1cb5edb9972df GIT binary patch literal 8192 zcmeI#u?@m75J1s$K*2&3Y>^6y0a$=0qM<`c2CTypbc_HOCr5$_1qBWI zw&I-cEIWQ(WGf<0pQ0sUOvBh5tlrFNe6L!R{y3d!WnET>wrHS-dz*aozWK#6+N=7^ z?5cS;7I_}hvTr!k?^`OQ5I_I{1Q0*~0R#|0009IL_%DIOY3F34ce4NcBt*TpTUtFT zbW>fQxl5hy6k%U-nQPBqdcBAU0R#|0009ILKmY**5I_I{1b#0tkx_Zb>Nq_=05p*m AuK)l5 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c31.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c31.dat new file mode 100644 index 0000000000000000000000000000000000000000..ec08143497fba7e83b443265253180190e04e8a2 GIT binary patch literal 16384 zcmeHNON<;x8LpmLPxribXV>xOVUjqBz0QM9s`^n~9h=ZRV!}ft;b8|89{mglBrdQ> zNL(Ue<-!e_TsUyR;)E0-S>l2?S>l3nT8R@EWC54le8>g<|F0Tv&(3tW5E2ro+w#9P zRo`Fz*WcAu^?ft!kTGV#f4sKHj>y){vb|mh<$s#%M0MlG*P!M5@ZVu@IgbNJkP z<(pdPA3XneU0>^qDlYyF{tUTp9Oyr5mhRbg<2A3oqR&8|fj$F$2Ko&28R#?6XQ0nO zpMgFDeFpjr{O@Jp?VrE@OZEeZd&%#A#*i)}O<%p1?W?tHYXsDNz-}<-z7nvpWZaI4 zzQta!j!dmEfAP)(h~$gxx~Vw_fAP+PKY&?M^#My>9kK&z9Rs zk35BcnTR=OLpB)ScO61E{ncln&p@AnJ_CIQ`V90L=rhn~pwB>`fj$F$2LAsu@E*Ga zgS$U@EfKqGHM(MC17-h7o&Fo(@IL82CjG}89$39SKn~A& zkZ~?zmkSO=zVu@^Q)Pr49xlNv_zxWZ6zB{ZuRIxW;Q^rZT`8dyrm=*Nap|Xi7M8^M zx8`ho0xx*(X1NMoE_rdk|2WMQ_CIG6!V49aii^A}o^3WIe88)Sa|NOU_8;V4<>sm= zP5-_W~VpfrR&9z)RXuLdw}qfigM09-jz?AojHjYq3bITB2z_mGM}dw zY+vKk*vqTq@m8sur3*YP+ZTk#G%SI5)*Z_ymB zF?*tpPrLe`uqW$ym}TwpOxaU4JSDs}{uw)8$9Il*n_Z~mJIA}j4(fPZz+2;4u#0s( zPOw(|E_=F;#|httAB@;Db$nO;2R3`QhWGIWY3<*!l2^$gf+Zo~up+cCp!U>CULyyQ zN_dA#-0|90TzlI}Ue|ZXa@g|9&O7W_$(QsUV4>$6R{oAV>{-c|$pLmzPYDiNV{1sx z$V$FK4qT*RAUHhbb_d%^zN*Ji@Ji9T-|jH6lB@a-VNt6+>oq-wScW+2IM6q~s8! zsUPqFUTGXdv%`}t$;g3cei`r(=0dx}d6wkl0B>|Ht<871z><+rK)7FugWz5N-> z>7KZ;DJRB}t`yV=n|7(2M75{K-_`kt-o$rSe!~YGw>wG_) z8vbwaC_uF3XE-zb-{3pPJ2(7a<8fzi?|<9yf5kly4xGRrNDuO42_jF7!=bAZ!o%aw z*23`rReZBPH8%V|hI2Z^ghxa#bU|qXQ6fz-JiJ64$0g|nbHo2@ct3DOkcMt5xrryJ zq^M%jgBFJWZ@^bV>pO6iJ;v`C{tsFZoDWG*DwYx__^il z{&OFm7YeNH_=Oed{);q2&Ato2YlVa_ecy*Ax9fR1jwK1N{0vq--X+#JV=L1AmzjXK z+K}1C=jF^SrSXvpK}hM0XKuxWPeD$AtpewB+w*m{trrQO;Rb-Do$$>v%EG#&<4MCT z=Rv3Ja@xAA<4MaB@STdq8S7(&uQDMy$MXip-yF}r^%CKWynyvecIg$)!`8=j`~`+z7*AO8IdVv)lpwjlQ5vUSv%|E` zhx&3Y1GB#n^Sq0kbM^%+Ply9MH?T%?e&+zoW8$T=9~0&twcbHHk<@w%?eraN9q&^; zwb~VywQ4Z^2e#TbsfO^QLoCmJgY}~;R8PMDiHsrI$09)%SgVq-;io}xCO82cR T0_+g$;roBX|6ker)%X4d$DvbF literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c311.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c311.dat new file mode 100644 index 0000000000000000000000000000000000000000..f60c260f85bd9b0a9e1ac4fbc0967fb1521015d6 GIT binary patch literal 8192 zcmeI$yA8rH5P;!x5`~no0Ud25Bq~+_(au1>-;g8#yW>(rWk*+^vw7BlSw$}3J(Y^1U z3f^S{gPTq!4~n>Rwb9nhcC{EA1Q0*~0R#|0009ILKmY**{!!p?+!|Tym-!#;$gVnX z-|F+tMB33SgS}+cML_GSddmOj8yT9bi^jb&o9G;C`MFHBFUo8&#oCjH3os&p00Iag afB*srAbVZcRFqIrAO@g9)UwmeL4+bQhZ0=*mU9p~z@+^}kAM`^)&z^QWS_ zTwrk5&5WWZzOJTS&-_q};XnWa5P$##AOHafKmY;|fB*#kk-+J^H?q~2g%5V(tnBTr zA>T}-nT`yOl2?O(R;xM{{`p3R=IW!JewnqS2RjRx%d*Va%{ER7YatMT00bZa0SG_< X0uX=z1Rwwb2>e7~Dr;YVTTNy!_+>2u literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c331.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c331.dat new file mode 100644 index 0000000000000000000000000000000000000000..85ee72b31368516c6de9fbe3516e0e3229ea2755 GIT binary patch literal 8192 zcmeI$u?@m75J1s$kdl;)Kt~BQRLp=V5hG9o5*-bqVgfc`3T8;b1Qaj@ob5PrLO`NL z-;y2s&dJHIi)AAsM!Ri^8&fyNL&(Q5oj=Rg2!CA8G_%s4i*&;#qs4XowY8Q%j~_k% zR`e|w=->5WhEWl}uQs}x`K}gYfdB#sAbHq)$ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c340.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c340.dat new file mode 100644 index 0000000000000000000000000000000000000000..d99b11a3f2dfe2333989898bca9463dfb265ef5f GIT binary patch literal 8192 zcmeI#u?@m75J1s$K*mB8Y(Rx*8GwQbEE)>L8i0goSb&C>ozfsN105s4;lv~|p`f8a z-%*^)o#l&P7ukr2(fc{FFxxQKr&zD&G`^Q3Nq>BuX=PPZ`*BfEo4fe(&GY6K%Ve+e zGe=j=o3Y5NNyEOOr`tDFNFjg#0tg_000IagfB*srAn;!Thtt-`TF(^!@3Rnf-cA|o zNuh0Z{lJ{7bZe@y6)$tWym-^CYD5SifB*srAb%c`MXo7z5=i5{uUv--&9MZ&vF5D`EC d0R#|0009ILKmY**5J2E3fuStizH|39egYK>F4O=3 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c361.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c361.dat new file mode 100644 index 0000000000000000000000000000000000000000..b5c8f259d0d1fefc112f60325bfde24724aded2e GIT binary patch literal 8192 zcmeI$u?@m75J1s$kdl;$3Fs)HqM~2|L`_Fa4M=n}luW<|Ou-be0fLqV;B3c{69N(~ z`j&FB@0?h9T~5{_V)U{jaWQo<4xt|Bbp9+xE&Xvh)yh(@T%;W~89iLrUq|Ed$Kk!} zpNih)61|(=%pf|%@2f<2X1=ZDSRjA^0tg_000IagfB*srAn=a@`@_b_O1~`pU?*;t zy?tw_*9&Q;ErXrpWh0<*Rz4N}^NsY)*=JkxqH0?YwihswSy36gj5Z}sK0!nP0R#|0 a009ILKmY**5I_Kd9|T6S@Vl>_%i{&Jf-Z#s literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c371.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c371.dat new file mode 100644 index 0000000000000000000000000000000000000000..ad11f01b25b6bd995142e4d731203e66b5792409 GIT binary patch literal 8192 zcmeI$u?@m75J1s$kdn|b0v)1)ii&~>5H%AZIwU}%qoHI1HedoureFq`0?u|EIUyj? zqHie|`!3EYuZv|XB1SJe5*Je!;}Gg`PUp{J)Y2c9Gp(%k%0)WiA*0Q8{dF|9KaU<= zzbkr|OZ4t~GsCEff36Z;&wO9Wu|NO;1Q0*~0R#|0009ILK;Rz*j;EcGjec49!A{&P zd;8Wiymj?ljvvODX&o?qKH=k{-imE+&u8S%5XZ;44-W1Q0zFj_R40w?^~Xvy7f69btO#@xqKVdPyGMdZbWs{AI=VbU zI^Kc~iHCr-q2e*0yv92LKSzr`*8;Zc9&iJtk&r?pZubDfBVMzQVMb>U{_3*NUrG$ebmha~$9Z^g zNXH{6U`2aDJKP$d<4#Ffn!RpZP8X$x&!r)7xrH^6vrwf*wNGnm8l z`S$+m_0Fqexx3RAaHgaJX)G2PKv2Mh4O4H7LEDJqCBw>BNscK^QJ66s-e$wxq#n_s zI9@Vr>M%mgzJSq+WbY1+yGSESfl)#o*ojo{mS4RE@BeLuW!dN3ePb4nd4++kcf2qjTV%=na7}HpBts!0Km>>Y5g-CY zfCvx)B0vO)01+Spt3}}M;flcpzEiZnFM`-=ul;(otx|cg&IH=^ToX-)o-?jyp%aox_e;A_JOa6!<~I<`&LWGSVO`8I4D}!FiJ_ z8f76T8R~JBae^k9Dge{*hMJG zMh!!+b4%5z1ZBynX^b47JC zmesuVkoN*k;Cxw`Q3jh5?>J~!FoJzgxmwF8b)*}Fj+aCeC&^;vNDMdf(qQUJsDWsJ zP5wYDrDT+u{5CYnAF4o08B3GD39Z7fBZYp~nvCCLHbCVkp`soTwy`u?_8}r Q%Dj>u!9@Y->EUz!3ysj5U;qFB literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3b1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3b1.dat new file mode 100644 index 0000000000000000000000000000000000000000..3a73f40cabead56cc7b0b2c4827553021846d530 GIT binary patch literal 8192 zcmeI1J5Iwu5Qb+RDRJHjXF#E{SU=);B~Czrs6e9gv!Dhfx)c!6(9%#M(bG{j0Bq|$zW z5BlU!Bbj*;sc6>Qhe6?=I<_Z$t$zSR^3R-9#ZvjY{zDj%KXC)>uR@)F1Y`0$Q8>f? zkNV8;oFCg4BY;*;`so?)41=aq3P25}@J%KlH^aKu0ZZ4idH*cWNmXd;K zoXuatqkXUN!nc7eM8xR%8j+2ujbZThFsJiJF>2|L%aK-QdgdZ+zsYEGU4I>o?RSG) z$K4e?%O<*4y_jCm#OV^ z%iiAA*XxBe(_aQ_$;%%BjkEGD|DA87Z!RtypNndu*I3(+?J+5;2b&d1?k+(@009IL bKmY**5I_I{1Q0*~fgc5iGIcwTt^MfxGuieXjZk45o7=7~Aa(&|ZxC{9>rt@dfYT=K|v1aD_WFqab$!Kw1e{GHBkAr*1 zpNih)0^OSqrWY0Q`zpPwnXM}^76>4K00IagfB*srAbheKZoe|J&@T%=*ey3p z-@Y~E>xm@QD}#+>K-rbX_gV}2!JFWS)%KmY** a5I_I{1Q0*~0R#|0;1_|R%>4F)Jhm^H*DqcG literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3f1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c3f1.dat new file mode 100644 index 0000000000000000000000000000000000000000..08acdcee31e218c5d9c3b4f62ef38fb0f42c8e72 GIT binary patch literal 8192 zcmeI0F%H5o3`LzHwH@IGY>Y55aR$W95tsqN#?p}!a05=kDL6wJ7&rkqNmHezAhDun zDX#M!*UH;s*@}qKWi4?&bv||>A8Q&vD{ILgw+qdzb>$-caL8zL-G8;t_UGws=&PcC zIbl@l$4sIo{#?Vmp827nv4H>tAOHafKmY;|fB*y_009X6BZ1>-Z)Br43lHqXMcLb3 zL%y9zGaVTelGlTP&Zw>m?|dU;bM2TM$;ub(?#18*9@Q?- literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c400.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c400.dat new file mode 100644 index 0000000000000000000000000000000000000000..a23e287bb3d2910cb6c52d61b965ee1062cb2f55 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c421.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c421.dat new file mode 100644 index 0000000000000000000000000000000000000000..c5274a22d6f36054b67ed0d6f2a16670cd657204 GIT binary patch literal 8192 zcmeI0zfQw25XR3<)dU8FcmpKbPLVE3l|K?ID`JThx+S=o7y+pZVqxS7cmbY>nGN0o z&Q4rKC4g8M(07r~zWZXI{o8E1AtEKs*vR^c^?m2`eon^koo%JR49`Tlk`@r{yPuR4 zm-t)rhSb~L^=q5&tz{GQH|Z4jiVV!RHG{hW1t|~!0T2KI5C8!X009sH0T2KI5cppN z9v;_c{L6;HW?BpOap`f8a zza_u!EMNR}k*$b0?V)9HEaKQ5EZ>dk`rfuA{Bb+i%(}@A?a)Ard)s_7*M7N5?rJ}? zx@p`^M4m-@?u|A5z9&Nn0R#|0009ILKmY**5I_Kd{}MPHcTP6?Ci}n7;;MXmrR9@E zUg-IeyS~D?{&hs>8?kdI?JewM8f{y3d$X02B)(hZA@7T5XL)>{5De)RoQ z(Yst=aMzm|MMeC&TJLJ+`&x_%0tg_000IagfB*srAbfaii?* zUqil`NHaY$I7nU{1hkH-r@}tp$k5z;w6iF)_UOTupUJY!=my?>PIC1DdIS(a009IL YKmY**5I_I{1Q7T^U?MBOx_2t3FYvf6QUCw| literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c461.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c461.dat new file mode 100644 index 0000000000000000000000000000000000000000..e6d98541fb79659dd82e6c495be7eda4795dd219 GIT binary patch literal 8192 zcmeI$u?@m75J1s$h#Z%UKu3#&M8ynr~rwMhLQ=`fQo6D0XjB-!;T{-1VoL# zB|G+=lT%)2%SJ?u_E*dNX#JQDF`veC{wP}`{Bb$e%u2fx>Bdb)i|hJpYb}2o-Fo4z z49z7(^F^7>_1V$#Gnr_gmsvf;Yg8n^hX5l22q1s} a0tg_000IagfB*sr{3tM%W!UMgJwE}e#Vuq2 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c470.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c470.dat new file mode 100644 index 0000000000000000000000000000000000000000..c9f2eb1cae75e19bcc6f3d1feb17572a3f80c36e GIT binary patch literal 8192 zcmeI#p$@_@5P;$9(u@iO9zjr8Bm%)BU=W0tKmZ92O@b%kvGx);9s!Qq%9b(&20{KV z>uz^VZ~fe4Cn8So=g4f%ZEjAn-ppxyuSSyo_&V3hrmXhjqOLX%@#UN6Ei6~bUe#xg zu9|makyn$JeXVCWv{XnTfB*srAbHJxYTKeO1q?Nf|xkx)~GJ3eKzmCS^4})9B zKNY>pCAwF=nSOML-&cw5%zRzRu|NO;1Q0*~0R#|0009ILK;Rz*cKel)g??H1!A{&P zd;8WUUorr~3;OQZJwY literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c490.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c490.dat new file mode 100644 index 0000000000000000000000000000000000000000..63e4bc6727d114b360f1bfd3021e394a5ec27ea2 GIT binary patch literal 8192 zcmeI0zfQw25XLX1YJ&s^l4R>l5fT7*klQYfRnHnyT01`j~ zNB{{S0VIF~kN^@u0!RP}{6zwHk0S#j)meJK&%=^hEr07Z)#rqKLG3IXZe=Y1lsqeF}>UD$a zz9sAnP6v+Vc0J4XJ=lP?ka_`UCqd9+V#w6i%*`E?N zC133K{1boO9j%CnrQ4=l%w3E_@MBHJkE%7~kJGU@3+bAu8y2x#F7vOgm2%e|bMtz1 zmJ|AS`S38hB(dM!sW%A+5(t0*2!H?xfB*=900@8p2!H?x{1$=T-Y_lYO(DO}$fnxu zw^s(gY2<~J47Q}}LO^m$s;dMnKgk8@ wm!hl^4)?neK>!3m00ck)1V8`;KmY_l00cnb9|@ePC(k~*IHH+HV9NRF2_cLyLI3~& literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4b0.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4b0.dat new file mode 100644 index 0000000000000000000000000000000000000000..a8fed1f80bff0c12ff7b354d56ac63df63cad76c GIT binary patch literal 65536 zcmeIuF-ikL6adgaA;c6GLM#RCYy~SJV2%)sUcfUL>pg;(u(z=>mk@Fw{j;0J5MyCw z;hSOp%>2K@?7Vo4h?1kWK^sSH+zx$xJD2N^P1{NTxSeO^p{q7^I?i#Jmyhe_x9xRy z`PQ9j`lH=%mYb(cl#7U?zOZL*?;JOKDpCXp5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAn@M=PR~xBW0|imo0kvT)xkH1zP?i!j`I7fvi?dBUvfQ(+qlcV$hod+ z%wATRS(H`nG0(0MAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&zZ96p Lb$9*w^8Nl3kklJ` literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4c1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4c1.dat new file mode 100644 index 0000000000000000000000000000000000000000..6e1de5e605c6e845f8afd1abd5b1acfc95af1cf5 GIT binary patch literal 8192 zcmeI$u?@m75J1s$gpw2#j6g>T6%|8JP$49GYCxi+p+pS822_jyOE3dW0cSgooDh&` z(YKU~edol=>vFOd5u=wKiHoU=aR~J|r}JkqYUz*5u~wFP`y_{yG|uKMfyU z|5WrYm+0N~W(LtAeqSZJGxKdF#{vNa5I_I{1Q0*~0R#|00D*rL*dI4WR{CY(2Rm`I z?Co1aym$B+b3P$8l3 zD3|k{6DO~WtVG1=8HTr*TdarFuh%rcSEE(_IGt%{5xf0x8R*&5&5Kz3E?zg~Dc)hv z3TgG4lUvA3k!K^WYed_#*fwfR5I_I{1Q0*~0R#|0009IL_(y@=VeMq8UzYywy=9%Z zZ%zGHBg=LD&|O~T?5w$$xgHDz5I_I{1Q0*~0R#|0009IL_@%&9MsfT7aol|Xt(O!A literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4e1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c4e1.dat new file mode 100644 index 0000000000000000000000000000000000000000..02b55f6d64335c27e6f260b80aac667481f15c3d GIT binary patch literal 8192 zcmeI$D-Oay5P;#?hP0I^bR7~DibG&9903g^I1CbntyPJqq_! z^e&s|-}PpO(IIYME!s2lO)bX)0R#|0009ILKmY**5I_Kde-zjq)<%~4W#I=qv9s*$ zTSL8BNHc92Y$dN60j;y@sqmj~WMD2X+qwB_*?K5@0aKaz%GqYLDRFWMA_52?fB*sr YAbRREYtEsOVCJQ~@1ea}!fioH}xxLYca-cVj|K zZ2TGq{s$Xdxy=WvNl_y_3Np|xJtrm@@-VleINJc<9RL)vNis_80SaBehBkFVzDqE zZieM{{xTaB_4>xzW?uC>{W{;PpLM!^MmECY9T^+Eck=%s^xl}5K@AvFGRyv1;B<7B+YS!=B6}_)}T%Z2WB%XYnkCQm#e5mBrx2xj-F9{3*LJ}v$2_Znbe(VrJFs#@_ z!eRppK!zDXYj7@M$vzFCLmf9vDFs*ip9DxUc+{yPA(eUiY=@%_ppzunpK zji>%z*EibYinD*im%gk|_Ue}-$bGKs_()V&(J9a=&?(R<&?(R<&?(R<&?(R<&?(R< z&?)fIQ{cT{{OMQlJskJGzyCRqT_&4;_}D*xxE3}nwC+8)2+plcz->!9?7-*?cv@W3 zwdeIK_1wdeybN#an$!47J@-CD*thCEP_Oi12hOCDj;QdYETmTz^SKw6MT&3b68|!P zAtm&o@7xOQV>8{+DbOj!K6xo-S6jEwjWjE(p%OpN#g zm@>c4p-4$N6yNjXYVIwwIla|6l(^2JOkrlkpTVXPe-pNj@I$W*g1}4XVRbMbozvNZ zJ52bPr@GUKZ^Ow3-)DVRY|VHkaN3AJg@;V|JsTcw^67?Ob-j8HJYvLm z;fxV~0FN5+hp^M&<5PUi_(yQoh(CtMn*4S5Pj3Q`8}X;`gb{xx)GHhiR#lYCf);=z z^}=E?_ljy6;rwy=T7+ei@d9QKg?iN}U?kLe4#3qBm&h_%*TYz-*Ng%tLcMM>BnRj4 zWe$k^I89|3*F%c)Eb@{pr4JEKIxUj4ENInsrb4}86o9f`r~`s%naXHw4|fRlrcuD1 zLcPTS0baRW#4@O z@eab+AHvCJ1~%-7*TP+v0&I1TFSbwDVCNJeXWcm&ipi~`PpdY1#Ds4P>N=qr8v z9L|DT8U;KCDl-XihoEw!fDx#|C}4cdF1oAk6zCKeuwc%Li?YL-(*Y(#Z~U{5@W@f5W45- ztb3Z!xxq|}>fsvWWyU>1`;T-yHJ)@4}0C=H>cq1GgLHW^v#D z>$=`;G65_7zrlC-{G@HmceVeo`7v&uR_>?!1MUCY@`u|0Yd-EGR<}RW{=Y4Mto?sm z{zUu#vQldw)~m)|5+MgM#e`!zcOF8G1dOREq|u{e_Q^h_Wv#UCoJv%F;^Di{l>r9 znR~emP@hziU8HHNn|J(9i?f={I2ipI)0Pc@-XIFpslf&iUD?_Wy19GwuId@-0jI|F(Qv`~NESOUfhT1k2D%5+!@%k;`gra%59PM*J-i zGrvkpAD2j6P*&>cSRygv+hWfAY*|TcpVr@1=_AJxsS)253#0K2#4|?ikHk46{#ZO~ z#Gi;yGC%h*i6KLL%91|EXK6OYr;PYp;?p%hC^F15t!@9LP|7G^Td3zaU>Rlj4N;;$ zk;l*A9-*E$3bU&wimeoHw1HJ5+D_!6PTPSs+kYHdaF2t8+p!4U%Zz)38(fdyDPp;qL9lO9 zjeV7Hbc)6^{0HM77=Oh0CSjl3>F;t2+k|a$4bBd?&%M_f0p~i^I9CY8CB}-e=2%od PnhQAa|4;nnXWRb)4H#28 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c60.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c60.dat new file mode 100644 index 0000000000000000000000000000000000000000..4896921f0d436a6046de020e244b450e21bb8737 GIT binary patch literal 12288 zcmeI1Nsk*v6vv-uUp!mFIw6oD$%IRzs$Q!j4tP8r$BgZE+HJy|Lazcs*c9M|IB-E+ z;42`6gv0^900%w*5)u+8?r`CjBT{%(Z6`g8TSE<8P_^af?$_1*^ZVDUSFSdE001?7 z^KDkxIbq9Ye7@|%{rjWskbB}`AJ5z^&aRIe)e*ihKA7-%;W+<~-`@VR@IScM=xbj2 z1N~D3;0*sf?ppK-=E92;&MLQ3Kq;UUPzopolmbctrGQdEDWDWk3Md8sKML5jVH@7Z zc*g7d=U@wut{jPQ{)k67X6Eq9^R-_}XJ5trS?IwK-~0vhv#<@97~vZw8X+ms^3-uO zBTE?`k_cZhbqT@c`ubph(DZw)j^FiyM(7P-8ft@wHy~-{4X|+l3uPcDOa?B)A_Bw4 zPDhHgSSDqaq&h5#&^p6zPbR3P5=z%kfEqNfd)xiTD1)n) zaE4onTZDPU?Ron$oRu=?B%QVE^}XJ%3~E)N5<(43dy%n@mZmZ8v4oR(%A1s$nDRwl zG&=3ZKq>{-N>Q2BgJTI6P`#Ji-c6a9)=MDEuI#2_RAK%#_hd*LWl~&8D)R4|A9(Fn zPckpglyF4UC#q2^ceE&W_~EENS=d=?u!0I=y$HRoCztJKkI)P)({V&I$KYeFR1J&% zy4IGfO^*oB!5mD8ZfPbXe3XrHP{*)VU>U;-gLbRs1u{MMs9@!cW}_0H8JcZVU9%#W zr;3{ykr7*Xwj^PD5Vo5#w8sudmNU)beHCYs!6U36RSu!P1Mjr#jUVE7P^iam`VenMUSN2CGo#quIML^m> zvjT;q7Kd(z)wKe37B(8qra$b3{lMoFi5&5wASMQjkXRiYrumJbA4-BQ2@tdFG$DC) zXjs{CzHfOwxsWakQqD4pl>!sHLPYGZk%)4rZGnoToFIxiNO07f69hYcRF@ zpDM6&3tk7P--Fv|KZ7^WZgJ1@ckmwCUG87{4PHZgSJ*nYi(m0Ji&wc__zCWyP5J)( zJ$MK0r|>4)O?V4n?t6aExgEYg`z!a)-r+50?sLz~7w|UPZQf@32kxH^IC1KCVL#@q zsde6__BHp^u5t@M^Y(BH-bMQYTr33o==sn8Ifb4RP^{xJ-NsqU ztPbu}g%65VoNW*tLDiw1uJA#zj7v;CWyHeuVugsOEPPO`<4iNl7_l)IDp0EM9U55b zP${4kPzopolmbctrGQdEDWDWk3Y<`ZsaN=Of!d#9{r?GH`PVkN2fpD?C~*Cc&lLFf I;l}0sZxC;E$p8QV literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c71.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c71.dat new file mode 100644 index 0000000000000000000000000000000000000000..9df02c154c2037e75cfc6f79d2b8955e494eb8af GIT binary patch literal 8192 zcmeHLId2m|6#mu|Y$x%V5E71XAEL0d#)R17+^i?g5_{L|5fmyCOlWA30Eq@sKuH6l z0f`O?@e`={4G2*{Lk9&t1qHkrJdqUw(v+YXYv0bk+3y|S%o}SKw*gpmiI$QwE#;t4 zOVeqY2+qdS)im|vdB3-|F!MgZ1nz;Wg6;HA&( zy-h}p$}nIUFbo(53GHFkl!k3>XFs1OFET51-w!aEo$M=lgkxqxO;CvQ*<6 z2hth(Wbgpl^$!7?_SRAAoNu9Oz3*#p^zV%BDGDTkk4t^sWvK($C+cJv#!!luBRB9{ z?V!U$C*~0j<6zyEtyi(_o?Th%&CXV8S9^7Ov{&f2T5Z@i7_1Dk45Jt(8?iIj)&plT z%#g!~44|EKd@a|*7*XiRUEm!@3q68SMqf+{zmkvQ(DD3O%fcvf48zEfg+;!s1Y@GlK2dq2?|OH0N#yb}|%@6AOo5NVxCn)yz)pQogn0 z-i2v}O(M-jGmYJHi@DhDcAYR5Gj7k)_G_=&6}x((Ua9pOvz6Z3%5gd4)kf{=iPfsy zn0I53g2qm?r~}=Dy$ae5gRTyAFZRi;X(4DgJ-@}z&uO4jIqYW`N7-@RAn{{zE~-@1 zNFE0y-xrb~*2NZZP}Uf2OfBwfIxgan%)KAICc1>fGVCC1@=z07roVF23GH zF!1j&kbZ!ZK>Cf8=Y>o?$0^bjgk8WXnQsd4zLx+`fi0)E|dS za!H`JycN>=EUd9f%#nO5G($_mPHMk+-+CeRc!?(Uj|$DuJK-z!LB4ZYXfk&NDmx=& a=C#nLze{}soHXA=pT@3}q&EF3IsOwuqSA!` literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c720.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c720.dat new file mode 100644 index 0000000000000000000000000000000000000000..c3794777d9fb79e0b198377eb57e074a49c26a4c GIT binary patch literal 200704 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
  • TSIA:" + getTSIA() + "
  • " + "
  • openTSIA:" + getOpenTSIA() + "
  • " + + "
  • volume:" + getVolume() + "
  • "; + if ((getTopGainers() == null) || (getTopLosers() == null)) { + return ret; + } + ret += "
    Current Top Gainers:"; + Iterator it = getTopGainers().iterator(); + + while (it.hasNext()) { + QuoteDataBean quoteData = it.next(); + ret += ("
  • " + quoteData.toString() + "
  • "); + } + ret += "
    Current Top Losers:"; + it = getTopLosers().iterator(); + while (it.hasNext()) { + QuoteDataBean quoteData = it.next(); + ret += ("
  • " + quoteData.toString() + "
  • "); + } + return ret; + } + + public JsonObject toJSON() { + + JsonObjectBuilder jObjectBuilder = Json.createObjectBuilder(); + + int i = 1; + for (Iterator iterator = topGainers.iterator(); iterator.hasNext();) { + QuoteDataBean quote = iterator.next(); + + jObjectBuilder.add("gainer" + i + "_stock",quote.getSymbol()); + jObjectBuilder.add("gainer" + i + "_price","$" + quote.getPrice()); + jObjectBuilder.add("gainer" + i + "_change",quote.getChange()); + i++; + } + + i = 1; + for (Iterator iterator = topLosers.iterator(); iterator.hasNext();) { + QuoteDataBean quote = iterator.next(); + + jObjectBuilder.add("loser" + i + "_stock",quote.getSymbol()); + jObjectBuilder.add("loser" + i + "_price","$" + quote.getPrice()); + jObjectBuilder.add("loser" + i + "_change",quote.getChange()); + i++; + } + + jObjectBuilder.add("tsia", TSIA); + jObjectBuilder.add("volume",volume); + jObjectBuilder.add("date", summaryDate.toString()); + + return jObjectBuilder.build(); + + } + + public void print() { + Log.log(this.toString()); + } + + public BigDecimal getGainPercent() { + if (gainPercent == null) { + gainPercent = FinancialUtils.computeGainPercent(getTSIA(), getOpenTSIA()); + } + return gainPercent; + } + + /** + * Gets the tSIA + * + * @return Returns a BigDecimal + */ + public BigDecimal getTSIA() { + return TSIA; + } + + /** + * Sets the tSIA + * + * @param tSIA + * The tSIA to set + */ + public void setTSIA(BigDecimal tSIA) { + TSIA = tSIA; + } + + /** + * Gets the openTSIA + * + * @return Returns a BigDecimal + */ + public BigDecimal getOpenTSIA() { + return openTSIA; + } + + /** + * Sets the openTSIA + * + * @param openTSIA + * The openTSIA to set + */ + public void setOpenTSIA(BigDecimal openTSIA) { + this.openTSIA = openTSIA; + } + + /** + * Gets the volume + * + * @return Returns a BigDecimal + */ + public double getVolume() { + return volume; + } + + /** + * Sets the volume + * + * @param volume + * The volume to set + */ + public void setVolume(double volume) { + this.volume = volume; + } + + /** + * Gets the topGainers + * + * @return Returns a Collection + */ + public Collection getTopGainers() { + return topGainers; + } + + /** + * Sets the topGainers + * + * @param topGainers + * The topGainers to set + */ + public void setTopGainers(Collection topGainers) { + this.topGainers = topGainers; + } + + /** + * Gets the topLosers + * + * @return Returns a Collection + */ + public Collection getTopLosers() { + return topLosers; + } + + /** + * Sets the topLosers + * + * @param topLosers + * The topLosers to set + */ + public void setTopLosers(Collection topLosers) { + this.topLosers = topLosers; + } + + /** + * Gets the summaryDate + * + * @return Returns a Date + */ + public Date getSummaryDate() { + return summaryDate; + } + + /** + * Sets the summaryDate + * + * @param summaryDate + * The summaryDate to set + */ + public void setSummaryDate(Date summaryDate) { + this.summaryDate = summaryDate; + } + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/RunStatsDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/RunStatsDataBean.java new file mode 100644 index 00000000..1016b6cf --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/RunStatsDataBean.java @@ -0,0 +1,294 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.beans; + +import java.io.Serializable; + +public class RunStatsDataBean implements Serializable { + private static final long serialVersionUID = 4017778674103242167L; + + // Constructors + public RunStatsDataBean() { + } + + // count of trade users in the database (users w/ userID like 'uid:%') + private int tradeUserCount; + // count of trade stocks in the database (stocks w/ symbol like 's:%') + private int tradeStockCount; + + // count of new registered users in this run (users w/ userID like 'ru:%') + // -- random user + private int newUserCount; + + // sum of logins by trade users + private int sumLoginCount; + // sum of logouts by trade users + private int sumLogoutCount; + + // count of holdings of trade users + private int holdingCount; + + // count of orders of trade users + private int orderCount; + // count of buy orders of trade users + private int buyOrderCount; + // count of sell orders of trade users + private int sellOrderCount; + // count of cancelled orders of trade users + private int cancelledOrderCount; + // count of open orders of trade users + private int openOrderCount; + // count of orders deleted during this trade Reset + private int deletedOrderCount; + + @Override + public String toString() { + return "\n\tRunStatsData for reset at " + new java.util.Date() + "\n\t\t tradeUserCount: " + getTradeUserCount() + "\n\t\t newUserCount: " + + getNewUserCount() + "\n\t\t sumLoginCount: " + getSumLoginCount() + "\n\t\t sumLogoutCount: " + getSumLogoutCount() + + "\n\t\t holdingCount: " + getHoldingCount() + "\n\t\t orderCount: " + getOrderCount() + "\n\t\t buyOrderCount: " + + getBuyOrderCount() + "\n\t\t sellOrderCount: " + getSellOrderCount() + "\n\t\t cancelledOrderCount: " + getCancelledOrderCount() + + "\n\t\t openOrderCount: " + getOpenOrderCount() + "\n\t\t deletedOrderCount: " + getDeletedOrderCount(); + } + + /** + * Gets the tradeUserCount + * + * @return Returns a int + */ + public int getTradeUserCount() { + return tradeUserCount; + } + + /** + * Sets the tradeUserCount + * + * @param tradeUserCount + * The tradeUserCount to set + */ + public void setTradeUserCount(int tradeUserCount) { + this.tradeUserCount = tradeUserCount; + } + + /** + * Gets the newUserCount + * + * @return Returns a int + */ + public int getNewUserCount() { + return newUserCount; + } + + /** + * Sets the newUserCount + * + * @param newUserCount + * The newUserCount to set + */ + public void setNewUserCount(int newUserCount) { + this.newUserCount = newUserCount; + } + + /** + * Gets the sumLoginCount + * + * @return Returns a int + */ + public int getSumLoginCount() { + return sumLoginCount; + } + + /** + * Sets the sumLoginCount + * + * @param sumLoginCount + * The sumLoginCount to set + */ + public void setSumLoginCount(int sumLoginCount) { + this.sumLoginCount = sumLoginCount; + } + + /** + * Gets the sumLogoutCount + * + * @return Returns a int + */ + public int getSumLogoutCount() { + return sumLogoutCount; + } + + /** + * Sets the sumLogoutCount + * + * @param sumLogoutCount + * The sumLogoutCount to set + */ + public void setSumLogoutCount(int sumLogoutCount) { + this.sumLogoutCount = sumLogoutCount; + } + + /** + * Gets the holdingCount + * + * @return Returns a int + */ + public int getHoldingCount() { + return holdingCount; + } + + /** + * Sets the holdingCount + * + * @param holdingCount + * The holdingCount to set + */ + public void setHoldingCount(int holdingCount) { + this.holdingCount = holdingCount; + } + + /** + * Gets the buyOrderCount + * + * @return Returns a int + */ + public int getBuyOrderCount() { + return buyOrderCount; + } + + /** + * Sets the buyOrderCount + * + * @param buyOrderCount + * The buyOrderCount to set + */ + public void setBuyOrderCount(int buyOrderCount) { + this.buyOrderCount = buyOrderCount; + } + + /** + * Gets the sellOrderCount + * + * @return Returns a int + */ + public int getSellOrderCount() { + return sellOrderCount; + } + + /** + * Sets the sellOrderCount + * + * @param sellOrderCount + * The sellOrderCount to set + */ + public void setSellOrderCount(int sellOrderCount) { + this.sellOrderCount = sellOrderCount; + } + + /** + * Gets the cancelledOrderCount + * + * @return Returns a int + */ + public int getCancelledOrderCount() { + return cancelledOrderCount; + } + + /** + * Sets the cancelledOrderCount + * + * @param cancelledOrderCount + * The cancelledOrderCount to set + */ + public void setCancelledOrderCount(int cancelledOrderCount) { + this.cancelledOrderCount = cancelledOrderCount; + } + + /** + * Gets the openOrderCount + * + * @return Returns a int + */ + public int getOpenOrderCount() { + return openOrderCount; + } + + /** + * Sets the openOrderCount + * + * @param openOrderCount + * The openOrderCount to set + */ + public void setOpenOrderCount(int openOrderCount) { + this.openOrderCount = openOrderCount; + } + + /** + * Gets the deletedOrderCount + * + * @return Returns a int + */ + public int getDeletedOrderCount() { + return deletedOrderCount; + } + + /** + * Sets the deletedOrderCount + * + * @param deletedOrderCount + * The deletedOrderCount to set + */ + public void setDeletedOrderCount(int deletedOrderCount) { + this.deletedOrderCount = deletedOrderCount; + } + + /** + * Gets the orderCount + * + * @return Returns a int + */ + public int getOrderCount() { + return orderCount; + } + + /** + * Sets the orderCount + * + * @param orderCount + * The orderCount to set + */ + public void setOrderCount(int orderCount) { + this.orderCount = orderCount; + } + + /** + * Gets the tradeStockCount + * + * @return Returns a int + */ + public int getTradeStockCount() { + return tradeStockCount; + } + + /** + * Sets the tradeStockCount + * + * @param tradeStockCount + * The tradeStockCount to set + */ + public void setTradeStockCount(int tradeStockCount) { + this.tradeStockCount = tradeStockCount; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountDataBean.java new file mode 100644 index 00000000..7248dfe9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountDataBean.java @@ -0,0 +1,286 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.entities; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.Collection; +import java.util.Date; + +import javax.ejb.EJBException; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.TableGenerator; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PastOrPresent; +import javax.validation.constraints.PositiveOrZero; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Entity(name = "accountejb") +@Table(name = "accountejb") +public class AccountDataBean implements Serializable { + + private static final long serialVersionUID = 8437841265136840545L; + + /* Accessor methods for persistent fields */ + @TableGenerator(name = "accountIdGen", table = "KEYGENEJB", pkColumnName = "KEYNAME", valueColumnName = "KEYVAL", pkColumnValue = "account", allocationSize = 1000) + @Id + @GeneratedValue(strategy = GenerationType.TABLE, generator = "accountIdGen") + @Column(name = "ACCOUNTID", nullable = false) + private Integer accountID; /* accountID */ + + @NotNull + @PositiveOrZero + @Column(name = "LOGINCOUNT", nullable = false) + private int loginCount; /* loginCount */ + + @NotNull + @PositiveOrZero + @Column(name = "LOGOUTCOUNT", nullable = false) + private int logoutCount; /* logoutCount */ + + @Column(name = "LASTLOGIN") + @Temporal(TemporalType.TIMESTAMP) + @PastOrPresent + private Date lastLogin; /* lastLogin Date */ + + @Column(name = "CREATIONDATE") + @Temporal(TemporalType.TIMESTAMP) + @PastOrPresent + private Date creationDate; /* creationDate */ + + @Column(name = "BALANCE") + private BigDecimal balance; /* balance */ + + @Column(name = "OPENBALANCE") + private BigDecimal openBalance; /* open balance */ + + @OneToMany(mappedBy = "account", fetch = FetchType.LAZY) + private Collection orders; + + @OneToMany(mappedBy = "account", fetch = FetchType.LAZY) + private Collection holdings; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "PROFILE_USERID") + private AccountProfileDataBean profile; + + /* + * Accessor methods for relationship fields are only included for the + * AccountProfile profileID + */ + @Transient + private String profileID; + + public AccountDataBean() { + } + + public AccountDataBean(Integer accountID, int loginCount, int logoutCount, Date lastLogin, Date creationDate, BigDecimal balance, BigDecimal openBalance, + String profileID) { + setAccountID(accountID); + setLoginCount(loginCount); + setLogoutCount(logoutCount); + setLastLogin(lastLogin); + setCreationDate(creationDate); + setBalance(balance); + setOpenBalance(openBalance); + setProfileID(profileID); + } + + public AccountDataBean(int loginCount, int logoutCount, Date lastLogin, Date creationDate, BigDecimal balance, BigDecimal openBalance, String profileID) { + setLoginCount(loginCount); + setLogoutCount(logoutCount); + setLastLogin(lastLogin); + setCreationDate(creationDate); + setBalance(balance); + setOpenBalance(openBalance); + setProfileID(profileID); + } + + public static AccountDataBean getRandomInstance() { + return new AccountDataBean(new Integer(TradeConfig.rndInt(100000)), // accountID + TradeConfig.rndInt(10000), // loginCount + TradeConfig.rndInt(10000), // logoutCount + new java.util.Date(), // lastLogin + new java.util.Date(TradeConfig.rndInt(Integer.MAX_VALUE)), // creationDate + TradeConfig.rndBigDecimal(1000000.0f), // balance + TradeConfig.rndBigDecimal(1000000.0f), // openBalance + TradeConfig.rndUserID() // profileID + ); + } + + @Override + public String toString() { + return "\n\tAccount Data for account: " + getAccountID() + "\n\t\t loginCount:" + getLoginCount() + "\n\t\t logoutCount:" + getLogoutCount() + + "\n\t\t lastLogin:" + getLastLogin() + "\n\t\t creationDate:" + getCreationDate() + "\n\t\t balance:" + getBalance() + + "\n\t\t openBalance:" + getOpenBalance() + "\n\t\t profileID:" + getProfileID(); + } + + public String toHTML() { + return "
    Account Data for account: " + getAccountID() + "" + "
  • loginCount:" + getLoginCount() + "
  • " + "
  • logoutCount:" + + getLogoutCount() + "
  • " + "
  • lastLogin:" + getLastLogin() + "
  • " + "
  • creationDate:" + getCreationDate() + "
  • " + + "
  • balance:" + getBalance() + "
  • " + "
  • openBalance:" + getOpenBalance() + "
  • " + "
  • profileID:" + getProfileID() + + "
  • "; + } + + public void print() { + Log.log(this.toString()); + } + + public Integer getAccountID() { + return accountID; + } + + public void setAccountID(Integer accountID) { + this.accountID = accountID; + } + + public int getLoginCount() { + return loginCount; + } + + public void setLoginCount(int loginCount) { + this.loginCount = loginCount; + } + + public int getLogoutCount() { + return logoutCount; + } + + public void setLogoutCount(int logoutCount) { + this.logoutCount = logoutCount; + } + + public Date getLastLogin() { + return lastLogin; + } + + public void setLastLogin(Date lastLogin) { + this.lastLogin = lastLogin; + } + + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getOpenBalance() { + return openBalance; + } + + public void setOpenBalance(BigDecimal openBalance) { + this.openBalance = openBalance; + } + + public String getProfileID() { + return profileID; + } + + public void setProfileID(String profileID) { + this.profileID = profileID; + } + + /* + * Disabled for D185273 public String getUserID() { return getProfileID(); } + */ + + public Collection getOrders() { + return orders; + } + + public void setOrders(Collection orders) { + this.orders = orders; + } + + public Collection getHoldings() { + return holdings; + } + + public void setHoldings(Collection holdings) { + this.holdings = holdings; + } + + public AccountProfileDataBean getProfile() { + return profile; + } + + public void setProfile(AccountProfileDataBean profile) { + this.profile = profile; + } + + public void login(String password) { + AccountProfileDataBean profile = getProfile(); + if ((profile == null) || (profile.getPassword().equals(password) == false)) { + String error = "AccountBean:Login failure for account: " + getAccountID() + + ((profile == null) ? "null AccountProfile" : "\n\tIncorrect password-->" + profile.getUserID() + ":" + profile.getPassword()); + throw new EJBException(error); + } + + setLastLogin(new Timestamp(System.currentTimeMillis())); + setLoginCount(getLoginCount() + 1); + } + + public void logout() { + setLogoutCount(getLogoutCount() + 1); + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.accountID != null ? this.accountID.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof AccountDataBean)) { + return false; + } + AccountDataBean other = (AccountDataBean) object; + + if (this.accountID != other.accountID && (this.accountID == null || !this.accountID.equals(other.accountID))) { + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountProfileDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountProfileDataBean.java new file mode 100644 index 00000000..24e8ad81 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/AccountProfileDataBean.java @@ -0,0 +1,184 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.entities; + +//import java.sql.Timestamp; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Entity(name = "accountprofileejb") +@Table(name = "accountprofileejb") +public class AccountProfileDataBean implements java.io.Serializable { + + /* Accessor methods for persistent fields */ + + private static final long serialVersionUID = 2794584136675420624L; + + @Id + @NotNull + @Column(name = "USERID", nullable = false) + private String userID; /* userID */ + + @Column(name = "PASSWD") + @NotBlank + private String passwd; /* password */ + + @Column(name = "FULLNAME") + @NotBlank + private String fullName; /* fullName */ + + @Column(name = "ADDRESS") + @NotBlank + private String address; /* address */ + + @Column(name = "EMAIL") + @Email(message = "Email should be valid") + private String email; /* email */ + + @Column(name = "CREDITCARD") + @NotBlank + private String creditCard; /* creditCard */ + + @OneToOne(mappedBy = "profile", fetch = FetchType.LAZY) + private AccountDataBean account; + + public AccountProfileDataBean() { + } + + public AccountProfileDataBean(String userID, String password, String fullName, String address, String email, String creditCard) { + setUserID(userID); + setPassword(password); + setFullName(fullName); + setAddress(address); + setEmail(email); + setCreditCard(creditCard); + } + + public static AccountProfileDataBean getRandomInstance() { + return new AccountProfileDataBean(TradeConfig.rndUserID(), // userID + TradeConfig.rndUserID(), // passwd + TradeConfig.rndFullName(), // fullname + TradeConfig.rndAddress(), // address + TradeConfig.rndEmail(TradeConfig.rndUserID()), // email + TradeConfig.rndCreditCard() // creditCard + ); + } + + @Override + public String toString() { + return "\n\tAccount Profile Data for userID:" + getUserID() + "\n\t\t passwd:" + getPassword() + "\n\t\t fullName:" + getFullName() + + "\n\t\t address:" + getAddress() + "\n\t\t email:" + getEmail() + "\n\t\t creditCard:" + getCreditCard(); + } + + public String toHTML() { + return "
    Account Profile Data for userID: " + getUserID() + "" + "
  • passwd:" + getPassword() + "
  • " + "
  • fullName:" + + getFullName() + "
  • " + "
  • address:" + getAddress() + "
  • " + "
  • email:" + getEmail() + "
  • " + "
  • creditCard:" + + getCreditCard() + "
  • "; + } + + public void print() { + Log.log(this.toString()); + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getPassword() { + return passwd; + } + + public void setPassword(String password) { + this.passwd = password; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + public AccountDataBean getAccount() { + return account; + } + + public void setAccount(AccountDataBean account) { + this.account = account; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.userID != null ? this.userID.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof AccountProfileDataBean)) { + return false; + } + AccountProfileDataBean other = (AccountProfileDataBean) object; + + if (this.userID != other.userID && (this.userID == null || !this.userID.equals(other.userID))) { + return false; + } + + return true; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/HoldingDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/HoldingDataBean.java new file mode 100644 index 00000000..2974ddc2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/HoldingDataBean.java @@ -0,0 +1,204 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.entities; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.TableGenerator; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PastOrPresent; +import javax.validation.constraints.Positive; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Entity(name = "holdingejb") +@Table(name = "holdingejb") +public class HoldingDataBean implements Serializable { + + /* persistent/relationship fields */ + + private static final long serialVersionUID = -2338411656251935480L; + + @Id + @TableGenerator(name = "holdingIdGen", table = "KEYGENEJB", pkColumnName = "KEYNAME", valueColumnName = "KEYVAL", pkColumnValue = "holding", allocationSize = 1000) + @GeneratedValue(strategy = GenerationType.TABLE, generator = "holdingIdGen") + @Column(name = "HOLDINGID", nullable = false) + private Integer holdingID; /* holdingID */ + + @NotNull + @Positive + @Column(name = "QUANTITY", nullable = false) + private double quantity; /* quantity */ + + @Column(name = "PURCHASEPRICE") + @Positive + private BigDecimal purchasePrice; /* purchasePrice */ + + @Column(name = "PURCHASEDATE") + @Temporal(TemporalType.TIMESTAMP) + @PastOrPresent + private Date purchaseDate; /* purchaseDate */ + + @Transient + private String quoteID; /* Holding(*) ---> Quote(1) */ + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ACCOUNT_ACCOUNTID") + private AccountDataBean account; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "QUOTE_SYMBOL") + private QuoteDataBean quote; + + public HoldingDataBean() { + } + + public HoldingDataBean(Integer holdingID, double quantity, BigDecimal purchasePrice, Date purchaseDate, String quoteID) { + setHoldingID(holdingID); + setQuantity(quantity); + setPurchasePrice(purchasePrice); + setPurchaseDate(purchaseDate); + setQuoteID(quoteID); + } + + public HoldingDataBean(double quantity, BigDecimal purchasePrice, Date purchaseDate, AccountDataBean account, QuoteDataBean quote) { + setQuantity(quantity); + setPurchasePrice(purchasePrice); + setPurchaseDate(purchaseDate); + setAccount(account); + setQuote(quote); + } + + public static HoldingDataBean getRandomInstance() { + return new HoldingDataBean(new Integer(TradeConfig.rndInt(100000)), // holdingID + TradeConfig.rndQuantity(), // quantity + TradeConfig.rndBigDecimal(1000.0f), // purchasePrice + new java.util.Date(TradeConfig.rndInt(Integer.MAX_VALUE)), // purchaseDate + TradeConfig.rndSymbol() // symbol + ); + } + + @Override + public String toString() { + return "\n\tHolding Data for holding: " + getHoldingID() + "\n\t\t quantity:" + getQuantity() + "\n\t\t purchasePrice:" + getPurchasePrice() + + "\n\t\t purchaseDate:" + getPurchaseDate() + "\n\t\t quoteID:" + getQuoteID(); + } + + public String toHTML() { + return "
    Holding Data for holding: " + getHoldingID() + "
    " + "
  • quantity:" + getQuantity() + "
  • " + "
  • purchasePrice:" + + getPurchasePrice() + "
  • " + "
  • purchaseDate:" + getPurchaseDate() + "
  • " + "
  • quoteID:" + getQuoteID() + "
  • "; + } + + public void print() { + Log.log(this.toString()); + } + + public Integer getHoldingID() { + return holdingID; + } + + public void setHoldingID(Integer holdingID) { + this.holdingID = holdingID; + } + + public double getQuantity() { + return quantity; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + public BigDecimal getPurchasePrice() { + return purchasePrice; + } + + public void setPurchasePrice(BigDecimal purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public Date getPurchaseDate() { + return purchaseDate; + } + + public void setPurchaseDate(Date purchaseDate) { + this.purchaseDate = purchaseDate; + } + + public String getQuoteID() { + if (quote != null) { + return quote.getSymbol(); + } + return quoteID; + } + + public void setQuoteID(String quoteID) { + this.quoteID = quoteID; + } + + public AccountDataBean getAccount() { + return account; + } + + public void setAccount(AccountDataBean account) { + this.account = account; + } + + public QuoteDataBean getQuote() { + return quote; + } + + public void setQuote(QuoteDataBean quote) { + this.quote = quote; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.holdingID != null ? this.holdingID.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof HoldingDataBean)) { + return false; + } + HoldingDataBean other = (HoldingDataBean) object; + + if (this.holdingID != other.holdingID && (this.holdingID == null || !this.holdingID.equals(other.holdingID))) { + return false; + } + + return true; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/OrderDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/OrderDataBean.java new file mode 100644 index 00000000..b62b4993 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/OrderDataBean.java @@ -0,0 +1,339 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.entities; + +import java.io.Serializable; +import java.math.BigDecimal; +//import java.sql.Timestamp; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.TableGenerator; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PastOrPresent; +import javax.validation.constraints.Positive; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Entity(name = "orderejb") +@Table(name = "orderejb") +@NamedQueries({ + @NamedQuery(name = "orderejb.findByOrderfee", query = "SELECT o FROM orderejb o WHERE o.orderFee = :orderfee"), + @NamedQuery(name = "orderejb.findByCompletiondate", query = "SELECT o FROM orderejb o WHERE o.completionDate = :completiondate"), + @NamedQuery(name = "orderejb.findByOrdertype", query = "SELECT o FROM orderejb o WHERE o.orderType = :ordertype"), + @NamedQuery(name = "orderejb.findByOrderstatus", query = "SELECT o FROM orderejb o WHERE o.orderStatus = :orderstatus"), + @NamedQuery(name = "orderejb.findByPrice", query = "SELECT o FROM orderejb o WHERE o.price = :price"), + @NamedQuery(name = "orderejb.findByQuantity", query = "SELECT o FROM orderejb o WHERE o.quantity = :quantity"), + @NamedQuery(name = "orderejb.findByOpendate", query = "SELECT o FROM orderejb o WHERE o.openDate = :opendate"), + @NamedQuery(name = "orderejb.findByOrderid", query = "SELECT o FROM orderejb o WHERE o.orderID = :orderid"), + @NamedQuery(name = "orderejb.findByAccountAccountid", query = "SELECT o FROM orderejb o WHERE o.account.accountID = :accountAccountid"), + @NamedQuery(name = "orderejb.findByQuoteSymbol", query = "SELECT o FROM orderejb o WHERE o.quote.symbol = :quoteSymbol"), + @NamedQuery(name = "orderejb.findByHoldingHoldingid", query = "SELECT o FROM orderejb o WHERE o.holding.holdingID = :holdingHoldingid"), + @NamedQuery(name = "orderejb.closedOrders", query = "SELECT o FROM orderejb o WHERE o.orderStatus = 'closed' AND o.account.profile.userID = :userID"), + @NamedQuery(name = "orderejb.completeClosedOrders", query = "UPDATE orderejb o SET o.orderStatus = 'completed' WHERE o.orderStatus = 'closed' AND o.account.profile.userID = :userID") }) +public class OrderDataBean implements Serializable { + + private static final long serialVersionUID = 120650490200739057L; + + @Id + @TableGenerator(name = "orderIdGen", table = "KEYGENEJB", pkColumnName = "KEYNAME", valueColumnName = "KEYVAL", pkColumnValue = "order", allocationSize = 1000) + @GeneratedValue(strategy = GenerationType.TABLE, generator = "orderIdGen") + @Column(name = "ORDERID", nullable = false) + private Integer orderID; /* orderID */ + + @Column(name = "ORDERTYPE") + @NotBlank + private String orderType; /* orderType (buy, sell, etc.) */ + + @Column(name = "ORDERSTATUS") + @NotBlank + private String orderStatus; /* + * orderStatus (open, processing, completed, + * closed, cancelled) + */ + + @Column(name = "OPENDATE") + @Temporal(TemporalType.TIMESTAMP) + @PastOrPresent + private Date openDate; /* openDate (when the order was entered) */ + + @Column(name = "COMPLETIONDATE") + @PastOrPresent + @Temporal(TemporalType.TIMESTAMP) + private Date completionDate; /* completionDate */ + + @NotNull + @Column(name = "QUANTITY", nullable = false) + private double quantity; /* quantity */ + + @Column(name = "PRICE") + @Positive + private BigDecimal price; /* price */ + + @Column(name = "ORDERFEE") + @Positive + private BigDecimal orderFee; /* price */ + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "ACCOUNT_ACCOUNTID") + private AccountDataBean account; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "QUOTE_SYMBOL") + private QuoteDataBean quote; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "HOLDING_HOLDINGID") + private HoldingDataBean holding; + + /* Fields for relationship fields are not kept in the Data Bean */ + @Transient + private String symbol; + + public OrderDataBean() { + } + + public OrderDataBean(Integer orderID, String orderType, String orderStatus, Date openDate, Date completionDate, double quantity, BigDecimal price, + BigDecimal orderFee, String symbol) { + setOrderID(orderID); + setOrderType(orderType); + setOrderStatus(orderStatus); + setOpenDate(openDate); + setCompletionDate(completionDate); + setQuantity(quantity); + setPrice(price); + setOrderFee(orderFee); + setSymbol(symbol); + } + + public OrderDataBean(String orderType, String orderStatus, Date openDate, Date completionDate, double quantity, BigDecimal price, BigDecimal orderFee, + AccountDataBean account, QuoteDataBean quote, HoldingDataBean holding) { + setOrderType(orderType); + setOrderStatus(orderStatus); + setOpenDate(openDate); + setCompletionDate(completionDate); + setQuantity(quantity); + setPrice(price); + setOrderFee(orderFee); + setAccount(account); + setQuote(quote); + setHolding(holding); + } + + public static OrderDataBean getRandomInstance() { + return new OrderDataBean(new Integer(TradeConfig.rndInt(100000)), TradeConfig.rndBoolean() ? "buy" : "sell", "open", new java.util.Date( + TradeConfig.rndInt(Integer.MAX_VALUE)), new java.util.Date(TradeConfig.rndInt(Integer.MAX_VALUE)), TradeConfig.rndQuantity(), + TradeConfig.rndBigDecimal(1000.0f), TradeConfig.rndBigDecimal(1000.0f), TradeConfig.rndSymbol()); + } + + @Override + public String toString() { + return "Order " + getOrderID() + "\n\t orderType: " + getOrderType() + "\n\t orderStatus: " + getOrderStatus() + "\n\t openDate: " + + getOpenDate() + "\n\t completionDate: " + getCompletionDate() + "\n\t quantity: " + getQuantity() + "\n\t price: " + + getPrice() + "\n\t orderFee: " + getOrderFee() + "\n\t symbol: " + getSymbol(); + } + + public String toHTML() { + return "
    Order " + getOrderID() + "" + "
  • orderType: " + getOrderType() + "
  • " + "
  • orderStatus: " + getOrderStatus() + + "
  • " + "
  • openDate: " + getOpenDate() + "
  • " + "
  • completionDate: " + getCompletionDate() + "
  • " + + "
  • quantity: " + getQuantity() + "
  • " + "
  • price: " + getPrice() + "
  • " + "
  • orderFee: " + getOrderFee() + + "
  • " + "
  • symbol: " + getSymbol() + "
  • "; + } + + public void print() { + Log.log(this.toString()); + } + + public Integer getOrderID() { + return orderID; + } + + public void setOrderID(Integer orderID) { + this.orderID = orderID; + } + + public String getOrderType() { + return orderType; + } + + public void setOrderType(String orderType) { + this.orderType = orderType; + } + + public String getOrderStatus() { + return orderStatus; + } + + public void setOrderStatus(String orderStatus) { + this.orderStatus = orderStatus; + } + + public Date getOpenDate() { + return openDate; + } + + public void setOpenDate(Date openDate) { + this.openDate = openDate; + } + + public Date getCompletionDate() { + return completionDate; + } + + public void setCompletionDate(Date completionDate) { + this.completionDate = completionDate; + } + + public double getQuantity() { + return quantity; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getOrderFee() { + return orderFee; + } + + public void setOrderFee(BigDecimal orderFee) { + this.orderFee = orderFee; + } + + public String getSymbol() { + if (quote != null) { + return quote.getSymbol(); + } + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public AccountDataBean getAccount() { + return account; + } + + public void setAccount(AccountDataBean account) { + this.account = account; + } + + public QuoteDataBean getQuote() { + return quote; + } + + public void setQuote(QuoteDataBean quote) { + this.quote = quote; + } + + public HoldingDataBean getHolding() { + return holding; + } + + public void setHolding(HoldingDataBean holding) { + this.holding = holding; + } + + public boolean isBuy() { + String orderType = getOrderType(); + if (orderType.compareToIgnoreCase("buy") == 0) { + return true; + } + return false; + } + + public boolean isSell() { + String orderType = getOrderType(); + if (orderType.compareToIgnoreCase("sell") == 0) { + return true; + } + return false; + } + + public boolean isOpen() { + String orderStatus = getOrderStatus(); + if ((orderStatus.compareToIgnoreCase("open") == 0) || (orderStatus.compareToIgnoreCase("processing") == 0)) { + return true; + } + return false; + } + + public boolean isCompleted() { + String orderStatus = getOrderStatus(); + if ((orderStatus.compareToIgnoreCase("completed") == 0) || (orderStatus.compareToIgnoreCase("alertcompleted") == 0) + || (orderStatus.compareToIgnoreCase("cancelled") == 0)) { + return true; + } + return false; + } + + public boolean isCancelled() { + String orderStatus = getOrderStatus(); + if (orderStatus.compareToIgnoreCase("cancelled") == 0) { + return true; + } + return false; + } + + public void cancel() { + setOrderStatus("cancelled"); + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.orderID != null ? this.orderID.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof OrderDataBean)) { + return false; + } + OrderDataBean other = (OrderDataBean) object; + if (this.orderID != other.orderID && (this.orderID == null || !this.orderID.equals(other.orderID))) { + return false; + } + return true; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/QuoteDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/QuoteDataBean.java new file mode 100644 index 00000000..188873a0 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/entities/QuoteDataBean.java @@ -0,0 +1,213 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.entities; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.NamedNativeQueries; +import javax.persistence.NamedNativeQuery; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Entity(name = "quoteejb") +@Table(name = "quoteejb") +@NamedQueries({ + @NamedQuery(name = "quoteejb.allQuotes", query = "SELECT q FROM quoteejb q")}) +@NamedNativeQueries({ @NamedNativeQuery(name = "quoteejb.quoteForUpdate", query = "select * from quoteejb q where q.symbol=? for update", resultClass = com.ibm.websphere.samples.daytrader.entities.QuoteDataBean.class) }) +public class QuoteDataBean implements Serializable { + + /* Accessor methods for persistent fields */ + + private static final long serialVersionUID = 1847932261895838791L; + + @Id + @NotNull + @Column(name = "SYMBOL", nullable = false) + private String symbol; /* symbol */ + + @Column(name = "COMPANYNAME") + @NotBlank + private String companyName; /* companyName */ + + @NotNull + @Column(name = "VOLUME", nullable = false) + private double volume; /* volume */ + + @Column(name = "PRICE") + @Positive + private BigDecimal price; /* price */ + + @Column(name = "OPEN1") + @Positive + private BigDecimal open1; /* open1 price */ + + @Column(name = "LOW") + @Positive + private BigDecimal low; /* low price */ + + @Column(name = "HIGH") + @Positive + private BigDecimal high; /* high price */ + + @NotNull + @Column(name = "CHANGE1", nullable = false) + private double change1; /* price change */ + + /* Accessor methods for relationship fields are not kept in the DataBean */ + + public QuoteDataBean() { + } + + public QuoteDataBean(String symbol, String companyName, double volume, BigDecimal price, BigDecimal open, BigDecimal low, BigDecimal high, double change) { + setSymbol(symbol); + setCompanyName(companyName); + setVolume(volume); + setPrice(price); + setOpen(open); + setLow(low); + setHigh(high); + setChange(change); + } + + public static QuoteDataBean getRandomInstance() { + return new QuoteDataBean(TradeConfig.rndSymbol(), // symbol + TradeConfig.rndSymbol() + " Incorporated", // Company Name + TradeConfig.rndFloat(100000), // volume + TradeConfig.rndBigDecimal(1000.0f), // price + TradeConfig.rndBigDecimal(1000.0f), // open1 + TradeConfig.rndBigDecimal(1000.0f), // low + TradeConfig.rndBigDecimal(1000.0f), // high + TradeConfig.rndFloat(100000) // volume + ); + } + + // Create a "zero" value quoteDataBean for the given symbol + public QuoteDataBean(String symbol) { + setSymbol(symbol); + } + + @Override + public String toString() { + return "\n\tQuote Data for: " + getSymbol() + "\n\t\t companyName: " + getCompanyName() + "\n\t\t volume: " + getVolume() + "\n\t\t price: " + + getPrice() + "\n\t\t open1: " + getOpen() + "\n\t\t low: " + getLow() + "\n\t\t high: " + getHigh() + + "\n\t\t change1: " + getChange(); + } + + public String toHTML() { + return "
    Quote Data for: " + getSymbol() + "
  • companyName: " + getCompanyName() + "
  • " + "
  • volume: " + getVolume() + "
  • " + + "
  • price: " + getPrice() + "
  • " + "
  • open1: " + getOpen() + "
  • " + "
  • low: " + getLow() + "
  • " + + "
  • high: " + getHigh() + "
  • " + "
  • change1: " + getChange() + "
  • "; + } + + public void print() { + Log.log(this.toString()); + } + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getOpen() { + return open1; + } + + public void setOpen(BigDecimal open) { + this.open1 = open; + } + + public BigDecimal getLow() { + return low; + } + + public void setLow(BigDecimal low) { + this.low = low; + } + + public BigDecimal getHigh() { + return high; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public double getChange() { + return change1; + } + + public void setChange(double change) { + this.change1 = change; + } + + public double getVolume() { + return volume; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.symbol != null ? this.symbol.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + + if (!(object instanceof QuoteDataBean)) { + return false; + } + QuoteDataBean other = (QuoteDataBean) object; + if (this.symbol != other.symbol && (this.symbol == null || !this.symbol.equals(other.symbol))) { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrder.java new file mode 100644 index 00000000..eae3935c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrder.java @@ -0,0 +1,71 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.direct; + +import javax.annotation.Resource; +import javax.enterprise.context.Dependent; +import javax.inject.Inject; +import javax.transaction.UserTransaction; + +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; + +@Dependent +public class AsyncOrder implements Runnable { + + @Inject + @TradeJDBC + TradeServices tradeService; + + @Resource + UserTransaction ut; + + Integer orderID; + boolean twoPhase; + + public void setProperties(Integer orderID, boolean twoPhase) { + this.orderID = orderID; + this.twoPhase = twoPhase; + } + + @Override + public void run() { + + + try { + ut.begin(); + tradeService.completeOrder(orderID, twoPhase); + ut.commit(); + } catch (Exception e) { + + try { + ut.rollback(); + } catch (Exception e1) { + try { + throw new Exception(e1); + } catch (Exception e2) { + e2.printStackTrace(); + } + } + try { + throw new Exception(e); + } catch (Exception e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrderSubmitter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrderSubmitter.java new file mode 100644 index 00000000..75770d4a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/AsyncOrderSubmitter.java @@ -0,0 +1,40 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.direct; + +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; + +@RequestScoped +public class AsyncOrderSubmitter { + + + @Resource + private ManagedExecutorService mes; + + @Inject + private AsyncOrder asyncOrder; + + + public Future submitOrder(Integer orderID, boolean twoPhase) { + asyncOrder.setProperties(orderID,twoPhase); + return mes.submit(asyncOrder); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/KeySequenceDirect.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/KeySequenceDirect.java new file mode 100644 index 00000000..dfd7beba --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/KeySequenceDirect.java @@ -0,0 +1,114 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.direct; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; + +import com.ibm.websphere.samples.daytrader.util.KeyBlock; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +public class KeySequenceDirect { + + private static HashMap> keyMap = new HashMap>(); + + public static synchronized Integer getNextID(Connection conn, String keyName, boolean inSession, boolean inGlobalTxn) throws Exception { + Integer nextID = null; + // First verify we have allocated a block of keys + // for this key name + // Then verify the allocated block has not been depleted + // allocate a new block if necessary + if (keyMap.containsKey(keyName) == false) { + allocNewBlock(conn, keyName, inSession, inGlobalTxn); + } + Collection block = keyMap.get(keyName); + + Iterator ids = block.iterator(); + if (ids.hasNext() == false) { + ids = allocNewBlock(conn, keyName, inSession, inGlobalTxn).iterator(); + } + // get and return a new unique key + nextID = (Integer) ids.next(); + + + Log.trace("KeySequenceDirect:getNextID inSession(" + inSession + ") - return new PK ID for Entity type: " + keyName + " ID=" + nextID); + + return nextID; + } + + private static Collection allocNewBlock(Connection conn, String keyName, boolean inSession, boolean inGlobalTxn) throws Exception { + try { + + if (inGlobalTxn == false && !inSession) { + conn.commit(); // commit any pending txns + } + + PreparedStatement stmt = conn.prepareStatement(getKeyForUpdateSQL); + stmt.setString(1, keyName); + ResultSet rs = stmt.executeQuery(); + + if (!rs.next()) { + // No keys found for this name - create a new one + PreparedStatement stmt2 = conn.prepareStatement(createKeySQL); + int keyVal = 0; + stmt2.setString(1, keyName); + stmt2.setInt(2, keyVal); + stmt2.executeUpdate(); + stmt2.close(); + stmt.close(); + stmt = conn.prepareStatement(getKeyForUpdateSQL); + stmt.setString(1, keyName); + rs = stmt.executeQuery(); + rs.next(); + } + + int keyVal = rs.getInt("keyval"); + + stmt.close(); + + stmt = conn.prepareStatement(updateKeyValueSQL); + stmt.setInt(1, keyVal + TradeConfig.KEYBLOCKSIZE); + stmt.setString(2, keyName); + stmt.executeUpdate(); + stmt.close(); + + Collection block = new KeyBlock(keyVal, keyVal + TradeConfig.KEYBLOCKSIZE - 1); + keyMap.put(keyName, block); + + if (inGlobalTxn == false && !inSession) { + conn.commit(); + } + + return block; + } catch (Exception e) { + String error = "KeySequenceDirect:allocNewBlock - failure to allocate new block of keys for Entity type: " + keyName; + Log.error(e, error); + throw new Exception(error + e.toString()); + } + } + + private static final String getKeyForUpdateSQL = "select * from keygenejb kg where kg.keyname = ? for update"; + + private static final String createKeySQL = "insert into keygenejb " + "( keyname, keyval ) " + "VALUES ( ? , ? )"; + + private static final String updateKeyValueSQL = "update keygenejb set keyval = ? " + "where keyname = ?"; + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java new file mode 100644 index 00000000..071ee3d1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java @@ -0,0 +1,1837 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.direct; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.enterprise.context.Dependent; +import javax.enterprise.event.Event; +import javax.enterprise.event.NotificationOptions; +import javax.inject.Inject; +import javax.jms.JMSContext; +import javax.jms.JMSException; +import javax.jms.Queue; +import javax.jms.QueueConnectionFactory; +import javax.jms.TextMessage; +import javax.jms.Topic; +import javax.jms.TopicConnectionFactory; +import javax.sql.DataSource; +import javax.transaction.UserTransaction; +import javax.validation.constraints.NotNull; + +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.MDBStats; +import com.ibm.websphere.samples.daytrader.util.RecentQuotePriceChangeList; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.interfaces.MarketSummaryUpdate; +import com.ibm.websphere.samples.daytrader.interfaces.RuntimeMode; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; + +/** + * TradeDirect uses direct JDBC and JMS access to a + * javax.sql.DataSource to implement the business methods of the + * Trade online broker application. These business methods represent the + * features and operations that can be performed by customers of the brokerage + * such as login, logout, get a stock quote, buy or sell a stock, etc. and are + * specified in the {@link com.ibm.websphere.samples.daytrader.TradeServices} + * interface + * + * Note: In order for this class to be thread-safe, a new TradeJDBC must be + * created for each call to a method from the TradeInterface interface. + * Otherwise, pooled connections may not be released. + * + * @see com.ibm.websphere.samples.daytrader.TradeServices + * + */ + +@Dependent +@TradeJDBC +@RuntimeMode("Direct (JDBC)") +@Trace +public class TradeDirect implements TradeServices, Serializable { + /** + * + */ + private static final long serialVersionUID = -8089049090952927985L; + + //This lock is used to serialize market summary operations. + private static final Integer marketSummaryLock = new Integer(0); + private static long nextMarketSummary = System.currentTimeMillis(); + private static MarketSummaryDataBean cachedMSDB = MarketSummaryDataBean.getRandomInstance(); + + private static BigDecimal ZERO = new BigDecimal(0.0); + private boolean inGlobalTxn = false; + private boolean inSession = false; + + // For Wildfly - add java:/ to these resource names. + + @Resource(name = "jms/QueueConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + //@Resource(name = "java:/jms/QueueConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private QueueConnectionFactory queueConnectionFactory; + + @Resource(name = "jms/TopicConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + //@Resource(name = "java:/jms/TopicConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private TopicConnectionFactory topicConnectionFactory; + + @Resource(lookup = "jms/TradeStreamerTopic") + //@Resource(lookup = "java:/jms/TradeStreamerTopic") + private Topic tradeStreamerTopic; + + @Resource(lookup = "jms/TradeBrokerQueue") + //@Resource(lookup = "java:/jms/TradeBrokerQueue") + private Queue tradeBrokerQueue; + + @Resource(lookup = "jdbc/TradeDataSource") + //@Resource(lookup = "java:/jdbc/TradeDataSource") + private DataSource datasource; + + @Resource + private UserTransaction txn; + + @Inject + RecentQuotePriceChangeList recentQuotePriceChangeList; + + @Inject + AsyncOrderSubmitter asyncOrderSubmitter; + + @Inject + @MarketSummaryUpdate + Event mkSummaryUpdateEvent; + + @Resource + private ManagedExecutorService mes; + + + @Override + public MarketSummaryDataBean getMarketSummary() throws Exception { + + if (TradeConfig.getMarketSummaryInterval() == 0) { + return getMarketSummaryInternal(); + } + if (TradeConfig.getMarketSummaryInterval() < 0) { + return cachedMSDB; + } + + /** + * This is a little funky. If its time to fetch a new Market summary + * then we'll synchronize access to make sure only one requester does + * it. Others will merely return the old copy until the new + * MarketSummary has been executed. + */ + + long currentTime = System.currentTimeMillis(); + + if (currentTime > nextMarketSummary) { + long oldNextMarketSummary = nextMarketSummary; + boolean fetch = false; + + synchronized (marketSummaryLock) { + /** + * Is it still ahead or did we miss lose the race? If we lost + * then let's get out of here as the work has already been done. + */ + if (oldNextMarketSummary == nextMarketSummary) { + fetch = true; + nextMarketSummary += TradeConfig.getMarketSummaryInterval() * 1000; + + /** + * If the server has been idle for a while then its possible + * that nextMarketSummary could be way off. Rather than try + * and play catch up we'll simply get in sync with the + * current time + the interval. + */ + if (nextMarketSummary < currentTime) { + nextMarketSummary = currentTime + TradeConfig.getMarketSummaryInterval() * 1000; + } + } + } + + /** + * If we're the lucky one then let's update the MarketSummary + */ + if (fetch) { + cachedMSDB = getMarketSummaryInternal(); + + } + } + + return cachedMSDB; + } + + + + /** + * @see TradeServices#getMarketSummary() + */ + + public MarketSummaryDataBean getMarketSummaryInternal() throws Exception { + + MarketSummaryDataBean marketSummaryData = null; + Connection conn = null; + try { + + Log.trace("TradeDirect:getMarketSummary - inSession(" + this.inSession + ")"); + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, getTSIAQuotesOrderByChangeSQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + + ArrayList topGainersData = new ArrayList(5); + ArrayList topLosersData = new ArrayList(5); + + ResultSet rs = stmt.executeQuery(); + + int count = 0; + while (rs.next() && (count++ < 5)) { + QuoteDataBean quoteData = getQuoteDataFromResultSet(rs); + topLosersData.add(quoteData); + } + + stmt.close(); + stmt = getStatement(conn, "select * from quoteejb q order by q.change1 DESC", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); + rs = stmt.executeQuery(); + + count = 0; + while (rs.next() && (count++ < 5)) { + QuoteDataBean quoteData = getQuoteDataFromResultSet(rs); + topGainersData.add(quoteData); + } + + /* + * rs.last(); count = 0; while (rs.previous() && (count++ < 5) ) { + * QuoteDataBean quoteData = getQuoteDataFromResultSet(rs); + * topGainersData.add(quoteData); } + */ + + stmt.close(); + + BigDecimal TSIA = ZERO; + BigDecimal openTSIA = ZERO; + double volume = 0.0; + + if ((topGainersData.size() > 0) || (topLosersData.size() > 0)) { + + stmt = getStatement(conn, getTSIASQL); + rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:getMarketSummary -- error w/ getTSIASQL -- no results"); + } else { + TSIA = rs.getBigDecimal("TSIA"); + } + stmt.close(); + + stmt = getStatement(conn, getOpenTSIASQL); + rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:getMarketSummary -- error w/ getOpenTSIASQL -- no results"); + } else { + openTSIA = rs.getBigDecimal("openTSIA"); + } + stmt.close(); + + stmt = getStatement(conn, getTSIATotalVolumeSQL); + rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:getMarketSummary -- error w/ getTSIATotalVolumeSQL -- no results"); + } else { + volume = rs.getDouble("totalVolume"); + } + stmt.close(); + } + commit(conn); + + marketSummaryData = new MarketSummaryDataBean(TSIA, openTSIA, volume, topGainersData, topLosersData); + mkSummaryUpdateEvent.fireAsync("MarketSummaryUpdate", NotificationOptions.builder().setExecutor(mes).build()); + + } + + catch (Exception e) { + Log.error("TradeDirect:login -- error logging in user", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return marketSummaryData; + + } + + /** + * @see TradeServices#buy(String, String, double) + */ + @Override + @NotNull + public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception { + + final Connection conn = getConn(); + OrderDataBean orderData = null; + + BigDecimal total; + + try { + + Log.trace("TradeDirect:buy - inSession(" + this.inSession + ")");//, userID, symbol, new Double(quantity)); + + + if (!inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + + Log.trace("TradeDirect:buy create/begin global transaction"); + + + txn.begin(); + setInGlobalTxn(true); + } + + //conn = getConn(); + + AccountDataBean accountData = getAccountData(conn, userID); + QuoteDataBean quoteData = getQuoteData(conn, symbol); + HoldingDataBean holdingData = null; // the buy operation will create + // the holding + + orderData = createOrder(accountData, quoteData, holdingData, "buy", quantity); + + // Update -- account should be credited during completeOrder + BigDecimal price = quoteData.getPrice(); + BigDecimal orderFee = orderData.getOrderFee(); + total = (new BigDecimal(quantity).multiply(price)).add(orderFee); + // subtract total from account balance + creditAccountBalance(conn, accountData, total.negate()); + final Integer orderID = orderData.getOrderID(); + + try { + + if (orderProcessingMode == TradeConfig.SYNCH) { + completeOrder(conn, orderData.getOrderID()); + } else if (orderProcessingMode == TradeConfig.ASYNCH) { + completeOrderAsync(orderID, true); + } else if (orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + queueOrder(orderID, true); // 2-phase + } + } catch (JMSException je) { + Log.error("TradeBean:buy(" + userID + "," + symbol + "," + quantity + ") --> failed to queueOrder", je); + + + cancelOrder(conn, orderData.getOrderID()); + } + + orderData = getOrderData(conn, orderData.getOrderID().intValue()); + + if (getInGlobalTxn()) { + + Log.trace("TradeDirect:buy committing global transaction"); + + if (!inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + txn.commit(); + setInGlobalTxn(false); + } + } else { + commit(conn); + } + } catch (Exception e) { + Log.error("TradeDirect:buy error - rolling back", e); + if (getInGlobalTxn()) { + txn.rollback(); + } else { + rollBack(conn, e); + } + } finally { + releaseConn(conn); + } + + return orderData; + } + + /** + * @see TradeServices#sell(String, Integer) + */ + @Override + @NotNull + public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception { + Connection conn = null; + OrderDataBean orderData = null; + //UserTransaction txn = null; + + /* + * total = (quantity * purchasePrice) + orderFee + */ + BigDecimal total; + + try { + + Log.trace("TradeDirect:sell - inSession(" + this.inSession + ")", userID, holdingID); + + + if (!inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + + Log.trace("TradeDirect:sell create/begin global transaction"); + + txn.begin(); + setInGlobalTxn(true); + } + + conn = getConn(); + + AccountDataBean accountData = getAccountData(conn, userID); + HoldingDataBean holdingData = getHoldingData(conn, holdingID.intValue()); + QuoteDataBean quoteData = null; + if (holdingData != null) { + quoteData = getQuoteData(conn, holdingData.getQuoteID()); + } + + if ((accountData == null) || (holdingData == null) || (quoteData == null)) { + String error = "TradeDirect:sell -- error selling stock -- unable to find: \n\taccount=" + accountData + "\n\tholding=" + holdingData + + "\n\tquote=" + quoteData + "\nfor user: " + userID + " and holdingID: " + holdingID; + Log.debug(error); + if (getInGlobalTxn()) { + txn.rollback(); + } else { + rollBack(conn, new Exception(error)); + } + orderData = new OrderDataBean(); + orderData.setOrderStatus("cancelled"); + return orderData; + } + + double quantity = holdingData.getQuantity(); + + orderData = createOrder(accountData, quoteData, holdingData, "sell", quantity); + + // Set the holdingSymbol purchaseDate to selling to signify the sell + // is "inflight" + updateHoldingStatus(conn, holdingData.getHoldingID(), holdingData.getQuoteID()); + + // UPDATE -- account should be credited during completeOrder + BigDecimal price = quoteData.getPrice(); + BigDecimal orderFee = orderData.getOrderFee(); + total = (new BigDecimal(quantity).multiply(price)).subtract(orderFee); + creditAccountBalance(conn, accountData, total); + + try { + if (orderProcessingMode == TradeConfig.SYNCH) { + completeOrder(conn, orderData.getOrderID()); + } else if (orderProcessingMode == TradeConfig.ASYNCH) { + this.completeOrderAsync(orderData.getOrderID(), true); + } else if (orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + queueOrder(orderData.getOrderID(), true); + } + } catch (JMSException je) { + Log.error("TradeBean:sell(" + userID + "," + holdingID + ") --> failed to queueOrder", je); + + cancelOrder(conn, orderData.getOrderID()); + } + + orderData = getOrderData(conn, orderData.getOrderID().intValue()); + + if (!inSession && orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + + Log.trace("TradeDirect:sell committing global transaction"); + + txn.commit(); + setInGlobalTxn(false); + } else { + commit(conn); + } + } catch (Exception e) { + Log.error("TradeDirect:sell error", e); + if (getInGlobalTxn()) { + txn.rollback(); + } else { + rollBack(conn, e); + } + } finally { + releaseConn(conn); + } + + return orderData; + } + + /** + * @see TradeServices#queueOrder(Integer) + */ + @Override + public void queueOrder(Integer orderID, boolean twoPhase) throws Exception { + + + Log.trace("TradeDirect:queueOrder - inSession(" + this.inSession + ")", orderID); + + + try (JMSContext context = queueConnectionFactory.createContext();){ + TextMessage message = context.createTextMessage(); + + message.setStringProperty("command", "neworder"); + message.setIntProperty("orderID", orderID.intValue()); + message.setBooleanProperty("twoPhase", twoPhase); + message.setBooleanProperty("direct", true); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("neworder: orderID=" + orderID + " runtimeMode=Direct twoPhase=" + twoPhase); + + context.createProducer().send(tradeBrokerQueue, message); + } catch (Exception e) { + throw e; // pass the exception + } + } + + /** + * @see TradeServices#completeOrder(Integer) + */ + @Override + public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception { + OrderDataBean orderData = null; + Connection conn = null; + + try { // twoPhase + + + Log.trace("TradeDirect:completeOrder - inSession(" + this.inSession + ")", orderID); + + setInGlobalTxn(!inSession && twoPhase); + conn = getConn(); + + orderData = completeOrder(conn, orderID); + + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:completeOrder -- error completing order", e); + rollBack(conn, e); + cancelOrder(orderID, twoPhase); + } finally { + releaseConn(conn); + } + + return orderData; + + } + + @Override + public Future completeOrderAsync(Integer orderID, boolean twoPhase) throws Exception { + if (!inSession) { + asyncOrderSubmitter.submitOrder(orderID, twoPhase); + } + return null; + } + + + private OrderDataBean completeOrder(Connection conn, Integer orderID) throws Exception { + //conn = getConn(); + OrderDataBean orderData = null; + + Log.trace("TradeDirect:completeOrderInternal - inSession(" + this.inSession + ")", orderID); + + + PreparedStatement stmt = getStatement(conn, getOrderSQL); + stmt.setInt(1, orderID.intValue()); + + ResultSet rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:completeOrder -- unable to find order: " + orderID); + stmt.close(); + return orderData; + } + orderData = getOrderDataFromResultSet(rs); + + String orderType = orderData.getOrderType(); + String orderStatus = orderData.getOrderStatus(); + + // if (order.isCompleted()) + if ((orderStatus.compareToIgnoreCase("completed") == 0) || (orderStatus.compareToIgnoreCase("alertcompleted") == 0) + || (orderStatus.compareToIgnoreCase("cancelled") == 0)) { + throw new Exception("TradeDirect:completeOrder -- attempt to complete Order that is already completed"); + } + + int accountID = rs.getInt("account_accountID"); + String quoteID = rs.getString("quote_symbol"); + int holdingID = rs.getInt("holding_holdingID"); + + BigDecimal price = orderData.getPrice(); + double quantity = orderData.getQuantity(); + + // get the data for the account and quote + // the holding will be created for a buy or extracted for a sell + + /* + * Use the AccountID and Quote Symbol from the Order AccountDataBean + * accountData = getAccountData(accountID, conn); QuoteDataBean + * quoteData = getQuoteData(conn, quoteID); + */ + String userID = getAccountProfileData(conn, new Integer(accountID)).getUserID(); + + HoldingDataBean holdingData = null; + + + Log.trace("TradeDirect:completeOrder--> Completing Order " + orderData.getOrderID() + "\n\t Order info: " + orderData + "\n\t Account info: " + + accountID + "\n\t Quote info: " + quoteID); + + + // if (order.isBuy()) + if (orderType.compareToIgnoreCase("buy") == 0) { + /* + * Complete a Buy operation - create a new Holding for the Account - + * deduct the Order cost from the Account balance + */ + + holdingData = createHolding(conn, accountID, quoteID, quantity, price); + updateOrderHolding(conn, orderID.intValue(), holdingData.getHoldingID().intValue()); + updateOrderStatus(conn, orderData.getOrderID(), "closed"); + updateQuotePriceVolume(orderData.getSymbol(), TradeConfig.getRandomPriceChangeFactor(), orderData.getQuantity()); + } + + // if (order.isSell()) { + if (orderType.compareToIgnoreCase("sell") == 0) { + /* + * Complete a Sell operation - remove the Holding from the Account - + * deposit the Order proceeds to the Account balance + */ + holdingData = getHoldingData(conn, holdingID); + if (holdingData == null) { + Log.debug("TradeDirect:completeOrder:sell -- user: " + userID + " already sold holding: " + holdingID); + updateOrderStatus(conn, orderData.getOrderID(), "cancelled"); + } else { + removeHolding(conn, holdingID, orderID.intValue()); + updateOrderStatus(conn, orderData.getOrderID(), "closed"); + updateQuotePriceVolume(orderData.getSymbol(), TradeConfig.getRandomPriceChangeFactor(), orderData.getQuantity()); + } + + } + + + + Log.trace("TradeDirect:completeOrder--> Completed Order " + orderData.getOrderID() + "\n\t Order info: " + orderData + "\n\t Account info: " + + accountID + "\n\t Quote info: " + quoteID + "\n\t Holding info: " + holdingData); + + stmt.close(); + + commit(conn); + + + + return orderData; + } + + /** + * @see TradeServices#cancelOrder(Integer, boolean) + */ + @Override + public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception { + + Connection conn = null; + try { + + Log.trace("TradeDirect:cancelOrder - inSession(" + this.inSession + ")", orderID); + + setInGlobalTxn(!inSession && twoPhase); + conn = getConn(); + cancelOrder(conn, orderID); + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:cancelOrder -- error cancelling order: " + orderID, e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + } + + private void cancelOrder(Connection conn, Integer orderID) throws Exception { + updateOrderStatus(conn, orderID, "cancelled"); + } + + @Override + public void orderCompleted(String userID, Integer orderID) throws Exception { + throw new UnsupportedOperationException("TradeDirect:orderCompleted method not supported"); + } + + private HoldingDataBean createHolding(Connection conn, int accountID, String symbol, double quantity, BigDecimal purchasePrice) throws Exception { + + Timestamp purchaseDate = new Timestamp(System.currentTimeMillis()); + PreparedStatement stmt = getStatement(conn, createHoldingSQL); + + Integer holdingID = KeySequenceDirect.getNextID(conn, "holding", inSession, getInGlobalTxn()); + stmt.setInt(1, holdingID.intValue()); + stmt.setTimestamp(2, purchaseDate); + stmt.setBigDecimal(3, purchasePrice); + stmt.setDouble(4, quantity); + stmt.setString(5, symbol); + stmt.setInt(6, accountID); + stmt.executeUpdate(); + + stmt.close(); + + return getHoldingData(conn, holdingID.intValue()); + } + + private void removeHolding(Connection conn, int holdingID, int orderID) throws Exception { + PreparedStatement stmt = getStatement(conn, removeHoldingSQL); + + stmt.setInt(1, holdingID); + stmt.executeUpdate(); + stmt.close(); + + // set the HoldingID to NULL for the purchase and sell order now that + // the holding as been removed + stmt = getStatement(conn, removeHoldingFromOrderSQL); + + stmt.setInt(1, holdingID); + stmt.executeUpdate(); + stmt.close(); + + } + + public OrderDataBean createOrder(AccountDataBean accountData, QuoteDataBean quoteData, HoldingDataBean holdingData, String orderType, + double quantity) throws Exception { + OrderDataBean orderData = null; + Connection conn = null; + try { + + conn = getConn(); + Timestamp currentDate = new Timestamp(System.currentTimeMillis()); + + PreparedStatement stmt = getStatement(conn, createOrderSQL); + + Integer orderID = KeySequenceDirect.getNextID(conn, "order", inSession, getInGlobalTxn()); + stmt.setInt(1, orderID.intValue()); + stmt.setString(2, orderType); + stmt.setString(3, "open"); + stmt.setTimestamp(4, currentDate); + stmt.setDouble(5, quantity); + stmt.setBigDecimal(6, quoteData.getPrice().setScale(FinancialUtils.SCALE, FinancialUtils.ROUND)); + stmt.setBigDecimal(7, TradeConfig.getOrderFee(orderType)); + stmt.setInt(8, accountData.getAccountID().intValue()); + if (holdingData == null) { + stmt.setNull(9, java.sql.Types.INTEGER); + } else { + stmt.setInt(9, holdingData.getHoldingID().intValue()); + } + stmt.setString(10, quoteData.getSymbol()); + stmt.executeUpdate(); + + orderData = getOrderData(conn, orderID.intValue()); + + stmt.close(); + + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:createOrder -- error getting user orders", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + + return orderData; + } + + /** + * @see TradeServices#getOrders(String) + */ + @Override + public Collection getOrders(String userID) throws Exception { + Collection orderDataBeans = new ArrayList(); + Connection conn = null; + try { + Log.trace("TradeDirect:getOrders - inSession(" + this.inSession + ")", userID); + + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, getOrdersByUserSQL); + stmt.setString(1, userID); + + ResultSet rs = stmt.executeQuery(); + + // TODO: return top 5 orders for now -- next version will add a + // getAllOrders method + // also need to get orders sorted by order id descending + int i = 0; + while ((rs.next()) && (i++ < 5)) { + OrderDataBean orderData = getOrderDataFromResultSet(rs); + orderDataBeans.add(orderData); + } + + stmt.close(); + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:getOrders -- error getting user orders", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return orderDataBeans; + } + + /** + * @see TradeServices#getClosedOrders(String) + */ + @Override + public Collection getClosedOrders(String userID) throws Exception { + Collection orderDataBeans = new ArrayList(); + Connection conn = null; + try { + + Log.trace("TradeDirect:getClosedOrders - inSession(" + this.inSession + ")", userID); + + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, getClosedOrdersSQL); + stmt.setString(1, userID); + + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + OrderDataBean orderData = getOrderDataFromResultSet(rs); + orderData.setOrderStatus("completed"); + updateOrderStatus(conn, orderData.getOrderID(), orderData.getOrderStatus()); + orderDataBeans.add(orderData); + + } + + stmt.close(); + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:getOrders -- error getting user orders", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return orderDataBeans; + } + + /** + * @see TradeServices#createQuote(String, String, BigDecimal) + */ + @Override + public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception { + + QuoteDataBean quoteData = null; + Connection conn = null; + try { + + Log.trace("TradeDirect:createQuote - inSession(" + this.inSession + ")"); + + + price = price.setScale(FinancialUtils.SCALE, FinancialUtils.ROUND); + double volume = 0.0, change = 0.0; + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, createQuoteSQL); + stmt.setString(1, symbol); // symbol + stmt.setString(2, companyName); // companyName + stmt.setDouble(3, volume); // volume + stmt.setBigDecimal(4, price); // price + stmt.setBigDecimal(5, price); // open + stmt.setBigDecimal(6, price); // low + stmt.setBigDecimal(7, price); // high + stmt.setDouble(8, change); // change + + stmt.executeUpdate(); + stmt.close(); + commit(conn); + + quoteData = new QuoteDataBean(symbol, companyName, volume, price, price, price, price, change); + } catch (Exception e) { + Log.error("TradeDirect:createQuote -- error creating quote", e); + } finally { + releaseConn(conn); + } + return quoteData; + } + + /** + * @see TradeServices#getQuote(String) + */ + + @Override + public QuoteDataBean getQuote(String symbol) throws Exception { + QuoteDataBean quoteData = null; + Connection conn = null; + + try { + + Log.trace("TradeDirect:getQuote - inSession(" + this.inSession + ")", symbol); + + + conn = getConn(); + quoteData = getQuote(conn, symbol); + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:getQuote -- error getting quote", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return quoteData; + } + + private QuoteDataBean getQuote(Connection conn, String symbol) throws Exception { + QuoteDataBean quoteData = null; + PreparedStatement stmt = getStatement(conn, getQuoteSQL); + stmt.setString(1, symbol); // symbol + + ResultSet rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:getQuote -- failure no result.next() for symbol: " + symbol); + } else { + quoteData = getQuoteDataFromResultSet(rs); + } + + stmt.close(); + + return quoteData; + } + + private QuoteDataBean getQuoteForUpdate(Connection conn, String symbol) throws Exception { + QuoteDataBean quoteData = null; + PreparedStatement stmt = getStatement(conn, getQuoteForUpdateSQL); + stmt.setString(1, symbol); // symbol + + ResultSet rs = stmt.executeQuery(); + + if (!rs.next()) { + Log.error("TradeDirect:getQuote -- failure no result.next()"); + } else { + quoteData = getQuoteDataFromResultSet(rs); + } + + stmt.close(); + + return quoteData; + } + + /** + * @see TradeServices#getAllQuotes(String) + */ + @Override + public Collection getAllQuotes() throws Exception { + Collection quotes = new ArrayList(); + QuoteDataBean quoteData = null; + + Connection conn = null; + try { + conn = getConn(); + + PreparedStatement stmt = getStatement(conn, getAllQuotesSQL); + + ResultSet rs = stmt.executeQuery(); + + while (!rs.next()) { + quoteData = getQuoteDataFromResultSet(rs); + quotes.add(quoteData); + } + + stmt.close(); + } catch (Exception e) { + Log.error("TradeDirect:getAllQuotes", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + + return quotes; + } + + /** + * @see TradeServices#getHoldings(String) + */ + @Override + public Collection getHoldings(String userID) throws Exception { + Collection holdingDataBeans = new ArrayList(); + Connection conn = null; + try { + + Log.trace("TradeDirect:getHoldings - inSession(" + this.inSession + ")", userID); + + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, getHoldingsForUserSQL); + stmt.setString(1, userID); + + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + HoldingDataBean holdingData = getHoldingDataFromResultSet(rs); + holdingDataBeans.add(holdingData); + } + + stmt.close(); + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:getHoldings -- error getting user holings", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return holdingDataBeans; + } + + /** + * @see TradeServices#getHolding(Integer) + */ + @Override + public HoldingDataBean getHolding(Integer holdingID) throws Exception { + HoldingDataBean holdingData = null; + Connection conn = null; + try { + + Log.trace("TradeDirect:getHolding - inSession(" + this.inSession + ")", holdingID); + + + conn = getConn(); + holdingData = getHoldingData(holdingID.intValue()); + + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:getHolding -- error getting holding " + holdingID + "", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return holdingData; + } + + /** + * @see TradeServices#getAccountData(String) + */ + @Override + public AccountDataBean getAccountData(String userID) throws Exception { + try { + AccountDataBean accountData = null; + Connection conn = null; + try { + + Log.trace("TradeDirect:getAccountData - inSession(" + this.inSession + ")", userID); + + + conn = getConn(); + accountData = getAccountData(conn, userID); + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:getAccountData -- error getting account data", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return accountData; + } catch (Exception e) { + throw new Exception(e.getMessage(), e); + } + } + + private AccountDataBean getAccountData(Connection conn, String userID) throws Exception { + PreparedStatement stmt = getStatement(conn, getAccountForUserSQL); + stmt.setString(1, userID); + ResultSet rs = stmt.executeQuery(); + AccountDataBean accountData = getAccountDataFromResultSet(rs); + stmt.close(); + return accountData; + } + + /** + * @see TradeServices#getAccountData(String) + */ + public AccountDataBean getAccountData(int accountID) throws Exception { + AccountDataBean accountData = null; + Connection conn = null; + try { + + Log.trace("TradeDirect:getAccountData - inSession(" + this.inSession + ")", new Integer(accountID)); + + conn = getConn(); + accountData = getAccountData(accountID, conn); + commit(conn); + + } catch (Exception e) { + Log.error("TradeDirect:getAccountData -- error getting account data", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return accountData; + } + + private AccountDataBean getAccountData(int accountID, Connection conn) throws Exception { + PreparedStatement stmt = getStatement(conn, getAccountSQL); + stmt.setInt(1, accountID); + ResultSet rs = stmt.executeQuery(); + AccountDataBean accountData = getAccountDataFromResultSet(rs); + stmt.close(); + return accountData; + } + + private QuoteDataBean getQuoteData(Connection conn, String symbol) throws Exception { + QuoteDataBean quoteData = null; + PreparedStatement stmt = getStatement(conn, getQuoteSQL); + stmt.setString(1, symbol); + ResultSet rs = stmt.executeQuery(); + if (!rs.next()) { + Log.error("TradeDirect:getQuoteData -- could not find quote for symbol=" + symbol); + } else { + quoteData = getQuoteDataFromResultSet(rs); + } + stmt.close(); + return quoteData; + } + + private HoldingDataBean getHoldingData(int holdingID) throws Exception { + HoldingDataBean holdingData = null; + Connection conn = null; + try { + conn = getConn(); + holdingData = getHoldingData(conn, holdingID); + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:getHoldingData -- error getting data", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return holdingData; + } + + private HoldingDataBean getHoldingData(Connection conn, int holdingID) throws Exception { + HoldingDataBean holdingData = null; + PreparedStatement stmt = getStatement(conn, getHoldingSQL); + stmt.setInt(1, holdingID); + ResultSet rs = stmt.executeQuery(); + if (!rs.next()) { + // already sold + Log.debug("TradeDirect:getHoldingData -- no results -- holdingID=" + holdingID); + } else { + holdingData = getHoldingDataFromResultSet(rs); + } + + stmt.close(); + return holdingData; + } + + private OrderDataBean getOrderData(Connection conn, int orderID) throws Exception { + OrderDataBean orderData = null; + + Log.trace("TradeDirect:getOrderData(conn, " + orderID + ")"); + + PreparedStatement stmt = getStatement(conn, getOrderSQL); + stmt.setInt(1, orderID); + ResultSet rs = stmt.executeQuery(); + if (!rs.next()) { + // already sold + Log.error("TradeDirect:getOrderData -- no results for orderID:" + orderID); + } else { + orderData = getOrderDataFromResultSet(rs); + } + stmt.close(); + return orderData; + } + + /** + * @see TradeServices#getAccountProfileData(String) + */ + @Override + public AccountProfileDataBean getAccountProfileData(String userID) throws Exception { + AccountProfileDataBean accountProfileData = null; + Connection conn = null; + + try { + + Log.trace("TradeDirect:getAccountProfileData - inSession(" + this.inSession + ")", userID); + + + conn = getConn(); + accountProfileData = getAccountProfileData(conn, userID); + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:getAccountProfileData -- error getting profile data", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return accountProfileData; + } + + private AccountProfileDataBean getAccountProfileData(Connection conn, String userID) throws Exception { + PreparedStatement stmt = getStatement(conn, getAccountProfileSQL); + stmt.setString(1, userID); + + ResultSet rs = stmt.executeQuery(); + + AccountProfileDataBean accountProfileData = getAccountProfileDataFromResultSet(rs); + stmt.close(); + return accountProfileData; + } + + private AccountProfileDataBean getAccountProfileData(Connection conn, Integer accountID) throws Exception { + PreparedStatement stmt = getStatement(conn, getAccountProfileForAccountSQL); + stmt.setInt(1, accountID.intValue()); + + ResultSet rs = stmt.executeQuery(); + + AccountProfileDataBean accountProfileData = getAccountProfileDataFromResultSet(rs); + stmt.close(); + return accountProfileData; + } + + /** + * @see TradeServices#updateAccountProfile(AccountProfileDataBean) + */ + @Override + public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception { + AccountProfileDataBean accountProfileData = null; + Connection conn = null; + + try { + + Log.trace("TradeDirect:updateAccountProfileData - inSession(" + this.inSession + ")", profileData.getUserID()); + + conn = getConn(); + updateAccountProfile(conn, profileData); + + accountProfileData = getAccountProfileData(conn, profileData.getUserID()); + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:getAccountProfileData -- error getting profile data", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return accountProfileData; + } + + private void creditAccountBalance(Connection conn, AccountDataBean accountData, BigDecimal credit) throws Exception { + PreparedStatement stmt = getStatement(conn, creditAccountBalanceSQL); + + stmt.setBigDecimal(1, credit); + stmt.setInt(2, accountData.getAccountID().intValue()); + + stmt.executeUpdate(); + stmt.close(); + + } + + // Set Timestamp to zero to denote sell is inflight + // UPDATE -- could add a "status" attribute to holding + private void updateHoldingStatus(Connection conn, Integer holdingID, String symbol) throws Exception { + Timestamp ts = new Timestamp(0); + PreparedStatement stmt = getStatement(conn, "update holdingejb set purchasedate= ? where holdingid = ?"); + + stmt.setTimestamp(1, ts); + stmt.setInt(2, holdingID.intValue()); + stmt.executeUpdate(); + stmt.close(); + } + + private void updateOrderStatus(Connection conn, Integer orderID, String status) throws Exception { + PreparedStatement stmt = getStatement(conn, updateOrderStatusSQL); + + stmt.setString(1, status); + stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis())); + stmt.setInt(3, orderID.intValue()); + stmt.executeUpdate(); + stmt.close(); + } + + private void updateOrderHolding(Connection conn, int orderID, int holdingID) throws Exception { + PreparedStatement stmt = getStatement(conn, updateOrderHoldingSQL); + + stmt.setInt(1, holdingID); + stmt.setInt(2, orderID); + stmt.executeUpdate(); + stmt.close(); + } + + private void updateAccountProfile(Connection conn, AccountProfileDataBean profileData) throws Exception { + PreparedStatement stmt = getStatement(conn, updateAccountProfileSQL); + + stmt.setString(1, profileData.getPassword()); + stmt.setString(2, profileData.getFullName()); + stmt.setString(3, profileData.getAddress()); + stmt.setString(4, profileData.getEmail()); + stmt.setString(5, profileData.getCreditCard()); + stmt.setString(6, profileData.getUserID()); + + stmt.executeUpdate(); + stmt.close(); + } + + @Override + public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal changeFactor, double sharesTraded) throws Exception { + return updateQuotePriceVolumeInt(symbol, changeFactor, sharesTraded, TradeConfig.getPublishQuotePriceChange()); + } + + /** + * Update a quote's price and volume + * + * @param symbol + * The PK of the quote + * @param changeFactor + * the percent to change the old price by (between 50% and 150%) + * @param sharedTraded + * the ammount to add to the current volume + * @param publishQuotePriceChange + * used by the PingJDBCWrite Primitive to ensure no JMS is used, + * should be true for all normal calls to this API + */ + public QuoteDataBean updateQuotePriceVolumeInt(String symbol, BigDecimal changeFactor, double sharesTraded, boolean publishQuotePriceChange) + throws Exception { + + if (TradeConfig.getUpdateQuotePrices() == false) { + return new QuoteDataBean(); + } + + QuoteDataBean quoteData = null; + Connection conn = null; + + try { + Log.trace("TradeDirect:updateQuotePriceVolume - inSession(" + this.inSession + ")", symbol, changeFactor, new Double(sharesTraded)); + + conn = getConn(); + + quoteData = getQuoteForUpdate(conn, symbol); + BigDecimal oldPrice = quoteData.getPrice(); + BigDecimal openPrice = quoteData.getOpen(); + + double newVolume = quoteData.getVolume() + sharesTraded; + + if (oldPrice.equals(TradeConfig.PENNY_STOCK_PRICE)) { + changeFactor = TradeConfig.PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER; + } else if (oldPrice.compareTo(TradeConfig.MAXIMUM_STOCK_PRICE) > 0) { + changeFactor = TradeConfig.MAXIMUM_STOCK_SPLIT_MULTIPLIER; + } + + BigDecimal newPrice = changeFactor.multiply(oldPrice).setScale(2, BigDecimal.ROUND_HALF_UP); + double change = newPrice.subtract(openPrice).doubleValue(); + + updateQuotePriceVolume(conn, quoteData.getSymbol(), newPrice, newVolume, change); + quoteData = getQuote(conn, symbol); + + commit(conn); + + if (publishQuotePriceChange) { + publishQuotePriceChange(quoteData, oldPrice, changeFactor, sharesTraded); + } + + recentQuotePriceChangeList.add(quoteData); + + } catch (Exception e) { + Log.error("TradeDirect:updateQuotePriceVolume -- error updating quote price/volume for symbol:" + symbol); + rollBack(conn, e); + throw e; + } finally { + releaseConn(conn); + } + return quoteData; + } + + private void updateQuotePriceVolume(Connection conn, String symbol, BigDecimal newPrice, double newVolume, double change) throws Exception { + + PreparedStatement stmt = getStatement(conn, updateQuotePriceVolumeSQL); + + stmt.setBigDecimal(1, newPrice); + stmt.setDouble(2, change); + stmt.setDouble(3, newVolume); + stmt.setString(4, symbol); + + stmt.executeUpdate(); + stmt.close(); + } + + private void publishQuotePriceChange(QuoteDataBean quoteData, BigDecimal oldPrice, BigDecimal changeFactor, double sharesTraded) throws Exception { + + Log.trace("TradeDirect:publishQuotePrice PUBLISHING to MDB quoteData = " + quoteData); + + try (JMSContext context = topicConnectionFactory.createContext();){ + TextMessage message = context.createTextMessage(); + + message.setStringProperty("command", "updateQuote"); + message.setStringProperty("symbol", quoteData.getSymbol()); + message.setStringProperty("company", quoteData.getCompanyName()); + message.setStringProperty("price", quoteData.getPrice().toString()); + message.setStringProperty("oldPrice", oldPrice.toString()); + message.setStringProperty("open", quoteData.getOpen().toString()); + message.setStringProperty("low", quoteData.getLow().toString()); + message.setStringProperty("high", quoteData.getHigh().toString()); + message.setDoubleProperty("volume", quoteData.getVolume()); + + message.setStringProperty("changeFactor", changeFactor.toString()); + message.setDoubleProperty("sharesTraded", sharesTraded); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Update Stock price for " + quoteData.getSymbol() + " old price = " + oldPrice + " new price = " + quoteData.getPrice()); + + + context.createProducer().send(tradeStreamerTopic, message); + + } catch (Exception e) { + throw e; // pass exception back + + } + } + + /** + * @see TradeServices#login(String, String) + */ + + @Override + public AccountDataBean login(String userID, String password) throws Exception { + + AccountDataBean accountData = null; + Connection conn = null; + try { + Log.trace("TradeDirect:login - inSession(" + this.inSession + ")", userID, password); + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, getAccountProfileSQL); + stmt.setString(1, userID); + + ResultSet rs = stmt.executeQuery(); + if (!rs.next()) { + Log.error("TradeDirect:login -- failure to find account for" + userID); + throw new javax.ejb.FinderException("Cannot find account for" + userID); + } + + String pw = rs.getString("passwd"); + stmt.close(); + if ((pw == null) || (pw.equals(password) == false)) { + String error = "TradeDirect:Login failure for user: " + userID + "\n\tIncorrect password-->" + userID + ":" + password; + Log.error(error); + throw new Exception(error); + } + + stmt = getStatement(conn, loginSQL); + stmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); + stmt.setString(2, userID); + + stmt.executeUpdate(); + stmt.close(); + + stmt = getStatement(conn, getAccountForUserSQL); + stmt.setString(1, userID); + rs = stmt.executeQuery(); + + accountData = getAccountDataFromResultSet(rs); + + stmt.close(); + + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:login -- error logging in user", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + return accountData; + + /* + * setLastLogin( new Timestamp(System.currentTimeMillis()) ); + * setLoginCount( getLoginCount() + 1 ); + */ + } + + /** + * @see TradeServices#logout(String) + */ + @Override + public void logout(String userID) throws Exception { + Log.trace("TradeDirect:logout - inSession(" + this.inSession + ")", userID); + + Connection conn = null; + try { + conn = getConn(); + PreparedStatement stmt = getStatement(conn, logoutSQL); + stmt.setString(1, userID); + stmt.executeUpdate(); + stmt.close(); + + commit(conn); + } catch (Exception e) { + Log.error("TradeDirect:logout -- error logging out user", e); + rollBack(conn, e); + } finally { + releaseConn(conn); + } + } + + /** + * @see TradeServices#register(String, String, String, String, String, + * String, BigDecimal, boolean) + */ + + @Override + public AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) + throws Exception { + + AccountDataBean accountData = null; + Connection conn = null; + try { + Log.trace("TradeDirect:register - inSession(" + this.inSession + ")"); + + conn = getConn(); + PreparedStatement stmt = getStatement(conn, createAccountSQL); + + Integer accountID = KeySequenceDirect.getNextID(conn, "account", inSession, getInGlobalTxn()); + BigDecimal balance = openBalance; + Timestamp creationDate = new Timestamp(System.currentTimeMillis()); + Timestamp lastLogin = creationDate; + int loginCount = 0; + int logoutCount = 0; + + stmt.setInt(1, accountID.intValue()); + stmt.setTimestamp(2, creationDate); + stmt.setBigDecimal(3, openBalance); + stmt.setBigDecimal(4, balance); + stmt.setTimestamp(5, lastLogin); + stmt.setInt(6, loginCount); + stmt.setInt(7, logoutCount); + stmt.setString(8, userID); + stmt.executeUpdate(); + stmt.close(); + + stmt = getStatement(conn, createAccountProfileSQL); + stmt.setString(1, userID); + stmt.setString(2, password); + stmt.setString(3, fullname); + stmt.setString(4, address); + stmt.setString(5, email); + stmt.setString(6, creditcard); + stmt.executeUpdate(); + stmt.close(); + + commit(conn); + + accountData = new AccountDataBean(accountID, loginCount, logoutCount, lastLogin, creationDate, balance, openBalance, userID); + + } catch (Exception e) { + Log.error("TradeDirect:register -- error registering new user", e); + } finally { + releaseConn(conn); + } + return accountData; + } + + private AccountDataBean getAccountDataFromResultSet(ResultSet rs) throws Exception { + AccountDataBean accountData = null; + + if (!rs.next()) { + Log.error("TradeDirect:getAccountDataFromResultSet -- cannot find account data"); + } else { + accountData = new AccountDataBean(new Integer(rs.getInt("accountID")), rs.getInt("loginCount"), rs.getInt("logoutCount"), + rs.getTimestamp("lastLogin"), rs.getTimestamp("creationDate"), rs.getBigDecimal("balance"), rs.getBigDecimal("openBalance"), + rs.getString("profile_userID")); + } + return accountData; + } + + private AccountProfileDataBean getAccountProfileDataFromResultSet(ResultSet rs) throws Exception { + AccountProfileDataBean accountProfileData = null; + + if (!rs.next()) { + Log.error("TradeDirect:getAccountProfileDataFromResultSet -- cannot find accountprofile data"); + } else { + accountProfileData = new AccountProfileDataBean(rs.getString("userID"), rs.getString("passwd"), rs.getString("fullName"), rs.getString("address"), + rs.getString("email"), rs.getString("creditCard")); + } + + return accountProfileData; + } + + private HoldingDataBean getHoldingDataFromResultSet(ResultSet rs) throws Exception { + HoldingDataBean holdingData = null; + + holdingData = new HoldingDataBean(new Integer(rs.getInt("holdingID")), rs.getDouble("quantity"), rs.getBigDecimal("purchasePrice"), + rs.getTimestamp("purchaseDate"), rs.getString("quote_symbol")); + return holdingData; + } + + private QuoteDataBean getQuoteDataFromResultSet(ResultSet rs) throws Exception { + QuoteDataBean quoteData = null; + + quoteData = new QuoteDataBean(rs.getString("symbol"), rs.getString("companyName"), rs.getDouble("volume"), rs.getBigDecimal("price"), + rs.getBigDecimal("open1"), rs.getBigDecimal("low"), rs.getBigDecimal("high"), rs.getDouble("change1")); + return quoteData; + } + + private OrderDataBean getOrderDataFromResultSet(ResultSet rs) throws Exception { + OrderDataBean orderData = null; + + orderData = new OrderDataBean(new Integer(rs.getInt("orderID")), rs.getString("orderType"), rs.getString("orderStatus"), rs.getTimestamp("openDate"), + rs.getTimestamp("completionDate"), rs.getDouble("quantity"), rs.getBigDecimal("price"), rs.getBigDecimal("orderFee"), + rs.getString("quote_symbol")); + return orderData; + } + + public boolean recreateDBTables(Object[] sqlBuffer, java.io.PrintWriter out) throws Exception { + // Clear MDB Statistics + MDBStats.getInstance().reset(); + + Connection conn = null; + boolean success = false; + try { + + Log.trace("TradeDirect:recreateDBTables"); + + conn = getConn(); + Statement stmt = conn.createStatement(); + int bufferLength = sqlBuffer.length; + for (int i = 0; i < bufferLength; i++) { + try { + stmt.executeUpdate((String) sqlBuffer[i]); + // commit(conn); + } catch (SQLException ex) { + // Ignore DROP statements as tables won't always exist. + if (((String) sqlBuffer[i]).indexOf("DROP ") < 0) { + Log.error("TradeDirect:recreateDBTables SQL Exception thrown on executing the foll sql command: " + sqlBuffer[i], ex); + out.println("
    SQL Exception thrown on executing the foll sql command: " + sqlBuffer[i] + " . Check log for details.
    "); + } + } + } + stmt.close(); + commit(conn); + success = true; + } catch (Exception e) { + Log.error(e, "TradeDirect:recreateDBTables() -- Error dropping and recreating the database tables"); + } finally { + releaseConn(conn); + } + return success; + } + + ; + + + + private void releaseConn(Connection conn) throws Exception { + try { + if (conn != null) { + conn.close(); + if (Log.doTrace()) { + synchronized (lock) { + connCount--; + } + Log.trace("TradeDirect:releaseConn -- connection closed, connCount=" + connCount); + } + } + } catch (Exception e) { + Log.error("TradeDirect:releaseConnection -- failed to close connection", e); + } + } + + + /* + * Allocate a new connection to the datasource + */ + private static int connCount = 0; + + private static Integer lock = new Integer(0); + + private Connection getConn() throws Exception { + + Connection conn = datasource.getConnection(); + + if (!this.inGlobalTxn) { + conn.setAutoCommit(false); + } + if (Log.doTrace()) { + synchronized (lock) { + connCount++; + } + Log.trace("TradeDirect:getConn -- new connection allocated, IsolationLevel=" + conn.getTransactionIsolation() + " connectionCount = " + connCount); + } + + return conn; + } + + public Connection getConnPublic() throws Exception { + return getConn(); + } + + /* + * Commit the provided connection if not under Global Transaction scope - + * conn.commit() is not allowed in a global transaction. the txn manager + * will perform the commit + */ + private void commit(Connection conn) throws Exception { + if (!inSession) { + if ((getInGlobalTxn() == false) && (conn != null)) { + conn.commit(); + } + } + } + + /* + * Rollback the statement for the given connection + */ + private void rollBack(Connection conn, Exception e) throws Exception { + if (!inSession) { + Log.log("TradeDirect:rollBack -- rolling back conn due to previously caught exception -- inGlobalTxn=" + getInGlobalTxn()); + if ((getInGlobalTxn() == false) && (conn != null)) { + conn.rollback(); + } else { + throw e; // Throw the exception + // so the Global txn manager will rollBack + } + } + } + + /* + * Allocate a new prepared statment for this connection + */ + private PreparedStatement getStatement(Connection conn, String sql) throws Exception { + return conn.prepareStatement(sql); + } + + private PreparedStatement getStatement(Connection conn, String sql, int type, int concurrency) throws Exception { + return conn.prepareStatement(sql, type, concurrency); + } + + private static final String createQuoteSQL = "insert into quoteejb " + "( symbol, companyName, volume, price, open1, low, high, change1 ) " + + "VALUES ( ? , ? , ? , ? , ? , ? , ? , ? )"; + + private static final String createAccountSQL = "insert into accountejb " + + "( accountid, creationDate, openBalance, balance, lastLogin, loginCount, logoutCount, profile_userid) " + + "VALUES ( ? , ? , ? , ? , ? , ? , ? , ? )"; + + private static final String createAccountProfileSQL = "insert into accountprofileejb " + "( userid, passwd, fullname, address, email, creditcard ) " + + "VALUES ( ? , ? , ? , ? , ? , ? )"; + + private static final String createHoldingSQL = "insert into holdingejb " + + "( holdingid, purchaseDate, purchasePrice, quantity, quote_symbol, account_accountid ) " + "VALUES ( ? , ? , ? , ? , ? , ? )"; + + private static final String createOrderSQL = "insert into orderejb " + + "( orderid, ordertype, orderstatus, opendate, quantity, price, orderfee, account_accountid, holding_holdingid, quote_symbol) " + + "VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ?)"; + + private static final String removeHoldingSQL = "delete from holdingejb where holdingid = ?"; + + private static final String removeHoldingFromOrderSQL = "update orderejb set holding_holdingid=null where holding_holdingid = ?"; + + private static final String updateAccountProfileSQL = "update accountprofileejb set " + "passwd = ?, fullname = ?, address = ?, email = ?, creditcard = ? " + + "where userid = (select profile_userid from accountejb a " + "where a.profile_userid=?)"; + + private static final String loginSQL = "update accountejb set lastLogin=?, logincount=logincount+1 " + "where profile_userid=?"; + + private static final String logoutSQL = "update accountejb set logoutcount=logoutcount+1 " + "where profile_userid=?"; + + private static final String getAccountSQL = "select * from accountejb a where a.accountid = ?"; + + private static final String getAccountProfileSQL = "select * from accountprofileejb ap where ap.userid = " + + "(select profile_userid from accountejb a where a.profile_userid=?)"; + + private static final String getAccountProfileForAccountSQL = "select * from accountprofileejb ap where ap.userid = " + + "(select profile_userid from accountejb a where a.accountid=?)"; + + private static final String getAccountForUserSQL = "select * from accountejb a where a.profile_userid = " + + "( select userid from accountprofileejb ap where ap.userid = ?)"; + + private static final String getHoldingSQL = "select * from holdingejb h where h.holdingid = ?"; + + private static final String getHoldingsForUserSQL = "select * from holdingejb h where h.account_accountid = " + + "(select a.accountid from accountejb a where a.profile_userid = ?)"; + + private static final String getOrderSQL = "select * from orderejb o where o.orderid = ?"; + + private static final String getOrdersByUserSQL = "select * from orderejb o where o.account_accountid = " + + "(select a.accountid from accountejb a where a.profile_userid = ?)"; + + private static final String getClosedOrdersSQL = "select * from orderejb o " + "where o.orderstatus = 'closed' AND o.account_accountid = " + + "(select a.accountid from accountejb a where a.profile_userid = ?)"; + + private static final String getQuoteSQL = "select * from quoteejb q where q.symbol=?"; + + private static final String getAllQuotesSQL = "select * from quoteejb q"; + + private static final String getQuoteForUpdateSQL = "select * from quoteejb q where q.symbol=? For Update"; + + private static final String getTSIAQuotesOrderByChangeSQL = "select * from quoteejb q order by q.change1"; + + private static final String getTSIASQL = "select SUM(price)/count(*) as TSIA from quoteejb q "; + + private static final String getOpenTSIASQL = "select SUM(open1)/count(*) as openTSIA from quoteejb q "; + + private static final String getTSIATotalVolumeSQL = "select SUM(volume) as totalVolume from quoteejb q "; + + private static final String creditAccountBalanceSQL = "update accountejb set " + "balance = balance + ? " + "where accountid = ?"; + + private static final String updateOrderStatusSQL = "update orderejb set " + "orderstatus = ?, completiondate = ? " + "where orderid = ?"; + + private static final String updateOrderHoldingSQL = "update orderejb set " + "holding_holdingID = ? " + "where orderid = ?"; + + private static final String updateQuotePriceVolumeSQL = "update quoteejb set " + "price = ?, change1 = ?, volume = ? " + "where symbol = ?"; + + /** + * Gets the inGlobalTxn + * + * @return Returns a boolean + */ + private boolean getInGlobalTxn() { + return inGlobalTxn; + } + + /** + * Sets the inGlobalTxn + * + * @param inGlobalTxn + * The inGlobalTxn to set + */ + private void setInGlobalTxn(boolean inGlobalTxn) { + this.inGlobalTxn = inGlobalTxn; + } + + public void setInSession(boolean inSession) { + this.inSession = inSession; + } + + @Override + public int getImpl() { + return TradeConfig.DIRECT; + } + + + + @Override + public QuoteDataBean pingTwoPhase(String symbol) { + throw new UnsupportedOperationException(); + } + + + + @Override + public double investmentReturn(double rnd1, double rnd2) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java new file mode 100644 index 00000000..c9284dc7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java @@ -0,0 +1,472 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.direct; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; + +import javax.annotation.Resource; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.sql.DataSource; + +import com.ibm.websphere.samples.daytrader.beans.RunStatsDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeDB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.MDBStats; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * TradeBuildDB uses operations provided by the TradeApplication to (a) create the Database tables + * (b)populate a DayTrader database without creating the tables. Specifically, a + * new DayTrader User population is created using UserIDs of the form "uid:xxx" + * where xxx is a sequential number (e.g. uid:0, uid:1, etc.). New stocks are also created of the + * form "s:xxx", again where xxx represents sequential numbers (e.g. s:1, s:2, etc.) + */ +@ApplicationScoped +public class TradeDirectDBUtils implements TradeDB { + + // For Wildfly - add java:/ to this resource. + + @Resource(lookup = "jdbc/TradeDataSource") + //@Resource(lookup = "java:/jdbc/TradeDataSource") + private DataSource datasource; + + @Inject + @TradeJDBC + TradeServices ts; + + public String checkDBProductName() throws Exception { + Connection conn = null; + String dbProductName = null; + + try { + + conn = datasource.getConnection(); + DatabaseMetaData dbmd = conn.getMetaData(); + dbProductName = dbmd.getDatabaseProductName(); + } catch (SQLException e) { + Log.error(e, "TradeDirect:checkDBProductName() -- Error checking the Daytrader Database Product Name"); + } finally { + conn.close(); + } + return dbProductName; + } + + + /** + * Re-create the DayTrader db tables and populate them OR just populate a DayTrader DB, logging to the provided output stream + */ + public void buildDB(java.io.PrintWriter out, InputStream ddlFile) throws Exception { + String symbol, companyName; + int errorCount = 0; // Give up gracefully after 10 errors + + // TradeStatistics.statisticsEnabled=false; // disable statistics + out.println("
    TradeBuildDB: Building DayTrader Database...
    This operation will take several minutes. Please wait..."); + out.println(""); + + if (ddlFile != null) { + //out.println("
    TradeBuildDB: **** warPath= "+warPath+" ****
    "); + + boolean success = false; + + Object[] sqlBuffer = null; + + //parse the DDL file and fill the SQL commands into a buffer + try { + sqlBuffer = parseDDLToBuffer(ddlFile); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to parse DDL file"); + out.println("
    TradeBuildDB: **** Unable to parse DDL file for the specified database ****
    "); + return; + } + if ((sqlBuffer == null) || (sqlBuffer.length == 0)) { + out.println("
    TradeBuildDB: **** Parsing DDL file returned empty buffer, please check that a valid DB specific DDL file is available and retry ****
    "); + return; + } + + // send the sql commands buffer to drop and recreate the Daytrader tables + out.println("
    TradeBuildDB: **** Dropping and Recreating the DayTrader tables... ****
    "); + try { + success = recreateDBTables(sqlBuffer, out); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to drop and recreate DayTrader Db Tables, please check for database consistency before continuing"); + out.println("TradeBuildDB: Unable to drop and recreate DayTrader Db Tables, please check for database consistency before continuing"); + return; + } + if (!success) { + out.println("
    TradeBuildDB: **** Unable to drop and recreate DayTrader Db Tables, please check for database consistency before continuing ****
    "); + return; + } + out.println("
    TradeBuildDB: **** DayTrader tables successfully created! ****

    Please Stop and Re-start your Daytrader application (or your application server) and then use the \"Repopulate Daytrader Database\" link to populate your database.


    "); + return; + } // end of createDBTables + + out.println("
    TradeBuildDB: **** Creating " + TradeConfig.getMAX_QUOTES() + " Quotes ****
    "); + //Attempt to delete all of the Trade users and Trade Quotes first + try { + resetTrade(true); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to delete Trade users (uid:0, uid:1, ...) and Trade Quotes (s:0, s:1, ...)"); + } + for (int i = 0; i < TradeConfig.getMAX_QUOTES(); i++) { + symbol = "s:" + i; + companyName = "S" + i + " Incorporated"; + try { + ts.createQuote(symbol, companyName, new java.math.BigDecimal(TradeConfig.rndPrice())); + if (i % 10 == 0) { + out.print("....." + symbol); + if (i % 100 == 0) { + out.println(" -
    "); + out.flush(); + } + } + } catch (Exception e) { + if (errorCount++ >= 10) { + String error = "Populate Trade DB aborting after 10 create quote errors. Check the EJB datasource configuration. Check the log for details

    Exception is:
    " + + e.toString(); + Log.error(e, error); + throw e; + } + } + } + out.println("
    "); + out.println("
    **** Registering " + TradeConfig.getMAX_USERS() + " Users **** "); + errorCount = 0; //reset for user registrations + + // Registration is a formal operation in Trade 2. + for (int i = 0; i < TradeConfig.getMAX_USERS(); i++) { + String userID = "uid:" + i; + String fullname = TradeConfig.rndFullName(); + String email = TradeConfig.rndEmail(userID); + String address = TradeConfig.rndAddress(); + String creditcard = TradeConfig.rndCreditCard(); + double initialBalance = (double) (TradeConfig.rndInt(100000)) + 200000; + if (i == 0) { + initialBalance = 1000000; // uid:0 starts with a cool million. + } + try { + AccountDataBean accountData = ts.register(userID, "xxx", fullname, address, email, creditcard, new BigDecimal(initialBalance)); + + if (accountData != null) { + if (i % 50 == 0) { + out.print("
    Account# " + accountData.getAccountID() + " userID=" + userID); + } // end-if + + int holdings = TradeConfig.rndInt(TradeConfig.getMAX_HOLDINGS() + 1); // 0-MAX_HOLDING (inclusive), avg holdings per user = (MAX-0)/2 + double quantity = 0; + + for (int j = 0; j < holdings; j++) { + symbol = TradeConfig.rndSymbol(); + quantity = TradeConfig.rndQuantity(); + ts.buy(userID, symbol, quantity, TradeConfig.getOrderProcessingMode()); + } // end-for + if (i % 50 == 0) { + out.println(" has " + holdings + " holdings."); + out.flush(); + } // end-if + } else { + out.println("
    UID " + userID + " already registered.
    "); + out.flush(); + } // end-if + + } catch (Exception e) { + if (errorCount++ >= 10) { + String error = "Populate Trade DB aborting after 10 user registration errors. Check the log for details.

    Exception is:
    " + + e.toString(); + Log.error(e, error); + throw e; + } + } + } // end-for + out.println(""); + } + + private boolean recreateDBTables(Object[] sqlBuffer, java.io.PrintWriter out) throws Exception { + // Clear MDB Statistics + MDBStats.getInstance().reset(); + + Connection conn = null; + boolean success = false; + try { + conn = datasource.getConnection(); + Statement stmt = conn.createStatement(); + int bufferLength = sqlBuffer.length; + for (int i = 0; i < bufferLength; i++) { + try { + stmt.executeUpdate((String) sqlBuffer[i]); + // commit(conn); + } catch (SQLException ex) { + // Ignore DROP statements as tables won't always exist. + if (((String) sqlBuffer[i]).indexOf("DROP ") < 0) { + Log.error("TradeDirect:recreateDBTables SQL Exception thrown on executing the foll sql command: " + sqlBuffer[i], ex); + out.println("
    SQL Exception thrown on executing the foll sql command: " + sqlBuffer[i] + " . Check log for details.
    "); + } + } + } + stmt.close(); + conn.commit(); + success = true; + } catch (Exception e) { + Log.error(e, "TradeDirect:recreateDBTables() -- Error dropping and recreating the database tables"); + } finally { + conn.close(); + } + return success; + } + + + public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception { + // Clear MDB Statistics + MDBStats.getInstance().reset(); + // Reset Trade + + RunStatsDataBean runStatsData = new RunStatsDataBean(); + Connection conn = null; + try { + + conn = datasource.getConnection(); + conn.setAutoCommit(false); + PreparedStatement stmt = null; + ResultSet rs = null; + + if (deleteAll) { + try { + stmt = getStatement(conn, "delete from quoteejb"); + stmt.executeUpdate(); + stmt.close(); + stmt = getStatement(conn, "delete from accountejb"); + stmt.executeUpdate(); + stmt.close(); + stmt = getStatement(conn, "delete from accountprofileejb"); + stmt.executeUpdate(); + stmt.close(); + stmt = getStatement(conn, "delete from holdingejb"); + stmt.executeUpdate(); + stmt.close(); + stmt = getStatement(conn, "delete from orderejb"); + stmt.executeUpdate(); + stmt.close(); + // FUTURE: - DuplicateKeyException - For now, don't start at + // zero as KeySequenceDirect and KeySequenceBean will still + // give out + // the cached Block and then notice this change. Better + // solution is + // to signal both classes to drop their cached blocks + // stmt = getStatement(conn, "delete from keygenejb"); + // stmt.executeUpdate(); + // stmt.close(); + conn.commit(); + } catch (Exception e) { + Log.error(e, "TradeDirect:resetTrade(deleteAll) -- Error deleting Trade users and stock from the Trade database"); + } + return runStatsData; + } + + stmt = getStatement(conn, "delete from holdingejb where holdingejb.account_accountid is null"); + stmt.executeUpdate(); + stmt.close(); + + // Count and Delete newly registered users (users w/ id that start + // "ru:%": + stmt = getStatement(conn, "delete from accountprofileejb where userid like 'ru:%'"); + stmt.executeUpdate(); + stmt.close(); + + stmt = getStatement(conn, "delete from orderejb where account_accountid in (select accountid from accountejb a where a.profile_userid like 'ru:%')"); + stmt.executeUpdate(); + stmt.close(); + + stmt = getStatement(conn, + "delete from holdingejb where account_accountid in (select accountid from accountejb a where a.profile_userid like 'ru:%')"); + stmt.executeUpdate(); + stmt.close(); + + stmt = getStatement(conn, "delete from accountejb where profile_userid like 'ru:%'"); + int newUserCount = stmt.executeUpdate(); + runStatsData.setNewUserCount(newUserCount); + stmt.close(); + + // Count of trade users + stmt = getStatement(conn, "select count(accountid) as \"tradeUserCount\" from accountejb a where a.profile_userid like 'uid:%'"); + rs = stmt.executeQuery(); + rs.next(); + int tradeUserCount = rs.getInt("tradeUserCount"); + runStatsData.setTradeUserCount(tradeUserCount); + stmt.close(); + + rs.close(); + // Count of trade stocks + stmt = getStatement(conn, "select count(symbol) as \"tradeStockCount\" from quoteejb a where a.symbol like 's:%'"); + rs = stmt.executeQuery(); + rs.next(); + int tradeStockCount = rs.getInt("tradeStockCount"); + runStatsData.setTradeStockCount(tradeStockCount); + stmt.close(); + + // Count of trade users login, logout + stmt = getStatement(conn, + "select sum(loginCount) as \"sumLoginCount\", sum(logoutCount) as \"sumLogoutCount\" from accountejb a where a.profile_userID like 'uid:%'"); + rs = stmt.executeQuery(); + rs.next(); + int sumLoginCount = rs.getInt("sumLoginCount"); + int sumLogoutCount = rs.getInt("sumLogoutCount"); + runStatsData.setSumLoginCount(sumLoginCount); + runStatsData.setSumLogoutCount(sumLogoutCount); + stmt.close(); + + rs.close(); + // Update logoutcount and loginCount back to zero + + stmt = getStatement(conn, "update accountejb set logoutCount=0,loginCount=0 where profile_userID like 'uid:%'"); + stmt.executeUpdate(); + stmt.close(); + + // count holdings for trade users + stmt = getStatement(conn, "select count(holdingid) as \"holdingCount\" from holdingejb h where h.account_accountid in " + + "(select accountid from accountejb a where a.profile_userid like 'uid:%')"); + + rs = stmt.executeQuery(); + rs.next(); + int holdingCount = rs.getInt("holdingCount"); + runStatsData.setHoldingCount(holdingCount); + stmt.close(); + rs.close(); + + // count orders for trade users + stmt = getStatement(conn, "select count(orderid) as \"orderCount\" from orderejb o where o.account_accountid in " + + "(select accountid from accountejb a where a.profile_userid like 'uid:%')"); + + rs = stmt.executeQuery(); + rs.next(); + int orderCount = rs.getInt("orderCount"); + runStatsData.setOrderCount(orderCount); + stmt.close(); + rs.close(); + + // count orders by type for trade users + stmt = getStatement(conn, "select count(orderid) \"buyOrderCount\"from orderejb o where (o.account_accountid in " + + "(select accountid from accountejb a where a.profile_userid like 'uid:%')) AND " + " (o.orderType='buy')"); + + rs = stmt.executeQuery(); + rs.next(); + int buyOrderCount = rs.getInt("buyOrderCount"); + runStatsData.setBuyOrderCount(buyOrderCount); + stmt.close(); + rs.close(); + + // count orders by type for trade users + stmt = getStatement(conn, "select count(orderid) \"sellOrderCount\"from orderejb o where (o.account_accountid in " + + "(select accountid from accountejb a where a.profile_userid like 'uid:%')) AND " + " (o.orderType='sell')"); + + rs = stmt.executeQuery(); + rs.next(); + int sellOrderCount = rs.getInt("sellOrderCount"); + runStatsData.setSellOrderCount(sellOrderCount); + stmt.close(); + rs.close(); + + // Delete cancelled orders + stmt = getStatement(conn, "delete from orderejb where orderStatus='cancelled'"); + int cancelledOrderCount = stmt.executeUpdate(); + runStatsData.setCancelledOrderCount(cancelledOrderCount); + stmt.close(); + rs.close(); + + // count open orders by type for trade users + stmt = getStatement(conn, "select count(orderid) \"openOrderCount\"from orderejb o where (o.account_accountid in " + + "(select accountid from accountejb a where a.profile_userid like 'uid:%')) AND " + " (o.orderStatus='open')"); + + rs = stmt.executeQuery(); + rs.next(); + int openOrderCount = rs.getInt("openOrderCount"); + runStatsData.setOpenOrderCount(openOrderCount); + + stmt.close(); + rs.close(); + // Delete orders for holding which have been purchased and sold + stmt = getStatement(conn, "delete from orderejb where holding_holdingid is null"); + int deletedOrderCount = stmt.executeUpdate(); + runStatsData.setDeletedOrderCount(deletedOrderCount); + stmt.close(); + rs.close(); + + conn.commit(); + + System.out.println("TradeDirect:reset Run stats data\n\n" + runStatsData); + } catch (Exception e) { + Log.error(e, "Failed to reset Trade"); + conn.rollback(); + throw e; + } finally { + conn.close(); + } + return runStatsData; + + } + + private PreparedStatement getStatement(Connection conn, String sql) throws Exception { + return conn.prepareStatement(sql); + } + + public Object[] parseDDLToBuffer(InputStream ddlFile) throws Exception { + BufferedReader br = null; + ArrayList sqlBuffer = new ArrayList(30); //initial capacity 30 assuming we have 30 ddl-sql statements to read + + try { + br = new BufferedReader(new InputStreamReader(ddlFile)); + String s; + String sql = new String(); + while ((s = br.readLine()) != null) { + s = s.trim(); + if ((s.length() != 0) && (s.charAt(0) != '#')) // Empty lines or lines starting with "#" are ignored + { + sql = sql + " " + s; + if (s.endsWith(";")) { // reached end of sql statement + sql = sql.replace(';', ' '); //remove the semicolon + sqlBuffer.add(sql); + sql = ""; + } + } + } + } catch (IOException ex) { + Log.error("TradeBuildDB:parseDDLToBuffer Exeception during open/read of File: " + ddlFile, ex); + throw ex; + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + Log.error("TradeBuildDB:parseDDLToBuffer Failed to close BufferedReader", ex); + } + } + } + return sqlBuffer.toArray(); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrder.java new file mode 100644 index 00000000..5b00b1bb --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrder.java @@ -0,0 +1,59 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.ejb3; + + +import javax.enterprise.context.Dependent; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; + +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + + +@Dependent +public class AsyncScheduledOrder implements Runnable { + + TradeServices tradeService; + + Integer orderID; + boolean twoPhase; + + @Inject + public AsyncScheduledOrder(@Any Instance services) { + tradeService = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + public void setProperties(Integer orderID, boolean twoPhase) { + this.orderID = orderID; + this.twoPhase = twoPhase; + } + + @Override + public void run() { + + + try { + tradeService.completeOrder(orderID, twoPhase); + + } catch (Exception e) { + + e.printStackTrace(); + } + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrderSubmitter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrderSubmitter.java new file mode 100644 index 00000000..24290eda --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/AsyncScheduledOrderSubmitter.java @@ -0,0 +1,41 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.ejb3; + +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedScheduledExecutorService; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; + +@RequestScoped +public class AsyncScheduledOrderSubmitter { + + + @Resource + private ManagedScheduledExecutorService mes; + + @Inject + private AsyncScheduledOrder asyncOrder; + + + public Future submitOrder(Integer orderID, boolean twoPhase) { + asyncOrder.setProperties(orderID,twoPhase); + return mes.schedule(asyncOrder,500,TimeUnit.MILLISECONDS); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/MarketSummarySingleton.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/MarketSummarySingleton.java new file mode 100644 index 00000000..ceef6ff0 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/MarketSummarySingleton.java @@ -0,0 +1,138 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.ejb3; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; +import javax.ejb.Lock; +import javax.ejb.LockType; +import javax.ejb.Schedule; +import javax.ejb.Singleton; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.enterprise.event.Event; +import javax.enterprise.event.NotificationOptions; +import javax.inject.Inject; +import javax.json.JsonObject; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.MarketSummaryUpdate; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Singleton +public class MarketSummarySingleton { + + private MarketSummaryDataBean marketSummaryDataBean; + + @PersistenceContext + private EntityManager entityManager; + + @Inject + @MarketSummaryUpdate + Event mkSummaryUpdateEvent; + + @Resource + private ManagedExecutorService mes; + + + /* Update Market Summary every 20 seconds */ + @Schedule(second = "*/20",minute = "*", hour = "*", persistent = false) + private void updateMarketSummary() { + + + Log.trace("MarketSummarySingleton:updateMarketSummary -- updating market summary"); + + + if (TradeConfig.getRunTimeMode() != TradeConfig.EJB3) + { + Log.trace("MarketSummarySingleton:updateMarketSummary -- Not EJB3 Mode, so not updating"); + return; // Only do the actual work if in EJB3 Mode + } + + List quotes; + + try { + // Find Trade Stock Index Quotes (Top 100 quotes) ordered by their change in value + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(QuoteDataBean.class); + Root quoteRoot = criteriaQuery.from(QuoteDataBean.class); + criteriaQuery.orderBy(criteriaBuilder.desc(quoteRoot.get("change1"))); + criteriaQuery.select(quoteRoot); + TypedQuery q = entityManager.createQuery(criteriaQuery); + quotes = q.getResultList(); + } catch (Exception e) { + Log.debug("Warning: The database has not been configured. If this is the first time the application has been started, please create and populate the database tables. Then restart the server."); + return; + } + + /* TODO: Make this cleaner? */ + QuoteDataBean[] quoteArray = quotes.toArray(new QuoteDataBean[quotes.size()]); + ArrayList topGainers = new ArrayList(5); + ArrayList topLosers = new ArrayList(5); + BigDecimal TSIA = FinancialUtils.ZERO; + BigDecimal openTSIA = FinancialUtils.ZERO; + double totalVolume = 0.0; + + if (quoteArray.length > 5) { + for (int i = 0; i < 5; i++) { + topGainers.add(quoteArray[i]); + } + for (int i = quoteArray.length - 1; i >= quoteArray.length - 5; i--) { + topLosers.add(quoteArray[i]); + } + + for (QuoteDataBean quote : quoteArray) { + BigDecimal price = quote.getPrice(); + BigDecimal open = quote.getOpen(); + double volume = quote.getVolume(); + TSIA = TSIA.add(price); + openTSIA = openTSIA.add(open); + totalVolume += volume; + } + TSIA = TSIA.divide(new BigDecimal(quoteArray.length), FinancialUtils.ROUND); + openTSIA = openTSIA.divide(new BigDecimal(quoteArray.length), FinancialUtils.ROUND); + } + + setMarketSummaryDataBean(new MarketSummaryDataBean(TSIA, openTSIA, totalVolume, topGainers, topLosers)); + mkSummaryUpdateEvent.fireAsync("MarketSummaryUpdate", NotificationOptions.builder().setExecutor(mes).build()); + } + + @Lock(LockType.READ) + public MarketSummaryDataBean getMarketSummaryDataBean() { + if (marketSummaryDataBean == null){ + updateMarketSummary(); + } + + return marketSummaryDataBean; + } + + @Lock(LockType.WRITE) + public void setMarketSummaryDataBean(MarketSummaryDataBean marketSummaryDataBean) { + this.marketSummaryDataBean = marketSummaryDataBean; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java new file mode 100644 index 00000000..780e5219 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java @@ -0,0 +1,618 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.ejb3; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.util.Collection; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.ejb.EJB; +import javax.ejb.EJBException; +import javax.ejb.SessionContext; +import javax.ejb.Stateless; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.ejb.TransactionManagement; +import javax.ejb.TransactionManagementType; +import javax.inject.Inject; +import javax.jms.JMSContext; +import javax.jms.Queue; +import javax.jms.QueueConnectionFactory; +import javax.jms.TextMessage; +import javax.jms.Topic; +import javax.jms.TopicConnectionFactory; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import javax.transaction.RollbackException; +import javax.validation.constraints.NotNull; + +import com.ibm.websphere.samples.daytrader.interfaces.RuntimeMode; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.RecentQuotePriceChangeList; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Stateless +@TradeEJB +@RuntimeMode("Full EJB3") +@Trace +@TransactionAttribute(TransactionAttributeType.REQUIRED) +@TransactionManagement(TransactionManagementType.CONTAINER) +public class TradeSLSBBean implements TradeServices { + + // For Wildfly - add java:/ to these resource names. + @Resource(name = "jms/QueueConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + //@Resource(name = "java:/jms/QueueConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private QueueConnectionFactory queueConnectionFactory; + + @Resource(name = "jms/TopicConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + //@Resource(name = "java:/jms/TopicConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private TopicConnectionFactory topicConnectionFactory; + + @Resource(lookup = "jms/TradeStreamerTopic") + //@Resource(lookup = "java:/jms/TradeStreamerTopic") + private Topic tradeStreamerTopic; + + @Resource(lookup = "jms/TradeBrokerQueue") + //@Resource(lookup = "java:/jms/TradeBrokerQueue") + private Queue tradeBrokerQueue; + + @PersistenceContext + private EntityManager entityManager; + + @Resource + private SessionContext context; + + @EJB + MarketSummarySingleton marketSummarySingleton; + + @Inject + AsyncScheduledOrderSubmitter asyncEJBOrderSubmitter; + + @Inject + RecentQuotePriceChangeList recentQuotePriceChangeList; + + @Override + public MarketSummaryDataBean getMarketSummary() { + return marketSummarySingleton.getMarketSummaryDataBean(); + } + + @Override + @NotNull + public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) { + OrderDataBean order = null; + BigDecimal total; + try { + + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + AccountDataBean account = profile.getAccount(); + QuoteDataBean quote = entityManager.find(QuoteDataBean.class, symbol); + HoldingDataBean holding = null; // The holding will be created by + // this buy order + + order = createOrder(account, quote, holding, "buy", quantity); + + // UPDATE - account should be credited during completeOrder + BigDecimal price = quote.getPrice(); + BigDecimal orderFee = order.getOrderFee(); + BigDecimal balance = account.getBalance(); + total = (new BigDecimal(quantity).multiply(price)).add(orderFee); + account.setBalance(balance.subtract(total)); + final Integer orderID=order.getOrderID(); + + if (orderProcessingMode == TradeConfig.SYNCH) { + completeOrder(orderID, false); + } else if (orderProcessingMode == TradeConfig.ASYNCH) { + completeOrderAsync(orderID, false); + } else if (orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + queueOrder(orderID, true); + } + } catch (Exception e) { + Log.error("TradeSLSBBean:buy(" + userID + "," + symbol + "," + quantity + ") --> failed", e); + /* On exception - cancel the order */ + // TODO figure out how to do this with JPA + // if (order != null) order.cancel(); + throw new EJBException(e); + } + return order; + } + + @Override + @NotNull + public OrderDataBean sell(final String userID, final Integer holdingID, int orderProcessingMode) { + OrderDataBean order=null; + BigDecimal total; + try { + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + AccountDataBean account = profile.getAccount(); + + HoldingDataBean holding = entityManager.find(HoldingDataBean.class, holdingID); + + if (holding == null) { + Log.debug("TradeSLSBBean:sell User " + userID + " attempted to sell holding " + holdingID + " which has already been sold"); + + OrderDataBean orderData = new OrderDataBean(); + orderData.setOrderStatus("cancelled"); + entityManager.persist(orderData); + + return orderData; + } + + QuoteDataBean quote = holding.getQuote(); + double quantity = holding.getQuantity(); + + order = createOrder(account, quote, holding, "sell", quantity); + + // UPDATE the holding purchase data to signify this holding is + // "inflight" to be sold + // -- could add a new holdingStatus attribute to holdingEJB + holding.setPurchaseDate(new java.sql.Timestamp(0)); + + // UPDATE - account should be credited during completeOrder + BigDecimal price = quote.getPrice(); + BigDecimal orderFee = order.getOrderFee(); + BigDecimal balance = account.getBalance(); + total = (new BigDecimal(quantity).multiply(price)).subtract(orderFee); + account.setBalance(balance.add(total)); + final Integer orderID=order.getOrderID(); + + if (orderProcessingMode == TradeConfig.SYNCH) { + completeOrder(orderID, false); + } else if (orderProcessingMode == TradeConfig.ASYNCH) { + completeOrderAsync(orderID, false); + } else if (orderProcessingMode == TradeConfig.ASYNCH_2PHASE) { + queueOrder(orderID, true); + } + + } catch (Exception e) { + Log.error("TradeSLSBBean:sell(" + userID + "," + holdingID + ") --> failed", e); + // if (order != null) order.cancel(); + // UPDATE - handle all exceptions like: + throw new EJBException("TradeSLSBBean:sell(" + userID + "," + holdingID + ")", e); + } + return order; + } + + public void queueOrder(Integer orderID, boolean twoPhase) { + + // 2 phase + try (JMSContext queueContext = queueConnectionFactory.createContext();) { + TextMessage message = queueContext.createTextMessage(); + + message.setStringProperty("command", "neworder"); + message.setIntProperty("orderID", orderID); + message.setBooleanProperty("twoPhase", twoPhase); + message.setText("neworder: orderID=" + orderID + " runtimeMode=EJB twoPhase=" + twoPhase); + message.setLongProperty("publishTime", System.currentTimeMillis()); + + queueContext.createProducer().send(tradeBrokerQueue, message); + + } catch (Exception e) { + throw new EJBException(e.getMessage(), e); // pass the exception + } + } + + @Override + public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception { + OrderDataBean order = entityManager.find(OrderDataBean.class, orderID); + + if (order == null) { + System.out.println("error"); + throw new EJBException("Error: attempt to complete Order that is null\n" + order); + } + + order.getQuote(); + + if (order.isCompleted()) { + throw new EJBException("Error: attempt to complete Order that is already completed\n" + order); + } + + AccountDataBean account = order.getAccount(); + QuoteDataBean quote = order.getQuote(); + HoldingDataBean holding = order.getHolding(); + BigDecimal price = order.getPrice(); + double quantity = order.getQuantity(); + + if (order.isBuy()) { + /* + * Complete a Buy operation - create a new Holding for the Account - + * deduct the Order cost from the Account balance + */ + + HoldingDataBean newHolding = createHolding(account, quote, quantity, price); + order.setHolding(newHolding); + order.setOrderStatus("closed"); + order.setCompletionDate(new java.sql.Timestamp(System.currentTimeMillis())); + updateQuotePriceVolume(quote.getSymbol(), TradeConfig.getRandomPriceChangeFactor(), quantity); + } + + if (order.isSell()) { + /* + * Complete a Sell operation - remove the Holding from the Account - + * deposit the Order proceeds to the Account balance + */ + if (holding == null) { + Log.debug("TradeSLSBBean:completeOrder -- Unable to sell order " + order.getOrderID() + " holding already sold"); + order.cancel(); + //throw new EJBException("TradeSLSBBean:completeOrder -- Unable to sell order " + order.getOrderID() + " holding already sold"); + } else { + entityManager.remove(holding); + order.setHolding(null); + order.setOrderStatus("closed"); + order.setCompletionDate(new java.sql.Timestamp(System.currentTimeMillis())); + updateQuotePriceVolume(quote.getSymbol(), TradeConfig.getRandomPriceChangeFactor(), quantity); + } + } + + Log.trace("TradeSLSBBean:completeOrder--> Completed Order " + order.getOrderID() + "\n\t Order info: " + order + "\n\t Account info: " + account + + "\n\t Quote info: " + quote + "\n\t Holding info: " + holding); + + return order; + } + + @Override + public Future completeOrderAsync(Integer orderID, boolean twoPhase) throws Exception { + asyncEJBOrderSubmitter.submitOrder(orderID, twoPhase); + return null; + } + + @Override + public void cancelOrder(Integer orderID, boolean twoPhase) { + OrderDataBean order = entityManager.find(OrderDataBean.class, orderID); + order.cancel(); + } + + @Override + public void orderCompleted(String userID, Integer orderID) { + throw new UnsupportedOperationException("TradeSLSBBean:orderCompleted method not supported"); + } + + @Override + public Collection getOrders(String userID) { + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + AccountDataBean account = profile.getAccount(); + return account.getOrders(); + } + + @Override + public Collection getClosedOrders(String userID) { + + try { + /* I want to do a CriteriaUpdate here, but there are issues with JBoss/Hibernate */ + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(OrderDataBean.class); + Root orders = criteriaQuery.from(OrderDataBean.class); + criteriaQuery.select(orders); + criteriaQuery.where( + criteriaBuilder.equal(orders.get("orderStatus"), + criteriaBuilder.parameter(String.class, "p_status")), + criteriaBuilder.equal(orders.get("account").get("profile").get("userID"), + criteriaBuilder.parameter(String.class, "p_userid"))); + + TypedQuery q = entityManager.createQuery(criteriaQuery); + q.setParameter("p_status", "closed"); + q.setParameter("p_userid", userID); + List results = q.getResultList(); + + Iterator itr = results.iterator(); + // Spin through the orders to remove or mark completed + while (itr.hasNext()) { + OrderDataBean order = itr.next(); + // TODO: Investigate ConncurrentModification Exceptions + if (TradeConfig.getLongRun()) { + //Added this for Longruns (to prevent orderejb growth) + entityManager.remove(order); + } + else { + order.setOrderStatus("completed"); + } + } + + return results; + } catch (Exception e) { + Log.error("TradeSLSBBean.getClosedOrders", e); + throw new EJBException("TradeSLSBBean.getClosedOrders - error", e); + } + } + + @Override + public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) { + try { + QuoteDataBean quote = new QuoteDataBean(symbol, companyName, 0, price, price, price, price, 0); + entityManager.persist(quote); + + Log.trace("TradeSLSBBean:createQuote-->" + quote); + + return quote; + } catch (Exception e) { + Log.error("TradeSLSBBean:createQuote -- exception creating Quote", e); + throw new EJBException(e); + } + } + + @Override + public QuoteDataBean getQuote(String symbol) { + return entityManager.find(QuoteDataBean.class, symbol); + } + + @Override + public Collection getAllQuotes() { + TypedQuery query = entityManager.createNamedQuery("quoteejb.allQuotes", QuoteDataBean.class); + return query.getResultList(); + } + + @Override + public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal changeFactor, double sharesTraded) { + if (!TradeConfig.getUpdateQuotePrices()) { + return new QuoteDataBean(); + } + + Log.trace("TradeSLSBBean:updateQuote", symbol, changeFactor); + + TypedQuery q = entityManager.createNamedQuery("quoteejb.quoteForUpdate", QuoteDataBean.class); + q.setParameter(1, symbol); + QuoteDataBean quote = q.getSingleResult(); + + BigDecimal oldPrice = quote.getPrice(); + BigDecimal openPrice = quote.getOpen(); + + if (oldPrice.equals(TradeConfig.PENNY_STOCK_PRICE)) { + changeFactor = TradeConfig.PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER; + } else if (oldPrice.compareTo(TradeConfig.MAXIMUM_STOCK_PRICE) > 0) { + changeFactor = TradeConfig.MAXIMUM_STOCK_SPLIT_MULTIPLIER; + } + + BigDecimal newPrice = changeFactor.multiply(oldPrice).setScale(2, BigDecimal.ROUND_HALF_UP); + + quote.setPrice(newPrice); + quote.setChange(newPrice.subtract(openPrice).doubleValue()); + quote.setVolume(quote.getVolume() + sharesTraded); + entityManager.merge(quote); + + if (TradeConfig.getPublishQuotePriceChange()) { + publishQuotePriceChange(quote, oldPrice, changeFactor, sharesTraded); + } + + recentQuotePriceChangeList.add(quote); + + return quote; + } + + @Override + public Collection<@NotNull HoldingDataBean> getHoldings(String userID) { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(HoldingDataBean.class); + Root holdings = criteriaQuery.from(HoldingDataBean.class); + criteriaQuery.where( + criteriaBuilder.equal(holdings.get("account").get("profile").get("userID"), + criteriaBuilder.parameter(String.class, "p_userid"))); + criteriaQuery.select(holdings); + + TypedQuery typedQuery = entityManager.createQuery(criteriaQuery); + typedQuery.setParameter("p_userid", userID); + return typedQuery.getResultList(); + } + + @Override + public HoldingDataBean getHolding(Integer holdingID) { + return entityManager.find(HoldingDataBean.class, holdingID); + } + + @Override + public AccountDataBean getAccountData(String userID) { + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + AccountDataBean account = profile.getAccount(); + + // Added to populate transient field for account + account.setProfileID(profile.getUserID()); + + return account; + } + + @Override + public AccountProfileDataBean getAccountProfileData(String userID) { + return entityManager.find(AccountProfileDataBean.class, userID); + } + + @Override + public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) { + AccountProfileDataBean temp = entityManager.find(AccountProfileDataBean.class, profileData.getUserID()); + temp.setAddress(profileData.getAddress()); + temp.setPassword(profileData.getPassword()); + temp.setFullName(profileData.getFullName()); + temp.setCreditCard(profileData.getCreditCard()); + temp.setEmail(profileData.getEmail()); + + entityManager.merge(temp); + + return temp; + } + + @Override + public AccountDataBean login(String userID, String password) throws RollbackException { + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + if (profile == null) { + throw new EJBException("No such user: " + userID); + } + + AccountDataBean account = profile.getAccount(); + account.login(password); + + Log.trace("TradeSLSBBean:login(" + userID + "," + password + ") success" + account); + + return account; + } + + @Override + public void logout(String userID) { + AccountProfileDataBean profile = entityManager.find(AccountProfileDataBean.class, userID); + AccountDataBean account = profile.getAccount(); + account.logout(); + + Log.trace("TradeSLSBBean:logout(" + userID + ") success"); + } + + @Override + public AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) { + AccountDataBean account = null; + AccountProfileDataBean profile = null; + + // Check to see if a profile with the desired userID already exists + profile = entityManager.find(AccountProfileDataBean.class, userID); + + if (profile != null) { + Log.error("Failed to register new Account - AccountProfile with userID(" + userID + ") already exists"); + return null; + } else { + profile = new AccountProfileDataBean(userID, password, fullname, address, email, creditcard); + account = new AccountDataBean(0, 0, null, new Timestamp(System.currentTimeMillis()), openBalance, openBalance, userID); + + profile.setAccount(account); + account.setProfile(profile); + + entityManager.persist(profile); + entityManager.persist(account); + } + + return account; + } + + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public void publishQuotePriceChange(QuoteDataBean quote, BigDecimal oldPrice, BigDecimal changeFactor, double sharesTraded) { + if (!TradeConfig.getPublishQuotePriceChange()) { + return; + } + + try (JMSContext topicContext = topicConnectionFactory.createContext();) { + TextMessage message = topicContext.createTextMessage(); + + message.setStringProperty("command", "updateQuote"); + message.setStringProperty("symbol", quote.getSymbol()); + message.setStringProperty("company", quote.getCompanyName()); + message.setStringProperty("price", quote.getPrice().toString()); + message.setStringProperty("oldPrice", oldPrice.toString()); + message.setStringProperty("open", quote.getOpen().toString()); + message.setStringProperty("low", quote.getLow().toString()); + message.setStringProperty("high", quote.getHigh().toString()); + message.setDoubleProperty("volume", quote.getVolume()); + message.setStringProperty("changeFactor", changeFactor.toString()); + message.setDoubleProperty("sharesTraded", sharesTraded); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Update Stock price for " + quote.getSymbol() + " old price = " + oldPrice + " new price = " + quote.getPrice()); + + topicContext.createProducer().send(tradeStreamerTopic, message); + } catch (Exception e) { + throw new EJBException(e.getMessage(), e); // pass the exception + } + } + + public OrderDataBean createOrder(AccountDataBean account, QuoteDataBean quote, HoldingDataBean holding, String orderType, double quantity) { + OrderDataBean order; + + try { + order = new OrderDataBean(orderType, "open", new Timestamp(System.currentTimeMillis()), null, quantity, quote.getPrice().setScale( + FinancialUtils.SCALE, FinancialUtils.ROUND), TradeConfig.getOrderFee(orderType), account, quote, holding); + entityManager.persist(order); + } catch (Exception e) { + Log.error("TradeSLSBBean:createOrder -- failed to create Order. The stock/quote may not exist in the database.", e); + throw new EJBException("TradeSLSBBean:createOrder -- failed to create Order. Check that the symbol exists in the database.", e); + } + return order; + } + + private HoldingDataBean createHolding(AccountDataBean account, QuoteDataBean quote, double quantity, BigDecimal purchasePrice) throws Exception { + HoldingDataBean newHolding = new HoldingDataBean(quantity, purchasePrice, new Timestamp(System.currentTimeMillis()), account, quote); + entityManager.persist(newHolding); + return newHolding; + } + + @Override + public double investmentReturn(double investment, double NetValue) throws Exception { + double diff = NetValue - investment; + double ir = diff / investment; + return ir; + } + + @Override + public QuoteDataBean pingTwoPhase(String symbol) throws Exception { + QuoteDataBean quoteData = null; + + try (JMSContext queueContext = queueConnectionFactory.createContext();) { + // Get a Quote and send a JMS message in a 2-phase commit + quoteData = entityManager.find(QuoteDataBean.class, symbol); + + double sharesTraded = (Math.random() * 100) + 1 ; + BigDecimal oldPrice = quoteData.getPrice(); + BigDecimal openPrice = quoteData.getOpen(); + BigDecimal changeFactor = new BigDecimal (Math.random() * 100); + + BigDecimal newPrice = changeFactor.multiply(oldPrice).setScale(2, BigDecimal.ROUND_HALF_UP); + + quoteData.setPrice(newPrice); + quoteData.setChange(newPrice.subtract(openPrice).doubleValue()); + quoteData.setVolume(quoteData.getVolume() + sharesTraded); + entityManager.merge(quoteData); + + TextMessage message = queueContext.createTextMessage(); + + message.setStringProperty("command", "ping"); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Ping message for queue java:comp/env/jms/TradeBrokerQueue sent from TradeSLSBBean:pingTwoPhase at " + new java.util.Date()); + queueContext.createProducer().send(tradeBrokerQueue, message); + } catch (Exception e) { + Log.error("TradeSLSBBean:pingTwoPhase -- exception caught", e); + } + + return quoteData; + } + + class quotePriceComparator implements Comparator { + @Override + public int compare(QuoteDataBean quote1, QuoteDataBean quote2) { + double change1 = quote1.getChange(); + double change2 = quote2.getChange(); + return new Double(change2).compareTo(change1); + } + } + + @Override + public int getImpl() { + return TradeConfig.EJB3; + } + + @Override + public void setInSession(boolean inSession) { + throw new UnsupportedOperationException("TradeSLSBBean::setInGlobalTxn not supported"); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/session2direct/DirectSLSBBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/session2direct/DirectSLSBBean.java new file mode 100644 index 00000000..b6cabe9b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/impl/session2direct/DirectSLSBBean.java @@ -0,0 +1,237 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.impl.session2direct; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.concurrent.Future; + +import javax.ejb.Stateless; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.ejb.TransactionManagement; +import javax.ejb.TransactionManagementType; +import javax.inject.Inject; +import javax.validation.constraints.NotNull; + +import com.ibm.websphere.samples.daytrader.interfaces.RuntimeMode; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.interfaces.TradeSession2Direct; +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.impl.ejb3.AsyncScheduledOrderSubmitter; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Stateless +@TradeSession2Direct +@RuntimeMode("Session to Direct") +@Trace +@TransactionAttribute(TransactionAttributeType.REQUIRED) +@TransactionManagement(TransactionManagementType.CONTAINER) +public class DirectSLSBBean implements TradeServices { + + @Inject + @TradeJDBC + TradeServices tradeDirect; + + @Inject + AsyncScheduledOrderSubmitter asyncEJBOrderSubmitter; + + @Override + public int getImpl() { + return TradeConfig.SESSION_TO_DIRECT; + } + + @Override + public MarketSummaryDataBean getMarketSummary() throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getMarketSummary(); + } + + @Override + public OrderDataBean createOrder(AccountDataBean account, QuoteDataBean quote, HoldingDataBean holding, + String orderType, double quantity) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.createOrder(account, quote, holding, orderType, quantity); + } + + @Override + @NotNull + public OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception { + tradeDirect.setInSession(true); + OrderDataBean orderdata = tradeDirect.buy(userID, symbol, quantity, orderProcessingMode); + + if (orderProcessingMode == TradeConfig.ASYNCH) { + this.completeOrderAsync(orderdata.getOrderID(), false); + } + + return orderdata; + } + + @Override + @NotNull + public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception { + tradeDirect.setInSession(true); + OrderDataBean orderdata = tradeDirect.sell(userID, holdingID, orderProcessingMode); + + if (orderProcessingMode == TradeConfig.ASYNCH) { + this.completeOrderAsync(orderdata.getOrderID(), false); + } + return orderdata; + + } + + @Override + public void queueOrder(Integer orderID, boolean twoPhase) throws Exception { + tradeDirect.setInSession(true); + tradeDirect.queueOrder(orderID, twoPhase); + + } + + @Override + public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.completeOrder(orderID, twoPhase); + } + + @Override + public Future completeOrderAsync(Integer orderID, boolean twoPhase) throws Exception { + asyncEJBOrderSubmitter.submitOrder(orderID, twoPhase); + return null; + } + + @Override + public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception { + tradeDirect.setInSession(true); + tradeDirect.cancelOrder(orderID, twoPhase); + + } + + @Override + public void orderCompleted(String userID, Integer orderID) throws Exception { + tradeDirect.setInSession(true); + tradeDirect.orderCompleted(userID, orderID); + + } + + @Override + public Collection getOrders(String userID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getOrders(userID); + } + + @Override + public Collection getClosedOrders(String userID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getClosedOrders(userID); + } + + @Override + public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.createQuote(symbol, companyName, price); + } + + @Override + public QuoteDataBean getQuote(String symbol) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getQuote(symbol); + } + + @Override + public Collection getAllQuotes() throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getAllQuotes(); + } + + @Override + public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) + throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.updateQuotePriceVolume(symbol, newPrice, sharesTraded); + } + + @Override + public Collection getHoldings(String userID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getHoldings(userID); + } + + @Override + public HoldingDataBean getHolding(Integer holdingID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getHolding(holdingID); + } + + @Override + public AccountDataBean getAccountData(String userID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getAccountData(userID); + } + + @Override + public AccountProfileDataBean getAccountProfileData(String userID) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.getAccountProfileData(userID); + } + + @Override + public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.updateAccountProfile(profileData); + } + + @Override + public AccountDataBean login(String userID, String password) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.login(userID, password); + } + + @Override + public void logout(String userID) throws Exception { + tradeDirect.setInSession(true); + tradeDirect.logout(userID); + } + + @Override + public AccountDataBean register(String userID, String password, String fullname, String address, String email, + String creditcard, BigDecimal openBalance) throws Exception { + tradeDirect.setInSession(true); + return tradeDirect.register(userID, password, fullname, address, email, creditcard, openBalance); + } + + @Override + public QuoteDataBean pingTwoPhase(String symbol) throws Exception { + throw new UnsupportedOperationException(); + } + + @Override + public double investmentReturn(double rnd1, double rnd2) throws Exception { + throw new UnsupportedOperationException(); + } + + + @Override + public void setInSession(boolean inSession) { + throw new UnsupportedOperationException("DirectSLSBBean::setInGlobalTxn not supported"); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/MarketSummaryUpdate.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/MarketSummaryUpdate.java new file mode 100644 index 00000000..16ddc303 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/MarketSummaryUpdate.java @@ -0,0 +1,27 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) +public @interface MarketSummaryUpdate {} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/QuotePriceChange.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/QuotePriceChange.java new file mode 100644 index 00000000..936097b4 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/QuotePriceChange.java @@ -0,0 +1,31 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) +public @interface QuotePriceChange { +} + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/RuntimeMode.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/RuntimeMode.java new file mode 100644 index 00000000..9c55d709 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/RuntimeMode.java @@ -0,0 +1,33 @@ +/******************************************************************************* +* Copyright (c) 2017 IBM Corp. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*******************************************************************************/ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD, + ElementType.FIELD, ElementType.PARAMETER}) +public @interface RuntimeMode { + /** + * Default to jaxrs client impl + */ + String value() default "Full EJB3"; +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/Trace.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/Trace.java new file mode 100644 index 00000000..1c24008b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/Trace.java @@ -0,0 +1,33 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import javax.interceptor.InterceptorBinding; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Inherited; + +@Inherited +@InterceptorBinding +@Target({ TYPE, METHOD }) +@Retention(RUNTIME) +public @interface Trace { +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeDB.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeDB.java new file mode 100644 index 00000000..ee07a020 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeDB.java @@ -0,0 +1,44 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import com.ibm.websphere.samples.daytrader.beans.RunStatsDataBean; + +public interface TradeDB { + + /** + * Reset the TradeData by - removing all newly registered users by scenario + * servlet (i.e. users with userID's beginning with "ru:") * - removing all + * buy/sell order pairs - setting logoutCount = loginCount + * + * return statistics for this benchmark run + */ + RunStatsDataBean resetTrade(boolean deleteAll) throws Exception; + + /** + * Get the Database Product Name + * + * return DB Product Name String + */ + String checkDBProductName() throws Exception; + + /** + * Get the impl for the TradeService + * + * return int matching the implementation + */ + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeEJB.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeEJB.java new file mode 100644 index 00000000..13330044 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeEJB.java @@ -0,0 +1,32 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface TradeEJB {} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeJDBC.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeJDBC.java new file mode 100644 index 00000000..57086a49 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeJDBC.java @@ -0,0 +1,32 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface TradeJDBC {} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeServices.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeServices.java new file mode 100644 index 00000000..dc91be1d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeServices.java @@ -0,0 +1,338 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.concurrent.Future; + +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; + +/** + * TradeServices interface specifies the business methods provided by the Trade + * online broker application. These business methods represent the features and + * operations that can be performed by customers of the brokerage such as login, + * logout, get a stock quote, buy or sell a stock, etc. This interface is + * implemented by {@link Trade} providing an EJB implementation of these + * business methods and also by {@link TradeDirect} providing a JDBC + * implementation. + * + * @see TradeDirect + * @see TradeSLSB + * + */ + +public interface TradeServices { + + /** + * Compute and return a snapshot of the current market conditions This + * includes the TSIA - an index of the price of the top 100 Trade stock + * quotes The openTSIA ( the index at the open) The volume of shares traded, + * Top Stocks gain and loss + * + * @return A snapshot of the current market summary + */ + MarketSummaryDataBean getMarketSummary() throws Exception; + + /** + * Create an order (buy or sell) + * + * @param accoount + * the accountdatabean + * @param quote + * the quptedatabean + * @param holding + * the holdingdatabean + * @param orderType + * buy or sell + * @param quantity + * quantity + * @return Collection OrderDataBeans providing detailed order information + */ + OrderDataBean createOrder(AccountDataBean account, QuoteDataBean quote, HoldingDataBean holding, String orderType, + double quantity) throws Exception; + + /** + * Purchase a stock and create a new holding for the given user. Given a + * stock symbol and quantity to purchase, retrieve the current quote price, + * debit the user's account balance, and add holdings to user's portfolio. + * buy/sell are asynchronous, using J2EE messaging, A new order is created + * and submitted for processing to the TradeBroker + * + * @param userID + * the customer requesting the stock purchase + * @param symbol + * the symbol of the stock being purchased + * @param quantity + * the quantity of shares to purchase + * @return OrderDataBean providing the status of the newly created buy order + */ + + OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception; + + /** + * Sell a stock holding and removed the holding for the given user. Given a + * Holding, retrieve current quote, credit user's account, and reduce + * holdings in user's portfolio. + * + * @param userID + * the customer requesting the sell + * @param holdingID + * the users holding to be sold + * @return OrderDataBean providing the status of the newly created sell + * order + */ + OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception; + + /** + * Queue the Order identified by orderID to be processed + * + * Orders are submitted through JMS to a Trading Broker and completed + * asynchronously. This method queues the order for processing + * + * The boolean twoPhase specifies to the server implementation whether or + * not the method is to participate in a global transaction + * + * @param orderID + * the Order being queued for processing + * @return OrderDataBean providing the status of the completed order + */ + void queueOrder(Integer orderID, boolean twoPhase) throws Exception; + + /** + * Complete the Order identified by orderID. This method completes + * the order For a buy, the stock is purchased creating a holding and the + * users account is debited For a sell, the stock holding is removed and the + * users account is credited with the proceeds + * + * The boolean twoPhase specifies to the server implementation whether or + * not the method is to participate in a global transaction + * + * @param orderID + * the Order to complete + * @return OrderDataBean providing the status of the completed order + */ + OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception; + + /** + * Complete the Order identefied by orderID Orders are completed + * asynchronously. This method completes + * the order For a buy, the stock is purchased creating a holding and the + * users account is debited For a sell, the stock holding is removed and the + * users account is credited with the proceeds + * + * The boolean twoPhase specifies to the server implementation whether or + * not the method is to participate in a global transaction + * + * @param orderID + * the Order to complete + * @return OrderDataBean providing the status of the completed order + */ + Future completeOrderAsync(Integer orderID, boolean twoPhase) throws Exception; + + /** + * Cancel the Order identefied by orderID + * + * The boolean twoPhase specifies to the server implementation whether or + * not the method is to participate in a global transaction + * + * @param orderID + * the Order to complete + * @return OrderDataBean providing the status of the completed order + */ + void cancelOrder(Integer orderID, boolean twoPhase) throws Exception; + + /** + * Signify an order has been completed for the given userID + * + * @param userID + * the user for which an order has completed + * @param orderID + * the order which has completed + * + */ + void orderCompleted(String userID, Integer orderID) throws Exception; + + /** + * Get the collection of all orders for a given account + * + * @param userID + * the customer account to retrieve orders for + * @return Collection OrderDataBeans providing detailed order information + */ + Collection getOrders(String userID) throws Exception; + + /** + * Get the collection of completed orders for a given account that need to + * be alerted to the user + * + * @param userID + * the customer account to retrieve orders for + * @return Collection OrderDataBeans providing detailed order information + */ + Collection getClosedOrders(String userID) throws Exception; + + /** + * Given a market symbol, price, and details, create and return a new + * {@link QuoteDataBean} + * + * @param symbol + * the symbol of the stock + * @param price + * the current stock price + * @param details + * a short description of the stock or company + * @return a new QuoteDataBean or null if Quote could not be created + */ + QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception; + + /** + * Return a {@link QuoteDataBean} describing a current quote for the given + * stock symbol + * + * @param symbol + * the stock symbol to retrieve the current Quote + * @return the QuoteDataBean + */ + QuoteDataBean getQuote(String symbol) throws Exception; + + /** + * Return a {@link java.util.Collection} of {@link QuoteDataBean} describing + * all current quotes + * + * @return A collection of QuoteDataBean + */ + Collection getAllQuotes() throws Exception; + + /** + * Update the stock quote price and volume for the specified stock symbol + * + * @param symbol + * for stock quote to update + * @param price + * the updated quote price + * @return the QuoteDataBean describing the stock + */ + QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception; + + /** + * Return the portfolio of stock holdings for the specified customer as a + * collection of HoldingDataBeans + * + * @param userID + * the customer requesting the portfolio + * @return Collection of the users portfolio of stock holdings + */ + Collection getHoldings(String userID) throws Exception; + + /** + * Return a specific user stock holding identifed by the holdingID + * + * @param holdingID + * the holdingID to return + * @return a HoldingDataBean describing the holding + */ + HoldingDataBean getHolding(Integer holdingID) throws Exception; + + /** + * Return an AccountDataBean object for userID describing the account + * + * @param userID + * the account userID to lookup + * @return User account data in AccountDataBean + */ + AccountDataBean getAccountData(String userID) throws Exception; + + /** + * Return an AccountProfileDataBean for userID providing the users profile + * + * @param userID + * the account userID to lookup + * @param User + * account profile data in AccountProfileDataBean + */ + AccountProfileDataBean getAccountProfileData(String userID) throws Exception; + + /** + * Update userID's account profile information using the provided + * AccountProfileDataBean object + * + * @param userID + * the account userID to lookup + * @param User + * account profile data in AccountProfileDataBean + */ + AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception; + + /** + * Attempt to authenticate and login a user with the given password + * + * @param userID + * the customer to login + * @param password + * the password entered by the customer for authentication + * @return User account data in AccountDataBean + */ + AccountDataBean login(String userID, String password) throws Exception; + + /** + * Logout the given user + * + * @param userID + * the customer to logout + * @return the login status + */ + + void logout(String userID) throws Exception; + + /** + * Register a new Trade customer. Create a new user profile, user registry + * entry, account with initial balance, and empty portfolio. + * + * @param userID + * the new customer to register + * @param password + * the customers password + * @param fullname + * the customers fullname + * @param address + * the customers street address + * @param email + * the customers email address + * @param creditcard + * the customers creditcard number + * @param initialBalance + * the amount to charge to the customers credit to open the + * account and set the initial balance + * @return the userID if successful, null otherwise + */ + AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) + throws Exception; + + + int getImpl(); + + QuoteDataBean pingTwoPhase(String symbol) throws Exception; + + double investmentReturn(double rnd1, double rnd2) throws Exception; + + void setInSession(boolean inSession); +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeSession2Direct.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeSession2Direct.java new file mode 100644 index 00000000..e39b6842 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/interfaces/TradeSession2Direct.java @@ -0,0 +1,32 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.interfaces; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface TradeSession2Direct {} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/BroadcastResource.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/BroadcastResource.java new file mode 100644 index 00000000..3b280fde --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/BroadcastResource.java @@ -0,0 +1,70 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.jaxrs; + +import java.util.List; + +import javax.annotation.Priority; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.ObservesAsync; +import javax.inject.Inject; +import javax.interceptor.Interceptor; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.sse.OutboundSseEvent.Builder; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseBroadcaster; +import javax.ws.rs.sse.SseEventSink; + +import com.ibm.websphere.samples.daytrader.interfaces.QuotePriceChange; +import com.ibm.websphere.samples.daytrader.util.RecentQuotePriceChangeList; + +@Path("broadcastevents") +@ApplicationScoped +public class BroadcastResource { + + private SseBroadcaster broadcaster; + private Builder builder; + + @Inject RecentQuotePriceChangeList recentQuotePriceChangeList; + + @Context + public void setSse(Sse sse) { + broadcaster = sse.newBroadcaster(); + builder = sse.newEventBuilder(); + } + + @GET + @Produces(MediaType.SERVER_SENT_EVENTS) + public void register(@Context SseEventSink eventSink) { + if (recentQuotePriceChangeList.isEmpty()) { + eventSink.send(builder.data(new String("welcome!")).build()); + } else { + eventSink.send(builder.mediaType(MediaType.APPLICATION_JSON_TYPE) + .data(List.class,recentQuotePriceChangeList.recentList()).build()); + } + broadcaster.register(eventSink); + } + + public void eventStreamCdi(@ObservesAsync @Priority(Interceptor.Priority.APPLICATION + 1) @QuotePriceChange String event) { + broadcaster.broadcast(builder.mediaType(MediaType.APPLICATION_JSON_TYPE) + .data(List.class,recentQuotePriceChangeList.recentList()).build()); + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/JAXRSApplication.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/JAXRSApplication.java new file mode 100644 index 00000000..1266ede0 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/JAXRSApplication.java @@ -0,0 +1,28 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.jaxrs; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.core.Application; + +/** + * + * @author hantsy + */ +@ApplicationPath("/rest") +public class JAXRSApplication extends Application { + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/QuoteResource.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/QuoteResource.java new file mode 100644 index 00000000..cf1d5a45 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/jaxrs/QuoteResource.java @@ -0,0 +1,84 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.jaxrs; + +import java.util.ArrayList; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Path("quotes") +@RequestScoped +public class QuoteResource { + + private TradeServices tradeService; + + + public QuoteResource() { + } + + @Inject + public QuoteResource(@Any Instance services) { + tradeService = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/{symbols}") + public List quotesGet(@PathParam("symbols") String symbols) { + return getQuotes(symbols); + } + + @POST + @Consumes({ "application/x-www-form-urlencoded" }) + @Produces(MediaType.APPLICATION_JSON) + public List quotesPost(@FormParam("symbols") String symbols) { + return getQuotes(symbols); + } + + private List getQuotes(String symbols) { + ArrayList quoteDataBeans = new ArrayList(); + + try { + String[] symbolsSplit = symbols.split(","); + for (String symbol: symbolsSplit) { + QuoteDataBean quoteData = tradeService.getQuote(symbol); + quoteDataBeans.add(quoteData); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return (List)quoteDataBeans; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java new file mode 100644 index 00000000..a5024fc0 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java @@ -0,0 +1,159 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.mdb; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.ejb.ActivationConfigProperty; +import javax.ejb.MessageDriven; +import javax.ejb.MessageDrivenContext; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.ejb.TransactionManagement; +import javax.ejb.TransactionManagementType; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.jms.Message; +import javax.jms.MessageListener; +import javax.jms.TextMessage; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.MDBStats; +import com.ibm.websphere.samples.daytrader.util.TimerStat; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +// For Glassfish/Payara - take jms/ off of the destination name + +@TransactionAttribute(TransactionAttributeType.REQUIRED) +@TransactionManagement(TransactionManagementType.CONTAINER) +@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), + @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), + @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/TradeBrokerQueue"), + //@ActivationConfigProperty(propertyName = "destination", propertyValue = "TradeBrokerQueue"), + @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NonDurable") }) +@Trace +public class DTBroker3MDB implements MessageListener { + private final MDBStats mdbStats; + private int statInterval = 10000; + + @Resource + public MessageDrivenContext mdc; + + @Inject @Any + Instance services; + + private TradeServices trade; + + public DTBroker3MDB() { + + if (statInterval <= 0) { + statInterval = 10000; + } + mdbStats = MDBStats.getInstance(); + } + + @PostConstruct + void boostrapTradeServices() { + trade = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @Override + public void onMessage(Message message) { + try { + + Log.trace("TradeBroker:onMessage -- received message -->" + ((TextMessage) message).getText() + "command-->" + + message.getStringProperty("command") + "<--"); + + if (message.getJMSRedelivered()) { + Log.log("DTBroker3MDB: The following JMS message was redelivered due to a rollback:\n" + ((TextMessage) message).getText()); + // Order has been cancelled -- ignore returned messages + return; + } + String command = message.getStringProperty("command"); + if (command == null) { + Log.debug("DTBroker3MDB:onMessage -- received message with null command. Message-->" + message); + return; + } + if (command.equalsIgnoreCase("neworder")) { + /* Get the Order ID and complete the Order */ + Integer orderID = new Integer(message.getIntProperty("orderID")); + boolean twoPhase = message.getBooleanProperty("twoPhase"); + boolean direct = message.getBooleanProperty("direct"); + long publishTime = message.getLongProperty("publishTime"); + long receiveTime = System.currentTimeMillis(); + + try { + //TODO: why direct? + //trade = getTrade(direct); + + Log.trace("DTBroker3MDB:onMessage - completing order " + orderID + " twoPhase=" + twoPhase + " direct=" + direct); + + trade.completeOrder(orderID, twoPhase); + + TimerStat currentStats = mdbStats.addTiming("DTBroker3MDB:neworder", publishTime, receiveTime); + + if ((currentStats.getCount() % statInterval) == 0) { + Log.log(" DTBroker3MDB: processed " + statInterval + " stock trading orders." + + " Total NewOrders process = " + currentStats.getCount() + + "Time (in seconds):" + + " min: " +currentStats.getMinSecs()+ + " max: " +currentStats.getMaxSecs()+ + " avg: " +currentStats.getAvgSecs()); + } + } catch (Exception e) { + Log.error("DTBroker3MDB:onMessage Exception completing order: " + orderID + "\n", e); + mdc.setRollbackOnly(); + /* + * UPDATE - order is cancelled in trade if an error is + * caught try { trade.cancelOrder(orderID, twoPhase); } + * catch (Exception e2) { Log.error("order cancel failed", + * e); } + */ + } + } else if (command.equalsIgnoreCase("ping")) { + + Log.trace("DTBroker3MDB:onMessage received test command -- message: " + ((TextMessage) message).getText()); + + long publishTime = message.getLongProperty("publishTime"); + long receiveTime = System.currentTimeMillis(); + + TimerStat currentStats = mdbStats.addTiming("DTBroker3MDB:ping", publishTime, receiveTime); + + if ((currentStats.getCount() % statInterval) == 0) { + Log.log(" DTBroker3MDB: received " + statInterval + " ping messages." + + " Total ping message count = " + currentStats.getCount() + + " Time (in seconds):" + + " min: " +currentStats.getMinSecs()+ + " max: " +currentStats.getMaxSecs()+ + " avg: " +currentStats.getAvgSecs()); + } + } else { + Log.error("DTBroker3MDB:onMessage - unknown message request command-->" + command + "<-- message=" + ((TextMessage) message).getText()); + } + } catch (Throwable t) { + // JMS onMessage should handle all exceptions + Log.error("DTBroker3MDB: Error rolling back transaction", t); + mdc.setRollbackOnly(); + } + } + + + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java new file mode 100644 index 00000000..49fc8a5b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java @@ -0,0 +1,123 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.mdb; + +import javax.annotation.Resource; +import javax.ejb.ActivationConfigProperty; +import javax.ejb.MessageDriven; +import javax.ejb.MessageDrivenContext; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.ejb.TransactionManagement; +import javax.ejb.TransactionManagementType; +import javax.jms.Message; +import javax.jms.MessageListener; +import javax.jms.TextMessage; + + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.MDBStats; +import com.ibm.websphere.samples.daytrader.util.TimerStat; + +//For Glassfish/Payara - take jms/ off of the destination name + +@TransactionAttribute(TransactionAttributeType.REQUIRED) +@TransactionManagement(TransactionManagementType.CONTAINER) +@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), + @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), + @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/TradeStreamerTopic"), + //@ActivationConfigProperty(propertyName = "destination", propertyValue = "TradeStreamerTopic"), + @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "NonDurable") }) +@Trace +public class DTStreamer3MDB implements MessageListener { + + private final MDBStats mdbStats; + private int statInterval = 10000; + + @Resource + public MessageDrivenContext mdc; + + + /** Creates a new instance of TradeSteamerMDB */ + public DTStreamer3MDB() { + Log.trace("DTStreamer3MDB:DTStreamer3MDB()"); + + if (statInterval <= 0) { + statInterval = 10000; + } + mdbStats = MDBStats.getInstance(); + } + + @Override + public void onMessage(Message message) { + + try { + Log.trace("DTStreamer3MDB:onMessage -- received message -->" + ((TextMessage) message).getText() + "command-->" + + message.getStringProperty("command") + "<--"); + + String command = message.getStringProperty("command"); + if (command == null) { + Log.debug("DTStreamer3MDB:onMessage -- received message with null command. Message-->" + message); + return; + } + if (command.equalsIgnoreCase("updateQuote")) { + Log.trace("DTStreamer3MDB:onMessage -- received message -->" + ((TextMessage) message).getText() + "\n\t symbol = " + + message.getStringProperty("symbol") + "\n\t current price =" + message.getStringProperty("price") + "\n\t old price =" + + message.getStringProperty("oldPrice")); + + long publishTime = message.getLongProperty("publishTime"); + long receiveTime = System.currentTimeMillis(); + + TimerStat currentStats = mdbStats.addTiming("DTStreamer3MDB:udpateQuote", publishTime, receiveTime); + + if ((currentStats.getCount() % statInterval) == 0) { + Log.log(" DTStreamer3MDB: " + statInterval + " prices updated:" + + " Total message count = " + currentStats.getCount() + + " Time (in seconds):" + + " min: " +currentStats.getMinSecs()+ + " max: " +currentStats.getMaxSecs()+ + " avg: " +currentStats.getAvgSecs() ); + } + } else if (command.equalsIgnoreCase("ping")) { + Log.trace("DTStreamer3MDB:onMessage received ping command -- message: " + ((TextMessage) message).getText()); + + + long publishTime = message.getLongProperty("publishTime"); + long receiveTime = System.currentTimeMillis(); + + TimerStat currentStats = mdbStats.addTiming("DTStreamer3MDB:ping", publishTime, receiveTime); + + if ((currentStats.getCount() % statInterval) == 0) { + Log.log(" DTStreamer3MDB: received " + statInterval + " ping messages." + + " Total message count = " + currentStats.getCount() + + " Time (in seconds):" + + " min: " +currentStats.getMinSecs()+ + " max: " +currentStats.getMaxSecs()+ + " avg: " +currentStats.getAvgSecs()); + } + } else { + Log.error("DTStreamer3MDB:onMessage - unknown message request command-->" + command + "<-- message=" + ((TextMessage) message).getText()); + } + } catch (Throwable t) { + // JMS onMessage should handle all exceptions + Log.error("DTStreamer3MDB: Exception", t); + //UPDATE - Not rolling back for now -- so error messages are not redelivered + mdc.setRollbackOnly(); + } + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Diagnostics.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Diagnostics.java new file mode 100644 index 00000000..0c53c60c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Diagnostics.java @@ -0,0 +1,77 @@ +/** + * (C) Copyright IBM Corporation 2022. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.util.concurrent.ArrayBlockingQueue; + +public class Diagnostics { + private static final int DRIVE_MEMORY = Integer.getInteger("DRIVE_MEMORY", 0); + private static final int DRIVE_LATENCY = Integer.getInteger("DRIVE_LATENCY", 0); + private static final int DRIVE_MEMACCUMULATION = Integer.getInteger("DRIVE_MEMACCUMULATION", 0); + private static final ArrayBlockingQueue accumulation; + + static { + if (DRIVE_MEMORY > 0) { + Log.warning("DRIVE_MEMORY=" + DRIVE_MEMORY + + " has been specified which will allocate that many bytes on some app requests"); + } + if (DRIVE_MEMACCUMULATION > 0) { + Log.warning("DRIVE_MEMACCUMULATION=" + DRIVE_MEMACCUMULATION + + " has been specified which will accumulate up to " + (DRIVE_MEMORY * DRIVE_MEMACCUMULATION) + + " bytes"); + accumulation = new ArrayBlockingQueue(DRIVE_MEMACCUMULATION); + } else { + accumulation = null; + } + if (DRIVE_LATENCY > 0) { + Log.warning("DRIVE_LATENCY=" + DRIVE_LATENCY + + " has been specified which will sleep that many milliseconds on some app requests"); + } + } + + public static void checkDiagnostics() { + if (DRIVE_MEMORY > 0) { + byte[] memory = new byte[DRIVE_MEMORY]; + // Not sure if Java will optimize this away if we don't use it, so just + // do something trivial + int count = 0; + for (byte b : memory) { + if ((b & 0x01) > 0) { + count++; + } + } + if (count > 0) { + Log.error("Something that shouldn't happen"); + } + if (DRIVE_MEMACCUMULATION > 0) { + synchronized (accumulation) { + if (accumulation.size() >= DRIVE_MEMACCUMULATION) { + accumulation.remove(); + } + accumulation.add(memory); + } + } + } + + if (DRIVE_LATENCY > 0) { + try { + Thread.sleep(DRIVE_LATENCY); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/FinancialUtils.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/FinancialUtils.java new file mode 100644 index 00000000..076529ce --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/FinancialUtils.java @@ -0,0 +1,105 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Iterator; + +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; + +public class FinancialUtils { + + public static final int ROUND = BigDecimal.ROUND_HALF_UP; + public static final int SCALE = 2; + public static final BigDecimal ZERO = (new BigDecimal(0.00)).setScale(SCALE); + public static final BigDecimal ONE = (new BigDecimal(1.00)).setScale(SCALE); + public static final BigDecimal HUNDRED = (new BigDecimal(100.00)).setScale(SCALE); + + public static BigDecimal computeGain(BigDecimal currentBalance, BigDecimal openBalance) { + return currentBalance.subtract(openBalance).setScale(SCALE); + } + + public static BigDecimal computeGainPercent(BigDecimal currentBalance, BigDecimal openBalance) { + if (openBalance.doubleValue() == 0.0) { + return ZERO; + } + BigDecimal gainPercent = currentBalance.divide(openBalance, ROUND).subtract(ONE).multiply(HUNDRED); + return gainPercent; + } + + public static BigDecimal computeHoldingsTotal(Collection holdingDataBeans) { + BigDecimal holdingsTotal = new BigDecimal(0.0).setScale(SCALE); + if (holdingDataBeans == null) { + return holdingsTotal; + } + Iterator it = holdingDataBeans.iterator(); + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + BigDecimal total = holdingData.getPurchasePrice().multiply(new BigDecimal(holdingData.getQuantity())); + holdingsTotal = holdingsTotal.add(total); + } + return holdingsTotal.setScale(SCALE); + } + + public static String printGainHTML(BigDecimal gain) { + String htmlString, arrow; + if (gain.doubleValue() < 0.0) { + htmlString = ""; + arrow = "arrowdown.gif"; + } else { + htmlString = ""; + arrow = "arrowup.gif"; + } + + htmlString += gain.setScale(SCALE, ROUND) + ""; + return htmlString; + } + + public static String printChangeHTML(double change) { + String htmlString, arrow; + if (change < 0.0) { + htmlString = ""; + arrow = "arrowdown.gif"; + } else { + htmlString = ""; + arrow = "arrowup.gif"; + } + + htmlString += change + ""; + return htmlString; + } + + public static String printGainPercentHTML(BigDecimal gain) { + String htmlString, arrow; + if (gain.doubleValue() < 0.0) { + htmlString = "("; + arrow = "arrowdown.gif"; + } else { + htmlString = "(+"; + arrow = "arrowup.gif"; + } + + htmlString += gain.setScale(SCALE, ROUND); + htmlString += "%)"; + return htmlString; + } + + public static String printQuoteLink(String symbol) { + return "
    " + symbol + ""; + } + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/KeyBlock.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/KeyBlock.java new file mode 100644 index 00000000..8133d60f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/KeyBlock.java @@ -0,0 +1,140 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.util.AbstractSequentialList; +import java.util.ListIterator; + +public class KeyBlock extends AbstractSequentialList { + + // min and max provide range of valid primary keys for this KeyBlock + private int min = 0; + private int max = 0; + private int index = 0; + + /** + * Constructor for KeyBlock + */ + public KeyBlock() { + super(); + min = 0; + max = 0; + index = min; + } + + /** + * Constructor for KeyBlock + */ + public KeyBlock(int min, int max) { + super(); + this.min = min; + this.max = max; + index = min; + } + + /** + * @see AbstractCollection#size() + */ + @Override + public int size() { + return (max - min) + 1; + } + + /** + * @see AbstractSequentialList#listIterator(int) + */ + @Override + public ListIterator listIterator(int arg0) { + return new KeyBlockIterator(); + } + + class KeyBlockIterator implements ListIterator { + + /** + * @see ListIterator#hasNext() + */ + @Override + public boolean hasNext() { + return index <= max; + } + + /** + * @see ListIterator#next() + */ + @Override + public synchronized Object next() { + if (index > max) { + throw new java.lang.RuntimeException("KeyBlock:next() -- Error KeyBlock depleted"); + } + return new Integer(index++); + } + + /** + * @see ListIterator#hasPrevious() + */ + @Override + public boolean hasPrevious() { + return index > min; + } + + /** + * @see ListIterator#previous() + */ + @Override + public Object previous() { + return new Integer(--index); + } + + /** + * @see ListIterator#nextIndex() + */ + @Override + public int nextIndex() { + return index - min; + } + + /** + * @see ListIterator#previousIndex() + */ + @Override + public int previousIndex() { + throw new UnsupportedOperationException("KeyBlock: previousIndex() not supported"); + } + + /** + * @see ListIterator#add() + */ + @Override + public void add(Object o) { + throw new UnsupportedOperationException("KeyBlock: add() not supported"); + } + + /** + * @see ListIterator#remove() + */ + @Override + public void remove() { + throw new UnsupportedOperationException("KeyBlock: remove() not supported"); + } + + /** + * @see ListIterator#set(Object) + */ + @Override + public void set(Object arg0) { + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Log.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Log.java new file mode 100644 index 00000000..83928517 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/Log.java @@ -0,0 +1,162 @@ +/** + * (C) Copyright IBM Corporation 2015, 2022. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.util.Collection; +import java.util.Iterator; +import java.util.logging.Level; +import java.util.logging.Logger; + + + +public class Log { + + private final static Logger log = Logger.getLogger("daytrader"); + + + // A general purpose, high performance logging, tracing, statistic service + + public static void log(String message) { + log.log(Level.INFO, message); + } + + public static void log(String msg1, String msg2) { + log(msg1 + msg2); + } + + public static void log(String msg1, String msg2, String msg3) { + log(msg1 + msg2 + msg3); + } + + public static void error(String message) { + message = "Error: " + message; + log.severe(message); + } + + public static void error(String message, Throwable e) { + error(message + "\n\t" + e.toString()); + e.printStackTrace(System.out); + } + + public static void error(String msg1, String msg2, Throwable e) { + error(msg1 + "\n" + msg2 + "\n\t", e); + } + + public static void error(String msg1, String msg2, String msg3, Throwable e) { + error(msg1 + "\n" + msg2 + "\n" + msg3 + "\n\t", e); + } + + public static void error(Throwable e, String message) { + error(message + "\n\t", e); + e.printStackTrace(System.out); + } + + public static void error(Throwable e, String msg1, String msg2) { + error(msg1 + "\n" + msg2 + "\n\t", e); + } + + public static void error(Throwable e, String msg1, String msg2, String msg3) { + error(msg1 + "\n" + msg2 + "\n" + msg3 + "\n\t", e); + } + + public static void trace(String message) { + log.log(Level.FINE, message + " threadID=" + Thread.currentThread()); + } + + public static void traceInterceptor(String message, Object parm1) { + log.log(Level.SEVERE,message,parm1); + } + + public static void trace(String message, Object parm1) { + trace(message + "(" + parm1 + ")"); + } + + public static void trace(String message, Object parm1, Object parm2) { + trace(message + "(" + parm1 + ", " + parm2 + ")"); + } + + public static void trace(String message, Object parm1, Object parm2, Object parm3) { + trace(message + "(" + parm1 + ", " + parm2 + ", " + parm3 + ")"); + } + + public static void trace(String message, Object parm1, Object parm2, Object parm3, Object parm4) { + trace(message + "(" + parm1 + ", " + parm2 + ", " + parm3 + ")" + ", " + parm4); + } + + public static void trace(String message, Object parm1, Object parm2, Object parm3, Object parm4, Object parm5) { + trace(message + "(" + parm1 + ", " + parm2 + ", " + parm3 + ")" + ", " + parm4 + ", " + parm5); + } + + public static void trace(String message, Object parm1, Object parm2, Object parm3, Object parm4, Object parm5, Object parm6) { + trace(message + "(" + parm1 + ", " + parm2 + ", " + parm3 + ")" + ", " + parm4 + ", " + parm5 + ", " + parm6); + } + + public static void trace(String message, Object parm1, Object parm2, Object parm3, Object parm4, Object parm5, Object parm6, Object parm7) { + trace(message + "(" + parm1 + ", " + parm2 + ", " + parm3 + ")" + ", " + parm4 + ", " + parm5 + ", " + parm6 + ", " + parm7); + } + + public static void traceEnter(String message) { + log.log(Level.FINE,"Method enter --" + message); + } + + public static void traceExit(String message) { + log.log(Level.FINE,"Method exit --" + message); + } + + public static void stat(String message) { + log(message); + } + + public static void debug(String message) { + log.log(Level.INFO,message); + } + + public static void print(String message) { + log(message); + } + + public static void printObject(Object o) { + log("\t" + o.toString()); + } + + public static void printCollection(Collection c) { + log("\t---Log.printCollection -- collection size=" + c.size()); + Iterator it = c.iterator(); + + while (it.hasNext()) { + log("\t\t" + it.next().toString()); + } + log("\t---Log.printCollection -- complete"); + } + + public static void printCollection(String message, Collection c) { + log(message); + printCollection(c); + } + + + public static boolean doDebug() { + return true; + } + + public static boolean doTrace() { + return log.isLoggable(Level.FINE); + } + + public static void warning(String message) { + log.log(Level.WARNING, message); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/MDBStats.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/MDBStats.java new file mode 100644 index 00000000..fc49ba01 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/MDBStats.java @@ -0,0 +1,68 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +/** + * + * To change this generated comment edit the template variable "typecomment": + * Window>Preferences>Java>Templates. To enable and disable the creation of type + * comments go to Window>Preferences>Java>Code Generation. + */ +public class MDBStats extends java.util.HashMap { + + private static final long serialVersionUID = -3759835921094193760L; + // Singleton class + private static MDBStats mdbStats = null; + + private MDBStats() { + } + + public static synchronized MDBStats getInstance() { + if (mdbStats == null) { + mdbStats = new MDBStats(); + } + return mdbStats; + } + + public TimerStat addTiming(String type, long sendTime, long recvTime) { + TimerStat stats = null; + synchronized (type) { + + stats = get(type); + if (stats == null) { + stats = new TimerStat(); + } + + long time = recvTime - sendTime; + if (time > stats.getMax()) { + stats.setMax(time); + } + if (time < stats.getMin()) { + stats.setMin(time); + } + stats.setCount(stats.getCount() + 1); + stats.setTotalTime(stats.getTotalTime() + time); + + put(type, stats); + } + return stats; + } + + public synchronized void reset() { + clear(); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/RecentQuotePriceChangeList.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/RecentQuotePriceChangeList.java new file mode 100644 index 00000000..cf3966da --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/RecentQuotePriceChangeList.java @@ -0,0 +1,77 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Event; +import javax.enterprise.event.NotificationOptions; +import javax.inject.Inject; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.QuotePriceChange; + + +/** This class is a holds the last 5 stock changes, used by the MarketSummary WebSocket + * and the JAX-RS SSE Broadcaster + * It fires a CDI event everytime a price change is added + **/ + +@ApplicationScoped +public class RecentQuotePriceChangeList { + + private List list = new CopyOnWriteArrayList(); + private int maxSize = 5; + + @Resource + private ManagedExecutorService mes; + + @Inject + @QuotePriceChange + Event quotePriceChangeEvent; + + public boolean add(QuoteDataBean quoteData) { + + int symbolNumber = new Integer(quoteData.getSymbol().substring(2)); + + if ( symbolNumber < TradeConfig.getMAX_QUOTES() * TradeConfig.getListQuotePriceChangeFrequency() * 0.01) { + list.add(0, quoteData); + + // Add stock, remove if needed + if(list.size() > maxSize) { + list.remove(maxSize); + } + quotePriceChangeEvent.fireAsync("quotePriceChange for symbol: " + quoteData.getSymbol(), NotificationOptions.builder().setExecutor(mes).build()); + } + return true; + } + + public boolean isEmpty() { + return list.isEmpty(); + } + + @Size(max=5) + @NotEmpty + public List<@NotNull QuoteDataBean> recentList() { + return list; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TimerStat.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TimerStat.java new file mode 100644 index 00000000..c3057b48 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TimerStat.java @@ -0,0 +1,133 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +/** + * + * To change this generated comment edit the template variable "typecomment": + * Window>Preferences>Java>Templates. To enable and disable the creation of type + * comments go to Window>Preferences>Java>Code Generation. + */ +public class TimerStat { + + private double min = 1000000000.0, max = 0.0, totalTime = 0.0; + private int count; + + /** + * Returns the count. + * + * @return int + */ + public int getCount() { + return count; + } + + /** + * Returns the max. + * + * @return double + */ + public double getMax() { + return max; + } + + /** + * Returns the min. + * + * @return double + */ + public double getMin() { + return min; + } + + /** + * Sets the count. + * + * @param count + * The count to set + */ + public void setCount(int count) { + this.count = count; + } + + /** + * Sets the max. + * + * @param max + * The max to set + */ + public void setMax(double max) { + this.max = max; + } + + /** + * Sets the min. + * + * @param min + * The min to set + */ + public void setMin(double min) { + this.min = min; + } + + /** + * Returns the totalTime. + * + * @return double + */ + public double getTotalTime() { + return totalTime; + } + + /** + * Sets the totalTime. + * + * @param totalTime + * The totalTime to set + */ + public void setTotalTime(double totalTime) { + this.totalTime = totalTime; + } + + /** + * Returns the max in Secs + * + * @return double + */ + public double getMaxSecs() { + return max / 1000.0; + } + + /** + * Returns the min in Secs + * + * @return double + */ + public double getMinSecs() { + return min / 1000.0; + } + + /** + * Returns the average time in Secs + * + * @return double + */ + public double getAvgSecs() { + + double avg = getTotalTime() / getCount(); + return avg / 1000.0; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TraceInterceptor.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TraceInterceptor.java new file mode 100644 index 00000000..5af7f4b3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TraceInterceptor.java @@ -0,0 +1,49 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.io.Serializable; +import java.text.MessageFormat; +import java.util.Arrays; + +import javax.annotation.Priority; + +import javax.interceptor.AroundInvoke; +import javax.interceptor.Interceptor; +import javax.interceptor.InvocationContext; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; + + +@Trace +@Interceptor +@Priority(Interceptor.Priority.APPLICATION) +public class TraceInterceptor implements Serializable { + + private static final long serialVersionUID = -4195975993998268072L; + private static final MessageFormat form = new MessageFormat("Method enter -- {0} called with {1}"); + + @AroundInvoke + public Object logMethodEntry(InvocationContext ctx) throws Exception { + Log.trace(form.format( + new String[]{ + ctx.getMethod().getDeclaringClass().getSimpleName() + ":"+ ctx.getMethod().getName(), + Arrays.deepToString(ctx.getParameters()) + })); + + return ctx.proceed(); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TradeConfig.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TradeConfig.java new file mode 100644 index 00000000..34a03983 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/util/TradeConfig.java @@ -0,0 +1,752 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.util; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Random; + +/** + * TradeConfig is a JavaBean holding all configuration and runtime parameters + * for the Trade application TradeConfig sets runtime parameters such as the + * RunTimeMode (EJB, JDBC, EJB_ALT) + * + */ + +public class TradeConfig { + + /* Trade Runtime Configuration Parameters */ + + /* Trade Runtime Mode parameters */ + private static String[] runTimeModeNames = { "Full EJB3", "Direct (JDBC)", "Session to Direct"}; + public static final int EJB3 = 0; + public static final int DIRECT = 1; + public static final int SESSION_TO_DIRECT = 2; + private static int runTimeMode = EJB3; + + private static String[] orderProcessingModeNames = { "Sync", "Async","Async_2-Phase" }; + public static final int SYNCH = 0; + public static final int ASYNCH = 1; + public static final int ASYNCH_2PHASE = 2; + private static int orderProcessingMode = SYNCH; + + private static String[] accessModeNames = { "Standard", "WebServices" }; + public static final int STANDARD = 0; + private static int accessMode = STANDARD; + + /* Trade Web Interface parameters */ + private static String[] webInterfaceNames = { "JSP", "JSP-Images", "JSP-Images-Http2" }; + public static final int JSP = 0; + public static final int JSP_Images = 1; + public static final int JSP_Images_HTTP2 = 2; + private static int webInterface = JSP; + + /* Trade Database Scaling parameters */ + private static int MAX_USERS = 15000; + private static int MAX_QUOTES = 10000; + + + /* Trade XA Datasource specific parameters */ + public static boolean JDBCDriverNeedsGlobalTransation = false; + + /* Trade Config Miscellaneous itmes */ + public static String DATASOURCE = "java:comp/env/jdbc/TradeDataSource"; + public static int KEYBLOCKSIZE = 1000; + public static int QUOTES_PER_PAGE = 10; + public static boolean RND_USER = true; + // public static int RND_SEED = 0; + private static int MAX_HOLDINGS = 10; + private static int count = 0; + private static Object userID_count_semaphore = new Object(); + private static int userID_count = 0; + private static String hostName = null; + private static Random r0 = new Random(System.currentTimeMillis()); + // private static Random r1 = new Random(RND_SEED); + private static Random randomNumberGenerator = r0; + public static final String newUserPrefix = "ru:"; + public static final int verifyPercent = 5; + private static boolean updateQuotePrices = true; + private static int primIterations = 1; + private static boolean longRun = true; + private static boolean publishQuotePriceChange = true; + private static int listQuotePriceChangeFrequency = 100; + private static boolean displayOrderAlerts = true; + + /** + * -1 means every operation 0 means never perform a market summary > 0 means + * number of seconds between summaries. These will be synchronized so only + * one transaction in this period will create a summary and will cache its + * results. + */ + private static int marketSummaryInterval = 20; + + /* + * Penny stocks is a problem where the random price change factor gets a + * stock down to $.01. In this case trade jumpstarts the price back to $6.00 + * to keep the math interesting. + */ + public static BigDecimal PENNY_STOCK_PRICE; + public static BigDecimal PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER; + static { + PENNY_STOCK_PRICE = new BigDecimal(0.01); + PENNY_STOCK_PRICE = PENNY_STOCK_PRICE.setScale(2, BigDecimal.ROUND_HALF_UP); + PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER = new BigDecimal(600.0); + PENNY_STOCK_RECOVERY_MIRACLE_MULTIPLIER.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + /* + * CJB (DAYTRADER-25) - Also need to impose a ceiling on the quote price to + * ensure prevent account and holding balances from exceeding the databases + * decimal precision. At some point, this maximum value can be used to + * trigger a stock split. + */ + + public static BigDecimal MAXIMUM_STOCK_PRICE; + public static BigDecimal MAXIMUM_STOCK_SPLIT_MULTIPLIER; + static { + MAXIMUM_STOCK_PRICE = new BigDecimal(400); + MAXIMUM_STOCK_PRICE.setScale(2, BigDecimal.ROUND_HALF_UP); + MAXIMUM_STOCK_SPLIT_MULTIPLIER = new BigDecimal(0.5); + MAXIMUM_STOCK_SPLIT_MULTIPLIER.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + /* + * Trade Scenario actions mixes. Each of the array rows represents a + * specific Trade Scenario Mix. The columns give the percentages for each + * action in the column header. Note: "login" is always 0. logout represents + * both login and logout (because each logout operation will cause a new + * login when the user context attempts the next action. + */ + /* Trade Scenario Workload parameters */ + public static final int HOME_OP = 0; + public static final int QUOTE_OP = 1; + public static final int LOGIN_OP = 2; + public static final int LOGOUT_OP = 3; + public static final int REGISTER_OP = 4; + public static final int ACCOUNT_OP = 5; + public static final int PORTFOLIO_OP = 6; + public static final int BUY_OP = 7; + public static final int SELL_OP = 8; + public static final int UPDATEACCOUNT_OP = 9; + + private static int[][] scenarioMixes = { + // h q l o r a p b s u + { 20, 40, 0, 4, 2, 10, 12, 4, 4, 4 }, // STANDARD + { 20, 40, 0, 4, 2, 7, 7, 7, 7, 6 }, // High Volume + }; + private static char[] actions = { 'h', 'q', 'l', 'o', 'r', 'a', 'p', 'b', 's', 'u' }; + private static int sellDeficit = 0; + // Tracks the number of buys over sell when a users portfolio is empty + // Used to maintain the correct ratio of buys/sells + + /* JSP pages for all Trade Actions */ + + public static final int WELCOME_PAGE = 0; + public static final int REGISTER_PAGE = 1; + public static final int PORTFOLIO_PAGE = 2; + public static final int QUOTE_PAGE = 3; + public static final int HOME_PAGE = 4; + public static final int ACCOUNT_PAGE = 5; + public static final int ORDER_PAGE = 6; + public static final int CONFIG_PAGE = 7; + public static final int STATS_PAGE = 8; + public static final int MARKET_SUMMARY_PAGE = 9; + + // FUTURE Add XML/XSL View + public static String[][] webUI = { + { "/welcome.jsp", "/register.jsp", "/portfolio.jsp", "/quote.jsp", "/tradehome.jsp", "/account.jsp", "/order.jsp", "/config.jsp", "/runStats.jsp", + "/marketSummary.jsp" }, + // JSP Interface + { "/welcomeImg.jsp", "/registerImg.jsp", "/portfolioImg.jsp", "/quoteImg.jsp", "/tradehomeImg.jsp", "/accountImg.jsp", "/orderImg.jsp", + "/config.jsp", "/runStats.jsp", "/marketSummary.jsp" }, + // JSP Interface + { "/welcomeImg.jsp", "/registerImg.jsp", "/portfolioImg.jsp", "/quoteImg.jsp", "/tradehomeImg.jsp", "/accountImg.jsp", "/orderImg.jsp", + "/config.jsp", "/runStats.jsp", "/marketSummary.jsp" }, + }; + + + /** + * Return the hostname for this system Creation date: (2/16/2000 9:02:25 PM) + */ + + private static String getHostname() { + try { + if (hostName == null) { + hostName = java.net.InetAddress.getLocalHost().getHostName(); + // Strip of fully qualifed domain if necessary + try { + hostName = hostName.substring(0, hostName.indexOf('.')); + } catch (Exception e) { + } + } + } catch (Exception e) { + Log.error("Exception getting local host name using 'localhost' - ", e); + hostName = "localhost"; + } + return hostName; + } + + /** + * Return a Trade UI Web page based on the current configuration This may + * return a JSP page or a Servlet page Creation date: (3/14/2000 9:08:34 PM) + */ + + public static String getPage(int pageNumber) { + return webUI[webInterface][pageNumber]; + } + + /** + * Return the list of run time mode names Creation date: (3/8/2000 5:58:34 + * PM) + * + * @return java.lang.String[] + */ + public static java.lang.String[] getRunTimeModeNames() { + return runTimeModeNames; + } + + private static int scenarioCount = 0; + + /** + * Return a Trade Scenario Operation based on the setting of the current mix + * (TradeScenarioMix) Creation date: (2/10/2000 9:08:34 PM) + */ + + public static char getScenarioAction(boolean newUser) { + int r = rndInt(100); // 0 to 99 = 100 + int i = 0; + int sum = scenarioMixes[0][i]; + while (sum <= r) { + i++; + sum += scenarioMixes[0][i]; + } + + incrementScenarioCount(); + + /* + * In TradeScenarioServlet, if a sell action is selected, but the users + * portfolio is empty, a buy is executed instead and sellDefecit is + * incremented. This allows the number of buy/sell operations to stay in + * sync w/ the given Trade mix. + */ + + if ((!newUser) && (actions[i] == 'b')) { + synchronized (TradeConfig.class) { + if (sellDeficit > 0) { + sellDeficit--; + return 's'; + // Special case for TradeScenarioServlet to note this is a + // buy switched to a sell to fix sellDeficit + } + } + } + + return actions[i]; + } + + public static String getUserID() { + String userID; + if (RND_USER) { + userID = rndUserID(); + } else { + userID = nextUserID(); + } + return userID; + } + + private static final BigDecimal orderFee = new BigDecimal("24.95"); + private static final BigDecimal cashFee = new BigDecimal("0.0"); + + public static BigDecimal getOrderFee(String orderType) { + if ((orderType.compareToIgnoreCase("BUY") == 0) || (orderType.compareToIgnoreCase("SELL") == 0)) { + return orderFee; + } + + return cashFee; + + } + + /** + * Increment the sell deficit counter Creation date: (6/21/2000 11:33:45 AM) + */ + public static synchronized void incrementSellDeficit() { + sellDeficit++; + } + + public static String nextUserID() { + String userID; + synchronized (userID_count_semaphore) { + userID = "uid:" + userID_count; + userID_count++; + if (userID_count % MAX_USERS == 0) { + userID_count = 0; + } + } + return userID; + } + + public static double random() { + return randomNumberGenerator.nextDouble(); + } + + public static String rndAddress() { + return rndInt(1000) + " Oak St."; + } + + public static String rndBalance() { + // Give all new users a cool mill in which to trade + return "1000000"; + } + + public static String rndCreditCard() { + return rndInt(100) + "-" + rndInt(1000) + "-" + rndInt(1000) + "-" + rndInt(1000); + } + + public static String rndEmail(String userID) { + return userID.replace(":", "") + "@" + rndInt(100) + ".com"; + } + + public static String rndFullName() { + return "first:" + rndInt(1000) + " last:" + rndInt(5000); + } + + public static int rndInt(int i) { + return (new Float(random() * i)).intValue(); + } + + public static float rndFloat(int i) { + return (new Float(random() * i)).floatValue(); + } + + public static BigDecimal rndBigDecimal(float f) { + return (new BigDecimal(random() * f)).setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public static boolean rndBoolean() { + return randomNumberGenerator.nextBoolean(); + } + + /** + * Returns a new Trade user Creation date: (2/16/2000 8:50:35 PM) + */ + public static synchronized String rndNewUserID() { + + return newUserPrefix + getHostname() + System.currentTimeMillis() + count++; + } + + public static float rndPrice() { + return ((new Integer(rndInt(200))).floatValue()) + 1.0f; + } + + private static final BigDecimal ONE = new BigDecimal(1.0); + + public static BigDecimal getRandomPriceChangeFactor() { + // CJB (DAYTRADER-25) - Vary change factor between 1.1 and 0.9 + double percentGain = rndFloat(1) * 0.1; + if (random() < .5) { + percentGain *= -1; + } + percentGain += 1; + + // change factor is between +/- 20% + BigDecimal percentGainBD = (new BigDecimal(percentGain)).setScale(2, BigDecimal.ROUND_HALF_UP); + if (percentGainBD.doubleValue() <= 0.0) { + percentGainBD = ONE; + } + + return percentGainBD; + } + + public static float rndQuantity() { + return ((new Integer(rndInt(200))).floatValue()) + 1.0f; + } + + public static String rndSymbol() { + return "s:" + rndInt(MAX_QUOTES - 1); + } + + public static String rndSymbols() { + + String symbols = ""; + int num_symbols = rndInt(QUOTES_PER_PAGE); + + for (int i = 0; i <= num_symbols; i++) { + symbols += "s:" + rndInt(MAX_QUOTES - 1); + if (i < num_symbols) { + symbols += ","; + } + } + return symbols; + } + + public static String rndUserID() { + String nextUser = getNextUserIDFromDeck(); + + Log.trace("TradeConfig:rndUserID -- new trader = " + nextUser); + + + return nextUser; + } + + private static synchronized String getNextUserIDFromDeck() { + int numUsers = getMAX_USERS(); + if (deck == null) { + deck = new ArrayList(numUsers); + for (int i = 0; i < numUsers; i++) { + deck.add(i, new Integer(i)); + } + java.util.Collections.shuffle(deck, r0); + } + if (card >= numUsers) { + card = 0; + } + return "uid:" + deck.get(card++); + + } + + // Trade implements a card deck approach to selecting + // users for trading with tradescenarioservlet + private static ArrayList deck = null; + private static int card = 0; + + /** + * This is a convenience method for servlets to set Trade configuration + * parameters from servlet initialization parameters. The servlet provides + * the init param and its value as strings. This method then parses the + * parameter, converts the value to the correct type and sets the + * corresponding TradeConfig parameter to the converted value + * + */ + public static void setConfigParam(String parm, String value) { + Log.log("TradeConfig setting parameter: " + parm + "=" + value); + // Compare the parm value to valid TradeConfig parameters that can be + // set + // by servlet initialization + + // First check the proposed new parm and value - if empty or null ignore + // it + if (parm == null) { + return; + } + parm = parm.trim(); + if (parm.length() <= 0) { + return; + } + if (value == null) { + return; + } + value = value.trim(); + + if (parm.equalsIgnoreCase("orderProcessingMode")) { + try { + for (int i = 0; i < orderProcessingModeNames.length; i++) { + if (value.equalsIgnoreCase(orderProcessingModeNames[i])) { + orderProcessingMode = i; + break; + } + } + } catch (Exception e) { + Log.error("TradeConfig.setConfigParm(..): minor exception caught" + "trying to set orderProcessingMode to " + value + + "reverting to current value: " + orderProcessingModeNames[orderProcessingMode], e); + } // If the value is bad, simply revert to current + } else if (parm.equalsIgnoreCase("accessMode")) { + try { + for (int i = 0; i < accessModeNames.length; i++) { + if (value.equalsIgnoreCase(accessModeNames[i])) { + accessMode = i; + break; + } + } + } catch (Exception e) { + Log.error("TradeConfig.setConfigParm(..): minor exception caught" + "trying to set accessMode to " + value + "reverting to current value: " + + accessModeNames[accessMode], e); + } + } else if (parm.equalsIgnoreCase("WebInterface")) { + try { + for (int i = 0; i < webInterfaceNames.length; i++) { + if (value.equalsIgnoreCase(webInterfaceNames[i])) { + webInterface = i; + break; + } + } + } catch (Exception e) { + Log.error("TradeConfig.setConfigParm(..): minor exception caught" + "trying to set WebInterface to " + value + "reverting to current value: " + + webInterfaceNames[webInterface], e); + + } // If the value is bad, simply revert to current + } else if (parm.equalsIgnoreCase("maxUsers")) { + try { + MAX_USERS = Integer.parseInt(value); + } catch (Exception e) { + Log.error("TradeConfig.setConfigParm(..): minor exception caught" + "Setting maxusers, error parsing string to int:" + value + + "revering to current value: " + MAX_USERS, e); + } // On error, revert to saved + } else if (parm.equalsIgnoreCase("maxQuotes")) { + try { + MAX_QUOTES = Integer.parseInt(value); + } catch (Exception e) { + // >>rjm + Log.error("TradeConfig.setConfigParm(...) minor exception caught" + "Setting max_quotes, error parsing string to int " + value + + "reverting to current value: " + MAX_QUOTES, e); + // < implements RuntimeMode { + + private static final long serialVersionUID = -252789556335033400L; + private String value; + public TradeRunTimeModeLiteral(String value) { + this.value = value; + } + + @Override + public String value() { + return value; + } + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/AccountDataJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/AccountDataJSF.java new file mode 100644 index 00000000..9c14067d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/AccountDataJSF.java @@ -0,0 +1,327 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpSession; +import javax.validation.constraints.PastOrPresent; +import javax.validation.constraints.PositiveOrZero; + +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("accountdata") +@RequestScoped +@Trace +public class AccountDataJSF { + + @Inject + private ExternalContext context; + + private TradeServices tradeAction; + + private Date sessionCreationDate; + private Date currentTime; + private String profileID; + private Integer accountID; + + @PastOrPresent + private Date creationDate; + + @PositiveOrZero + private int loginCount; + + @PastOrPresent + private Date lastLogin; + + @PositiveOrZero + private int logoutCount; + private BigDecimal balance; + private BigDecimal openBalance; + private Integer numberHoldings; + private BigDecimal holdingsTotal; + private BigDecimal sumOfCashHoldings; + private BigDecimal gain; + private BigDecimal gainPercent; + + private OrderData[] closedOrders; + private OrderData[] allOrders; + + private Integer numberOfOrders = 0; + private Integer numberOfOrderRows = 5; + + public void toggleShowAllRows() { + setNumberOfOrderRows(0); + } + + @Inject + public AccountDataJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @PostConstruct + public void home() { + try { + HttpSession session = (HttpSession) context.getSession(true); + + // Get the data and then parse + String userID = (String) session.getAttribute("uidBean"); + AccountDataBean accountData = tradeAction.getAccountData(userID); + Collection holdingDataBeans = tradeAction.getHoldings(userID); + + if (TradeConfig.getDisplayOrderAlerts()) { + + Collection closedOrders = tradeAction.getClosedOrders(userID); + + if (closedOrders != null && closedOrders.size() > 0) { + session.setAttribute("closedOrders", closedOrders); + OrderData[] orderjsfs = new OrderData[closedOrders.size()]; + Iterator it = closedOrders.iterator(); + int i = 0; + + while (it.hasNext()) { + OrderDataBean order = (OrderDataBean) it.next(); + OrderData r = new OrderData(order.getOrderID(), order.getOrderStatus(), order.getOpenDate(), order.getCompletionDate(), + order.getOrderFee(), order.getOrderType(), order.getQuantity(), order.getSymbol()); + orderjsfs[i] = r; + i++; + } + + setClosedOrders(orderjsfs); + } + } + + Collection orderDataBeans = (TradeConfig.getLongRun() ? new ArrayList() : (Collection) tradeAction.getOrders(userID)); + + if (orderDataBeans != null && orderDataBeans.size() > 0) { + session.setAttribute("orderDataBeans", orderDataBeans); + OrderData[] orderjsfs = new OrderData[orderDataBeans.size()]; + Iterator it = orderDataBeans.iterator(); + int i = 0; + + while (it.hasNext()) { + OrderDataBean order = (OrderDataBean) it.next(); + OrderData r = new OrderData(order.getOrderID(), order.getOrderStatus(), order.getOpenDate(), order.getCompletionDate(), + order.getOrderFee(), order.getOrderType(), order.getQuantity(), order.getSymbol(),order.getPrice()); + orderjsfs[i] = r; + i++; + } + setNumberOfOrders(orderDataBeans.size()); + setAllOrders(orderjsfs); + } + + setSessionCreationDate((Date) session.getAttribute("sessionCreationDate")); + setCurrentTime(new java.util.Date()); + doAccountData(accountData, holdingDataBeans); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void doAccountData(AccountDataBean accountData, Collection holdingDataBeans) { + setProfileID(accountData.getProfileID()); + setAccountID(accountData.getAccountID()); + setCreationDate(accountData.getCreationDate()); + setLoginCount(accountData.getLoginCount()); + setLogoutCount(accountData.getLogoutCount()); + setLastLogin(accountData.getLastLogin()); + setOpenBalance(accountData.getOpenBalance()); + setBalance(accountData.getBalance()); + setNumberHoldings(holdingDataBeans.size()); + setHoldingsTotal(FinancialUtils.computeHoldingsTotal(holdingDataBeans)); + setSumOfCashHoldings(balance.add(holdingsTotal)); + setGain(FinancialUtils.computeGain(sumOfCashHoldings, openBalance)); + setGainPercent(FinancialUtils.computeGainPercent(sumOfCashHoldings, openBalance)); + } + + public Date getSessionCreationDate() { + return sessionCreationDate; + } + + public void setSessionCreationDate(Date sessionCreationDate) { + this.sessionCreationDate = sessionCreationDate; + } + + public Date getCurrentTime() { + return currentTime; + } + + public void setCurrentTime(Date currentTime) { + this.currentTime = currentTime; + } + + public String getProfileID() { + return profileID; + } + + public void setProfileID(String profileID) { + this.profileID = profileID; + } + + public void setAccountID(Integer accountID) { + this.accountID = accountID; + } + + public Integer getAccountID() { + return accountID; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public Date getCreationDate() { + return creationDate; + } + + public void setLoginCount(int loginCount) { + this.loginCount = loginCount; + } + + public int getLoginCount() { + return loginCount; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setOpenBalance(BigDecimal openBalance) { + this.openBalance = openBalance; + } + + public BigDecimal getOpenBalance() { + return openBalance; + } + + public void setHoldingsTotal(BigDecimal holdingsTotal) { + this.holdingsTotal = holdingsTotal; + } + + public BigDecimal getHoldingsTotal() { + return holdingsTotal; + } + + public void setSumOfCashHoldings(BigDecimal sumOfCashHoldings) { + this.sumOfCashHoldings = sumOfCashHoldings; + } + + public BigDecimal getSumOfCashHoldings() { + return sumOfCashHoldings; + } + + public void setGain(BigDecimal gain) { + this.gain = gain; + } + + public BigDecimal getGain() { + return gain; + } + + public void setGainPercent(BigDecimal gainPercent) { + this.gainPercent = gainPercent.setScale(2); + } + + public BigDecimal getGainPercent() { + return gainPercent; + } + + public void setNumberHoldings(Integer numberHoldings) { + this.numberHoldings = numberHoldings; + } + + public Integer getNumberHoldings() { + return numberHoldings; + } + + public OrderData[] getClosedOrders() { + return closedOrders; + } + + public void setClosedOrders(OrderData[] closedOrders) { + this.closedOrders = closedOrders; + } + + public void setLastLogin(Date lastLogin) { + this.lastLogin = lastLogin; + } + + public Date getLastLogin() { + return lastLogin; + } + + public void setLogoutCount(int logoutCount) { + this.logoutCount = logoutCount; + } + + public int getLogoutCount() { + return logoutCount; + } + + public void setAllOrders(OrderData[] allOrders) { + this.allOrders = allOrders; + } + + public OrderData[] getAllOrders() { + return allOrders; + } + + public String getGainHTML() { + return FinancialUtils.printGainHTML(gain); + } + + public String getGainPercentHTML() { + return FinancialUtils.printGainPercentHTML(gainPercent); + } + + public Integer getNumberOfOrderRows() { + return numberOfOrderRows; + } + + public void setNumberOfOrderRows(Integer numberOfOrderRows) { + this.numberOfOrderRows = numberOfOrderRows; + } + + public Integer getNumberOfOrders() { + return numberOfOrders; + } + + public void setNumberOfOrders(Integer numberOfOrders) { + this.numberOfOrders = numberOfOrders; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/HoldingData.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/HoldingData.java new file mode 100644 index 00000000..a0a395ea --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/HoldingData.java @@ -0,0 +1,118 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; + +@Named +@RequestScoped +public class HoldingData implements Serializable { + + private static final long serialVersionUID = -4760036695773749721L; + + private Integer holdingID; + private double quantity; + private BigDecimal purchasePrice; + private Date purchaseDate; + private String quoteID; + private BigDecimal price; + private BigDecimal basis; + private BigDecimal marketValue; + private BigDecimal gain; + + public void setHoldingID(Integer holdingID) { + this.holdingID = holdingID; + } + + public Integer getHoldingID() { + return holdingID; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + public double getQuantity() { + return quantity; + } + + public void setPurchasePrice(BigDecimal purchasePrice) { + this.purchasePrice = purchasePrice; + } + + public BigDecimal getPurchasePrice() { + return purchasePrice; + } + + public void setPurchaseDate(Date purchaseDate) { + this.purchaseDate = purchaseDate; + } + + public Date getPurchaseDate() { + return purchaseDate; + } + + public void setQuoteID(String quoteID) { + this.quoteID = quoteID; + } + + public String getQuoteID() { + return quoteID; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } + + public void setBasis(BigDecimal basis) { + this.basis = basis; + } + + public BigDecimal getBasis() { + return basis; + } + + public void setMarketValue(BigDecimal marketValue) { + this.marketValue = marketValue; + } + + public BigDecimal getMarketValue() { + return marketValue; + } + + public void setGain(BigDecimal gain) { + this.gain = gain; + } + + public BigDecimal getGain() { + return gain; + } + + public String getGainHTML() { + return FinancialUtils.printGainHTML(gain); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/JSFLoginFilter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/JSFLoginFilter.java new file mode 100644 index 00000000..e9732088 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/JSFLoginFilter.java @@ -0,0 +1,88 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +//import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@WebFilter(filterName = "JSFLoginFilter", urlPatterns = "*.faces") +public class JSFLoginFilter implements Filter { + + public JSFLoginFilter() { + super(); + } + + /** + * @see Filter#init(FilterConfig) + */ + private FilterConfig filterConfig = null; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + if (filterConfig == null) { + return; + } + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) resp; + + HttpSession session = request.getSession(); + String userID = (String) session.getAttribute("uidBean"); + + // If user has not logged in and is trying access account information, + // redirect to login page. + if (userID == null) { + String url = request.getServletPath(); + + if (url.contains("home") || url.contains("account") || url.contains("portfolio") || url.contains("quote") || url.contains("order") + || url.contains("marketSummary")) { + System.out.println("JSF service error: User Not Logged in"); + response.sendRedirect("welcome.faces"); + return; + } + } + + chain.doFilter(req, resp/* wrapper */); + } + + /** + * @see Filter#destroy() + */ + @Override + public void destroy() { + this.filterConfig = null; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/LoginValidator.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/LoginValidator.java new file mode 100644 index 00000000..5c5c973c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/LoginValidator.java @@ -0,0 +1,55 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.faces.application.FacesMessage; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.validator.FacesValidator; +import javax.faces.validator.Validator; +import javax.faces.validator.ValidatorException; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@SuppressWarnings("rawtypes") +@FacesValidator("loginValidator") +public class LoginValidator implements Validator{ + + static String loginRegex = "uid:\\d+"; + static Pattern pattern = Pattern.compile(loginRegex); + static Matcher matcher; + + // Simple JSF validator to make sure username starts with uid: and at least 1 number. + public LoginValidator() { + } + + @Override + public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { + Log.trace("LoginValidator.validate","Validating submitted login name -- " + value.toString()); + + matcher = pattern.matcher(value.toString()); + + if (!matcher.matches()) { + FacesMessage msg = new FacesMessage("Username validation failed. Please provide username in this format: uid:#"); + msg.setSeverity(FacesMessage.SEVERITY_ERROR); + + throw new ValidatorException(msg); + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/MarketSummaryJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/MarketSummaryJSF.java new file mode 100644 index 00000000..3677753a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/MarketSummaryJSF.java @@ -0,0 +1,166 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.inject.Named; + +import com.ibm.websphere.samples.daytrader.beans.MarketSummaryDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("marketdata") +@RequestScoped +@Trace +public class MarketSummaryJSF { + + private TradeServices tradeAction; + + private BigDecimal TSIA; + private BigDecimal openTSIA; + private double volume; + private QuoteData[] topGainers; + private QuoteData[] topLosers; + private Date summaryDate; + + // cache the gainPercent once computed for this bean + private BigDecimal gainPercent = null; + + @Inject + public MarketSummaryJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @PostConstruct + public void getMarketSummary() { + + try { + MarketSummaryDataBean marketSummaryData = tradeAction.getMarketSummary(); + setSummaryDate(marketSummaryData.getSummaryDate()); + setTSIA(marketSummaryData.getTSIA()); + setVolume(marketSummaryData.getVolume()); + setGainPercent(marketSummaryData.getGainPercent()); + + Collection topGainers = marketSummaryData.getTopGainers(); + + Iterator gainers = topGainers.iterator(); + int count = 0; + QuoteData[] gainerjsfs = new QuoteData[5]; + + while (gainers.hasNext() && (count < 5)) { + QuoteDataBean quote = (QuoteDataBean) gainers.next(); + QuoteData r = new QuoteData(quote.getPrice(), quote.getOpen(), quote.getSymbol()); + gainerjsfs[count] = r; + count++; + } + + setTopGainers(gainerjsfs); + + Collection topLosers = marketSummaryData.getTopLosers(); + + QuoteData[] loserjsfs = new QuoteData[5]; + count = 0; + Iterator losers = topLosers.iterator(); + + while (losers.hasNext() && (count < 5)) { + QuoteDataBean quote = (QuoteDataBean) losers.next(); + QuoteData r = new QuoteData(quote.getPrice(), quote.getOpen(), quote.getSymbol()); + loserjsfs[count] = r; + count++; + } + + setTopLosers(loserjsfs); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void setTSIA(BigDecimal tSIA) { + TSIA = tSIA; + } + + public BigDecimal getTSIA() { + return TSIA; + } + + public void setOpenTSIA(BigDecimal openTSIA) { + this.openTSIA = openTSIA; + } + + public BigDecimal getOpenTSIA() { + return openTSIA; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + public double getVolume() { + return volume; + } + + public void setTopGainers(QuoteData[] topGainers) { + this.topGainers = topGainers; + } + + public QuoteData[] getTopGainers() { + return topGainers; + } + + public void setTopLosers(QuoteData[] topLosers) { + this.topLosers = topLosers; + } + + public QuoteData[] getTopLosers() { + return topLosers; + } + + public void setSummaryDate(Date summaryDate) { + this.summaryDate = summaryDate; + } + + public Date getSummaryDate() { + return summaryDate; + } + + public void setGainPercent(BigDecimal gainPercent) { + this.gainPercent = gainPercent.setScale(2,RoundingMode.HALF_UP); + } + + public BigDecimal getGainPercent() { + return gainPercent; + } + + public String getGainPercentHTML() { + return FinancialUtils.printGainPercentHTML(gainPercent); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderData.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderData.java new file mode 100644 index 00000000..c05f810c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderData.java @@ -0,0 +1,140 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.util.Date; + +public class OrderData { + private Integer orderID; + private String orderStatus; + private Date openDate; + private Date completionDate; + private BigDecimal orderFee; + private String orderType; + private double quantity; + private String symbol; + private BigDecimal total; + private BigDecimal price; + + public OrderData(Integer orderID, String orderStatus, Date openDate, Date completeDate, BigDecimal orderFee, String orderType, double quantity, + String symbol) { + this.orderID = orderID; + this.completionDate = completeDate; + this.openDate = openDate; + this.orderFee = orderFee; + this.orderType = orderType; + this.orderStatus = orderStatus; + this.quantity = quantity; + this.symbol = symbol; + } + + public OrderData(Integer orderID, String orderStatus, Date openDate, Date completeDate, BigDecimal orderFee, String orderType, double quantity, + String symbol, BigDecimal price) { + this.orderID = orderID; + this.completionDate = completeDate; + this.openDate = openDate; + this.orderFee = orderFee; + this.orderType = orderType; + this.orderStatus = orderStatus; + this.quantity = quantity; + this.symbol = symbol; + this.price = price; + this.total = price.multiply(new BigDecimal(quantity)); + + } + + public void setOrderID(Integer orderID) { + this.orderID = orderID; + } + + public Integer getOrderID() { + return orderID; + } + + public void setOrderStatus(String orderStatus) { + this.orderStatus = orderStatus; + } + + public String getOrderStatus() { + return orderStatus; + } + + public void setOpenDate(Date openDate) { + this.openDate = openDate; + } + + public Date getOpenDate() { + return openDate; + } + + public void setCompletionDate(Date completionDate) { + this.completionDate = completionDate; + } + + public Date getCompletionDate() { + return completionDate; + } + + public void setOrderFee(BigDecimal orderFee) { + this.orderFee = orderFee; + } + + public BigDecimal getOrderFee() { + return orderFee; + } + + public void setOrderType(String orderType) { + this.orderType = orderType; + } + + public String getOrderType() { + return orderType; + } + + public void setQuantity(double quantity) { + this.quantity = quantity; + } + + public double getQuantity() { + return quantity; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } + + public void setTotal(BigDecimal total) { + this.total = total; + } + + public BigDecimal getTotal() { + return total; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderDataJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderDataJSF.java new file mode 100644 index 00000000..8f9c70dd --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/OrderDataJSF.java @@ -0,0 +1,106 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.util.ArrayList; + +import javax.annotation.PostConstruct; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("orderdata") +@Trace +public class OrderDataJSF { + + @Inject + private ExternalContext context; + + private TradeServices tradeAction; + + private OrderData[] allOrders; + private OrderData orderData; + + @Inject + public OrderDataJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + public void getAllOrder() { + try { + HttpSession session = (HttpSession) context.getSession(true); + String userID = (String) session.getAttribute("uidBean"); + + ArrayList orderDataBeans = (TradeConfig.getLongRun() ? new ArrayList() : (ArrayList) tradeAction.getOrders(userID)); + OrderData[] orders = new OrderData[orderDataBeans.size()]; + + int count = 0; + + for (Object order : orderDataBeans) { + OrderData r = new OrderData(((OrderDataBean) order).getOrderID(), ((OrderDataBean) order).getOrderStatus(), + ((OrderDataBean) order).getOpenDate(), ((OrderDataBean) order).getCompletionDate(), ((OrderDataBean) order).getOrderFee(), + ((OrderDataBean) order).getOrderType(), ((OrderDataBean) order).getQuantity(), ((OrderDataBean) order).getSymbol()); + r.setPrice(((OrderDataBean) order).getPrice()); + r.setTotal(r.getPrice().multiply(new BigDecimal(r.getQuantity()))); + orders[count] = r; + count++; + } + + setAllOrders(orders); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @PostConstruct + public void getOrder() { + + + HttpSession session = (HttpSession) context.getSession(true); + OrderData order = (OrderData) session.getAttribute("orderData"); + + if (order != null) { + setOrderData(order); + } + } + + public void setAllOrders(OrderData[] allOrders) { + this.allOrders = allOrders; + } + + public OrderData[] getAllOrders() { + return allOrders; + } + + public void setOrderData(OrderData orderData) { + this.orderData = orderData; + } + + public OrderData getOrderData() { + return orderData; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/PortfolioJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/PortfolioJSF.java new file mode 100644 index 00000000..34a68d17 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/PortfolioJSF.java @@ -0,0 +1,235 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.faces.component.html.HtmlDataTable; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpSession; + +import javax.validation.constraints.PositiveOrZero; + +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("portfolio") +@RequestScoped +@Trace +public class PortfolioJSF { + @Inject + private ExternalContext context; + + private TradeServices tradeAction; + + private BigDecimal balance; + private BigDecimal openBalance; + + @PositiveOrZero + private Integer numberHoldings; + + private BigDecimal holdingsTotal; + private BigDecimal sumOfCashHoldings; + private BigDecimal totalGain = new BigDecimal(0.0); + private BigDecimal totalValue = new BigDecimal(0.0); + private BigDecimal totalBasis = new BigDecimal(0.0); + private BigDecimal totalGainPercent = new BigDecimal(0.0); + private ArrayList holdingDatas; + private HtmlDataTable dataTable; + + @Inject + public PortfolioJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @PostConstruct + public void getPortfolio() { + try { + + HttpSession session = (HttpSession) context.getSession(true); + String userID = (String) session.getAttribute("uidBean"); + Collection holdingDataBeans = tradeAction.getHoldings(userID); + + numberHoldings = holdingDataBeans.size(); + + // Walk through the collection of user holdings and creating a list + // of quotes + if (holdingDataBeans.size() > 0) { + Iterator it = holdingDataBeans.iterator(); + holdingDatas = new ArrayList(holdingDataBeans.size()); + + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + QuoteDataBean quoteData = tradeAction.getQuote(holdingData.getQuoteID()); + + BigDecimal basis = holdingData.getPurchasePrice().multiply(new BigDecimal(holdingData.getQuantity())); + BigDecimal marketValue = quoteData.getPrice().multiply(new BigDecimal(holdingData.getQuantity())); + totalBasis = totalBasis.add(basis); + totalValue = totalValue.add(marketValue); + BigDecimal gain = marketValue.subtract(basis); + totalGain = totalGain.add(gain); + + HoldingData h = new HoldingData(); + h.setHoldingID(holdingData.getHoldingID()); + h.setPurchaseDate(holdingData.getPurchaseDate()); + h.setQuoteID(holdingData.getQuoteID()); + h.setQuantity(holdingData.getQuantity()); + h.setPurchasePrice(holdingData.getPurchasePrice()); + h.setBasis(basis); + h.setGain(gain); + h.setMarketValue(marketValue); + h.setPrice(quoteData.getPrice()); + holdingDatas.add(h); + + } + // dataTable + setTotalGainPercent(FinancialUtils.computeGainPercent(totalValue, totalBasis)); + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public String sell() { + + HttpSession session = (HttpSession) context.getSession(true); + String userID = (String) session.getAttribute("uidBean"); + + OrderDataBean orderDataBean = null; + HoldingData holdingData = (HoldingData) dataTable.getRowData(); + + try { + orderDataBean = tradeAction.sell(userID, holdingData.getHoldingID(), TradeConfig.getOrderProcessingMode()); + holdingDatas.remove(holdingData); + } catch (Exception e) { + e.printStackTrace(); + } + + OrderData orderData = new OrderData(orderDataBean.getOrderID(), orderDataBean.getOrderStatus(), orderDataBean.getOpenDate(), + orderDataBean.getCompletionDate(), orderDataBean.getOrderFee(), orderDataBean.getOrderType(), orderDataBean.getQuantity(), + orderDataBean.getSymbol()); + session.setAttribute("orderData", orderData); + return "sell"; + } + + public void setDataTable(HtmlDataTable dataTable) { + this.dataTable = dataTable; + } + + public HtmlDataTable getDataTable() { + return dataTable; + } + + public void setBalance(BigDecimal balance) { + this.balance = balance; + } + + public BigDecimal getBalance() { + return balance; + } + + public void setOpenBalance(BigDecimal openBalance) { + this.openBalance = openBalance; + } + + public BigDecimal getOpenBalance() { + return openBalance; + } + + public void setHoldingsTotal(BigDecimal holdingsTotal) { + this.holdingsTotal = holdingsTotal; + } + + public BigDecimal getHoldingsTotal() { + return holdingsTotal; + } + + public void setSumOfCashHoldings(BigDecimal sumOfCashHoldings) { + this.sumOfCashHoldings = sumOfCashHoldings; + } + + public BigDecimal getSumOfCashHoldings() { + return sumOfCashHoldings; + } + + public void setNumberHoldings(Integer numberHoldings) { + this.numberHoldings = numberHoldings; + } + + public Integer getNumberHoldings() { + return numberHoldings; + } + + public void setTotalGain(BigDecimal totalGain) { + this.totalGain = totalGain; + } + + public BigDecimal getTotalGain() { + return totalGain; + } + + public void setTotalValue(BigDecimal totalValue) { + this.totalValue = totalValue; + } + + public BigDecimal getTotalValue() { + return totalValue; + } + + public void setTotalBasis(BigDecimal totalBasis) { + this.totalBasis = totalBasis; + } + + public BigDecimal getTotalBasis() { + return totalBasis; + } + + public void setHoldingDatas(ArrayList holdingDatas) { + this.holdingDatas = holdingDatas; + } + + public ArrayList getHoldingDatas() { + return holdingDatas; + } + + public void setTotalGainPercent(BigDecimal totalGainPercent) { + this.totalGainPercent = totalGainPercent; + } + + public BigDecimal getTotalGainPercent() { + return totalGainPercent; + } + + public String getTotalGainPercentHTML() { + return FinancialUtils.printGainPercentHTML(totalGainPercent); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteData.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteData.java new file mode 100644 index 00000000..ad3425b7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteData.java @@ -0,0 +1,167 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; + +public class QuoteData { + private BigDecimal price; + private BigDecimal open; + private String symbol; + private BigDecimal high; + private BigDecimal low; + private String companyName; + private double volume; + private double change; + private String range; + private BigDecimal gainPercent; + private BigDecimal gain; + + public QuoteData(BigDecimal price, BigDecimal open, String symbol) { + this.open = open; + this.price = price; + this.symbol = symbol; + this.change = price.subtract(open).setScale(2).doubleValue(); + } + + public QuoteData(BigDecimal open, BigDecimal price, String symbol, BigDecimal high, BigDecimal low, String companyName, Double volume, Double change) { + this.open = open; + this.price = price; + this.symbol = symbol; + this.high = high; + this.low = low; + this.companyName = companyName; + this.volume = volume; + this.change = change; + this.range = high.toString() + "-" + low.toString(); + this.gainPercent = FinancialUtils.computeGainPercent(price, open).setScale(2); + this.gain = FinancialUtils.computeGain(price, open).setScale(2); + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public String getSymbol() { + return symbol; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getPrice() { + return price; + } + + public void setOpen(BigDecimal open) { + this.open = open; + } + + public BigDecimal getOpen() { + return open; + } + + public void setHigh(BigDecimal high) { + this.high = high; + } + + public BigDecimal getHigh() { + return high; + } + + public void setLow(BigDecimal low) { + this.low = low; + } + + public BigDecimal getLow() { + return low; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyName() { + return companyName; + } + + public void setVolume(double volume) { + this.volume = volume; + } + + public double getVolume() { + return volume; + } + + public void setChange(double change) { + this.change = change; + } + + public double getChange() { + return change; + } + + public void setRange(String range) { + this.range = range; + } + + public String getRange() { + return range; + } + + public void setGainPercent(BigDecimal gainPercent) { + this.gainPercent = gainPercent.setScale(2); + } + + public BigDecimal getGainPercent() { + return gainPercent; + } + + public void setGain(BigDecimal gain) { + this.gain = gain; + } + + public BigDecimal getGain() { + return gain; + } + + public String getGainPercentHTML() { + return FinancialUtils.printGainPercentHTML(gainPercent); + } + + public String getGainHTML() { + return FinancialUtils.printGainHTML(gain); + } + + public String getChangeHTML() { + String htmlString, arrow; + if (change < 0.0) { + htmlString = ""; + arrow = "arrowdown.gif"; + } else { + htmlString = ""; + arrow = "arrowup.gif"; + } + DecimalFormat df = new DecimalFormat("####0.00"); + + htmlString += df.format(change) + ""; + return htmlString; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteJSF.java new file mode 100644 index 00000000..f8c5d7c2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/QuoteJSF.java @@ -0,0 +1,146 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.faces.component.html.HtmlDataTable; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("quotedata") +@RequestScoped +@Trace +public class QuoteJSF { + + @Inject + private ExternalContext context; + + private TradeServices tradeAction; + + private QuoteData[] quotes; + private String symbols = null; + private HtmlDataTable dataTable; + private Integer quantity = 100; + + @Inject + public QuoteJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @PostConstruct + public void getAllQuotes() { + getQuotesBySymbols(); + } + + public String getQuotesBySymbols() { + HttpSession session = (HttpSession) context.getSession(true); + + if (symbols == null && (session.getAttribute("symbols") == null)) { + setSymbols("s:0,s:1,s:2,s:3,s:4"); + session.setAttribute("symbols", getSymbols()); + } else if (symbols == null && session.getAttribute("symbols") != null) { + setSymbols((String) session.getAttribute("symbols")); + } + + else { + session.setAttribute("symbols", getSymbols()); + } + + java.util.StringTokenizer st = new java.util.StringTokenizer(symbols, " ,"); + QuoteData[] quoteDatas = new QuoteData[st.countTokens()]; + int count = 0; + + while (st.hasMoreElements()) { + String symbol = st.nextToken(); + + try { + QuoteDataBean quoteData = tradeAction.getQuote(symbol); + quoteDatas[count] = new QuoteData(quoteData.getOpen(), quoteData.getPrice(), quoteData.getSymbol(), quoteData.getHigh(), quoteData.getLow(), + quoteData.getCompanyName(), quoteData.getVolume(), quoteData.getChange()); + count++; + } catch (Exception e) { + Log.error(e.toString()); + } + } + setQuotes(quoteDatas); + return "quotes"; + } + + public String buy() { + HttpSession session = (HttpSession) context.getSession(true); + String userID = (String) session.getAttribute("uidBean"); + QuoteData quoteData = (QuoteData) dataTable.getRowData(); + OrderDataBean orderDataBean; + + try { + orderDataBean = tradeAction.buy(userID, quoteData.getSymbol(), new Double(this.quantity).doubleValue(), TradeConfig.getOrderProcessingMode()); + + OrderData orderData = new OrderData(orderDataBean.getOrderID(), orderDataBean.getOrderStatus(), orderDataBean.getOpenDate(), + orderDataBean.getCompletionDate(), orderDataBean.getOrderFee(), orderDataBean.getOrderType(), orderDataBean.getQuantity(), + orderDataBean.getSymbol()); + session.setAttribute("orderData", orderData); + } catch (Exception e) { + Log.error(e.toString()); + e.printStackTrace(); + } + return "buy"; + } + + public void setQuotes(QuoteData[] quotes) { + this.quotes = quotes; + } + + public QuoteData[] getQuotes() { + return quotes; + } + + public void setSymbols(String symbols) { + this.symbols = symbols; + } + + public String getSymbols() { + return symbols; + } + + public void setDataTable(HtmlDataTable dataTable) { + this.dataTable = dataTable; + } + + public HtmlDataTable getDataTable() { + return dataTable; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Integer getQuantity() { + return quantity; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeAppJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeAppJSF.java new file mode 100644 index 00000000..b8271641 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeAppJSF.java @@ -0,0 +1,298 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.enterprise.context.SessionScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; + +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@Named("tradeapp") +@SessionScoped +@Trace +public class TradeAppJSF implements Serializable { + + @Inject ExternalContext context; + + private TradeServices tradeAction; + + private static final long serialVersionUID = 2L; + + @NotBlank + private String userID = "uid:0"; + + @NotBlank + private String password = "xxx"; + + @NotBlank + private String cpassword; + + @NotBlank + private String results; + + @NotBlank + private String fullname; + + @NotBlank + private String address; + + @Email + private String email; + + @NotBlank + private String ccn; + + @NotBlank + private String money; + + @Inject + public TradeAppJSF(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + public String login() { + try { + AccountDataBean accountData = tradeAction.login(userID, password); + + AccountProfileDataBean accountProfileData = tradeAction.getAccountProfileData(userID); + if (accountData != null) { + HttpSession session = (HttpSession) context.getSession(true); + + session.setAttribute("uidBean", userID); + session.setAttribute("sessionCreationDate", new java.util.Date()); + setResults("Ready to Trade"); + + // Get account profile information + setAddress(accountProfileData.getAddress()); + setCcn(accountProfileData.getCreditCard()); + setEmail(accountProfileData.getEmail()); + setFullname(accountProfileData.getFullName()); + setCpassword(accountProfileData.getPassword()); + return "Ready to Trade"; + } else { + Log.log("TradeServletAction.doLogin(...)", "Error finding account for user " + userID + "", + "user entered a bad username or the database is not populated"); + throw new NullPointerException("User does not exist or password is incorrect!"); + } + } + + catch (Exception se) { + // Go to welcome page + setResults("Could not find account"); + return "welcome"; + } + } + + public String register() { + + // Validate user passwords match and are atleast 1 char in length + try { + if ((password.equals(cpassword)) && (password.length() >= 1)) { + AccountDataBean accountData = tradeAction.register(userID, password, fullname, address, email, ccn, new BigDecimal(money)); + + if (accountData == null) { + setResults("Registration operation failed;"); + // Go to register page + return "Registration operation failed"; + + } else { + login(); + setResults("Registration operation succeeded; Account " + accountData.getAccountID() + " has been created."); + return "Registration operation succeeded"; + } + } + + else { + // Password validation failed + setResults("Registration operation failed, your passwords did not match"); + // Go to register page + return "Registration operation failed"; + } + } + + catch (Exception e) { + // log the exception with error page + Log.log("TradeServletAction.doRegister(...)" + " exception user =" + userID); + try { + throw new Exception("TradeServletAction.doRegister(...)" + " exception user =" + userID, e); + } catch (Exception e1) { + e1.printStackTrace(); + } + + } + return "Registration operation succeeded"; + } + + public String updateProfile() { + + // First verify input data + boolean doUpdate = true; + + if (password.equals(cpassword) == false) { + results = "Update profile error: passwords do not match"; + doUpdate = false; + } + + AccountProfileDataBean accountProfileData = new AccountProfileDataBean(userID, password, fullname, address, email, ccn); + + try { + if (doUpdate) { + accountProfileData = tradeAction.updateAccountProfile(accountProfileData); + results = "Account profile update successful"; + } + + } catch (java.lang.IllegalArgumentException e) { + // this is a user error so I will + // forward them to another page rather than throw a 500 + setResults("invalid argument, check userID is correct, and the database is populated" + userID); + Log.error(e, "TradeServletAction.doAccount(...)", "illegal argument, information should be in exception string", + "treating this as a user error and forwarding on to a new page"); + } catch (Exception e) { + // log the exception with error page + e.printStackTrace(); + } + // Go to account.xhtml + return "Go to account"; + } + + public String logout() { + + try { + setResults(""); + tradeAction.logout(userID); + } catch (java.lang.IllegalArgumentException e) { + // this is a user error so I will + // forward them to another page, at the end of the page. + setResults("illegal argument:" + e.getMessage()); + + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error(e, "TradeServletAction.doLogout(...)", "illegal argument, information should be in exception string", + "treating this as a user error and forwarding on to a new page"); + } catch (Exception e) { + // log the exception and foward to a error page + Log.error(e, "TradeAppJSF.logout():", "Error logging out" + userID, "fowarding to an error page"); + } + + HttpSession session = (HttpSession)context.getSession(false); + + if (session != null) { + session.invalidate(); + } + + // Added to actually remove a user from the authentication cache + try { + ((HttpServletRequest) context.getRequest()).logout(); + } catch (ServletException e) { + Log.error(e, "TradeAppJSF.logout():", "Error logging out request" + userID, "fowarding to an error page"); + } + + // Go to welcome page + return "welcome"; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCpassword() { + return cpassword; + } + + public void setCpassword(String cpassword) { + this.cpassword = cpassword; + } + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public String getResults() { + String tempResults=results; + results=""; + return tempResults; + } + + public void setResults(String results) { + this.results = results; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getCcn() { + return ccn; + } + + public void setCcn(String ccn) { + this.ccn = ccn; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } +}; diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeConfigJSF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeConfigJSF.java new file mode 100644 index 00000000..fd7cb859 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/jsf/TradeConfigJSF.java @@ -0,0 +1,331 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.jsf; + +import javax.enterprise.context.RequestScoped; +import javax.faces.context.ExternalContext; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.beans.RunStatsDataBean; +import com.ibm.websphere.samples.daytrader.impl.direct.TradeDirectDBUtils; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@Named("tradeconfig") +@RequestScoped +public class TradeConfigJSF { + + @Inject + private ExternalContext context; + + @Inject + TradeDirectDBUtils dbUtils; + + private String runtimeMode = TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()]; + private String orderProcessingMode = TradeConfig.getOrderProcessingModeNames()[TradeConfig.getOrderProcessingMode()]; + private int maxUsers = TradeConfig.getMAX_USERS(); + private int maxQuotes = TradeConfig.getMAX_QUOTES(); + private int marketSummaryInterval = TradeConfig.getMarketSummaryInterval(); + private String webInterface = TradeConfig.getWebInterfaceNames()[TradeConfig.getWebInterface()]; + private int primIterations = TradeConfig.getPrimIterations(); + private int listQuotePriceChangeFrequency = TradeConfig.getListQuotePriceChangeFrequency(); + private boolean publishQuotePriceChange = TradeConfig.getPublishQuotePriceChange(); + private boolean longRun = TradeConfig.getLongRun(); + private boolean displayOrderAlerts = TradeConfig.getDisplayOrderAlerts(); + private String[] runtimeModeList = TradeConfig.getRunTimeModeNames(); + private String[] orderProcessingModeList = TradeConfig.getOrderProcessingModeNames(); + + private String[] webInterfaceList = TradeConfig.getWebInterfaceNames(); + private String result = ""; + + public void updateConfig() { + String currentConfigStr = "\n\n########## Trade configuration update. Current config:\n\n"; + + currentConfigStr += "\t\tRunTimeMode:\t\t\t" + TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()] + "\n"; + + String orderProcessingModeStr = this.orderProcessingMode; + if (orderProcessingModeStr != null) { + try { + for (int i = 0; i < orderProcessingModeList.length; i++) { + if (orderProcessingModeStr.equals(orderProcessingModeList[i])) { + TradeConfig.setOrderProcessingMode(i); + } + } + } catch (Exception e) { + Log.error(e, "TradeConfigJSF.updateConfig(..): minor exception caught", "trying to set orderProcessing to " + orderProcessingModeStr, + "reverting to current value"); + + } // If the value is bad, simply revert to current + } + currentConfigStr += "\t\tOrderProcessingMode:\t\t" + TradeConfig.getOrderProcessingModeNames()[TradeConfig.getOrderProcessingMode()] + "\n"; + + String webInterfaceStr = webInterface; + if (webInterfaceStr != null) { + try { + for (int i = 0; i < webInterfaceList.length; i++) { + if (webInterfaceStr.equals(webInterfaceList[i])) { + TradeConfig.setWebInterface(i); + } + } + } catch (Exception e) { + Log.error(e, "TradeConfigJSF.updateConfig(..): minor exception caught", "trying to set WebInterface to " + webInterfaceStr, + "reverting to current value"); + + } // If the value is bad, simply revert to current + } + currentConfigStr += "\t\tWeb Interface:\t\t\t" + TradeConfig.getWebInterfaceNames()[TradeConfig.getWebInterface()] + "\n"; + + TradeConfig.setMAX_USERS(maxUsers); + TradeConfig.setMAX_QUOTES(maxQuotes); + + currentConfigStr += "\t\tTrade Users:\t\t\t" + TradeConfig.getMAX_USERS() + "\n"; + currentConfigStr += "\t\tTrade Quotes:\t\t\t" + TradeConfig.getMAX_QUOTES() + "\n"; + + TradeConfig.setMarketSummaryInterval(marketSummaryInterval); + + currentConfigStr += "\t\tMarket Summary Interval:\t" + TradeConfig.getMarketSummaryInterval() + "\n"; + + TradeConfig.setPrimIterations(primIterations); + + currentConfigStr += "\t\tPrimitive Iterations:\t\t" + TradeConfig.getPrimIterations() + "\n"; + + TradeConfig.setPublishQuotePriceChange(publishQuotePriceChange); + currentConfigStr += "\t\tTradeStreamer MDB Enabled:\t" + TradeConfig.getPublishQuotePriceChange() + "\n"; + + TradeConfig.setListQuotePriceChangeFrequency(listQuotePriceChangeFrequency); + currentConfigStr += "\t\t% of trades on Websocket:\t" + TradeConfig.getListQuotePriceChangeFrequency() + "\n"; + + TradeConfig.setLongRun(longRun); + currentConfigStr += "\t\tLong Run Enabled:\t\t" + TradeConfig.getLongRun() + "\n"; + + TradeConfig.setDisplayOrderAlerts(displayOrderAlerts); + currentConfigStr += "\t\tDisplay Order Alerts:\t\t" + TradeConfig.getDisplayOrderAlerts() + "\n"; + + System.out.println(currentConfigStr); + setResult("DayTrader Configuration Updated"); + } + + public String resetTrade() { + RunStatsDataBean runStatsData = new RunStatsDataBean(); + TradeConfig currentConfig = new TradeConfig(); + HttpSession session = (HttpSession) context.getSession(true); + + + try { + runStatsData = dbUtils.resetTrade(false); + session.setAttribute("runStatsData", runStatsData); + session.setAttribute("tradeConfig", currentConfig); + result += "Trade Reset completed successfully"; + + } catch (Exception e) { + result += "Trade Reset Error - see log for details"; + session.setAttribute("result", result); + Log.error(e, result); + } + + return "stats"; + } + + public String populateDatabase() { + + try { + dbUtils.buildDB(new java.io.PrintWriter(System.out), null); + } catch (Exception e) { + e.printStackTrace(); + } + + result = "TradeBuildDB: **** DayTrader Database Built - " + TradeConfig.getMAX_USERS() + " users created, " + TradeConfig.getMAX_QUOTES() + + " quotes created. ****
    "; + result += "TradeBuildDB: **** Check System.Out for any errors. ****
    "; + + return "database"; + } + + public String buildDatabaseTables() { + try { + String dbProductName = null; + try { + dbProductName = dbUtils.checkDBProductName(); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to check DB Product name"); + } + if (dbProductName == null) { + result += "TradeBuildDB: **** Unable to check DB Product name, please check Database/AppServer configuration and retry ****
    "; + return "database"; + } + + String ddlFile = null; + //Locate DDL file for the specified database + try { + result = result + "TradeBuildDB: **** Database Product detected: " + dbProductName + " ****
    "; + if (dbProductName.startsWith("DB2/")) { // if db is DB2 + ddlFile = "/dbscripts/db2/Table.ddl"; + } else if (dbProductName.startsWith("Apache Derby")) { //if db is Derby + ddlFile = "/dbscripts/derby/Table.ddl"; + } else if (dbProductName.startsWith("Oracle")) { // if the Db is Oracle + ddlFile = "/dbscripts/oracle/Table.ddl"; + } else { // Unsupported "Other" Database + ddlFile = "/dbscripts/other/Table.ddl"; + result = result + "TradeBuildDB: **** This Database is unsupported/untested use at your own risk ****
    "; + } + + result = result + "TradeBuildDB: **** The DDL file at path" + ddlFile + " will be used ****
    "; + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to locate DDL file for the specified database"); + result = result + "TradeBuildDB: **** Unable to locate DDL file for the specified database ****
    "; + return "database"; + } + + dbUtils.buildDB(new java.io.PrintWriter(System.out), context.getResourceAsStream(ddlFile)); + + result = result + "TradeBuildDB: **** DayTrader Database Created, Check System.Out for any errors. ****
    "; + + } catch (Exception e) { + e.printStackTrace(); + } + + // Go to configure.xhtml + return "database"; + } + + + + + public String getRuntimeMode() { + return runtimeMode; + } + + public void setRuntimeMode(String runtimeMode) { + this.runtimeMode = runtimeMode; + } + + public void setOrderProcessingMode(String orderProcessingMode) { + this.orderProcessingMode = orderProcessingMode; + } + + public String getOrderProcessingMode() { + return orderProcessingMode; + } + + + public void setMaxUsers(int maxUsers) { + this.maxUsers = maxUsers; + } + + public int getMaxUsers() { + return maxUsers; + } + + public void setmaxQuotes(int maxQuotes) { + this.maxQuotes = maxQuotes; + } + + public int getMaxQuotes() { + return maxQuotes; + } + + public void setMarketSummaryInterval(int marketSummaryInterval) { + this.marketSummaryInterval = marketSummaryInterval; + } + + public int getMarketSummaryInterval() { + return marketSummaryInterval; + } + + public void setPrimIterations(int primIterations) { + this.primIterations = primIterations; + } + + public int getPrimIterations() { + return primIterations; + } + + public void setPublishQuotePriceChange(boolean publishQuotePriceChange) { + this.publishQuotePriceChange = publishQuotePriceChange; + } + + public boolean isPublishQuotePriceChange() { + return publishQuotePriceChange; + } + + public void setListQuotePriceChangeFrequency(int listQuotePriceChangeFrequency) { + this.listQuotePriceChangeFrequency = listQuotePriceChangeFrequency; + } + + public int getListQuotePriceChangeFrequency() { + return listQuotePriceChangeFrequency; + } + + public void setDisplayOrderAlerts(boolean displayOrderAlerts) { + this.displayOrderAlerts = displayOrderAlerts; + } + + public boolean isDisplayOrderAlerts() { + return displayOrderAlerts; + } + + + public void setLongRun(boolean longRun) { + this.longRun = longRun; + } + + public boolean isLongRun() { + return longRun; + } + + public String[] getRuntimeModeList() { + return runtimeModeList; + } + + public void setRuntimeModeList(String[] runtimeModeList) { + this.runtimeModeList = runtimeModeList; + } + + public void setOrderProcessingModeList(String[] orderProcessingModeList) { + this.orderProcessingModeList = orderProcessingModeList; + } + + public String[] getOrderProcessingModeList() { + return orderProcessingModeList; + } + + public void setWebInterface(String webInterface) { + this.webInterface = webInterface; + } + + public String getWebInterface() { + return webInterface; + } + + public void setWebInterfaceList(String[] webInterfaceList) { + this.webInterfaceList = webInterfaceList; + } + + public String[] getWebInterfaceList() { + return webInterfaceList; + } + + public void setResult(String result) { + this.result = result; + } + + public String getResult() { + return result; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ExplicitGC.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ExplicitGC.java new file mode 100644 index 00000000..073a4709 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ExplicitGC.java @@ -0,0 +1,158 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * ExplicitGC invokes System.gc(). This allows one to gather min / max heap + * statistics. + * + */ +@WebServlet(name = "ExplicitGC", urlPatterns = { "/servlet/ExplicitGC" }) +public class ExplicitGC extends HttpServlet { + + private static final long serialVersionUID = -3758934393801102408L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (01/29/2006 + * 20:10:00 PM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + ServletOutputStream out = res.getOutputStream(); + hitCount++; + long totalMemory = Runtime.getRuntime().totalMemory(); + + long maxMemoryBeforeGC = Runtime.getRuntime().maxMemory(); + long freeMemoryBeforeGC = Runtime.getRuntime().freeMemory(); + long startTime = System.currentTimeMillis(); + + System.gc(); // Invoke the GC. + + long endTime = System.currentTimeMillis(); + long maxMemoryAfterGC = Runtime.getRuntime().maxMemory(); + long freeMemoryAfterGC = Runtime.getRuntime().freeMemory(); + + out.println("ExplicitGC" + + "

    Explicit Garbage Collection
    Init time : " + + initTime + + "

    Hit Count: " + + hitCount + + "
    " + + "" + + "" + + "
    Total Memory" + + totalMemory + + "
    " + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
    " + + "Statistics before GC
    " + + "Max Memory" + + maxMemoryBeforeGC + + "
    " + + "Free Memory" + + freeMemoryBeforeGC + + "
    " + + "Used Memory" + + (totalMemory - freeMemoryBeforeGC) + + "
    Statistics after GC
    " + + "Max Memory" + + maxMemoryAfterGC + + "
    " + + "Free Memory" + + freeMemoryAfterGC + + "
    " + + "Used Memory" + + (totalMemory - freeMemoryAfterGC) + + "
    " + + "Total Time in GC" + + Float.toString((endTime - startTime) / 1000) + + "s
    " + ""); + } catch (Exception e) { + Log.error(e, "ExplicitGC.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Generate Explicit GC to VM"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingBean.java new file mode 100644 index 00000000..1e8a05c7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingBean.java @@ -0,0 +1,41 @@ +/** + * (C) Copyright IBM Corporation 2016. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +/** + * Simple bean to get and set messages + */ + +public class PingBean { + + private String msg; + + /** + * returns the message contained in the bean + * + * @return message String + **/ + public String getMsg() { + return msg; + } + + /** + * sets the message contained in the bean param message String + **/ + public void setMsg(String s) { + msg = s; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead.java new file mode 100644 index 00000000..46e7b49a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead.java @@ -0,0 +1,135 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingJDBCReadPrepStmt uses a prepared statement for database read access. This + * primative uses + * {@link com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect} to set the + * price of a random stock (generated by + * {@link com.ibm.websphere.samples.daytrader.util.TradeConfig}) through the use + * of prepared statements. + * + */ + +@WebServlet(name = "PingJDBCRead", urlPatterns = { "/servlet/PingJDBCRead" }) +public class PingJDBCRead extends HttpServlet { + + @Inject + @TradeJDBC + TradeServices trade; + + private static final long serialVersionUID = -8810390150632488526L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + String symbol = null; + StringBuffer output = new StringBuffer(100); + + try { + // TradeJDBC uses prepared statements so I am going to make use of + // it's code. + + symbol = TradeConfig.rndSymbol(); + + QuoteDataBean quoteData = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + quoteData = trade.getQuote(symbol); + } + + output.append("Ping JDBC Read w/ Prepared Stmt." + + "
    Ping JDBC Read w/ Prep Stmt:
    Init time : " + + initTime); + hitCount++; + output.append("
    Hit Count: " + hitCount); + output.append("
    Quote Information

    : " + quoteData.toHTML()); + output.append("
    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingJDBCRead w/ Prep Stmt -- error getting quote for symbol", symbol); + res.sendError(500, "PingJDBCRead Exception caught: " + e.toString()); + } + + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JDBC Read using a prepared statment, makes use of TradeJDBC class"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead2JSP.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead2JSP.java new file mode 100644 index 00000000..2e89277f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCRead2JSP.java @@ -0,0 +1,128 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingJDBCReadPrepStmt uses a prepared statement for database read access. This + * primative uses + * {@link com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect} to set the + * price of a random stock (generated by + * {@link com.ibm.websphere.samples.daytrader.util.TradeConfig}) through the use + * of prepared statements. + * + */ + +@WebServlet(name = "PingJDBCRead2JSP", urlPatterns = { "/servlet/PingJDBCRead2JSP" }) +public class PingJDBCRead2JSP extends HttpServlet { + + @Inject + @TradeJDBC + TradeServices trade; + + private static final long serialVersionUID = 1118803761565654806L; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + String symbol = null; + QuoteDataBean quoteData = null; + ServletContext ctx = getServletConfig().getServletContext(); + + try { + + symbol = TradeConfig.rndSymbol(); + + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + quoteData = trade.getQuote(symbol); + } + + req.setAttribute("quoteData", quoteData); + // req.setAttribute("hitCount", hitCount); + // req.setAttribute("initTime", initTime); + + ctx.getRequestDispatcher("/quoteDataPrimitive.jsp").include(req, res); + } catch (Exception e) { + Log.error(e, "PingJDBCRead2JPS -- error getting quote for symbol", symbol); + res.sendError(500, "PingJDBCRead2JSP Exception caught: " + e.toString()); + } + + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JDBC Read using a prepared statment forwarded to a JSP, makes use of TradeJDBC class"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + // hitCount = 0; + // initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCWrite.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCWrite.java new file mode 100644 index 00000000..de451091 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJDBCWrite.java @@ -0,0 +1,140 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.math.BigDecimal; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect; +import com.ibm.websphere.samples.daytrader.interfaces.TradeJDBC; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingJDBCReadPrepStmt uses a prepared statement for database update. Statement + * parameters are set dynamically on each request. This primative uses + * {@link com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect} to set the + * price of a random stock (generated by + * {@link com.ibm.websphere.samples.daytrader.util.TradeConfig}) through the use + * of prepared statements. + * + */ +@WebServlet(name = "PingJDBCWrite", urlPatterns = { "/servlet/PingJDBCWrite" }) +public class PingJDBCWrite extends HttpServlet { + + @Inject + @TradeJDBC + TradeDirect trade; + + private static final long serialVersionUID = -4938035109655376503L; + private static String initTime; + private static int hitCount; + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + + String symbol = null; + BigDecimal newPrice; + StringBuffer output = new StringBuffer(100); + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + + try { + // get a random symbol to update and a random price. + symbol = TradeConfig.rndSymbol(); + newPrice = TradeConfig.getRandomPriceChangeFactor(); + + + // update the price of our symbol + QuoteDataBean quoteData = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + quoteData = trade.updateQuotePriceVolumeInt(symbol, newPrice, 100.0, false); + } + + // write the output + output.append("Ping JDBC Write w/ Prepared Stmt." + + "
    Ping JDBC Write w/ Prep Stmt:
    Init time : " + + initTime); + hitCount++; + output.append("
    Hit Count: " + hitCount); + output.append("
    Update Information
    "); + output.append("
    " + quoteData.toHTML() + "
    "); + out.println(output.toString()); + + } catch (Exception e) { + Log.error(e, "PingJDBCWrite -- error updating quote for symbol", symbol); + res.sendError(500, "PingJDBCWrite Exception caught: " + e.toString()); + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JDBC Write using a prepared statment makes use of TradeJDBC code."; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObject.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObject.java new file mode 100644 index 00000000..5f2cfbb8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObject.java @@ -0,0 +1,128 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.stream.JsonGenerator; +import javax.json.stream.JsonParser; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingJSONP tests JSON generating and parsing + * + */ + +@WebServlet(name = "PingJSONPObject", urlPatterns = { "/servlet/PingJSONPObject" }) +public class PingJSONPObject extends HttpServlet { + + + /** + * + */ + private static final long serialVersionUID = -5348806619121122708L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + ServletOutputStream out = res.getOutputStream(); + + hitCount++; + + // JSON generate + JsonObject json = Json.createObjectBuilder() + .add("initTime", initTime) + .add("hitCount", hitCount).build(); + String generatedJSON = json.toString(); + + // Read back + JsonReader jsonReader = Json.createReader(new StringReader(generatedJSON)); + String parsedJSON = jsonReader.readObject().toString(); + + + out.println("Ping JSONP" + + "

    Ping JSONP
    Generated JSON: " + generatedJSON + "
    Parsed JSON: " + parsedJSON + ""); + } catch (Exception e) { + Log.error(e, "PingJSONPObject.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JSON generation and parsing in a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObjectFactory.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObjectFactory.java new file mode 100644 index 00000000..1798797b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPObjectFactory.java @@ -0,0 +1,127 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.StringReader; + +import javax.json.Json; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObject; +import javax.json.JsonReader; +import javax.json.JsonReaderFactory; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingJSONP tests JSON generating and parsing + * + */ +@WebServlet(name = "PingJSONPObjectFactory", urlPatterns = { "/servlet/PingJSONPObjectFactory" }) +public class PingJSONPObjectFactory extends HttpServlet { + + private static final JsonBuilderFactory jSONObjectFactory = Json.createBuilderFactory(null); + private static final JsonReaderFactory jSONReaderFactory = Json.createReaderFactory(null); + /** + * + */ + private static final long serialVersionUID = -5348806619121122708L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + ServletOutputStream out = res.getOutputStream(); + + hitCount++; + + // JSON generate + JsonObject json = jSONObjectFactory.createObjectBuilder() + .add("initTime", initTime) + .add("hitCount", hitCount).build(); + String generatedJSON = json.toString(); + + // Read back + JsonReader jsonReader = jSONReaderFactory.createReader(new StringReader(generatedJSON)); + String parsedJSON = jsonReader.readObject().toString(); + + + out.println("Ping JSONP" + + "

    Ping JSONP
    Generated JSON: " + generatedJSON + "
    Parsed JSON: " + parsedJSON + ""); + } catch (Exception e) { + Log.error(e, "PingJSONPObject.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JSON generation and parsing in a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPStreaming.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPStreaming.java new file mode 100644 index 00000000..a1039381 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingJSONPStreaming.java @@ -0,0 +1,151 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; + +import javax.json.Json; +import javax.json.stream.JsonGenerator; +import javax.json.stream.JsonParser; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingJSONP tests JSON generating and parsing + * + */ + +@WebServlet(name = "PingJSONPStreaming", urlPatterns = { "/servlet/PingJSONPStreaming" }) +public class PingJSONPStreaming extends HttpServlet { + + + /** + * + */ + private static final long serialVersionUID = -5348806619121122708L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + ServletOutputStream out = res.getOutputStream(); + + hitCount++; + + // JSON generate + StringWriter sw = new StringWriter(); + JsonGenerator generator = Json.createGenerator(sw); + + generator.writeStartObject(); + generator.write("initTime",initTime); + generator.write("hitCount", hitCount); + generator.writeEnd(); + generator.flush(); + + String generatedJSON = sw.toString(); + StringBuffer parsedJSON = new StringBuffer(); + + // JSON parse + JsonParser parser = Json.createParser(new StringReader(generatedJSON)); + while (parser.hasNext()) { + JsonParser.Event event = parser.next(); + switch(event) { + case START_ARRAY: + case END_ARRAY: + case START_OBJECT: + case END_OBJECT: + case VALUE_FALSE: + case VALUE_NULL: + case VALUE_TRUE: + break; + case KEY_NAME: + parsedJSON.append(parser.getString() + ":"); + break; + case VALUE_STRING: + case VALUE_NUMBER: + parsedJSON.append(parser.getString() + " "); + break; + } + } + + out.println("Ping JSONP" + + "

    Ping JSONP
    Generated JSON: " + generatedJSON + "
    Parsed JSON: " + parsedJSON + ""); + } catch (Exception e) { + Log.error(e, "PingJSONP.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JSON generation and parsing in a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedExecutor.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedExecutor.java new file mode 100644 index 00000000..a86aeaa2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedExecutor.java @@ -0,0 +1,120 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.servlet.AsyncContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(asyncSupported=true,name = "PingManagedExecutor", urlPatterns = { "/servlet/PingManagedExecutor" }) +public class PingManagedExecutor extends HttpServlet{ + + private static final long serialVersionUID = -4695386150928451234L; + private static String initTime; + private static int hitCount; + + @Resource + private ManagedExecutorService mes; + + /** + * forwards post requests to the doGet method Creation date: (03/18/2014 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + + final AsyncContext asyncContext = req.startAsync(); + final ServletOutputStream out = res.getOutputStream(); + + try { + res.setContentType("text/html"); + + out.println("Ping ManagedExecutor" + + "

    Ping ManagedExecutor
    Init time : " + initTime + + "

    "); + + // Runnable task + mes.submit(new Runnable() { + @Override + public void run() { + try { + out.println("HitCount: " + ++hitCount +"
    "); + } catch (IOException e) { + e.printStackTrace(); + } + asyncContext.complete(); + } + }); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Tests a ManagedExecutor"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedThread.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedThread.java new file mode 100644 index 00000000..6ecdd98b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingManagedThread.java @@ -0,0 +1,126 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedThreadFactory; +import javax.servlet.AsyncContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(asyncSupported=true,name = "PingManagedThread", urlPatterns = { "/servlet/PingManagedThread" }) +public class PingManagedThread extends HttpServlet{ + + private static final long serialVersionUID = -4695386150928451234L; + private static String initTime; + private static int hitCount; + + @Resource + private ManagedThreadFactory managedThreadFactory; + + /** + * forwards post requests to the doGet method Creation date: (03/18/2014 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + + final AsyncContext asyncContext = req.startAsync(); + final ServletOutputStream out = res.getOutputStream(); + + try { + + res.setContentType("text/html"); + + out.println("Ping ManagedThread" + + "

    Ping ManagedThread
    Init time : " + initTime + "

    "); + + Thread thread = managedThreadFactory.newThread(new Runnable() { + @Override + public void run() { + try { + out.println("HitCount: " + ++hitCount +"
    "); + } catch (IOException e) { + e.printStackTrace(); + } + asyncContext.complete(); + } + }); + + thread.start(); + + } catch (Exception e) { + Log.error(e, "PingManagedThreadServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + } + + } + + + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Tests a ManagedThread asynchronous servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingReentryServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingReentryServlet.java new file mode 100644 index 00000000..00b5cb08 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingReentryServlet.java @@ -0,0 +1,138 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "PingReentryServlet", urlPatterns = { "/servlet/PingReentryServlet" }) +public class PingReentryServlet extends HttpServlet { + + private static final long serialVersionUID = -2536027021580175706L; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + // The following 2 lines are the difference between PingServlet and + // PingServletWriter + // the latter uses a PrintWriter for output versus a binary output + // stream. + ServletOutputStream out = res.getOutputStream(); + // java.io.PrintWriter out = res.getWriter(); + int numReentriesLeft; + int sleepTime; + + if(req.getParameter("numReentries") != null){ + numReentriesLeft = Integer.parseInt(req.getParameter("numReentries")); + } else { + numReentriesLeft = 0; + } + + if(req.getParameter("sleep") != null){ + sleepTime = Integer.parseInt(req.getParameter("sleep")); + } else { + sleepTime = 0; + } + + if(numReentriesLeft <= 0) { + Thread.sleep(sleepTime); + out.println(numReentriesLeft); + } else { + String hostname = req.getServerName(); + int port = req.getServerPort(); + req.getContextPath(); + int saveNumReentriesLeft = numReentriesLeft; + int nextNumReentriesLeft = numReentriesLeft - 1; + + // Recursively call into the same server, decrementing the counter by 1. + String url = "http://" + hostname + ":" + port + "/" + req.getRequestURI() + + "?numReentries=" + nextNumReentriesLeft + + "&sleep=" + sleepTime; + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestMethod("GET"); + con.setRequestProperty("User-Agent", "Mozilla/5.0"); + + //Append the recursion count to the response and return it. + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + + Thread.sleep(sleepTime); + out.println(saveNumReentriesLeft + response.toString()); + } + } catch (Exception e) { + //Log.error(e, "PingReentryServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet.java new file mode 100644 index 00000000..a8996e1e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet.java @@ -0,0 +1,112 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet tests fundamental dynamic HTML creation functionality through + * server side servlet processing. + * + */ + +@WebServlet(name = "PingServlet", urlPatterns = { "/servlet/PingServlet" }) +public class PingServlet extends HttpServlet { + + private static final long serialVersionUID = 7097023236709683760L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + // The following 2 lines are the difference between PingServlet and + // PingServletWriter + // the latter uses a PrintWriter for output versus a binary output + // stream. + ServletOutputStream out = res.getOutputStream(); + // java.io.PrintWriter out = res.getWriter(); + hitCount++; + out.println("Ping Servlet" + + "

    Ping Servlet
    Init time : " + initTime + + "

    Hit Count: " + hitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2DB.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2DB.java new file mode 100644 index 00000000..e003c41e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2DB.java @@ -0,0 +1,114 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.impl.direct.TradeDirect; +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2DB tests the path of a servlet making a JDBC connection to a + * database + * + */ + +@WebServlet(name = "PingServlet2DB", urlPatterns = { "/servlet/PingServlet2DB" }) +public class PingServlet2DB extends HttpServlet { + + private static final long serialVersionUID = -6456675185605592049L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + String symbol = null; + StringBuffer output = new StringBuffer(100); + + try { + // TradeJDBC uses prepared statements so I am going to make use of + // it's code. + TradeDirect trade = new TradeDirect(); + trade.getConnPublic(); + + output.append("PingServlet2DB." + + "
    PingServlet2DB:
    Init time : " + initTime); + hitCount++; + output.append("
    Hit Count: " + hitCount); + output.append("
    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingServlet2DB -- error getting connection to the database", symbol); + res.sendError(500, "PingServlet2DB Exception caught: " + e.toString()); + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JDBC Read using a prepared statment, makes use of TradeJDBC class"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Include.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Include.java new file mode 100644 index 00000000..29a81cdf --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Include.java @@ -0,0 +1,104 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingServlet2Include tests servlet to servlet request dispatching. Servlet 1, + * the controller, creates a new JavaBean object forwards the servlet request + * with the JavaBean added to Servlet 2. Servlet 2 obtains access to the + * JavaBean through the Servlet request object and provides the dynamic HTML + * output based on the JavaBean data. PingServlet2Servlet is the initial servlet + * that sends a request to {@link PingServlet2ServletRcv} + * + */ +@WebServlet(name = "PingServlet2Include", urlPatterns = { "/servlet/PingServlet2Include" }) +public class PingServlet2Include extends HttpServlet { + + private static final long serialVersionUID = 1063447780151198793L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + + try { + res.setContentType("text/html"); + + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + getServletConfig().getServletContext().getRequestDispatcher("/servlet/PingServlet2IncludeRcv").include(req, res); + } + + // ServletOutputStream out = res.getOutputStream(); + java.io.PrintWriter out = res.getWriter(); + out.println("Ping Servlet 2 Include" + + "

    Ping Servlet 2 Include
    Init time : " + + initTime + "

    Hit Count: " + hitCount++ + ""); + } catch (Exception ex) { + Log.error(ex, "PingServlet2Include.doGet(...): general exception"); + res.sendError(500, "PingServlet2Include.doGet(...): general exception" + ex.toString()); + } + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2IncludeRcv.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2IncludeRcv.java new file mode 100644 index 00000000..3b8e1a70 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2IncludeRcv.java @@ -0,0 +1,68 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * PingServlet2Include tests servlet to servlet request dispatching. Servlet 1, + * the controller, creates a new JavaBean object forwards the servlet request + * with the JavaBean added to Servlet 2. Servlet 2 obtains access to the + * JavaBean through the Servlet request object and provides the dynamic HTML + * output based on the JavaBean data. PingServlet2Servlet is the initial servlet + * that sends a request to {@link PingServlet2ServletRcv} + * + */ +@WebServlet(name = "PingServlet2IncludeRcv", urlPatterns = { "/servlet/PingServlet2IncludeRcv" }) +public class PingServlet2IncludeRcv extends HttpServlet { + + private static final long serialVersionUID = 2628801298561220872L; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + // do nothing but get included by PingServlet2Include + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2JNDI.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2JNDI.java new file mode 100644 index 00000000..44031d13 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2JNDI.java @@ -0,0 +1,109 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2JNDI performs a basic JNDI lookup of a JDBC DataSource + * + */ + +@WebServlet(name = "PingServlet2JNDI", urlPatterns = { "/servlet/PingServlet2JNDI" }) +public class PingServlet2JNDI extends HttpServlet { + + private static final long serialVersionUID = -8236271998141415347L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + + StringBuffer output = new StringBuffer(100); + + try { + output.append("Ping JNDI -- lookup of JDBC DataSource" + + "
    Ping JNDI -- lookup of JDBC DataSource
    Init time : " + + initTime); + hitCount++; + output.append("
    Hit Count: " + hitCount); + output.append("
    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingServlet2JNDI -- error look up of a JDBC DataSource"); + res.sendError(500, "PingServlet2JNDI Exception caught: " + e.toString()); + } + + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic JNDI look up of a JDBC DataSource"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Jsp.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Jsp.java new file mode 100644 index 00000000..719e7209 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Jsp.java @@ -0,0 +1,78 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2JSP tests a call from a servlet to a JavaServer Page providing + * server-side dynamic HTML through JSP scripting. + * + */ +@WebServlet(name = "PingServlet2Jsp", urlPatterns = { "/servlet/PingServlet2Jsp" }) +public class PingServlet2Jsp extends HttpServlet { + private static final long serialVersionUID = -5199543766883932389L; + private static int hitCount = 0; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + PingBean ab; + try { + ab = new PingBean(); + hitCount++; + ab.setMsg("Hit Count: " + hitCount); + req.setAttribute("ab", ab); + + getServletConfig().getServletContext().getRequestDispatcher("/PingServlet2Jsp.jsp").forward(req, res); + } catch (Exception ex) { + Log.error(ex, "PingServlet2Jsp.doGet(...): request error"); + res.sendError(500, "PingServlet2Jsp.doGet(...): request error" + ex.toString()); + + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2PDF.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2PDF.java new file mode 100644 index 00000000..4b6b2f2a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2PDF.java @@ -0,0 +1,115 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; + +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2PDF tests a call to a servlet which then loads a PDF document. + * + */ +@WebServlet(name = "PingServlet2PDF", urlPatterns = { "/servlet/PingServlet2PDF" }) +public class PingServlet2PDF extends HttpServlet { + + private static final long serialVersionUID = -1321793174442755868L; + private static int hitCount = 0; + private static final int BUFFER_SIZE = 1024 * 8; // 8 KB + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + PingBean ab; + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + try { + ab = new PingBean(); + hitCount++; + ab.setMsg("Hit Count: " + hitCount); + req.setAttribute("ab", ab); + + ServletOutputStream out = res.getOutputStream(); + + // MIME type for pdf doc + res.setContentType("application/pdf"); + + // Open an InputStream to the PDF document + String fileURL = "http://localhost:9080/daytrader/WAS_V7_64-bit_performance.pdf"; + URL url = new URL(fileURL); + URLConnection conn = url.openConnection(); + bis = new BufferedInputStream(conn.getInputStream()); + + // Transfer the InputStream (PDF Document) to OutputStream (servlet) + bos = new BufferedOutputStream(out); + byte[] buff = new byte[BUFFER_SIZE]; + int bytesRead; + // Simple read/write loop. + while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { + bos.write(buff, 0, bytesRead); + } + + } catch (Exception ex) { + Log.error(ex, "PingServlet2Jsp.doGet(...): request error"); + res.sendError(500, "PingServlet2Jsp.doGet(...): request error" + ex.toString()); + + } + + finally { + if (bis != null) { + bis.close(); + } + if (bos != null) { + bos.close(); + } + } + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Servlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Servlet.java new file mode 100644 index 00000000..8550ed6b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2Servlet.java @@ -0,0 +1,82 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2Servlet tests servlet to servlet request dispatching. Servlet 1, + * the controller, creates a new JavaBean object forwards the servlet request + * with the JavaBean added to Servlet 2. Servlet 2 obtains access to the + * JavaBean through the Servlet request object and provides the dynamic HTML + * output based on the JavaBean data. PingServlet2Servlet is the initial servlet + * that sends a request to {@link PingServlet2ServletRcv} + * + */ +@WebServlet(name = "PingServlet2Servlet", urlPatterns = { "/servlet/PingServlet2Servlet" }) +public class PingServlet2Servlet extends HttpServlet { + private static final long serialVersionUID = -955942781902636048L; + private static int hitCount = 0; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + PingBean ab; + try { + ab = new PingBean(); + hitCount++; + ab.setMsg("Hit Count: " + hitCount); + req.setAttribute("ab", ab); + + getServletConfig().getServletContext().getRequestDispatcher("/servlet/PingServlet2ServletRcv").forward(req, res); + } catch (Exception ex) { + Log.error(ex, "PingServlet2Servlet.doGet(...): general exception"); + res.sendError(500, "PingServlet2Servlet.doGet(...): general exception" + ex.toString()); + + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2ServletRcv.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2ServletRcv.java new file mode 100644 index 00000000..c195a8e6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet2ServletRcv.java @@ -0,0 +1,97 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet2Servlet tests servlet to servlet request dispatching. Servlet 1, + * the controller, creates a new JavaBean object forwards the servlet request + * with the JavaBean added to Servlet 2. Servlet 2 obtains access to the + * JavaBean through the Servlet request object and provides the dynamic HTML + * output based on the JavaBean data. PingServlet2ServletRcv receives a request + * from {@link PingServlet2Servlet} and displays output. + * + */ +@WebServlet(name = "PingServlet2ServletRcv", urlPatterns = { "/servlet/PingServlet2ServletRcv" }) +public class PingServlet2ServletRcv extends HttpServlet { + private static final long serialVersionUID = -5241563129216549706L; + private static String initTime = null; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + PingBean ab; + try { + ab = (PingBean) req.getAttribute("ab"); + res.setContentType("text/html"); + PrintWriter out = res.getWriter(); + out.println("Ping Servlet2Servlet" + + "

    PingServlet2Servlet:
    Init time: " + + initTime + "

    Message from Servlet: " + ab.getMsg() + ""); + } catch (Exception ex) { + Log.error(ex, "PingServlet2ServletRcv.doGet(...): general exception"); + res.sendError(500, "PingServlet2ServletRcv.doGet(...): general exception" + ex.toString()); + } + + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet30Async.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet30Async.java new file mode 100644 index 00000000..803bf6b6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet30Async.java @@ -0,0 +1,118 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +//import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet31Async tests fundamental dynamic HTML creation functionality through + * server side servlet processing asynchronously. + * + */ + +@WebServlet(name = "PingServlet30Async", urlPatterns = { "/servlet/PingServlet30Async" }, asyncSupported=true) +public class PingServlet30Async extends HttpServlet { + + private static final long serialVersionUID = 8731300373855056660L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + + AsyncContext ac = req.startAsync(); + StringBuilder sb = new StringBuilder(); + + ServletInputStream input = req.getInputStream(); + byte[] b = new byte[1024]; + int len = -1; + while ((len = input.read(b)) != -1) { + String data = new String(b, 0, len); + sb.append(data); + } + + ServletOutputStream output = res.getOutputStream(); + + output.println("Ping Servlet 3.0 Async" + + "

    Ping Servlet 3.0 Async
    " + + "Init time : " + initTime + + "

    Hit Count: " + ++hitCount + "
    Data Received: "+ sb.toString() + ""); + + ac.complete(); + } + + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doPost(req,res); + + } + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31Async.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31Async.java new file mode 100644 index 00000000..2bc313b8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31Async.java @@ -0,0 +1,186 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +import javax.servlet.AsyncContext; +import javax.servlet.ReadListener; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +//import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet31Async tests fundamental dynamic HTML creation functionality through + * server side servlet processing asynchronously with non-blocking i/o. + * + */ + +@WebServlet(name = "PingServlet31Async", urlPatterns = { "/servlet/PingServlet31Async" }, asyncSupported=true) +public class PingServlet31Async extends HttpServlet { + + private static final long serialVersionUID = 8731300373855056660L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + + AsyncContext ac = req.startAsync(); + + ServletInputStream input = req.getInputStream(); + ReadListener readListener = new ReadListenerImpl(input, res, ac); + input.setReadListener(readListener); + } + + class ReadListenerImpl implements ReadListener { + private ServletInputStream input = null; + private HttpServletResponse res = null; + private AsyncContext ac = null; + private Queue queue = new LinkedBlockingQueue(); + + ReadListenerImpl(ServletInputStream in, HttpServletResponse r, AsyncContext c) { + input = in; + res = r; + ac = c; + } + + public void onDataAvailable() throws IOException { + StringBuilder sb = new StringBuilder(); + int len = -1; + byte b[] = new byte[1024]; + + while (input.isReady() && (len = input.read(b)) != -1) { + String data = new String(b, 0, len); + sb.append(data); + } + queue.add(sb.toString()); + + } + + public void onAllDataRead() throws IOException { + ServletOutputStream output = res.getOutputStream(); + WriteListener writeListener = new WriteListenerImpl(output, queue, ac); + output.setWriteListener(writeListener); + } + + public void onError(final Throwable t) { + ac.complete(); + t.printStackTrace(); + } + } + + class WriteListenerImpl implements WriteListener { + private ServletOutputStream output = null; + private Queue queue = null; + private AsyncContext ac = null; + + WriteListenerImpl(ServletOutputStream sos, Queue q, AsyncContext c) { + output = sos; + queue = q; + ac = c; + + try { + output.print("Ping Servlet 3.1 Async" + + "

    Ping Servlet 3.1 Async" + + "
    Init time : " + initTime + + "

    Hit Count: " + ++hitCount + "
    Data Received: "); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public void onWritePossible() throws IOException { + + while (queue.peek() != null && output.isReady()) { + String data = (String) queue.poll(); + output.print(data); + } + + if (queue.peek() == null) { + output.println(""); + ac.complete(); + } + } + + public void onError(final Throwable t) { + ac.complete(); + t.printStackTrace(); + } + } + + + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doPost(req,res); + } + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31AsyncRead.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31AsyncRead.java new file mode 100644 index 00000000..e23994ed --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServlet31AsyncRead.java @@ -0,0 +1,145 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.AsyncContext; +import javax.servlet.ReadListener; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +//import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet31Async tests fundamental dynamic HTML creation functionality through + * server side servlet processing asynchronously with non-blocking i/o. + * + */ + +@WebServlet(name = "PingServlet31AsyncRead", urlPatterns = { "/servlet/PingServlet31AsyncRead" }, asyncSupported=true) +public class PingServlet31AsyncRead extends HttpServlet { + + private static final long serialVersionUID = 8731300373855056660L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + res.setContentType("text/html"); + + AsyncContext ac = req.startAsync(); + + ServletInputStream input = req.getInputStream(); + ReadListener readListener = new ReadListenerImpl(input, res, ac); + input.setReadListener(readListener); + } + + class ReadListenerImpl implements ReadListener { + private ServletInputStream input = null; + private HttpServletResponse res = null; + private AsyncContext ac = null; + private StringBuilder sb = new StringBuilder(); + + ReadListenerImpl(ServletInputStream in, HttpServletResponse r, AsyncContext c) { + input = in; + res = r; + ac = c; + } + + public void onDataAvailable() throws IOException { + + int len = -1; + byte b[] = new byte[1024]; + + while (input.isReady() && (len = input.read(b)) != -1) { + String data = new String(b, 0, len); + sb.append(data); + } + + + } + + public void onAllDataRead() throws IOException { + ServletOutputStream output = res.getOutputStream(); + output.println("Ping Servlet 3.1 Async" + + "

    Ping Servlet 3.1 AsyncRead" + + "
    Init time : " + initTime + + "

    Hit Count: " + ++hitCount + "
    Data Received: " + sb.toString() + ""); + ac.complete(); + } + + public void onError(final Throwable t) { + ac.complete(); + t.printStackTrace(); + } + } + + + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doPost(req,res); + } + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletLargeContentLength.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletLargeContentLength.java new file mode 100644 index 00000000..6246a5c5 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletLargeContentLength.java @@ -0,0 +1,95 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * PingServletSetContentLength tests fundamental dynamic HTML creation + * functionality through server side servlet processing. + * + */ + +@WebServlet(name = "PingServletLargeContentLength", urlPatterns = { "/servlet/PingServletLargeContentLength" }) +public class PingServletLargeContentLength extends HttpServlet { + + + + /** + * + */ + private static final long serialVersionUID = -7979576220528252408L; + + /** + * forwards post requests to the doGet method Creation date: (02/07/2013 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + System.out.println("Length: " + req.getContentLengthLong()); + + + + + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doPost(req,res); } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet, with " + "contentLength set by contentLength parameter."; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletSetContentLength.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletSetContentLength.java new file mode 100644 index 00000000..4ec93595 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletSetContentLength.java @@ -0,0 +1,121 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServletSetContentLength tests fundamental dynamic HTML creation + * functionality through server side servlet processing. + * + */ + +@WebServlet(name = "PingServletSetContentLength", urlPatterns = { "/servlet/PingServletSetContentLength" }) +public class PingServletSetContentLength extends HttpServlet { + + private static final long serialVersionUID = 8731300373855056661L; + + /** + * forwards post requests to the doGet method Creation date: (02/07/2013 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + String lengthParam = req.getParameter("contentLength"); + Integer length; + + if (lengthParam == null) { + length = 0; + } else { + length = Integer.parseInt(lengthParam); + } + + ServletOutputStream out = res.getOutputStream(); + + // Add characters (a's) to the SOS to equal the requested length + // 167 is the smallest length possible. + + int i = 0; + String buffer = ""; + + while (i + 167 < length) { + buffer = buffer + "a"; + i++; + } + + out.println("Ping Servlet" + + "

    Ping Servlet
    " + buffer + + "
    "); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet, with " + "contentLength set by contentLength parameter."; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletWriter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletWriter.java new file mode 100644 index 00000000..bda01cd8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingServletWriter.java @@ -0,0 +1,110 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet extends PingServlet by using a PrintWriter for formatted output + * vs. the output stream used by {@link PingServlet}. + * + */ +@WebServlet(name = "PingServletWriter", urlPatterns = { "/servlet/PingServletWriter" }) +public class PingServletWriter extends HttpServlet { + + private static final long serialVersionUID = -267847365014523225L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + // The following 2 lines are the difference between PingServlet and + // PingServletWriter + // the latter uses a PrintWriter for output versus a binary output + // stream. + // ServletOutputStream out = res.getOutputStream(); + java.io.PrintWriter out = res.getWriter(); + hitCount++; + out.println("Ping Servlet Writer" + + "

    Ping Servlet Writer:
    Init time : " + + initTime + "

    Hit Count: " + hitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServletWriter.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet using a PrintWriter"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession1.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession1.java new file mode 100644 index 00000000..3abb342b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession1.java @@ -0,0 +1,136 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingHTTPSession1 - SessionID tests fundamental HTTP session functionality by + * creating a unique session ID for each individual user. The ID is stored in + * the users session and is accessed and displayed on each user request. + * + */ +@WebServlet(name = "PingSession1", urlPatterns = { "/servlet/PingSession1" }) +public class PingSession1 extends HttpServlet { + private static final long serialVersionUID = -3703858656588519807L; + private static int count; + // For each new session created, add a session ID of the form "sessionID:" + + // count + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = null; + try { + try { + // get the users session, if the user does not have a session + // create one. + session = request.getSession(true); + } catch (Exception e) { + Log.error(e, "PingSession1.doGet(...): error getting session"); + // rethrow the exception for handling in one place. + throw e; + } + + // Get the session data value + Integer ival = (Integer) session.getAttribute("sessiontest.counter"); + // if their is not a counter create one. + if (ival == null) { + ival = new Integer(count++); + session.setAttribute("sessiontest.counter", ival); + } + String SessionID = "SessionID:" + ival.toString(); + + // Output the page + response.setContentType("text/html"); + response.setHeader("SessionKeyTest-SessionID", SessionID); + + PrintWriter out = response.getWriter(); + out.println("HTTP Session Key Test

    HTTP Session Test 1: Session Key
    Init time: " + + initTime + "

    "); + hitCount++; + out.println("Hit Count: " + hitCount + "
    Your HTTP Session key is " + SessionID + "
    "); + } catch (Exception e) { + // log the excecption + Log.error(e, "PingSession1.doGet(..l.): error."); + // set the server responce to 500 and forward to the web app defined + // error page + response.sendError(500, "PingSession1.doGet(...): error. " + e.toString()); + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + + @Override + public String getServletInfo() { + return "HTTP Session Key: Tests management of a read only unique id"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + count = 0; + hitCount = 0; + initTime = new java.util.Date().toString(); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession2.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession2.java new file mode 100644 index 00000000..9a47f87a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession2.java @@ -0,0 +1,145 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingHTTPSession2 session create/destroy further extends the previous test by + * invalidating the HTTP Session on every 5th user access. This results in + * testing HTTPSession create and destroy + * + */ +@WebServlet(name = "PingSession2", urlPatterns = { "/servlet/PingSession2" }) +public class PingSession2 extends HttpServlet { + + private static final long serialVersionUID = -273579463475455800L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + HttpSession session = null; + try { + try { + session = request.getSession(true); + } catch (Exception e) { + Log.error(e, "PingSession2.doGet(...): error getting session"); + // rethrow the exception for handling in one place. + throw e; + + } + + // Get the session data value + Integer ival = (Integer) session.getAttribute("sessiontest.counter"); + // if there is not a counter then create one. + if (ival == null) { + ival = new Integer(1); + } else { + ival = new Integer(ival.intValue() + 1); + } + session.setAttribute("sessiontest.counter", ival); + // if the session count is equal to five invalidate the session + if (ival.intValue() == 5) { + session.invalidate(); + } + + try { + // Output the page + response.setContentType("text/html"); + response.setHeader("SessionTrackingTest-counter", ival.toString()); + + PrintWriter out = response.getWriter(); + out.println("Session Tracking Test 2

    HTTP Session Test 2: Session create/invalidate
    Init time: " + + initTime + "

    "); + hitCount++; + out.println("Hit Count: " + hitCount + "
    Session hits: " + ival + "
    "); + } catch (Exception e) { + Log.error(e, "PingSession2.doGet(...): error getting session information"); + // rethrow the exception for handling in one place. + throw e; + } + + } + + catch (Exception e) { + // log the excecption + Log.error(e, "PingSession2.doGet(...): error."); + // set the server responce to 500 and forward to the web app defined + // error page + response.sendError(500, "PingSession2.doGet(...): error. " + e.toString()); + } + } // end of the method + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "HTTP Session Key: Tests management of a read/write unique id"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3.java new file mode 100644 index 00000000..7e49518e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3.java @@ -0,0 +1,182 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingHTTPSession3 tests the servers ability to manage and persist large + * HTTPSession data objects. The servlet creates the large custom java object + * {@link PingSession3Object}. This large session object is retrieved and stored + * to the session on each user request. The default settings result in approx + * 2024 bits being retrieved and stored upon each request. + * + */ +@WebServlet(name = "PingSession3", urlPatterns = { "/servlet/PingSession3" }) +public class PingSession3 extends HttpServlet { + private static final long serialVersionUID = -6129599971684210414L; + private static int NUM_OBJECTS = 2; + private static String initTime = null; + private static int hitCount = 0; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + PrintWriter out = response.getWriter(); + // Using a StringBuffer to output all at once. + StringBuffer outputBuffer = new StringBuffer(); + HttpSession session = null; + PingSession3Object[] sessionData; + response.setContentType("text/html"); + + // this is a general try/catch block. The catch block at the end of this + // will forward the responce + // to an error page if there is an exception + try { + + try { + session = request.getSession(true); + } catch (Exception e) { + Log.error(e, "PingSession3.doGet(...): error getting session"); + // rethrow the exception for handling in one place. + throw e; + + } + // Each PingSession3Object in the PingSession3Object array is 1K in + // size + // NUM_OBJECTS sets the size of the array to allocate and thus set + // the size in KBytes of the session object + // NUM_OBJECTS can be initialized by the servlet + // Here we check for the request parameter to change the size and + // invalidate the session if it exists + // NOTE: Current user sessions will remain the same (i.e. when + // NUM_OBJECTS is changed, all user thread must be restarted + // for the change to fully take effect + + String num_objects; + if ((num_objects = request.getParameter("num_objects")) != null) { + // validate input + try { + int x = Integer.parseInt(num_objects); + if (x > 0) { + NUM_OBJECTS = x; + } + } catch (Exception e) { + Log.error(e, "PingSession3.doGet(...): input should be an integer, input=" + num_objects); + } // revert to current value on exception + + outputBuffer.append(" Session object size set to " + NUM_OBJECTS + "K bytes "); + if (session != null) { + session.invalidate(); + } + out.print(outputBuffer.toString()); + out.close(); + return; + } + + // Get the session data value + sessionData = (PingSession3Object[]) session.getAttribute("sessiontest.sessionData"); + if (sessionData == null) { + sessionData = new PingSession3Object[NUM_OBJECTS]; + for (int i = 0; i < NUM_OBJECTS; i++) { + sessionData[i] = new PingSession3Object(); + } + } + + session.setAttribute("sessiontest.sessionData", sessionData); + + // Each PingSession3Object is about 1024 bits, there are 8 bits in a + // byte. + int num_bytes = (NUM_OBJECTS * 1024) / 8; + response.setHeader("SessionTrackingTest-largeSessionData", num_bytes + "bytes"); + + outputBuffer + .append("Session Large Data Test

    HTTP Session Test 3: Large Data
    Init time: ") + .append(initTime).append("

    "); + hitCount++; + outputBuffer.append("Hit Count: ").append(hitCount) + .append("
    Session object updated. Session Object size = " + num_bytes + " bytes
    "); + // output the Buffer to the printWriter. + out.println(outputBuffer.toString()); + + } catch (Exception e) { + // log the excecption + Log.error(e, "PingSession3.doGet(..l.): error."); + // set the server responce to 500 and forward to the web app defined + // error page + response.sendError(500, "PingSession3.doGet(...): error. " + e.toString()); + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "HTTP Session Object: Tests management of a large custom session class"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3Object.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3Object.java new file mode 100644 index 00000000..362f0a93 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingSession3Object.java @@ -0,0 +1,92 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.Serializable; + +/** + * + * An object that contains approximately 1024 bits of information. This is used + * by {@link PingSession3} + * + */ +public class PingSession3Object implements Serializable { + // PingSession3Object represents a BLOB of session data of various. + // Each instantiation of this class is approximately 1K in size (not + // including overhead for arrays and Strings) + // Using different datatype exercises the various serialization algorithms + // for each type + + private static final long serialVersionUID = 1452347702903504717L; + byte[] byteVal = new byte[16]; // 8 * 16 = 128 bits + char[] charVal = new char[8]; // 16 * 8 = 128 bits + int a, b, c, d; // 4 * 32 = 128 bits + float e, f, g, h; // 4 * 32 = 128 bits + double i, j; // 2 * 64 = 128 bits + // Primitive type size = ~5*128= 640 + + String s1 = new String("123456789012"); + String s2 = new String("abcdefghijkl"); + + // String type size = ~2*12*16 = 384 + // Total blob size (w/o overhead) = 1024 + + // The Session blob must be filled with data to avoid compression of the + // blob during serialization + PingSession3Object() { + int index; + byte b = 0x8; + for (index = 0; index < 16; index++) { + byteVal[index] = (byte) (b + 2); + } + + char c = 'a'; + for (index = 0; index < 8; index++) { + charVal[index] = (char) (c + 2); + } + + a = 1; + b = 2; + c = 3; + d = 5; + e = (float) 7.0; + f = (float) 11.0; + g = (float) 13.0; + h = (float) 17.0; + i = 19.0; + j = 23.0; + } + /** + * Main method to test the serialization of the Session Data blob object + * Creation date: (4/3/2000 3:07:34 PM) + * + * @param args + * java.lang.String[] + */ + + /** + * Since the following main method were written for testing purpose, we + * comment them out public static void main(String[] args) { try { + * PingSession3Object data = new PingSession3Object(); + * + * FileOutputStream ostream = new + * FileOutputStream("c:\\temp\\datablob.xxx"); ObjectOutputStream p = new + * ObjectOutputStream(ostream); p.writeObject(data); p.flush(); + * ostream.close(); } catch (Exception e) { System.out.println("Exception: " + * + e.toString()); } } + */ + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingUpgradeServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingUpgradeServlet.java new file mode 100644 index 00000000..339986ed --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingUpgradeServlet.java @@ -0,0 +1,157 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.servlet.ReadListener; +import javax.servlet.ServletException; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpUpgradeHandler; +import javax.servlet.http.WebConnection; +import javax.servlet.annotation.WebServlet; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(name = "PingUpgradeServlet", urlPatterns = { "/servlet/PingUpgradeServlet" }, asyncSupported=true) +public class PingUpgradeServlet extends HttpServlet { + private static final long serialVersionUID = -6955518532146927509L; + + + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + doPost(req,res); + } + + @Override + protected void doPost(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { + + + Log.trace("PingUpgradeServlet:doPost"); + + + if ("echo".equals(req.getHeader("Upgrade"))) { + + + Log.trace("PingUpgradeServlet:doPost -- found echo, doing upgrade"); + + + res.setStatus(101); + res.setHeader("Upgrade", "echo"); + res.setHeader("Connection", "Upgrade"); + + req.upgrade(Handler.class); + + } else { + + + Log.trace("PingUpgradeServlet:doPost -- did not find echo, no upgrade"); + + + res.getWriter().println("No upgrade: " + req.getHeader("Upgrade")); + } + } + + public static class Handler implements HttpUpgradeHandler { + + @Override + public void init(final WebConnection wc) { + Listener listener = null; + try { + listener = new Listener(wc); + + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + + Log.trace("PingUpgradeServlet$Handler.init() -- Initializing Handler"); + + + // flush headers if any + wc.getOutputStream().flush(); + wc.getInputStream().setReadListener(listener); + + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + @Override + public void destroy() { + Log.trace("PingUpgradeServlet$Handler.destroy() -- Destroying Handler"); + } + } + + private static class Listener implements ReadListener { + private final WebConnection connection; + private ServletInputStream input = null; + private ServletOutputStream output = null; + + private Listener(final WebConnection connection) throws IOException { + this.connection = connection; + this.input = connection.getInputStream(); + this.output = connection.getOutputStream(); + } + + @Override + public void onDataAvailable() throws IOException { + + Log.trace("PingUpgradeServlet$Listener.onDataAvailable() called"); + + byte[] data = new byte[1024]; + int len = -1; + + while (input.isReady() && (len = input.read(data)) != -1) { + String dataRead = new String(data, 0, len); + + Log.trace("PingUpgradeServlet$Listener.onDataAvailable() -- Adding data to queue -->" + dataRead + "<--"); + + output.println(dataRead); + output.flush(); + } + + closeConnection(); + } + + private void closeConnection() { + try { + connection.close(); + } catch (Exception e) { + + Log.error(e.toString()); + } + } + + + @Override + public void onAllDataRead() throws IOException { + closeConnection(); + } + + @Override + public void onError(final Throwable t) { + closeConnection(); + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketBinary.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketBinary.java new file mode 100644 index 00000000..5f55fbc8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketBinary.java @@ -0,0 +1,65 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** This class a simple websocket that echos the binary it has been sent. */ + +@ServerEndpoint(value = "/pingBinary") +public class PingWebSocketBinary { + + private Session currentSession = null; + + @OnOpen + public void onOpen(final Session session, EndpointConfig ec) { + currentSession = session; + } + + @OnMessage + public void ping(ByteBuffer data) { + currentSession.getAsyncRemote().sendBinary(data); + } + + @OnError + public void onError(Throwable t) { + t.printStackTrace(); + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + + try { + if (session.isOpen()) { + session.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketJson.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketJson.java new file mode 100644 index 00000000..fd0ab76f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketJson.java @@ -0,0 +1,116 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; + +import javax.enterprise.concurrent.ManagedThreadFactory; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +import com.ibm.websphere.samples.daytrader.web.websocket.JsonDecoder; +import com.ibm.websphere.samples.daytrader.web.websocket.JsonEncoder; +import com.ibm.websphere.samples.daytrader.web.websocket.JsonMessage; + +/** This class a simple websocket that sends the number of times it has been pinged. */ + +@ServerEndpoint(value = "/pingWebSocketJson",encoders=JsonEncoder.class ,decoders=JsonDecoder.class) +public class PingWebSocketJson { + + private Session currentSession = null; + private Integer sentHitCount = null; + private Integer receivedHitCount = null; + + @OnOpen + public void onOpen(final Session session, EndpointConfig ec) { + currentSession = session; + sentHitCount = 0; + receivedHitCount = 0; + + + InitialContext context; + ManagedThreadFactory mtf = null; + + try { + context = new InitialContext(); + mtf = (ManagedThreadFactory) context.lookup("java:comp/DefaultManagedThreadFactory"); + + } catch (NamingException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + Thread thread = mtf.newThread(new Runnable() { + + @Override + public void run() { + + try { + + Thread.sleep(500); + + while (currentSession.isOpen()) { + sentHitCount++; + + JsonMessage response = new JsonMessage(); + response.setKey("sentHitCount"); + response.setValue(sentHitCount.toString()); + currentSession.getAsyncRemote().sendObject(response); + + Thread.sleep(100); + } + + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + }); + + thread.start(); + + } + + @OnMessage + public void ping(JsonMessage message) throws IOException { + receivedHitCount++; + JsonMessage response = new JsonMessage(); + response.setKey("receivedHitCount"); + response.setValue(receivedHitCount.toString()); + currentSession.getAsyncRemote().sendObject(response); + } + + @OnError + public void onError(Throwable t) { + t.printStackTrace(); + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextAsync.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextAsync.java new file mode 100644 index 00000000..90d8350d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextAsync.java @@ -0,0 +1,70 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.SendHandler; +import javax.websocket.SendResult; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** This class a simple websocket that sends the number of times it has been pinged. */ + +@ServerEndpoint(value = "/pingTextAsync") +public class PingWebSocketTextAsync { + + private Session currentSession = null; + private Integer hitCount = null; + + @OnOpen + public void onOpen(final Session session, EndpointConfig ec) { + currentSession = session; + hitCount = 0; + } + + @OnMessage + public void ping(String text) { + + + hitCount++; + currentSession.getAsyncRemote().sendText(hitCount.toString(), new SendHandler() { + + @Override + public void onResult(SendResult result) { + if (!result.isOK()) { + System.out.println("NOT OK"); + } + } + } + ); + } + + @OnError + public void onError(Throwable t) { + t.printStackTrace(); + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextSync.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextSync.java new file mode 100644 index 00000000..facdbcc6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/PingWebSocketTextSync.java @@ -0,0 +1,67 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims; + +import java.io.IOException; +//import java.util.Collections; +//import java.util.HashSet; +//import java.util.Set; + +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + +/** This class a simple websocket that sends the number of times it has been pinged. */ + +@ServerEndpoint(value = "/pingTextSync") +public class PingWebSocketTextSync { + + private Session currentSession = null; + private Integer hitCount = null; + + @OnOpen + public void onOpen(final Session session, EndpointConfig ec) { + currentSession = session; + hitCount = 0; + } + + @OnMessage + public void ping(String text) { + hitCount++; + + try { + currentSession.getBasicRemote().sendText(hitCount.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @OnError + public void onError(Throwable t) { + t.printStackTrace(); + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/CDIMethodConstraintBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/CDIMethodConstraintBean.java new file mode 100644 index 00000000..755014a3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/CDIMethodConstraintBean.java @@ -0,0 +1,47 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import javax.enterprise.context.RequestScoped; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PastOrPresent; +import javax.validation.constraints.Size; + +@RequestScoped +public class CDIMethodConstraintBean { + + private static int hitCount = 0; + private List list = new ArrayList<>(); + + // Dumb primitive, beanval checks that the date passed in is valid and that the + // return is > 0; + @Min(1) + public int getHitCount(@NotNull @PastOrPresent LocalDateTime now) { + list.add(++hitCount); + return hitCount; + } + + @Size(max=1) + public List<@Min(1) Integer> hitList() { + return list; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValCDI.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValCDI.java new file mode 100644 index 00000000..e9654526 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValCDI.java @@ -0,0 +1,107 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.io.IOException; +import java.time.LocalDateTime; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(name = "PingServletBeanValCDI", urlPatterns = { "/servlet/PingServletBeanValCDI" }) +public class PingServletBeanValCDI extends HttpServlet { + + @Inject CDIMethodConstraintBean hitCountBean; + + private static final long serialVersionUID = 7097023236709683760L; + private static LocalDateTime initTime; + + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + ServletOutputStream out = res.getOutputStream(); + + int currentHitCount = hitCountBean.getHitCount(initTime); + hitCountBean.hitList(); + + out.println("Ping Servlet Bean Validation CDI" + + "

    Ping Servlet Bean Validation CDI
    Init time : " + initTime + + "

    Hit Count: " + currentHitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = LocalDateTime.now(); + + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple1.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple1.java new file mode 100644 index 00000000..a137556e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple1.java @@ -0,0 +1,106 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.io.IOException; +import java.time.LocalDateTime; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(name = "PingServletBeanValSimple1", urlPatterns = { "/servlet/PingServletBeanValSimple1" }) +public class PingServletBeanValSimple1 extends HttpServlet { + + private static final long serialVersionUID = 7097023236709683760L; + private static LocalDateTime initTime; + private static int hitCount = 0; + + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + SimpleBean1 simpleBean1 = new SimpleBean1(); + simpleBean1.checkInjectionValidation(); + + ServletOutputStream out = res.getOutputStream(); + + int currentHitCount = ++hitCount; + out.println("Ping Servlet Bean Validation Simple" + + "

    Ping Servlet Bean Validation Simple
    Init time : " + initTime + + "

    Hit Count: " + currentHitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = LocalDateTime.now(); + + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple2.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple2.java new file mode 100644 index 00000000..7bbc238b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/PingServletBeanValSimple2.java @@ -0,0 +1,106 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.io.IOException; +import java.time.LocalDateTime; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(name = "PingServletBeanValSimple2", urlPatterns = { "/servlet/PingServletBeanValSimple2" }) +public class PingServletBeanValSimple2 extends HttpServlet { + + private static final long serialVersionUID = 7097023236709683760L; + private static LocalDateTime initTime; + private static int hitCount = 0; + + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + SimpleBean2 simpleBean2 = new SimpleBean2(); + simpleBean2.checkInjectionValidation(); + + ServletOutputStream out = res.getOutputStream(); + + int currentHitCount = ++hitCount; + out.println("Ping Servlet Bean Validation Simple" + + "

    Ping Servlet Bean Validation Simple
    Init time : " + initTime + + "

    Hit Count: " + currentHitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = LocalDateTime.now(); + + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean1.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean1.java new file mode 100644 index 00000000..6ac7752d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean1.java @@ -0,0 +1,116 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.validation.ConstraintViolation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +public class SimpleBean1 { + /** + * Logging support and the static initializer for this class. Used to trace file + * version information. This will display the current version of the class in the + * debug log at the time the class is loaded. + */ + private static final String thisClass = SimpleBean1.class.getName(); + private static Logger traceLogger = Logger.getLogger(thisClass); + private static ValidatorFactory validatorFactory = null; + private Validator validator; + + @Min(1) + int iMin = 1; + @Max(1) + Integer iMax = 1; + @Size(min = 1) + int[] iMinArray = { 1 }; + @Size(max = 1) + Integer[] iMaxArray = { 1 }; + @Pattern(regexp = "[a-z][a-z]*", message = "go to your room!") + String pattern = "mypattern"; + + + + boolean setToFail = false; + + + + public SimpleBean1() throws Exception { + if (validatorFactory == null) { + Context nContext = new InitialContext(); + validatorFactory = (ValidatorFactory) nContext.lookup("java:comp/ValidatorFactory"); + + } + validator = validatorFactory.getValidator(); + } + + @NotNull + public String getDesc() { + return pattern; + } + + public void checkInjectionValidation() { + + traceLogger.entering(thisClass, "checkInjectionValidation", this); + + Set> cvSet = validator.validate(this); + + if (!cvSet.isEmpty()) { + String msg = formatConstraintViolations(cvSet); + traceLogger.log(Level.INFO, "Some reason cvSet was not null: " + cvSet + ", " + msg); + + throw new IllegalStateException("validation should not have found constraints: " + msg); + } + + traceLogger.exiting(thisClass, "checkInjectionValidation "); + } + + + @Override + public String toString() { + String result = "iMin:" + iMin + " iMax:" + iMax + " iMinArray:" + iMinArray + " iMaxArray:" + iMaxArray + " pattern:" + pattern + + " setToFail:" + setToFail; + + return result; + } + + /** + * Convert the constraint violations for use within WAS diagnostic logs. + * + * @return a String representation of the constraint violations formatted one per line and uniformly indented. + */ + public String formatConstraintViolations(Set> cvSet) { + traceLogger.entering(thisClass, "formatConstraintViolations " + cvSet); + + StringBuffer msg = new StringBuffer(); + for (ConstraintViolation cv : cvSet) { + msg.append("\n\t" + cv.toString()); + } + + traceLogger.exiting(thisClass, "formatConstraintViolations " + msg); + return msg.toString(); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean2.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean2.java new file mode 100644 index 00000000..a899e8d2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/beanval/SimpleBean2.java @@ -0,0 +1,47 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.beanval; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import javax.validation.constraints.PositiveOrZero; +import javax.validation.constraints.FutureOrPresent; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.PastOrPresent; + +public class SimpleBean2 extends SimpleBean1 { + + private List<@PositiveOrZero Integer> numbers= new ArrayList(); + private List<@NotBlank String> strings = new ArrayList(); + + @PastOrPresent + LocalDateTime now = LocalDateTime.now(); + + @FutureOrPresent + LocalDateTime future = LocalDateTime.now().plusDays(1); + + public SimpleBean2() throws Exception { + super(); + + numbers.add(1); + numbers.add(2); + + strings.add("string1"); + strings.add("string2"); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/CDIEventProducer.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/CDIEventProducer.java new file mode 100644 index 00000000..ef99073d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/CDIEventProducer.java @@ -0,0 +1,49 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import javax.annotation.Resource; +import javax.enterprise.concurrent.ManagedExecutorService; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Event; +import javax.enterprise.event.NotificationOptions; +import javax.inject.Inject; + +@ApplicationScoped //? +public class CDIEventProducer { + + @Resource + private ManagedExecutorService mes; + + @Inject + @Hit + Event hitCountEvent; + + @Inject + @HitAsync + Event hitCountEventAsync; + + public void produceSyncEvent() { + hitCountEvent.fire("hitCount++"); + } + + public void produceAsyncEvent() { + hitCountEventAsync.fireAsync("hitCount++", NotificationOptions.builder().setExecutor(mes).build()); + } + + + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/Hit.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/Hit.java new file mode 100644 index 00000000..6eb830a3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/Hit.java @@ -0,0 +1,29 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) +public @interface Hit { +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/HitAsync.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/HitAsync.java new file mode 100644 index 00000000..addca624 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/HitAsync.java @@ -0,0 +1,29 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE}) +public @interface HitAsync { +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIBean.java new file mode 100755 index 00000000..43e5a735 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIBean.java @@ -0,0 +1,59 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.util.Set; + +import javax.enterprise.context.RequestScoped; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.CDI; +import javax.naming.InitialContext; + +@RequestScoped +@PingInterceptorBinding +public class PingCDIBean { + + private static int helloHitCount = 0; + private static int getBeanManagerHitCountJNDI = 0; + private static int getBeanManagerHitCountSPI = 0; + + + public int hello() { + return ++helloHitCount; + } + + public int getBeanMangerViaJNDI() throws Exception { + BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager"); + Set> beans = beanManager.getBeans(Object.class); + if (beans.size() > 0) { + return ++getBeanManagerHitCountJNDI; + } + return 0; + + } + + public int getBeanMangerViaCDICurrent() throws Exception { + BeanManager beanManager = CDI.current().getBeanManager(); + Set> beans = beanManager.getBeans(Object.class); + + if (beans.size() > 0) { + return ++getBeanManagerHitCountSPI; + } + return 0; + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIJSFBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIJSFBean.java new file mode 100755 index 00000000..e618788c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingCDIJSFBean.java @@ -0,0 +1,33 @@ +/** + * (C) Copyright IBM Corporation 2016. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.Serializable; + +import javax.enterprise.context.SessionScoped; +import javax.inject.Named; + +@Named +@SessionScoped +public class PingCDIJSFBean implements Serializable { + + private static final long serialVersionUID = -7475815494313679416L; + private int hitCount = 0; + + public int getHitCount() { + return ++hitCount; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBIFace.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBIFace.java new file mode 100755 index 00000000..28bd563f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBIFace.java @@ -0,0 +1,24 @@ +/** + * (C) Copyright IBM Corporation 2016. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +/** + * EJB interface + */ +public interface PingEJBIFace { + + public String getMsg(); +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocal.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocal.java new file mode 100755 index 00000000..d9bf999b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocal.java @@ -0,0 +1,41 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import javax.ejb.Local; +import javax.ejb.Stateful; + +/** + * + */ +@Stateful +@Local +public class PingEJBLocal implements PingEJBIFace { + + private static int hitCount; + + /* + * (non-Javadoc) + * + * @see com.ibm.websphere.samples.daytrader.web.prims.EJBIFace#getMsg() + */ + @Override + public String getMsg() { + + return "PingEJBLocal: " + hitCount++; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocalDecorator.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocalDecorator.java new file mode 100755 index 00000000..dcfb07ba --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingEJBLocalDecorator.java @@ -0,0 +1,43 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import javax.annotation.Priority; +import javax.decorator.Decorator; +import javax.decorator.Delegate; +import javax.inject.Inject; +import javax.interceptor.Interceptor; + +@Decorator +@Priority(Interceptor.Priority.APPLICATION) +public class PingEJBLocalDecorator implements PingEJBIFace { + + /* + * (non-Javadoc) + * + * @see com.ibm.websphere.samples.daytrader.web.prims.EJBIFace#getMsg() + */ + @Delegate + @Inject + PingEJBIFace ejb; + + @Override + public String getMsg() { + + return "Decorated " + ejb.getMsg(); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptor.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptor.java new file mode 100755 index 00000000..dcc99693 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptor.java @@ -0,0 +1,42 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.Serializable; + +import javax.annotation.Priority; +import javax.interceptor.AroundInvoke; +import javax.interceptor.Interceptor; +import javax.interceptor.InvocationContext; + +/** + * + */ +@PingInterceptorBinding +@Interceptor +@Priority(Interceptor.Priority.APPLICATION) +public class PingInterceptor implements Serializable { + + /** */ + private static final long serialVersionUID = 1L; + + @AroundInvoke + public Object methodInterceptor(InvocationContext ctx) throws Exception { + + //noop + return ctx.proceed(); + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptorBinding.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptorBinding.java new file mode 100755 index 00000000..240b7b2c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingInterceptorBinding.java @@ -0,0 +1,33 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.interceptor.InterceptorBinding; + +/** + * + */ +@InterceptorBinding +@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR }) +@Retention(RetentionPolicy.RUNTIME) +public @interface PingInterceptorBinding { + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDI.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDI.java new file mode 100755 index 00000000..9696465a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDI.java @@ -0,0 +1,70 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.ejb.EJB; +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet("/servlet/PingServletCDI") +public class PingServletCDI extends HttpServlet { + + private static final long serialVersionUID = -1803544618879689949L; + private static String initTime; + + @Inject + PingCDIBean cdiBean; + + @EJB + PingEJBIFace ejb; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + PrintWriter pw = response.getWriter(); + pw.write("Ping Servlet CDI" + + "

    Ping Servlet CDI
    Init time : " + initTime + + "

    "); + + pw.write("hitCount: " + cdiBean.hello() + "
    "); + pw.write("hitCount: " + ejb.getMsg() + "
    "); + + pw.flush(); + pw.close(); + + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaCDICurrent.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaCDICurrent.java new file mode 100644 index 00000000..b4292e9e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaCDICurrent.java @@ -0,0 +1,71 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet("/servlet/PingServletCDIBeanManagerViaCDICurrent") +public class PingServletCDIBeanManagerViaCDICurrent extends HttpServlet { + + private static final long serialVersionUID = -1803544618879689949L; + private static String initTime; + + @Inject + PingCDIBean cdiBean; + + + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + PrintWriter pw = response.getWriter(); + pw.write("Ping Servlet CDI Bean Manager" + + "

    Ping Servlet CDI Bean Manager
    Init time : " + initTime + + "

    "); + + try { + pw.write("hitCount: " + cdiBean.getBeanMangerViaCDICurrent() + ""); + } catch (Exception e) { + e.printStackTrace(); + } + + pw.flush(); + pw.close(); + + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaJNDI.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaJNDI.java new file mode 100755 index 00000000..5ce3d914 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIBeanManagerViaJNDI.java @@ -0,0 +1,71 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet("/servlet/PingServletCDIBeanManagerViaJNDI") +public class PingServletCDIBeanManagerViaJNDI extends HttpServlet { + + private static final long serialVersionUID = -1803544618879689949L; + private static String initTime; + + @Inject + PingCDIBean cdiBean; + + + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + PrintWriter pw = response.getWriter(); + pw.write("Ping Servlet CDI Bean Manager" + + "

    Ping Servlet CDI Bean Manager
    Init time : " + initTime + + "

    "); + + try { + pw.write("hitCount: " + cdiBean.getBeanMangerViaJNDI() + ""); + } catch (Exception e) { + e.printStackTrace(); + } + + pw.flush(); + pw.close(); + + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEvent.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEvent.java new file mode 100644 index 00000000..9838dc33 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEvent.java @@ -0,0 +1,80 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.enterprise.event.Observes; +import javax.inject.Inject; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +@WebServlet("/servlet/PingServletCDIEvent") +public class PingServletCDIEvent extends HttpServlet { + + private static final long serialVersionUID = -1803544618879689949L; + private static String initTime; + private static int hitCount; + + @Inject + CDIEventProducer cdiEventProducer; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + cdiEventProducer.produceSyncEvent(); + + PrintWriter pw = response.getWriter(); + pw.write("Ping Servlet CDI Event" + + "

    Ping Servlet CDI Event
    Init time : " + initTime + + "

    "); + + try { + pw.write("hitCount1: " + hitCount + ""); + } catch (Exception e) { + e.printStackTrace(); + } + + pw.flush(); + pw.close(); + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } + + public void onEvent(@Observes @Hit String event) { + hitCount++; + } +} + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEventAsync.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEventAsync.java new file mode 100644 index 00000000..4a1b8b06 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/cdi/PingServletCDIEventAsync.java @@ -0,0 +1,90 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.cdi; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.annotation.Priority; +import javax.enterprise.event.ObservesAsync; +import javax.inject.Inject; +import javax.interceptor.Interceptor; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet("/servlet/PingServletCDIEventAsync") +public class PingServletCDIEventAsync extends HttpServlet { + + private static final long serialVersionUID = -1803544618879689949L; + private static String initTime; + private static int hitCount1; + private static int hitCount2; + + @Inject + CDIEventProducer cdiEventProducer; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + + cdiEventProducer.produceAsyncEvent(); + + PrintWriter pw = response.getWriter(); + pw.write("Ping Servlet CDI Event Async" + + "

    Ping Servlet CDI Event Async
    Init time : " + initTime + + "

    "); + + try { + pw.write("hitCount1: " + hitCount1 + "
    hitCount2: " + hitCount2 + ""); + } catch (Exception e) { + e.printStackTrace(); + } + + pw.flush(); + pw.close(); + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount1 = 0; + hitCount2 = 0; + } + + public void onAsyncEvent1(@ObservesAsync @Priority(Interceptor.Priority.APPLICATION) @HitAsync String event) { + hitCount1++; + } + + public void onAsyncEvent2(@ObservesAsync @Priority(Interceptor.Priority.APPLICATION + 1) @HitAsync String event) { + if (hitCount1 <= hitCount2 ) { + Log.error("Priority Error");; + } + hitCount2++; + } +} + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/drive/PingServletDrive.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/drive/PingServletDrive.java new file mode 100644 index 00000000..5420b38e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/drive/PingServletDrive.java @@ -0,0 +1,112 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.drive; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * + * PingServlet tests fundamental dynamic HTML creation functionality through + * server side servlet processing. + * + */ + +@WebServlet(name = "PingServletDrive", urlPatterns = { "/drive/PingServlet" }) +public class PingServletDrive extends HttpServlet { + + private static final long serialVersionUID = 7097023236709683760L; + private static String initTime; + private static int hitCount; + + /** + * forwards post requests to the doGet method Creation date: (11/6/2000 + * 10:52:39 AM) + * + * @param res + * javax.servlet.http.HttpServletRequest + * @param res2 + * javax.servlet.http.HttpServletResponse + */ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + /** + * this is the main method of the servlet that will service all get + * requests. + * + * @param request + * HttpServletRequest + * @param responce + * HttpServletResponce + **/ + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + try { + res.setContentType("text/html"); + + // The following 2 lines are the difference between PingServlet and + // PingServletWriter + // the latter uses a PrintWriter for output versus a binary output + // stream. + ServletOutputStream out = res.getOutputStream(); + // java.io.PrintWriter out = res.getWriter(); + hitCount++; + out.println("Ping Servlet" + + "

    Ping Servlet
    Init time : " + initTime + + "

    Hit Count: " + hitCount + ""); + } catch (Exception e) { + Log.error(e, "PingServlet.doGet(...): general exception caught"); + res.sendError(500, e.toString()); + + } + } + + /** + * returns a string of information about the servlet + * + * @return info String: contains info about the servlet + **/ + @Override + public String getServletInfo() { + return "Basic dynamic HTML generation through a servlet"; + } + + /** + * called when the class is loaded to initialize the servlet + * + * @param config + * ServletConfig: + **/ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Entity.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Entity.java new file mode 100644 index 00000000..79dfc3d8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Entity.java @@ -0,0 +1,114 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * Primitive designed to run within the TradeApplication and makes use of + * {@link trade_client.TradeConfig} for config parameters and random stock + * symbols. Servlet will generate a random stock symbol and get the price of + * that symbol using a {@link trade.Quote} Entity EJB This tests the common path + * of a Servlet calling an Entity EJB to get data + * + */ + +@WebServlet(name = "ejb3.PingServlet2Entity", urlPatterns = { "/ejb3/PingServlet2Entity" }) +public class PingServlet2Entity extends HttpServlet { + private static final long serialVersionUID = -9004026114063894842L; + + private static String initTime; + + private static int hitCount; + + @PersistenceContext(unitName = "daytrader") + private EntityManager em; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + + QuoteDataBean quote = null; + String symbol = null; + + StringBuffer output = new StringBuffer(100); + output.append("Servlet2Entity" + "
    PingServlet2Entity
    " + + "
    PingServlet2Entity accesses an EntityManager" + + " using a PersistenceContext annotaion and then gets the price of a random symbol (generated by TradeConfig)" + + " through the EntityManager find method"); + try { + // generate random symbol + try { + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + // get a random symbol to look up and get the key to that + // symbol. + symbol = TradeConfig.rndSymbol(); + // find the EntityInstance. + quote = em.find(QuoteDataBean.class, symbol); + } + } catch (Exception e) { + Log.error("web_primtv.PingServlet2Entity.doGet(...): error performing find"); + throw e; + } + // get the price and print the output. + + output.append("
    initTime: " + initTime + "
    Hit Count: ").append(hitCount++); + output.append("
    Quote Information

    " + quote.toHTML()); + output.append("

    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingServlet2Entity.doGet(...): error"); + // this will send an Error to teh web applications defined error + // page. + res.sendError(500, "PingServlet2Entity.doGet(...): error" + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Entity EJB path"; + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java new file mode 100644 index 00000000..c1941f86 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java @@ -0,0 +1,147 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.annotation.Resource; +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.JMSContext; +import javax.jms.Queue; +import javax.jms.TextMessage; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * This primitive is designed to run inside the TradeApplication and relies upon + * the {@link com.ibm.websphere.samples.daytrader.util.TradeConfig} class to set + * configuration parameters. PingServlet2MDBQueue tests key functionality of a + * servlet call to a post a message to an MDB Queue. The TradeBrokerMDB receives + * the message This servlet makes use of the MDB EJB + * {@link com.ibm.websphere.samples.daytrader.ejb3.DTBroker3MDB} by posting a + * message to the MDB Queue + */ +@WebServlet(name = "ejb3.PingServlet2MDBQueue", urlPatterns = { "/ejb3/PingServlet2MDBQueue" }) +public class PingServlet2MDBQueue extends HttpServlet { + + private static final long serialVersionUID = 2637271552188745216L; + + private static String initTime; + + private static int hitCount; + + @Resource(name = "jms/QueueConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private ConnectionFactory queueConnectionFactory; + + // TODO: Glassfish does not like this - change to lookup? + @Resource(name = "jms/TradeBrokerQueue") + private Queue tradeBrokerQueue; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + // use a stringbuffer to avoid concatenation of Strings + StringBuffer output = new StringBuffer(100); + output.append("PingServlet2MDBQueue" + + "
    PingServlet2MDBQueue
    " + "" + + "Tests the basic operation of a servlet posting a message to an EJB MDB through a JMS Queue.
    " + + "Note: Not intended for performance testing."); + + try { + Connection conn = queueConnectionFactory.createConnection(); + + try { + TextMessage message = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + /*Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); + try { + MessageProducer producer = sess.createProducer(tradeBrokerQueue); + + message = sess.createTextMessage(); + + String command = "ping"; + message.setStringProperty("command", command); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Ping message for queue java:comp/env/jms/TradeBrokerQueue sent from PingServlet2MDBQueue at " + new java.util.Date()); + producer.send(message); + } finally { + sess.close(); + }*/ + + JMSContext context = queueConnectionFactory.createContext(); + + message = context.createTextMessage(); + + message.setStringProperty("command", "ping"); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Ping message for queue java:comp/env/jms/TradeBrokerQueue sent from PingServlet2MDBQueue at " + new java.util.Date()); + + context.createProducer().send(tradeBrokerQueue, message); + } + + // write out the output + output.append("
    initTime: ").append(initTime); + output.append("
    Hit Count: ").append(hitCount++); + output.append("
    Posted Text message to java:comp/env/jms/TradeBrokerQueue destination"); + output.append("
    Message: ").append(message); + output.append("

    Message text: ").append(message.getText()); + output.append("

    "); + out.println(output.toString()); + + } catch (Exception e) { + Log.error("PingServlet2MDBQueue.doGet(...):exception posting message to TradeBrokerQueue destination "); + throw e; + } finally { + conn.close(); + } + } // this is where I actually handle the exceptions + catch (Exception e) { + Log.error(e, "PingServlet2MDBQueue.doGet(...): error"); + res.sendError(500, "PingServlet2MDBQueue.doGet(...): error, " + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, configured with trade runtime configs, tests Servlet to Session EJB path"; + + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java new file mode 100644 index 00000000..722cab74 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java @@ -0,0 +1,148 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.annotation.Resource; +import javax.jms.Connection; +import javax.jms.ConnectionFactory; +import javax.jms.JMSContext; +import javax.jms.TextMessage; +import javax.jms.Topic; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * This primitive is designed to run inside the TradeApplication and relies upon + * the {@link com.ibm.websphere.samples.daytrader.util.TradeConfig} class to set + * configuration parameters. PingServlet2MDBQueue tests key functionality of a + * servlet call to a post a message to an MDB Topic. The TradeStreamerMDB (and + * any other subscribers) receives the message This servlet makes use of the MDB + * EJB {@link com.ibm.websphere.samples.daytrader.ejb3.DTStreamer3MDB} by + * posting a message to the MDB Topic + */ +@WebServlet(name = "ejb3.PingServlet2MDBTopic", urlPatterns = { "/ejb3/PingServlet2MDBTopic" }) +public class PingServlet2MDBTopic extends HttpServlet { + + private static final long serialVersionUID = 5925470158886928225L; + + private static String initTime; + + private static int hitCount; + + @Resource(name = "jms/TopicConnectionFactory", authenticationType = javax.annotation.Resource.AuthenticationType.APPLICATION) + private ConnectionFactory topicConnectionFactory; + + // TODO: Glassfish does not like this - change to lookup? + @Resource(name = "jms/TradeStreamerTopic") + private Topic tradeStreamerTopic; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + // use a stringbuffer to avoid concatenation of Strings + StringBuffer output = new StringBuffer(100); + output.append("PingServlet2MDBTopic" + + "
    PingServlet2MDBTopic
    " + "" + + "Tests the basic operation of a servlet posting a message to an EJB MDB (and other subscribers) through a JMS Topic.
    " + + "Note: Not intended for performance testing."); + + // we only want to look up the JMS resources once + try { + + Connection conn = topicConnectionFactory.createConnection(); + + try { + TextMessage message = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + /*Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); + try { + MessageProducer producer = sess.createProducer(tradeStreamerTopic); + message = sess.createTextMessage(); + + String command = "ping"; + message.setStringProperty("command", command); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Ping message for topic java:comp/env/jms/TradeStreamerTopic sent from PingServlet2MDBTopic at " + new java.util.Date()); + + producer.send(message); + } finally { + sess.close(); + }*/ + + JMSContext context = topicConnectionFactory.createContext(); + + message = context.createTextMessage(); + + message.setStringProperty("command", "ping"); + message.setLongProperty("publishTime", System.currentTimeMillis()); + message.setText("Ping message for topic java:comp/env/jms/TradeStreamerTopic sent from PingServlet2MDBTopic at " + new java.util.Date()); + + context.createProducer().send(tradeStreamerTopic, message); + } + + // write out the output + output.append("
    initTime: ").append(initTime); + output.append("
    Hit Count: ").append(hitCount++); + output.append("
    Posted Text message to java:comp/env/jms/TradeStreamerTopic topic"); + output.append("
    Message: ").append(message); + output.append("

    Message text: ").append(message.getText()); + output.append("

    "); + out.println(output.toString()); + + } catch (Exception e) { + Log.error("PingServlet2MDBTopic.doGet(...):exception posting message to TradeStreamerTopic topic"); + throw e; + } finally { + conn.close(); + } + } // this is where I actually handle the exceptions + catch (Exception e) { + Log.error(e, "PingServlet2MDBTopic.doGet(...): error"); + res.sendError(500, "PingServlet2MDBTopic.doGet(...): error, " + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, configured with trade runtime configs, tests Servlet to Session EJB path"; + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session.java new file mode 100644 index 00000000..4b9b159e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session.java @@ -0,0 +1,121 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * This primitive is designed to run inside the TradeApplication and relies upon + * the {@link trade_client.TradeConfig} class to set configuration parameters. + * PingServlet2SessionEJB tests key functionality of a servlet call to a + * stateless SessionEJB. This servlet makes use of the Stateless Session EJB + * {@link trade.Trade} by calling calculateInvestmentReturn with three random + * numbers. + * + */ +@WebServlet(name = "ejb3.PingServlet2Session", urlPatterns = { "/ejb3/PingServlet2Session" }) +public class PingServlet2Session extends HttpServlet { + + private static final long serialVersionUID = 6854998080392777053L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + // use a stringbuffer to avoid concatenation of Strings + StringBuffer output = new StringBuffer(100); + output.append("PingServlet2SessionLocal" + + "
    PingServlet2SessionLocal
    " + "" + + "Tests the basis path from a Servlet to a Session Bean."); + + try { + + try { + // create three random numbers + double rnd1 = Math.random() * 1000000; + double rnd2 = Math.random() * 1000000; + + // use a function to do some work. + double increase = 0.0; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + increase = tradeSLSBLocal.investmentReturn(rnd1, rnd2); + } + + // write out the output + output.append("
    initTime: " + initTime); + output.append("
    Hit Count: " + hitCount++); + output.append("
    Investment Return Information

    investment: " + rnd1); + output.append("
    current Value: " + rnd2); + output.append("
    investment return " + increase + "
    "); + out.println(output.toString()); + + } catch (Exception e) { + Log.error("PingServlet2Session.doGet(...):exception calling trade.investmentReturn "); + throw e; + } + } // this is where I actually handle the exceptions + catch (Exception e) { + Log.error(e, "PingServlet2Session.doGet(...): error"); + res.sendError(500, "PingServlet2Session.doGet(...): error, " + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, configured with trade runtime configs, tests Servlet to Session EJB path"; + + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2Many.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2Many.java new file mode 100644 index 00000000..cfcda22b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2Many.java @@ -0,0 +1,114 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * Primitive to test Entity Container Managed Relationshiop One to One Servlet + * will generate a random userID and get the profile for that user using a + * {@link trade.Account} Entity EJB This tests the common path of a Servlet + * calling a Session to Entity EJB to get CMR One to One data + * + */ +@WebServlet(name = "ejb3.PingServlet2Session2CMR2One2Many", urlPatterns = { "/ejb3/PingServlet2Session2CMROne2Many" }) +public class PingServlet2Session2CMROne2Many extends HttpServlet { + private static final long serialVersionUID = -8658929449987440032L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + + String userID = null; + + StringBuffer output = new StringBuffer(100); + output.append("Servlet2Session2CMROne20ne" + + "
    PingServlet2Session2CMROne2Many
    " + + "
    PingServlet2Session2CMROne2Many uses the Trade Session EJB" + + " to get the orders for a user using an EJB 3.0 Entity CMR one to many relationship"); + try { + + Collection orderDataBeans = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + userID = TradeConfig.rndUserID(); + + // get the users orders and print the output. + orderDataBeans = tradeSLSBLocal.getOrders(userID); + } + + output.append("
    initTime: " + initTime + "
    Hit Count: ").append(hitCount++); + output.append("
    One to Many CMR access of Account Orders from Account Entity
    "); + output.append("
    User: " + userID + " currently has " + orderDataBeans.size() + " stock orders:"); + Iterator it = orderDataBeans.iterator(); + while (it.hasNext()) { + OrderDataBean orderData = (OrderDataBean) it.next(); + output.append("
    " + orderData.toHTML()); + } + output.append("

    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingServlet2Session2CMROne2Many.doGet(...): error"); + // this will send an Error to teh web applications defined error + // page. + res.sendError(500, "PingServlet2Session2CMROne2Many.doGet(...): error" + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Entity EJB path"; + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2One.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2One.java new file mode 100644 index 00000000..21801863 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2CMROne2One.java @@ -0,0 +1,107 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.ejb.EJB; +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * Primitive to test Entity Container Managed Relationshiop One to One Servlet + * will generate a random userID and get the profile for that user using a + * {@link trade.Account} Entity EJB This tests the common path of a Servlet + * calling a Session to Entity EJB to get CMR One to One data + * + */ +@WebServlet(name = "ejb3.PingServlet2Session2CMR2One2One", urlPatterns = { "/ejb3/PingServlet2Session2CMROne2One" }) +public class PingServlet2Session2CMROne2One extends HttpServlet { + private static final long serialVersionUID = 567062418489199248L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + + String userID = null; + + StringBuffer output = new StringBuffer(100); + output.append("Servlet2Session2CMROne20ne" + + "
    PingServlet2Session2CMROne2One
    " + + "
    PingServlet2Session2CMROne2One uses the Trade Session EJB" + + " to get the profile for a user using an EJB 3.0 CMR one to one relationship"); + try { + + AccountProfileDataBean accountProfileData = null; + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + userID = TradeConfig.rndUserID(); + // get the price and print the output. + accountProfileData = tradeSLSBLocal.getAccountProfileData(userID); + } + + output.append("
    initTime: " + initTime + "
    Hit Count: ").append(hitCount++); + output.append("
    One to One CMR access of AccountProfile Information from Account Entity

    " + accountProfileData.toHTML()); + output.append("

    "); + out.println(output.toString()); + } catch (Exception e) { + Log.error(e, "PingServlet2Session2CMROne2One.doGet(...): error"); + // this will send an Error to teh web applications defined error + // page. + res.sendError(500, "PingServlet2Session2CMROne2One.doGet(...): error" + e.toString()); + + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Entity EJB path"; + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity.java new file mode 100644 index 00000000..17e892cc --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity.java @@ -0,0 +1,126 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.ejb.EJB; +import javax.inject.Inject; +import javax.naming.InitialContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingServlet2Session2Entity tests key functionality of a servlet call to a + * stateless SessionEJB, and then to a Entity EJB representing data in a + * database. This servlet makes use of the Stateless Session EJB {@link Trade}, + * and then uses {@link TradeConfig} to generate a random stock symbol. The + * stocks price is looked up using the Quote Entity EJB. + * + */ +@WebServlet(name = "ejb3.PingServlet2Session2Entity", urlPatterns = { "/ejb3/PingServlet2Session2Entity" }) +public class PingServlet2Session2Entity extends HttpServlet { + + private static final long serialVersionUID = -5043457201022265012L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + String symbol = null; + QuoteDataBean quoteData = null; + StringBuffer output = new StringBuffer(100); + + output.append("PingServlet2Session2Entity" + + "
    PingServlet2Session2Entity
    " + "" + + "PingServlet2Session2Entity tests the common path of a Servlet calling a Session EJB " + "which in turn calls an Entity EJB.
    "); + + try { + try { + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + symbol = TradeConfig.rndSymbol(); + // getQuote will call findQuote which will instaniate the + // Quote Entity Bean + // and then will return a QuoteObject + quoteData = tradeSLSBLocal.getQuote(symbol); + } + } catch (Exception ne) { + Log.error(ne, "PingServlet2Session2Entity.goGet(...): exception getting QuoteData through Trade"); + throw ne; + } + + output.append("
    initTime: " + initTime).append("
    Hit Count: " + hitCount++); + output.append("
    Quote Information

    " + quoteData.toHTML()); + out.println(output.toString()); + + } catch (Exception e) { + Log.error(e, "PingServlet2Session2Entity.doGet(...): General Exception caught"); + res.sendError(500, "General Exception caught, " + e.toString()); + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Session to Entity EJB path"; + + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + + if (tradeSLSBLocal == null) { + Log.error("PingServlet2Session2Entity:init - Injection of tradeSLSBLocal failed - performing JNDI lookup!"); + + try { + InitialContext context = new InitialContext(); + tradeSLSBLocal = (TradeSLSBBean) context.lookup("java:comp/env/ejb/TradeSLSBBean"); + } catch (Exception ex) { + Log.error("PingServlet2Session2Entity:init - Lookup of tradeSLSBLocal failed!!!"); + ex.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity2JSP.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity2JSP.java new file mode 100644 index 00000000..e8f1c268 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2Entity2JSP.java @@ -0,0 +1,106 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.ejb.EJB; +import javax.inject.Inject; +import javax.naming.InitialContext; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingServlet2Session2Entity tests key functionality of a servlet call to a + * stateless SessionEJB, and then to a Entity EJB representing data in a + * database. This servlet makes use of the Stateless Session EJB {@link Trade}, + * and then uses {@link TradeConfig} to generate a random stock symbol. The + * stocks price is looked up using the Quote Entity EJB. + * + */ +@WebServlet(name = "ejb3.PingServlet2Session2Entity2JSP", urlPatterns = { "/ejb3/PingServlet2Session2Entity2JSP" }) +public class PingServlet2Session2Entity2JSP extends HttpServlet { + + private static final long serialVersionUID = -8966014710582651693L; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + String symbol = null; + QuoteDataBean quoteData = null; + ServletContext ctx = getServletConfig().getServletContext(); + + try { + try { + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + symbol = TradeConfig.rndSymbol(); + // getQuote will call findQuote which will instaniate the + // Quote Entity Bean + // and then will return a QuoteObject + quoteData = tradeSLSBLocal.getQuote(symbol); + } + + req.setAttribute("quoteData", quoteData); + // req.setAttribute("hitCount", hitCount); + // req.setAttribute("initTime", initTime); + + ctx.getRequestDispatcher("/quoteDataPrimitive.jsp").include(req, res); + } catch (Exception ne) { + Log.error(ne, "PingServlet2Session2Entity2JSP.goGet(...): exception getting QuoteData through Trade"); + throw ne; + } + + } catch (Exception e) { + Log.error(e, "PingServlet2Session2Entity2JSP.doGet(...): General Exception caught"); + res.sendError(500, "General Exception caught, " + e.toString()); + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Session to Entity EJB to JSP path"; + + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + // hitCount = 0; + // initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2EntityCollection.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2EntityCollection.java new file mode 100644 index 00000000..ded2e882 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2Session2EntityCollection.java @@ -0,0 +1,123 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; +import java.util.Collection; +import java.util.Iterator; + +import javax.ejb.EJB; +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.impl.ejb3.TradeSLSBBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * + * PingServlet2Session2Entity tests key functionality of a servlet call to a + * stateless SessionEJB, and then to a Entity EJB representing data in a + * database. This servlet makes use of the Stateless Session EJB {@link Trade}, + * and then uses {@link TradeConfig} to generate a random user. The users + * portfolio is looked up using the Holding Entity EJB returnin a collection of + * Holdings + * + */ +@WebServlet(name = "ejb3.PingServlet2Session2EntityCollection", urlPatterns = { "/ejb3/PingServlet2Session2EntityCollection" }) +public class PingServlet2Session2EntityCollection extends HttpServlet { + + private static final long serialVersionUID = 6171380014749902308L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + String userID = null; + Collection holdingDataBeans = null; + StringBuffer output = new StringBuffer(100); + + output.append("PingServlet2Session2EntityCollection" + + "
    PingServlet2Session2EntityCollection
    " + "" + + "PingServlet2Session2EntityCollection tests the common path of a Servlet calling a Session EJB " + + "which in turn calls a finder on an Entity EJB returning a collection of Entity EJBs.
    "); + + try { + + try { + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + userID = TradeConfig.rndUserID(); + // getQuote will call findQuote which will instaniate the + // Quote Entity Bean + // and then will return a QuoteObject + holdingDataBeans = tradeSLSBLocal.getHoldings(userID); + // trade.remove(); + } + } catch (Exception ne) { + Log.error(ne, "PingServlet2Session2EntityCollection.goGet(...): exception getting HoldingData collection through Trade for user " + userID); + throw ne; + } + + output.append("
    initTime: " + initTime).append("
    Hit Count: " + hitCount++); + output.append("
    User: " + userID + " is currently holding " + holdingDataBeans.size() + " stock holdings:"); + Iterator it = holdingDataBeans.iterator(); + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + output.append("
    " + holdingData.toHTML()); + } + out.println(output.toString()); + + } catch (Exception e) { + Log.error(e, "PingServlet2Session2EntityCollection.doGet(...): General Exception caught"); + res.sendError(500, "General Exception caught, " + e.toString()); + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Session to Entity returning a collection of Entity EJBs"; + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2TwoPhase.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2TwoPhase.java new file mode 100644 index 00000000..3e184f06 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2TwoPhase.java @@ -0,0 +1,118 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.ejb3; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.interfaces.TradeEJB; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + + +/** + * + * PingServlet2TwoPhase tests key functionality of a TwoPhase commit In this + * primitive a servlet calls a Session EJB which begins a global txn The Session + * EJB then reads a DB row and sends a message to JMS Queue The txn is closed w/ + * a 2-phase commit + * + */ +@WebServlet(name = "ejb3.PingServlet2TwoPhase", urlPatterns = { "/ejb3/PingServlet2TwoPhase" }) +public class PingServlet2TwoPhase extends HttpServlet { + + private static final long serialVersionUID = -1563251786527079548L; + + private static String initTime; + + private static int hitCount; + + @Inject + @TradeEJB + private TradeServices tradeSLSBLocal; + + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { + doGet(req, res); + } + + + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + + res.setContentType("text/html"); + java.io.PrintWriter out = res.getWriter(); + String symbol = null; + QuoteDataBean quoteData = null; + StringBuffer output = new StringBuffer(100); + + output.append("PingServlet2TwoPhase" + + "
    PingServlet2TwoPhase
    " + "" + + "PingServlet2TwoPhase tests the path of a Servlet calling a Session EJB " + + "which in turn calls an Entity EJB to read a DB row (quote). The Session EJB " + "then posts a message to a JMS Queue. " + + "
    These operations are wrapped in a 2-phase commit
    "); + + try { + + try { + int iter = TradeConfig.getPrimIterations(); + for (int ii = 0; ii < iter; ii++) { + symbol = TradeConfig.rndSymbol(); + // getQuote will call findQuote which will instaniate the + // Quote Entity Bean + // and then will return a QuoteObject + quoteData = tradeSLSBLocal.pingTwoPhase(symbol); + + } + } catch (Exception ne) { + Log.error(ne, "PingServlet2TwoPhase.goGet(...): exception getting QuoteData through Trade"); + throw ne; + } + + output.append("
    initTime: " + initTime).append("
    Hit Count: " + hitCount++); + output.append("
    Two phase ping selected a quote and sent a message to TradeBrokerQueue JMS queue
    Quote Information

    " + + quoteData.toHTML()); + out.println(output.toString()); + + } catch (Exception e) { + Log.error(e, "PingServlet2TwoPhase.doGet(...): General Exception caught"); + res.sendError(500, "General Exception caught, " + e.toString()); + } + } + + @Override + public String getServletInfo() { + return "web primitive, tests Servlet to Session to Entity EJB and JMS -- 2-phase commit path"; + + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + hitCount = 0; + initTime = new java.util.Date().toString(); + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletPush.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletPush.java new file mode 100644 index 00000000..296a564a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletPush.java @@ -0,0 +1,73 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.http2; + +import java.io.IOException; +import java.io.PrintWriter; + +// +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.PushBuilder; + +import com.ibm.websphere.samples.daytrader.util.Log; + +@WebServlet(name = "PingServletPush", urlPatterns = { "/PingServletPush" }) +public class PingServletPush extends HttpServlet { + + private static final long serialVersionUID = -1687383294950455998L; + private static String initTime; + private static int hitCount; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + try { + PushBuilder pushBuilder = req.newPushBuilder(); + if (pushBuilder != null) { + pushBuilder + .path("images/graph.gif") + .push(); + + } else { + Log.error("HTTP/2 not enabled or Push not supported"); + } + } catch (Exception e) { + e.printStackTrace(); + } + + try(PrintWriter respWriter = resp.getWriter();){ + hitCount++; + //System.out.println("Sending hit count: " + hitCount); + respWriter.write("Ping Servlet HTTP/2" + + "

    Ping Servlet HTTP/2
    Init time : " + initTime + + "

    Hit Count: " + hitCount + "
    " + + "" + + ""); + } + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletSimple.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletSimple.java new file mode 100644 index 00000000..5c9b7e69 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/http2/PingServletSimple.java @@ -0,0 +1,55 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.http2; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "PingServletHttpSimple", urlPatterns = { "/PingServletHttpSimple" }) +public class PingServletSimple extends HttpServlet { + + private static final long serialVersionUID = -1687383294950455998L; + private static String initTime; + private static int hitCount; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + try(PrintWriter respWriter = resp.getWriter();){ + hitCount++; + //System.out.println("Sending hit count: " + hitCount); + respWriter.write("Ping Servlet HTTP/2" + + "

    Ping Servlet HTTP/2
    Init time : " + initTime + + "

    Hit Count: " + hitCount + "
    " + + "" + + ""); + } + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + initTime = new java.util.Date().toString(); + hitCount = 0; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/JAXRSSyncService.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/JAXRSSyncService.java new file mode 100644 index 00000000..aff1ea9b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/JAXRSSyncService.java @@ -0,0 +1,63 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.jaxrs; + +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +@ApplicationPath("/jaxrs") +@Path("sync") +public class JAXRSSyncService { + + /** + * note: this should be the basic code path for jaxrs process + * @param input + * @return + */ + @GET + @Path("echoText") + public String echoString(@QueryParam("input") String input) { + return input; + } + + /** + * note: this code path involves JSON marshaller & un-marshaller based on basic code path + * @param p Person Object + * @return Person Object + */ + @POST + @Path("echoJSON") + @Produces(value={MediaType.APPLICATION_JSON}) + @Consumes(value={MediaType.APPLICATION_JSON}) + public TestJSONObject echoObject(TestJSONObject jsonObject) { + return jsonObject; + } + + @POST + @Path("echoXML") + @Produces(value={MediaType.TEXT_XML,MediaType.APPLICATION_XML}) + @Consumes(value={MediaType.TEXT_XML,MediaType.APPLICATION_XML}) + public XMLObject echoObject(XMLObject xmlObject) { + return xmlObject; + } +} + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/ObjectFactory.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/ObjectFactory.java new file mode 100644 index 00000000..f7993d8c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/ObjectFactory.java @@ -0,0 +1,28 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.jaxrs; + +import javax.xml.bind.annotation.XmlRegistry; + + +@XmlRegistry +public class ObjectFactory { + + public XMLObject createXMLObject() { + XMLObject xo = new XMLObject(); + return xo; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/TestJSONObject.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/TestJSONObject.java new file mode 100644 index 00000000..20c229d1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/TestJSONObject.java @@ -0,0 +1,134 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.jaxrs; + +public class TestJSONObject { + + private String prop0001; + private String prop0002; + private String prop0003; + private String prop0004; + private String prop0005; + private String prop0006; + private String prop0007; + private String prop0008; + private String prop0009; + private String prop0010; + private String prop0011; + private String prop0012; + private String prop0013; + private String prop0014; + private String prop0015; + private String prop0016; + + public String getProp0001() { + return prop0001; + } + public void setProp0001(String prop0001) { + this.prop0001 = prop0001; + } + public String getProp0002() { + return prop0002; + } + public void setProp0002(String prop0002) { + this.prop0002 = prop0002; + } + public String getProp0003() { + return prop0003; + } + public void setProp0003(String prop0003) { + this.prop0003 = prop0003; + } + public String getProp0004() { + return prop0004; + } + public void setProp0004(String prop0004) { + this.prop0004 = prop0004; + } + public String getProp0005() { + return prop0005; + } + public void setProp0005(String prop0005) { + this.prop0005 = prop0005; + } + public String getProp0006() { + return prop0006; + } + public void setProp0006(String prop0006) { + this.prop0006 = prop0006; + } + public String getProp0007() { + return prop0007; + } + public void setProp0007(String prop0007) { + this.prop0007 = prop0007; + } + public String getProp0008() { + return prop0008; + } + public void setProp0008(String prop0008) { + this.prop0008 = prop0008; + } + public String getProp0009() { + return prop0009; + } + public void setProp0009(String prop0009) { + this.prop0009 = prop0009; + } + public String getProp0010() { + return prop0010; + } + public void setProp0010(String prop0010) { + this.prop0010 = prop0010; + } + public String getProp0011() { + return prop0011; + } + public void setProp0011(String prop0011) { + this.prop0011 = prop0011; + } + public String getProp0012() { + return prop0012; + } + public void setProp0012(String prop0012) { + this.prop0012 = prop0012; + } + public String getProp0013() { + return prop0013; + } + public void setProp0013(String prop0013) { + this.prop0013 = prop0013; + } + public String getProp0014() { + return prop0014; + } + public void setProp0014(String prop0014) { + this.prop0014 = prop0014; + } + public String getProp0015() { + return prop0015; + } + public void setProp0015(String prop0015) { + this.prop0015 = prop0015; + } + public String getProp0016() { + return prop0016; + } + public void setProp0016(String prop0016) { + this.prop0016 = prop0016; + } +} + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/XMLObject.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/XMLObject.java new file mode 100644 index 00000000..eb427650 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/prims/jaxrs/XMLObject.java @@ -0,0 +1,152 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.prims.jaxrs; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * with @XmlRootElement, make the XMLObject as a JAXB object + * then add/remove any atteribute with setter& getter + * + * note: please change all XMLObjects in project JAXRSJ2SEClient,JAXRSBenchService,JAXRS20Client + * they should share the same XMLObject + * @author alexzan + * + */ +@XmlRootElement +public class XMLObject { + + private String prop0001; + private String prop0002; + private String prop0003; + private String prop0004; + private String prop0005; + private String prop0006; + private String prop0007; + private String prop0008; + private String prop0009; + private String prop0010; + private String prop0011; + private String prop0012; + private String prop0013; + private String prop0014; + private String prop0015; + private String prop0016; + private String x; + + public String getProp0001() { + return prop0001; + } + public void setProp0001(String prop0001) { + this.prop0001 = prop0001; + } + public String getProp0002() { + return prop0002; + } + public void setProp0002(String prop0002) { + this.prop0002 = prop0002; + } + public String getProp0003() { + return prop0003; + } + public void setProp0003(String prop0003) { + this.prop0003 = prop0003; + } + public String getProp0004() { + return prop0004; + } + public void setProp0004(String prop0004) { + this.prop0004 = prop0004; + } + public String getProp0005() { + return prop0005; + } + public void setProp0005(String prop0005) { + this.prop0005 = prop0005; + } + public String getProp0006() { + return prop0006; + } + public void setProp0006(String prop0006) { + this.prop0006 = prop0006; + } + public String getProp0007() { + return prop0007; + } + public void setProp0007(String prop0007) { + this.prop0007 = prop0007; + } + public String getProp0008() { + return prop0008; + } + public void setProp0008(String prop0008) { + this.prop0008 = prop0008; + } + public String getProp0009() { + return prop0009; + } + public void setProp0009(String prop0009) { + this.prop0009 = prop0009; + } + public String getProp0010() { + return prop0010; + } + public void setProp0010(String prop0010) { + this.prop0010 = prop0010; + } + public String getProp0011() { + return prop0011; + } + public void setProp0011(String prop0011) { + this.prop0011 = prop0011; + } + public String getProp0012() { + return prop0012; + } + public void setProp0012(String prop0012) { + this.prop0012 = prop0012; + } + public String getProp0013() { + return prop0013; + } + public void setProp0013(String prop0013) { + this.prop0013 = prop0013; + } + public String getProp0014() { + return prop0014; + } + public void setProp0014(String prop0014) { + this.prop0014 = prop0014; + } + public String getProp0015() { + return prop0015; + } + public void setProp0015(String prop0015) { + this.prop0015 = prop0015; + } + public String getProp0016() { + return prop0016; + } + public void setProp0016(String prop0016) { + this.prop0016 = prop0016; + } + public String getX() { + return x; + } + public void setX(String x) { + this.x = x; + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/OrdersAlertFilter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/OrdersAlertFilter.java new file mode 100644 index 00000000..9bbfa1d9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/OrdersAlertFilter.java @@ -0,0 +1,116 @@ +/** + * (C) Copyright IBM Corporation 2015, 2022. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; +import java.util.Collection; + +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Diagnostics; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@WebFilter(filterName = "OrdersAlertFilter", urlPatterns = "/app") +@Trace +public class OrdersAlertFilter implements Filter { + + private TradeServices tradeAction; + + @Inject + public OrdersAlertFilter(@Any Instance services) { + super(); + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + + /** + * @see Filter#init(FilterConfig) + */ + private FilterConfig filterConfig = null; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + if (filterConfig == null) { + return; + } + + if (TradeConfig.getDisplayOrderAlerts() == true) { + + try { + String action = req.getParameter("action"); + if (action != null) { + action = action.trim(); + if ((action.length() > 0) && (!action.equals("logout"))) { + String userID; + if (action.equals("login")) { + userID = req.getParameter("uid"); + } else { + userID = (String) ((HttpServletRequest) req).getSession().getAttribute("uidBean"); + } + + if ((userID != null) && (userID.trim().length() > 0)) { + + Collection closedOrders = tradeAction.getClosedOrders(userID); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + req.setAttribute("closedOrders", closedOrders); + } + if (Log.doTrace()) { + Log.printCollection("OrderAlertFilter: userID=" + userID + " closedOrders=", closedOrders); + } + } + } + } + } catch (Exception e) { + Log.error(e, "OrdersAlertFilter - Error checking for closedOrders"); + } + } + + Diagnostics.checkDiagnostics(); + + chain.doFilter(req, resp/* wrapper */); + } + + /** + * @see Filter#destroy() + */ + @Override + public void destroy() { + this.filterConfig = null; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/PrimFilter.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/PrimFilter.java new file mode 100644 index 00000000..64aaa2a6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/PrimFilter.java @@ -0,0 +1,68 @@ +/** + * (C) Copyright IBM Corporation 2015, 2022. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.util.Diagnostics; + +@WebFilter(filterName = "PrimFilter", urlPatterns = "/drive/*") +@Trace +public class PrimFilter implements Filter { + + /** + * @see Filter#init(FilterConfig) + */ + private FilterConfig filterConfig = null; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + + if (filterConfig == null) { + return; + } + + Diagnostics.checkDiagnostics(); + + chain.doFilter(req, resp/* wrapper */); + } + + /** + * @see Filter#destroy() + */ + @Override + public void destroy() { + this.filterConfig = null; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TestServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TestServlet.java new file mode 100644 index 00000000..6b644d77 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TestServlet.java @@ -0,0 +1,122 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; +import java.math.BigDecimal; + +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + +@WebServlet(name = "TestServlet", urlPatterns = { "/TestServlet" }) +public class TestServlet extends HttpServlet { + + private static final long serialVersionUID = -2927579146688173127L; + + private TradeServices tradeAction; + + @Inject + public TestServlet(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } + + /** + * Process incoming HTTP GET requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Process incoming HTTP POST requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Main service method for TradeAppServlet + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + public void performTask(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + Log.debug("Enter TestServlet doGet"); + //TradeDirect tradeDirect = new TradeDirect(); + for (int i = 0; i < 10; i++) { + tradeAction.createQuote("s:" + i, "Company " + i, new BigDecimal(i * 1.1)); + } + /* + * + * AccountDataBean accountData = new TradeAction().register("user1", + * "password", "fullname", "address", "email", "creditCard", new + * BigDecimal(123.45), false); + * + * OrderDataBean orderData = new TradeAction().buy("user1", "s:1", + * 100.0); orderData = new TradeAction().buy("user1", "s:2", 200.0); + * Thread.sleep(5000); accountData = new + * TradeAction().getAccountData("user1"); Collection + * holdingDataBeans = new TradeAction().getHoldings("user1"); + * PrintWriter out = resp.getWriter(); + * resp.setContentType("text/html"); + * out.write("

    "); + * out.write(accountData.toString()); + * Log.printCollection("user1 Holdings", holdingDataBeans); + * ServletContext sc = getServletContext(); + * req.setAttribute("results", "Success"); + * req.setAttribute("accountData", accountData); + * req.setAttribute("holdingDataBeans", holdingDataBeans); + * getServletContext + * ().getRequestDispatcher("/tradehome.jsp").include(req, resp); + * out.write("

    done."); + */ + } catch (Exception e) { + Log.error("TestServletException", e); + } + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeAppServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeAppServlet.java new file mode 100644 index 00000000..4b7c529f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeAppServlet.java @@ -0,0 +1,221 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import javax.servlet.http.PushBuilder; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + + +/** + * + * TradeAppServlet provides the standard web interface to Trade and can be + * accessed with the Go Trade! link. Driving benchmark load using this interface + * requires a sophisticated web load generator that is capable of filling HTML + * forms and posting dynamic data. + */ + +@WebServlet(name = "TradeAppServlet", urlPatterns = { "/app" }) +@Trace +public class TradeAppServlet extends HttpServlet { + + @Inject + TradeServletAction tsAction; + + private static final long serialVersionUID = 481530522846648373L; + + /** + * Servlet initialization method. + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + java.util.Enumeration en = config.getInitParameterNames(); + while (en.hasMoreElements()) { + String parm = en.nextElement(); + String value = config.getInitParameter(parm); + TradeConfig.setConfigParam(parm, value); + } + try { + // TODO: Uncomment this once split-tier issue is resolved + // TradeDirect.init(); + } catch (Exception e) { + Log.error(e, "TradeAppServlet:init -- Error initializing TradeDirect"); + } + } + + /** + * Returns a string that contains information about TradeScenarioServlet + * + * @return The servlet information + */ + @Override + public java.lang.String getServletInfo() { + return "TradeAppServlet provides the standard web interface to Trade"; + } + + /** + * Process incoming HTTP GET requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Process incoming HTTP POST requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Main service method for TradeAppServlet + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + public void performTask(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + String action = null; + String userID = null; + // String to create full dispatch path to TradeAppServlet w/ request + // Parameters + + resp.setContentType("text/html"); + + // Dyna - need status string - prepended to output + action = req.getParameter("action"); + + ServletContext ctx = getServletConfig().getServletContext(); + + if (action == null) { + tsAction.doWelcome(ctx, req, resp, ""); + return; + } else if (action.equals("login")) { + userID = req.getParameter("uid"); + String passwd = req.getParameter("passwd"); + tsAction.doLogin(ctx, req, resp, userID, passwd); + return; + } else if (action.equals("register")) { + userID = req.getParameter("user id"); + String passwd = req.getParameter("passwd"); + String cpasswd = req.getParameter("confirm passwd"); + String fullname = req.getParameter("Full Name"); + String ccn = req.getParameter("Credit Card Number"); + String money = req.getParameter("money"); + String email = req.getParameter("email"); + String smail = req.getParameter("snail mail"); + tsAction.doRegister(ctx, req, resp, userID, passwd, cpasswd, fullname, ccn, money, email, smail); + return; + } + + // The rest of the operations require the user to be logged in - + // Get the Session and validate the user. + HttpSession session = req.getSession(); + userID = (String) session.getAttribute("uidBean"); + + if (userID == null) { + System.out.println("TradeAppServlet service error: User Not Logged in"); + tsAction.doWelcome(ctx, req, resp, "User Not Logged in"); + return; + } + + // try http/2 push if we get here + // should be logged in and doing real work by this point + if (!action.equals("logout") && TradeConfig.getWebInterface() == TradeConfig.JSP_Images_HTTP2) { + pushHeaderImages(req.newPushBuilder()); + } + + if (action.equals("quotes")) { + String symbols = req.getParameter("symbols"); + tsAction.doQuotes(ctx, req, resp, userID, symbols); + } else if (action.equals("buy")) { + String symbol = req.getParameter("symbol"); + String quantity = req.getParameter("quantity"); + tsAction.doBuy(ctx, req, resp, userID, symbol, quantity); + } else if (action.equals("sell")) { + int holdingID = Integer.parseInt(req.getParameter("holdingID")); + tsAction.doSell(ctx, req, resp, userID, new Integer(holdingID)); + } else if (action.equals("portfolio") || action.equals("portfolioNoEdge")) { + tsAction.doPortfolio(ctx, req, resp, userID, "Portfolio as of " + new java.util.Date()); + } else if (action.equals("logout")) { + tsAction.doLogout(ctx, req, resp, userID); + } else if (action.equals("home")) { + tsAction.doHome(ctx, req, resp, userID, "Ready to Trade"); + } else if (action.equals("account")) { + tsAction.doAccount(ctx, req, resp, userID, ""); + } else if (action.equals("update_profile")) { + String password = req.getParameter("password"); + String cpassword = req.getParameter("cpassword"); + String fullName = req.getParameter("fullname"); + String address = req.getParameter("address"); + String creditcard = req.getParameter("creditcard"); + String email = req.getParameter("email"); + tsAction.doAccountUpdate(ctx, req, resp, userID, password == null ? "" : password.trim(), cpassword == null ? "" : cpassword.trim(), + fullName == null ? "" : fullName.trim(), address == null ? "" : address.trim(), creditcard == null ? "" : creditcard.trim(), + email == null ? "" : email.trim()); + } else if (action.equals("mksummary")) { + tsAction.doMarketSummary(ctx, req, resp, userID); + } else { + System.out.println("TradeAppServlet: Invalid Action=" + action); + tsAction.doWelcome(ctx, req, resp, "TradeAppServlet: Invalid Action" + action); + } + } + + private void pushHeaderImages(PushBuilder pushBuilder) { + if (pushBuilder != null) { + pushBuilder.path("images/menuHome.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/account.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/portfolio.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/quotes.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/logout.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/graph.gif").addHeader("content-type", "image/gif").push(); + pushBuilder.path("images/line.gif").addHeader("content-type", "image/gif").push(); + Log.trace("HTTP/2 is enabled"); + } else { + Log.error("HTTP/2 not enabled"); + } + + } + +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeConfigServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeConfigServlet.java new file mode 100644 index 00000000..4abbeca6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeConfigServlet.java @@ -0,0 +1,292 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; + +import javax.inject.Inject; +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +import com.ibm.websphere.samples.daytrader.beans.RunStatsDataBean; +import com.ibm.websphere.samples.daytrader.impl.direct.TradeDirectDBUtils; +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + + +/** + * TradeConfigServlet provides a servlet interface to adjust DayTrader runtime parameters. + * TradeConfigServlet updates values in the {@link com.ibm.websphere.samples.daytrader.web.TradeConfig} JavaBean holding + * all configuration and runtime parameters for the Trade application + * + */ +@WebServlet(name = "TradeConfigServlet", urlPatterns = { "/config" }) +@Trace +public class TradeConfigServlet extends HttpServlet { + + @Inject + private TradeDirectDBUtils dbUtils; + + private static final long serialVersionUID = -1910381529792500095L; + + /** + * Servlet initialization method. + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + } + + /** + * Create the TradeConfig bean and pass it the config.jsp page + * to display the current Trade runtime configuration + * Creation date: (2/8/2000 3:43:59 PM) + */ + void doConfigDisplay(HttpServletRequest req, HttpServletResponse resp, String results) throws Exception { + + TradeConfig currentConfig = new TradeConfig(); + + req.setAttribute("tradeConfig", currentConfig); + req.setAttribute("status", results); + getServletConfig().getServletContext().getRequestDispatcher(TradeConfig.getPage(TradeConfig.CONFIG_PAGE)).include(req, resp); + } + + void doResetTrade(HttpServletRequest req, HttpServletResponse resp, String results) throws Exception { + RunStatsDataBean runStatsData = new RunStatsDataBean(); + TradeConfig currentConfig = new TradeConfig(); + + try { + runStatsData = dbUtils.resetTrade(false); + + req.setAttribute("runStatsData", runStatsData); + req.setAttribute("tradeConfig", currentConfig); + results += "Trade Reset completed successfully"; + req.setAttribute("status", results); + + } catch (Exception e) { + results += "Trade Reset Error - see log for details"; + Log.error(e, results); + throw e; + } + getServletConfig().getServletContext().getRequestDispatcher(TradeConfig.getPage(TradeConfig.STATS_PAGE)).include(req, resp); + + } + + /** + * Update Trade runtime configuration paramaters + * Creation date: (2/8/2000 3:44:24 PM) + */ + void doConfigUpdate(HttpServletRequest req, HttpServletResponse resp) throws Exception { + String currentConfigStr = "\n\n########## Trade configuration update. Current config:\n\n"; + + currentConfigStr += "\t\tRuntimeMode:\t\t" + TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()] + "\n"; + + String orderProcessingModeStr = req.getParameter("OrderProcessingMode"); + if (orderProcessingModeStr != null) { + try { + int i = Integer.parseInt(orderProcessingModeStr); + if ((i >= 0) && (i < TradeConfig.getOrderProcessingModeNames().length)) //Input validation + TradeConfig.setOrderProcessingMode(i); + } catch (Exception e) { + //>>rjm + Log.error(e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set orderProcessing to " + orderProcessingModeStr, + "reverting to current value"); + + } // If the value is bad, simply revert to current + } + currentConfigStr += "\t\tOrderProcessingMode:\t\t" + TradeConfig.getOrderProcessingModeNames()[TradeConfig.getOrderProcessingMode()] + "\n"; + + String webInterfaceStr = req.getParameter("WebInterface"); + if (webInterfaceStr != null) { + try { + int i = Integer.parseInt(webInterfaceStr); + if ((i >= 0) && (i < TradeConfig.getWebInterfaceNames().length)) //Input validation + TradeConfig.setWebInterface(i); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "trying to set WebInterface to " + webInterfaceStr, + "reverting to current value"); + + } // If the value is bad, simply revert to current + } + currentConfigStr += "\t\tWeb Interface:\t\t\t" + TradeConfig.getWebInterfaceNames()[TradeConfig.getWebInterface()] + "\n"; + + String parm = req.getParameter("MaxUsers"); + if ((parm != null) && (parm.length() > 0)) { + try { + TradeConfig.setMAX_USERS(Integer.parseInt(parm)); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet.doConfigUpdate(..): minor exception caught", "Setting maxusers, probably error parsing string to int:" + parm, + "revertying to current value: " + TradeConfig.getMAX_USERS()); + + } //On error, revert to saved + } + parm = req.getParameter("MaxQuotes"); + if ((parm != null) && (parm.length() > 0)) { + try { + TradeConfig.setMAX_QUOTES(Integer.parseInt(parm)); + } catch (Exception e) { + //>>rjm + Log.error(e, "TradeConfigServlet: minor exception caught", "trying to set max_quotes, error on parsing int " + parm, + "reverting to current value " + TradeConfig.getMAX_QUOTES()); + //< 0)) { + try { + TradeConfig.setMarketSummaryInterval(Integer.parseInt(parm)); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet: minor exception caught", "trying to set marketSummaryInterval, error on parsing int " + parm, + "reverting to current value " + TradeConfig.getMarketSummaryInterval()); + + } + } + currentConfigStr += "\t\tMarket Summary Interval:\t" + TradeConfig.getMarketSummaryInterval() + "\n"; + + parm = req.getParameter("primIterations"); + if ((parm != null) && (parm.length() > 0)) { + try { + TradeConfig.setPrimIterations(Integer.parseInt(parm)); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet: minor exception caught", "trying to set primIterations, error on parsing int " + parm, + "reverting to current value " + TradeConfig.getPrimIterations()); + + } + } + currentConfigStr += "\t\tPrimitive Iterations:\t\t" + TradeConfig.getPrimIterations() + "\n"; + + String enablePublishQuotePriceChange = req.getParameter("EnablePublishQuotePriceChange"); + + if (enablePublishQuotePriceChange != null) + TradeConfig.setPublishQuotePriceChange(true); + else + TradeConfig.setPublishQuotePriceChange(false); + currentConfigStr += "\t\tTradeStreamer MDB Enabled:\t" + TradeConfig.getPublishQuotePriceChange() + "\n"; + + parm = req.getParameter("ListQuotePriceChangeFrequency"); + if ((parm != null) && (parm.length() > 0)) { + try { + TradeConfig.setListQuotePriceChangeFrequency(Integer.parseInt(parm)); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet: minor exception caught", "trying to set percentSentToWebSocket, error on parsing int " + parm, + "reverting to current value " + TradeConfig.getListQuotePriceChangeFrequency()); + + } + } + currentConfigStr += "\t\t% of trades on Websocket:\t" + TradeConfig.getListQuotePriceChangeFrequency() + "\n"; + + String enableLongRun = req.getParameter("EnableLongRun"); + + if (enableLongRun != null) + TradeConfig.setLongRun(true); + else + TradeConfig.setLongRun(false); + currentConfigStr += "\t\tLong Run Enabled:\t\t" + TradeConfig.getLongRun() + "\n"; + + String displayOrderAlerts = req.getParameter("DisplayOrderAlerts"); + + if (displayOrderAlerts != null) + TradeConfig.setDisplayOrderAlerts(true); + else + TradeConfig.setDisplayOrderAlerts(false); + currentConfigStr += "\t\tDisplay Order Alerts:\t\t" + TradeConfig.getDisplayOrderAlerts() + "\n"; + + System.out.println(currentConfigStr); + } + + @Override + public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + String action = null; + String result = ""; + + resp.setContentType("text/html"); + try { + action = req.getParameter("action"); + if (action == null) { + doConfigDisplay(req, resp, result + "
    Current DayTrader Configuration:
    "); + return; + } else if (action.equals("updateConfig")) { + doConfigUpdate(req, resp); + result = "
    DayTrader Configuration Updated
    "; + } else if (action.equals("resetTrade")) { + doResetTrade(req, resp, ""); + return; + } else if (action.equals("buildDB")) { + resp.setContentType("text/html"); + dbUtils.buildDB(resp.getWriter(), null); + result = "DayTrader Database Built - " + TradeConfig.getMAX_USERS() + "users created"; + } else if (action.equals("buildDBTables")) { + + resp.setContentType("text/html"); + + String dbProductName = null; + try { + dbProductName = dbUtils.checkDBProductName(); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to check DB Product name"); + } + if (dbProductName == null) { + resp.getWriter().println( + "
    TradeBuildDB: **** Unable to check DB Product name, please check Database/AppServer configuration and retry ****
    "); + return; + } + + String ddlFile = null; + //Locate DDL file for the specified database + try { + resp.getWriter().println("
    TradeBuildDB: **** Database Product detected: " + dbProductName + " ****
    "); + if (dbProductName.startsWith("DB2/")) {// if db is DB2 + ddlFile = "/dbscripts/db2/Table.ddl"; + } else if (dbProductName.startsWith("Apache Derby")) { //if db is Derby + ddlFile = "/dbscripts/derby/Table.ddl"; + } else if (dbProductName.startsWith("Oracle")) { // if the Db is Oracle + ddlFile = "/dbscripts/oracle/Table.ddl"; + } else {// Unsupported "Other" Database + ddlFile = "/dbscripts/other/Table.ddl"; + resp.getWriter().println("
    TradeBuildDB: **** This Database is unsupported/untested use at your own risk ****
    "); + } + + resp.getWriter().println("
    TradeBuildDB: **** The DDL file at path " + ddlFile + " will be used ****
    "); + resp.getWriter().flush(); + } catch (Exception e) { + Log.error(e, "TradeBuildDB: Unable to locate DDL file for the specified database"); + resp.getWriter().println("
    TradeBuildDB: **** Unable to locate DDL file for the specified database ****
    "); + return; + } + + dbUtils.buildDB(resp.getWriter(), getServletContext().getResourceAsStream(ddlFile)); + + } + doConfigDisplay(req, resp, result + "Current DayTrader Configuration:"); + } catch (Exception e) { + Log.error(e, "TradeConfigServlet.service(...)", "Exception trying to perform action=" + action); + + resp.sendError(500, "TradeConfigServlet.service(...)" + "Exception trying to perform action=" + action + "\nException details: " + e.toString()); + + } + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeScenarioServlet.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeScenarioServlet.java new file mode 100644 index 00000000..5c05399b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeScenarioServlet.java @@ -0,0 +1,297 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Iterator; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +/** + * TradeScenarioServlet emulates a population of web users by generating a + * specific Trade operation for a randomly chosen user on each access to the + * URL. Test this servlet by clicking Trade Scenario and hit "Reload" on your + * browser to step through a Trade Scenario. To benchmark using this URL aim + * your favorite web load generator (such as AKStress) at the Trade Scenario URL + * and fire away. + */ +@WebServlet(name = "TradeScenarioServlet", urlPatterns = { "/scenario" }) +public class TradeScenarioServlet extends HttpServlet { + + private static final long serialVersionUID = 1410005249314201829L; + + /** + * Servlet initialization method. + */ + @Override + public void init(ServletConfig config) throws ServletException { + super.init(config); + java.util.Enumeration en = config.getInitParameterNames(); + while (en.hasMoreElements()) { + String parm = en.nextElement(); + String value = config.getInitParameter(parm); + TradeConfig.setConfigParam(parm, value); + } + } + + /** + * Returns a string that contains information about TradeScenarioServlet + * + * @return The servlet information + */ + @Override + public java.lang.String getServletInfo() { + return "TradeScenarioServlet emulates a population of web users"; + } + + /** + * Process incoming HTTP GET requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Process incoming HTTP POST requests + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + @Override + public void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws ServletException, IOException { + performTask(request, response); + } + + /** + * Main service method for TradeScenarioServlet + * + * @param request + * Object that encapsulates the request to the servlet + * @param response + * Object that encapsulates the response from the servlet + */ + public void performTask(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + // Scenario generator for Trade2 + char action = ' '; + String userID = null; + + // String to create full dispatch path to TradeAppServlet w/ request + // Parameters + String dispPath = null; // Dispatch Path to TradeAppServlet + + resp.setContentType("text/html"); + + String scenarioAction = req.getParameter("action"); + if ((scenarioAction != null) && (scenarioAction.length() >= 1)) { + action = scenarioAction.charAt(0); + if (action == 'n') { // null; + try { + // resp.setContentType("text/html"); + PrintWriter out = new PrintWriter(resp.getOutputStream()); + out.println("TradeScenarioServletHello"); + out.close(); + return; + + } catch (Exception e) { + Log.error("trade_client.TradeScenarioServlet.service(...)" + "error creating printwriter from responce.getOutputStream", e); + + resp.sendError(500, + "trade_client.TradeScenarioServlet.service(...): erorr creating and writing to PrintStream created from response.getOutputStream()"); + } // end of catch + + } // end of action=='n' + } + + ServletContext ctx = null; + HttpSession session = null; + try { + ctx = getServletConfig().getServletContext(); + // These operations require the user to be logged in. Verify the + // user and if not logged in + // change the operation to a login + session = req.getSession(true); + userID = (String) session.getAttribute("uidBean"); + } catch (Exception e) { + Log.error("trade_client.TradeScenarioServlet.service(...): performing " + scenarioAction + + "error getting ServletContext,HttpSession, or UserID from session" + "will make scenarioAction a login and try to recover from there", e); + userID = null; + action = 'l'; + } + + if (userID == null) { + action = 'l'; // change to login + TradeConfig.incrementScenarioCount(); + } else if (action == ' ') { + // action is not specified perform a random operation according to + // current mix + // Tell getScenarioAction if we are an original user or a registered + // user + // -- sellDeficits should only be compensated for with original + // users. + action = TradeConfig.getScenarioAction(userID.startsWith(TradeConfig.newUserPrefix)); + } + switch (action) { + + case 'q': // quote + dispPath = tasPathPrefix + "quotes&symbols=" + TradeConfig.rndSymbols(); + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'a': // account + dispPath = tasPathPrefix + "account"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'u': // update account profile + dispPath = tasPathPrefix + "account"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + + String fullName = "rnd" + System.currentTimeMillis(); + String address = "rndAddress"; + String password = "xxx"; + String email = "rndEmail"; + String creditcard = "rndCC"; + dispPath = tasPathPrefix + "update_profile&fullname=" + fullName + "&password=" + password + "&cpassword=" + password + "&address=" + address + + "&email=" + email + "&creditcard=" + creditcard; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'h': // home + dispPath = tasPathPrefix + "home"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'l': // login + userID = TradeConfig.getUserID(); + String password2 = "xxx"; + dispPath = tasPathPrefix + "login&inScenario=true&uid=" + userID + "&passwd=" + password2; + ctx.getRequestDispatcher(dispPath).include(req, resp); + + // login is successful if the userID is written to the HTTP session + if (session.getAttribute("uidBean") == null) { + System.out.println("TradeScenario login failed. Reset DB between runs"); + } + break; + case 'o': // logout + dispPath = tasPathPrefix + "logout"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'p': // portfolio + dispPath = tasPathPrefix + "portfolio"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 'r': // register + // Logout the current user to become a new user + // see note in TradeServletAction + req.setAttribute("TSS-RecreateSessionInLogout", Boolean.TRUE); + dispPath = tasPathPrefix + "logout"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + + userID = TradeConfig.rndNewUserID(); + String passwd = "yyy"; + fullName = TradeConfig.rndFullName(); + creditcard = TradeConfig.rndCreditCard(); + String money = TradeConfig.rndBalance(); + email = TradeConfig.rndEmail(userID); + String smail = TradeConfig.rndAddress(); + dispPath = tasPathPrefix + "register&Full Name=" + fullName + "&snail mail=" + smail + "&email=" + email + "&user id=" + userID + "&passwd=" + + passwd + "&confirm passwd=" + passwd + "&money=" + money + "&Credit Card Number=" + creditcard; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + case 's': // sell + dispPath = tasPathPrefix + "portfolioNoEdge"; + ctx.getRequestDispatcher(dispPath).include(req, resp); + + Collection holdings = (Collection) req.getAttribute("holdingDataBeans"); + int numHoldings = holdings.size(); + if (numHoldings > 0) { + // sell first available security out of holding + + Iterator it = holdings.iterator(); + boolean foundHoldingToSell = false; + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + if (!(holdingData.getPurchaseDate().equals(new java.util.Date(0)))) { + Integer holdingID = holdingData.getHoldingID(); + + dispPath = tasPathPrefix + "sell&holdingID=" + holdingID; + ctx.getRequestDispatcher(dispPath).include(req, resp); + foundHoldingToSell = true; + break; + } + } + if (foundHoldingToSell) { + break; + } + + Log.trace("TradeScenario: No holding to sell -switch to buy -- userID = " + userID + " Collection count = " + numHoldings); + + + } + // At this point: A TradeScenario Sell was requested with No Stocks + // in Portfolio + // This can happen when a new registered user happens to request a + // sell before a buy + // In this case, fall through and perform a buy instead + + /* + * Trade 2.037: Added sell_deficit counter to maintain correct + * buy/sell mix. When a users portfolio is reduced to 0 holdings, a + * buy is requested instead of a sell. This throws off the buy/sell + * mix by 1. This results in unwanted holding table growth To fix + * this we increment a sell deficit counter to maintain the correct + * ratio in getScenarioAction The 'z' action from getScenario + * denotes that this is a sell action that was switched from a buy + * to reduce a sellDeficit + */ + if (userID.startsWith(TradeConfig.newUserPrefix) == false) { + TradeConfig.incrementSellDeficit(); + } + case 'b': // buy + String symbol = TradeConfig.rndSymbol(); + String amount = TradeConfig.rndQuantity() + ""; + + dispPath = tasPathPrefix + "quotes&symbols=" + symbol; + ctx.getRequestDispatcher(dispPath).include(req, resp); + + dispPath = tasPathPrefix + "buy&quantity=" + amount + "&symbol=" + symbol; + ctx.getRequestDispatcher(dispPath).include(req, resp); + break; + } // end of switch statement + } + + // URL Path Prefix for dispatching to TradeAppServlet + private static final String tasPathPrefix = "/app?action="; + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeServletAction.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeServletAction.java new file mode 100644 index 00000000..9ffb4fc3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeServletAction.java @@ -0,0 +1,654 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import java.io.IOException; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +import javax.enterprise.context.SessionScoped; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import com.ibm.websphere.samples.daytrader.interfaces.Trace; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.entities.AccountDataBean; +import com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean; +import com.ibm.websphere.samples.daytrader.entities.HoldingDataBean; +import com.ibm.websphere.samples.daytrader.entities.OrderDataBean; +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + + +/** + * TradeServletAction provides servlet specific client side access to each of + * the Trade brokerage user operations. These include login, logout, buy, sell, + * getQuote, etc. TradeServletAction manages a web interface to Trade handling + * HttpRequests/HttpResponse objects and forwarding results to the appropriate + * JSP page for the web interface. TradeServletAction invokes + * {@link TradeAction} methods to actually perform each trading operation. + * + */ +@SessionScoped +@Trace +public class TradeServletAction implements Serializable { + + private static final long serialVersionUID = 7732313125198761455L; + + private TradeServices tAction; + + @Inject + public TradeServletAction(@Any Instance services) { + tAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + public TradeServletAction() { + } + + /** + * Display User Profile information such as address, email, etc. for the + * given Trader Dispatch to the Trade Account JSP for display + * + * @param userID + * The User to display profile info + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @param results + * A short description of the results/success of this web request + * provided on the web page + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doAccount(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String results) throws javax.servlet.ServletException, + java.io.IOException { + try { + + AccountDataBean accountData = tAction.getAccountData(userID); + AccountProfileDataBean accountProfileData = tAction.getAccountProfileData(userID); + Collection orderDataBeans = (TradeConfig.getLongRun() ? new ArrayList() : (Collection) tAction.getOrders(userID)); + + req.setAttribute("accountData", accountData); + req.setAttribute("accountProfileData", accountProfileData); + req.setAttribute("orderDataBeans", orderDataBeans); + req.setAttribute("results", results); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ACCOUNT_PAGE)); + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "could not find account for userID = " + userID); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE)); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error("TradeServletAction.doAccount(...)", "illegal argument, information should be in exception string", e); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doAccount(...)" + " exception user =" + userID, e); + } + + } + + /** + * Update User Profile information such as address, email, etc. for the + * given Trader Dispatch to the Trade Account JSP for display If any in put + * is incorrect revert back to the account page w/ an appropriate message + * + * @param userID + * The User to upddate profile info + * @param password + * The new User password + * @param cpassword + * Confirm password + * @param fullname + * The new User fullname info + * @param address + * The new User address info + * @param cc + * The new User credit card info + * @param email + * The new User email info + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doAccountUpdate(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String password, String cpassword, + String fullName, String address, String creditcard, String email) throws javax.servlet.ServletException, java.io.IOException { + String results = ""; + + // First verify input data + boolean doUpdate = true; + if (password.equals(cpassword) == false) { + results = "Update profile error: passwords do not match"; + doUpdate = false; + } else if (password.length() <= 0 || fullName.length() <= 0 || address.length() <= 0 || creditcard.length() <= 0 || email.length() <= 0) { + results = "Update profile error: please fill in all profile information fields"; + doUpdate = false; + } + AccountProfileDataBean accountProfileData = new AccountProfileDataBean(userID, password, fullName, address, email, creditcard); + try { + if (doUpdate) { + accountProfileData = tAction.updateAccountProfile(accountProfileData); + results = "Account profile update successful"; + } + + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "invalid argument, check userID is correct, and the database is populated" + userID); + Log.error(e, "TradeServletAction.doAccount(...)", "illegal argument, information should be in exception string", + "treating this as a user error and forwarding on to a new page"); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doAccountUpdate(...)" + " exception user =" + userID, e); + } + doAccount(ctx, req, resp, userID, results); + } + + /** + * Buy a new holding of shares for the given trader Dispatch to the Trade + * Portfolio JSP for display + * + * @param userID + * The User buying shares + * @param symbol + * The stock to purchase + * @param amount + * The quantity of shares to purchase + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doBuy(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String symbol, String quantity) throws ServletException, + IOException { + + String results = ""; + + try { + + OrderDataBean orderData = tAction.buy(userID, symbol, new Double(quantity).doubleValue(), TradeConfig.getOrderProcessingMode()); + + req.setAttribute("orderData", orderData); + req.setAttribute("results", results); + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "illegal argument:"); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE)); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error(e, "TradeServletAction.doBuy(...)", "illegal argument. userID = " + userID, "symbol = " + symbol); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.buy(...)" + " exception buying stock " + symbol + " for user " + userID, e); + } + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ORDER_PAGE)); + } + + /** + * Create the Trade Home page with personalized information such as the + * traders account balance Dispatch to the Trade Home JSP for display + * + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @param results + * A short description of the results/success of this web request + * provided on the web page + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doHome(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String results) throws javax.servlet.ServletException, + java.io.IOException { + + try { + AccountDataBean accountData = tAction.getAccountData(userID); + Collection holdingDataBeans = tAction.getHoldings(userID); + + // Edge Caching: + // Getting the MarketSummary has been moved to the JSP + // MarketSummary.jsp. This makes the MarketSummary a + // standalone "fragment", and thus is a candidate for + // Edge caching. + // marketSummaryData = tAction.getMarketSummary(); + + req.setAttribute("accountData", accountData); + req.setAttribute("holdingDataBeans", holdingDataBeans); + // See Edge Caching above + // req.setAttribute("marketSummaryData", marketSummaryData); + req.setAttribute("results", results); + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "check userID = " + userID + " and that the database is populated"); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE)); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error("TradeServletAction.doHome(...)" + "illegal argument, information should be in exception string" + + "treating this as a user error and forwarding on to a new page", e); + } catch (javax.ejb.FinderException e) { + // this is a user error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "\nCould not find account for + " + userID); + // requestDispatch(ctx, req, resp, + // TradeConfig.getPage(TradeConfig.HOME_PAGE)); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error("TradeServletAction.doHome(...)" + "Error finding account for user " + userID + + "treating this as a user error and forwarding on to a new page", e); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doHome(...)" + " exception user =" + userID, e); + } + + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.HOME_PAGE)); + } + + /** + * Login a Trade User. Dispatch to the Trade Home JSP for display + * + * @param userID + * The User to login + * @param passwd + * The password supplied by the trader used to authenticate + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @param results + * A short description of the results/success of this web request + * provided on the web page + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doLogin(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String passwd) throws javax.servlet.ServletException, + java.io.IOException { + + String results = ""; + try { + // Got a valid userID and passwd, attempt login + if (tAction==null) { + System.out.println("null"); } + AccountDataBean accountData = tAction.login(userID, passwd); + + if (accountData != null) { + HttpSession session = req.getSession(true); + session.setAttribute("uidBean", userID); + session.setAttribute("sessionCreationDate", new java.util.Date()); + + results = "Ready to Trade"; + doHome(ctx, req, resp, userID, results); + return; + } else { + req.setAttribute("results", results + "\nCould not find account for + " + userID); + // log the exception with an error level of 3 which means, + // handled exception but would invalidate a automation run + Log.log("TradeServletAction.doLogin(...)", "Error finding account for user " + userID + "", + "user entered a bad username or the database is not populated"); + } + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "illegal argument:" + e.getMessage()); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error(e, "TradeServletAction.doLogin(...)", "illegal argument, information should be in exception string", + "treating this as a user error and forwarding on to a new page"); + + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doLogin(...)" + "Exception logging in user " + userID + "with password" + passwd, e); + } + + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.WELCOME_PAGE)); + + } + + /** + * Logout a Trade User Dispatch to the Trade Welcome JSP for display + * + * @param userID + * The User to logout + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @param results + * A short description of the results/success of this web request + * provided on the web page + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doLogout(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID) throws ServletException, IOException { + String results = ""; + + try { + tAction.logout(userID); + + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page, at the end of the page. + req.setAttribute("results", results + "illegal argument:" + e.getMessage()); + + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error(e, "TradeServletAction.doLogout(...)", "illegal argument, information should be in exception string", + "treating this as a user error and forwarding on to a new page"); + } catch (Exception e) { + // log the exception and foward to a error page + Log.error(e, "TradeServletAction.doLogout(...):", "Error logging out" + userID, "fowarding to an error page"); + // set the status_code to 500 + throw new ServletException("TradeServletAction.doLogout(...)" + "exception logging out user " + userID, e); + } + HttpSession session = req.getSession(); + if (session != null) { + session.invalidate(); + } + + // Added to actually remove a user from the authentication cache + req.logout(); + + Object o = req.getAttribute("TSS-RecreateSessionInLogout"); + if (o != null && ((Boolean) o).equals(Boolean.TRUE)) { + // Recreate Session object before writing output to the response + // Once the response headers are written back to the client the + // opportunity + // to create a new session in this request may be lost + // This is to handle only the TradeScenarioServlet case + session = req.getSession(true); + } + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.WELCOME_PAGE)); + } + + /** + * Retrieve the current portfolio of stock holdings for the given trader + * Dispatch to the Trade Portfolio JSP for display + * + * @param userID + * The User requesting to view their portfolio + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @param results + * A short description of the results/success of this web request + * provided on the web page + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doPortfolio(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String results) throws ServletException, IOException { + + try { + // Get the holdiings for this user + + Collection quoteDataBeans = new ArrayList(); + Collection holdingDataBeans = tAction.getHoldings(userID); + + // Walk through the collection of user + // holdings and creating a list of quotes + if (holdingDataBeans.size() > 0) { + + Iterator it = holdingDataBeans.iterator(); + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + QuoteDataBean quoteData = tAction.getQuote(holdingData.getQuoteID()); + quoteDataBeans.add(quoteData); + } + } else { + results = results + ". Your portfolio is empty."; + } + req.setAttribute("results", results); + req.setAttribute("holdingDataBeans", holdingDataBeans); + req.setAttribute("quoteDataBeans", quoteDataBeans); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.PORTFOLIO_PAGE)); + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // forward them to another page rather than throw a 500 + req.setAttribute("results", results + "illegal argument:" + e.getMessage()); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.PORTFOLIO_PAGE)); + // log the exception with an error level of 3 which means, handled + // exception but would invalidate a automation run + Log.error(e, "TradeServletAction.doPortfolio(...)", "illegal argument, information should be in exception string", "user error"); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doPortfolio(...)" + " exception user =" + userID, e); + } + } + + /** + * Retrieve the current Quote for the given stock symbol Dispatch to the + * Trade Quote JSP for display + * + * @param userID + * The stock symbol used to get the current quote + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doQuotes(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String symbols) throws ServletException, IOException { + + try { + Collection quoteDataBeans = new ArrayList(); + String[] symbolsSplit = symbols.split(","); + for (String symbol: symbolsSplit) { + QuoteDataBean quoteData = tAction.getQuote(symbol.trim()); + quoteDataBeans.add(quoteData); + } + req.setAttribute("quoteDataBeans", quoteDataBeans); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.QUOTE_PAGE)); + + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doQuotes(...)" + " exception user =" + userID, e); + } + } + + /** + * Register a new trader given the provided user Profile information such as + * address, email, etc. Dispatch to the Trade Home JSP for display + * + * @param userID + * The User to create + * @param passwd + * The User password + * @param fullname + * The new User fullname info + * @param ccn + * The new User credit card info + * @param money + * The new User opening account balance + * @param address + * The new User address info + * @param email + * The new User email info + * @return The userID of the new trader + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doRegister(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String passwd, String cpasswd, String fullname, + String ccn, String openBalanceString, String email, String address) throws ServletException, IOException { + String results = ""; + + try { + // Validate user passwords match and are atleast 1 char in length + if ((passwd.equals(cpasswd)) && (passwd.length() >= 1)) { + + AccountDataBean accountData = tAction.register(userID, passwd, fullname, address, email, ccn, new BigDecimal(openBalanceString)); + if (accountData == null) { + results = "Registration operation failed;"; + System.out.println(results); + req.setAttribute("results", results); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.REGISTER_PAGE)); + } else { + doLogin(ctx, req, resp, userID, passwd); + results = "Registration operation succeeded; Account " + accountData.getAccountID() + " has been created."; + req.setAttribute("results", results); + + } + } else { + // Password validation failed + results = "Registration operation failed, your passwords did not match"; + System.out.println(results); + req.setAttribute("results", results); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.REGISTER_PAGE)); + } + + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doRegister(...)" + " exception user =" + userID, e); + } + } + + /** + * Sell a current holding of stock shares for the given trader. Dispatch to + * the Trade Portfolio JSP for display + * + * @param userID + * The User buying shares + * @param symbol + * The stock to sell + * @param indx + * The unique index identifying the users holding to sell + * @param ctx + * the servlet context + * @param req + * the HttpRequest object + * @param resp + * the HttpResponse object + * @exception javax.servlet.ServletException + * If a servlet specific exception is encountered + * @exception javax.io.IOException + * If an exception occurs while writing results back to the + * user + * + */ + void doSell(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, Integer holdingID) throws ServletException, IOException { + String results = ""; + try { + OrderDataBean orderData = tAction.sell(userID, holdingID, TradeConfig.getOrderProcessingMode()); + + req.setAttribute("orderData", orderData); + req.setAttribute("results", results); + } catch (java.lang.IllegalArgumentException e) { // this is a user + // error so I will + // just log the exception and then later on I will redisplay the + // portfolio page + // because this is just a user exception + Log.error(e, "TradeServletAction.doSell(...)", "illegal argument, information should be in exception string", "user error"); + } catch (Exception e) { + // log the exception with error page + throw new ServletException("TradeServletAction.doSell(...)" + " exception selling holding " + holdingID + " for user =" + userID, e); + } + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.ORDER_PAGE)); + } + + void doWelcome(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String status) throws ServletException, IOException { + + req.setAttribute("results", status); + requestDispatch(ctx, req, resp, null, TradeConfig.getPage(TradeConfig.WELCOME_PAGE)); + } + + private void requestDispatch(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID, String page) throws ServletException, + IOException { + + ctx.getRequestDispatcher(page).include(req, resp); + } + + void doMarketSummary(ServletContext ctx, HttpServletRequest req, HttpServletResponse resp, String userID) throws ServletException, IOException { + req.setAttribute("results", "test"); + requestDispatch(ctx, req, resp, userID, TradeConfig.getPage(TradeConfig.MARKET_SUMMARY_PAGE)); + + } +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeWebContextListener.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeWebContextListener.java new file mode 100644 index 00000000..8931f576 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/servlet/TradeWebContextListener.java @@ -0,0 +1,116 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.servlet; + +import static javax.faces.annotation.FacesConfig.Version.JSF_2_3; + +import java.io.InputStream; +import java.util.Properties; + +import javax.faces.annotation.FacesConfig; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +@WebListener() +@FacesConfig(version = JSF_2_3) +public class TradeWebContextListener implements ServletContextListener { + + + + // receieve trade web app startup/shutown events to start(initialized)/stop + // TradeDirect + @Override + public void contextInitialized(ServletContextEvent event) { + Log.trace("TradeWebContextListener contextInitialized -- initializing TradeDirect"); + + // Load settings from properties file (if it exists) + Properties prop = new Properties(); + InputStream stream = event.getServletContext().getResourceAsStream("/properties/daytrader.properties"); + + try { + prop.load(stream); + System.out.println("Settings from daytrader.properties: " + prop); + + if (System.getenv("RUNTIME_MODE") != null) { + TradeConfig.setRunTimeMode(Integer.parseInt(System.getenv("RUNTIME_MODE"))); + } else { + TradeConfig.setRunTimeMode(Integer.parseInt(prop.getProperty("runtimeMode"))); + } + System.out.print("Running in " + TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()] + " Mode"); + + if (System.getenv("ORDER_PROCESSING_MODE") != null) { + TradeConfig.setOrderProcessingMode(Integer.parseInt(System.getenv("ORDER_PROCESSING_MODE"))); + } else { + TradeConfig.setOrderProcessingMode(Integer.parseInt(prop.getProperty("orderProcessingMode"))); + } + System.out.print("Running in " + TradeConfig.getOrderProcessingModeNames()[TradeConfig.getOrderProcessingMode()] + " Order Processing Mode"); + + if (System.getenv("MAX_USERS") != null) { + TradeConfig.setMAX_USERS(Integer.parseInt(System.getenv("MAX_USERS"))); + } else { + TradeConfig.setMAX_USERS(Integer.parseInt(prop.getProperty("maxUsers"))); + } + System.out.print("MAX_USERS = " + TradeConfig.getMAX_USERS() + " users"); + + if (System.getenv("MAX_QUOTES") != null) { + TradeConfig.setMAX_QUOTES(Integer.parseInt(System.getenv("MAX_QUOTES"))); + } else { + TradeConfig.setMAX_QUOTES(Integer.parseInt(prop.getProperty("maxQuotes"))); + } + System.out.print("MAX_QUOTES = " + TradeConfig.getMAX_QUOTES() + " quotes"); + + if (System.getenv("PUBLISH_QUOTES") != null) { + TradeConfig.setPublishQuotePriceChange(Boolean.parseBoolean(System.getenv("PUBLISH_QUOTES"))); + } else { + TradeConfig.setPublishQuotePriceChange(Boolean.parseBoolean(prop.getProperty("publishQuotePriceChange"))); + } + + if (System.getenv("DISPLAY_ORDER_ALERTS") != null) { + TradeConfig.setDisplayOrderAlerts(Boolean.parseBoolean(System.getenv("DISPLAY_ORDER_ALERTS"))); + } else { + TradeConfig.setDisplayOrderAlerts(Boolean.parseBoolean(prop.getProperty("displayOrderAlerts"))); + } + if (System.getenv("WEB_INTERFACE") != null) { + TradeConfig.setWebInterface(Integer.parseInt(System.getenv("WEB_INTERFACE"))); + } else { + TradeConfig.setWebInterface(Integer.parseInt(prop.getProperty("webInterface"))); + } + if (System.getenv("LIST_QUOTE_PRICE_CHANGE_FREQUENCY") != null) { + TradeConfig.setListQuotePriceChangeFrequency(Integer.parseInt(System.getenv("LIST_QUOTE_PRICE_CHANGE_FREQUENCY"))); + } else { + TradeConfig.setListQuotePriceChangeFrequency(Integer.parseInt(prop.getProperty("listQuotePriceChangeFrequency"))); + } + + TradeConfig.setPrimIterations(Integer.parseInt(prop.getProperty("primIterations"))); + TradeConfig.setMarketSummaryInterval(Integer.parseInt(prop.getProperty("marketSummaryInterval"))); + TradeConfig.setLongRun(Boolean.parseBoolean(prop.getProperty("longRun"))); + + } catch (Exception e) { + System.out.println("daytrader.properties not found"); + } + + } + + @Override + public void contextDestroyed(ServletContextEvent event) { + Log.trace("TradeWebContextListener contextDestroy calling TradeDirect:destroy()"); + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionDecoder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionDecoder.java new file mode 100644 index 00000000..51001d5d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionDecoder.java @@ -0,0 +1,57 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import javax.websocket.DecodeException; +import javax.websocket.Decoder; +import javax.websocket.EndpointConfig; + +import com.ibm.websphere.samples.daytrader.util.Log; + +// This is coded to be a Text type decoder expecting JSON format. +// It will decode incoming messages into object of type String +public class ActionDecoder implements Decoder.Text { + + public ActionDecoder() { + } + + @Override + public void destroy() { + } + + @Override + public void init(EndpointConfig config) { + } + + @Override + public ActionMessage decode(String jsonText) throws DecodeException { + + + Log.trace("ActionDecoder:decode -- received -->" + jsonText + "<--"); + + + ActionMessage actionMessage = new ActionMessage(); + actionMessage.doDecoding(jsonText); + return actionMessage; + + } + + @Override + public boolean willDecode(String s) { + return true; + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionMessage.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionMessage.java new file mode 100644 index 00000000..5abfb997 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/ActionMessage.java @@ -0,0 +1,85 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import java.io.StringReader; + +import javax.json.Json; +import javax.json.stream.JsonParser; + +import com.ibm.websphere.samples.daytrader.util.Log; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class ActionMessage { + + String decodedAction = null; + + public ActionMessage() { + } + + public void doDecoding(String jsonText) { + + String keyName = null; + try + { + // JSON parse + JsonParser parser = Json.createParser(new StringReader(jsonText)); + while (parser.hasNext()) { + JsonParser.Event event = parser.next(); + switch(event) { + case KEY_NAME: + keyName=parser.getString(); + break; + case VALUE_STRING: + if (keyName != null && keyName.equals("action")) { + decodedAction=parser.getString(); + } + break; + default: + break; + } + } + } catch (Exception e) { + Log.error("ActionMessage:doDecoding(" + jsonText + ") --> failed", e); + } + + + Log.trace("ActionMessage:doDecoding -- decoded action -->" + decodedAction + "<--"); + + } + + +public String getDecodedAction() { + return decodedAction; +} + +} + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonDecoder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonDecoder.java new file mode 100644 index 00000000..0a9b0827 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonDecoder.java @@ -0,0 +1,57 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import java.io.StringReader; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.websocket.DecodeException; +import javax.websocket.Decoder; +import javax.websocket.EndpointConfig; + +public class JsonDecoder implements Decoder.Text { + + @Override + public void destroy() { + } + + @Override + public void init(EndpointConfig ec) { + } + + @Override + public JsonMessage decode(String json) throws DecodeException { + JsonObject jsonObject = Json.createReader(new StringReader(json)).readObject(); + + JsonMessage message = new JsonMessage(); + message.setKey(jsonObject.getString("key")); + message.setValue(jsonObject.getString("value")); + + return message; + } + + @Override + public boolean willDecode(String json) { + try { + Json.createReader(new StringReader(json)).readObject(); + return true; + } catch (Exception e) { + return false; + } + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonEncoder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonEncoder.java new file mode 100644 index 00000000..d9629561 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonEncoder.java @@ -0,0 +1,46 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.websocket.EncodeException; +import javax.websocket.Encoder; +import javax.websocket.EndpointConfig; + +public class JsonEncoder implements Encoder.Text{ + + @Override + public void destroy() { + } + + @Override + public void init(EndpointConfig ec) { + } + + @Override + public String encode(JsonMessage message) throws EncodeException { + + JsonObject jsonObject = Json.createObjectBuilder() + .add("key", message.getKey()) + .add("value", message.getValue()).build(); + + return jsonObject.toString(); + } + + + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonMessage.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonMessage.java new file mode 100644 index 00000000..1483b960 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/JsonMessage.java @@ -0,0 +1,40 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +public class JsonMessage { + + private String key; + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/MarketSummaryWebSocket.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/MarketSummaryWebSocket.java new file mode 100644 index 00000000..ba879abd --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/MarketSummaryWebSocket.java @@ -0,0 +1,161 @@ +/** + * (C) Copyright IBM Corporation 2015, 2021. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CountDownLatch; + +import javax.annotation.Priority; +import javax.enterprise.event.ObservesAsync; +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.interceptor.Interceptor; +import javax.inject.Inject; +import javax.json.JsonObject; +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.ServerEndpoint; + + + +import com.ibm.websphere.samples.daytrader.interfaces.MarketSummaryUpdate; +import com.ibm.websphere.samples.daytrader.interfaces.QuotePriceChange; +import com.ibm.websphere.samples.daytrader.interfaces.TradeServices; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.RecentQuotePriceChangeList; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; +import com.ibm.websphere.samples.daytrader.util.TradeRunTimeModeLiteral; + + +/** This class is a WebSocket EndPoint that sends the Market Summary in JSON form and + * encodes recent quote price changes when requested or when triggered by CDI events. + **/ + +@ServerEndpoint(value = "/marketsummary",encoders={QuotePriceChangeListEncoder.class},decoders={ActionDecoder.class}) +public class MarketSummaryWebSocket { + + @Inject + RecentQuotePriceChangeList recentQuotePriceChangeList; + + private TradeServices tradeAction; + + private static final List sessions = new CopyOnWriteArrayList<>(); + private final CountDownLatch latch = new CountDownLatch(1); + + @Inject + public MarketSummaryWebSocket(@Any Instance services) { + tradeAction = services.select(new TradeRunTimeModeLiteral(TradeConfig.getRunTimeModeNames()[TradeConfig.getRunTimeMode()])).get(); + } + + // should never be used + public MarketSummaryWebSocket(){ + } + + @OnOpen + public void onOpen(final Session session, EndpointConfig ec) { + Log.trace("MarketSummaryWebSocket:onOpen -- session -->" + session + "<--"); + + sessions.add(session); + latch.countDown(); + } + + @OnMessage + public void sendMarketSummary(ActionMessage message, Session currentSession) { + + String action = message.getDecodedAction(); + + Log.trace("MarketSummaryWebSocket:sendMarketSummary -- received -->" + action + "<--"); + + // Make sure onopen is finished + try { + latch.await(); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + + if (action != null && action.equals("updateMarketSummary")) { + + try { + + JsonObject mkSummary = tradeAction.getMarketSummary().toJSON(); + + Log.trace("MarketSummaryWebSocket:sendMarketSummary -- sending -->" + mkSummary + "<--"); + + currentSession.getAsyncRemote().sendText(mkSummary.toString()); + + } catch (Exception e) { + e.printStackTrace(); + } + } else if (action != null && action.equals("updateRecentQuotePriceChange")) { + if (!recentQuotePriceChangeList.isEmpty()) { + currentSession.getAsyncRemote().sendObject(recentQuotePriceChangeList.recentList()); + } + } + } + + @OnError + public void onError(Throwable t, Session currentSession) { + Log.trace("MarketSummaryWebSocket:onError -- session -->" + currentSession + "<--"); + t.printStackTrace(); + } + + @OnClose + public void onClose(Session session, CloseReason reason) { + Log.trace("MarketSummaryWebSocket:onClose -- session -->" + session + "<--"); + sessions.remove(session); + } + + public void onStockChange(@ObservesAsync @Priority(Interceptor.Priority.APPLICATION) @QuotePriceChange String event) { + + Log.trace("MarketSummaryWebSocket:onStockChange"); + + Iterator failSafeIterator = sessions.iterator(); + while(failSafeIterator.hasNext()) { + Session s = failSafeIterator.next(); + if (s.isOpen()) { + s.getAsyncRemote().sendObject(recentQuotePriceChangeList.recentList()); + } + } + } + + public void onMarketSummarytUpdate(@ObservesAsync @Priority(Interceptor.Priority.APPLICATION) @MarketSummaryUpdate String event) { + + Log.trace("MarketSummaryWebSocket:onJMSMessage"); + + try { + JsonObject mkSummary = tradeAction.getMarketSummary().toJSON(); + + Iterator failSafeIterator = sessions.iterator(); + while(failSafeIterator.hasNext()) { + Session s = failSafeIterator.next(); + if (s.isOpen()) { + s.getAsyncRemote().sendText(mkSummary.toString()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/QuotePriceChangeListEncoder.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/QuotePriceChangeListEncoder.java new file mode 100644 index 00000000..0f090cee --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/web/websocket/QuotePriceChangeListEncoder.java @@ -0,0 +1,67 @@ +/** + * (C) Copyright IBM Corporation 2019. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.web.websocket; + +import java.util.Iterator; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.json.Json; +import javax.json.JsonBuilderFactory; +import javax.json.JsonObjectBuilder; +import javax.websocket.EncodeException; +import javax.websocket.Encoder; +import javax.websocket.EndpointConfig; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; + + +/** This class takes a list of quotedata (from the RecentQuotePriceChangeList bean) and encodes + it to the json format the client (marektsummary.html) is expecting. **/ +public class QuotePriceChangeListEncoder implements Encoder.Text> { + + private static final JsonBuilderFactory jsonObjectFactory = Json.createBuilderFactory(null); + + public String encode(CopyOnWriteArrayList list) throws EncodeException { + + JsonObjectBuilder jObjectBuilder = jsonObjectFactory.createObjectBuilder(); + + int i = 1; + + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + QuoteDataBean quotedata = iterator.next(); + + jObjectBuilder.add("change" + i + "_stock", quotedata.getSymbol()); + jObjectBuilder.add("change" + i + "_price","$" + quotedata.getPrice()); + jObjectBuilder.add("change" + i + "_change", quotedata.getChange()); + i++; + } + + return jObjectBuilder.build().toString(); + } + + @Override + public void init(EndpointConfig config) { + // TODO Auto-generated method stub + + } + + @Override + public void destroy() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/test/resources/test-applications/daytrader8/src/main/liberty/config/bootstrap.properties b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/bootstrap.properties new file mode 100644 index 00000000..b20b3d57 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/bootstrap.properties @@ -0,0 +1,2 @@ +default.http.port=9080 +default.https.port=9443 diff --git a/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.env b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.env new file mode 100644 index 00000000..e56f3dd7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.env @@ -0,0 +1,2 @@ +MAX_QUOTES=1000 +MAX_USERS=500 diff --git a/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml new file mode 100644 index 00000000..c951cac3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml @@ -0,0 +1,79 @@ + + + + ejb-3.2 + servlet-4.0 + jsf-2.3 + jpa-2.2 + mdb-3.2 + wasJmsServer-1.0 + wasJmsClient-2.0 + cdi-2.0 + websocket-1.1 + concurrent-1.0 + jsonp-1.1 + jsonb-1.0 + beanValidation-2.0 + jaxrs-2.1 + ssl-1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml_db2 b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml_db2 new file mode 100644 index 00000000..a9287130 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/liberty/config/server.xml_db2 @@ -0,0 +1,74 @@ + + + ejb-3.2 + servlet-4.0 + jsf-2.3 + jpa-2.2 + mdb-3.2 + wasJmsServer-1.0 + wasJmsClient-2.0 + cdi-2.0 + websocket-1.1 + concurrent-1.0 + jsonp-1.1 + jsonb-1.0 + beanValidation-2.0 + jaxrs-2.1 + ssl-1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/LICENSE b/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/MANIFEST.MF b/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 00000000..7b603592 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.7.1 +Class-Path: daytrader-ee7-ejb.jar +Created-By: 2.6 (IBM Corporation) + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingCDIJSF.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingCDIJSF.xhtml new file mode 100644 index 00000000..949bdce7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingCDIJSF.xhtml @@ -0,0 +1,39 @@ + + + + + +DayTrader PingJSF + + + + + + + + + + +
    Hit Count: #{pingCDIJSFBean.hitCount}
    +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingHtml.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingHtml.html new file mode 100644 index 00000000..53ec32d5 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingHtml.html @@ -0,0 +1,29 @@ + + + +PingHTML.html + + +
    +

    + PING HTML: +

    +

    + Hello World +

    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsf.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsf.xhtml new file mode 100644 index 00000000..e06ab7ec --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsf.xhtml @@ -0,0 +1,145 @@ + + + + + +DayTrader PingJSF + + + + + + + + + + +
    + + + + + + + + + +
    Quotes
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsp.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsp.jsp new file mode 100644 index 00000000..787f8793 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJsp.jsp @@ -0,0 +1,39 @@ + + + + + + + +PingJsp + + + <%!int hitCount = 0; + String initTime = new java.util.Date().toString();%> +
    +
    + PING JSP:
    +
    + Init time: <%=initTime%> + <% + hitCount++; + %> +

    + Hit Count: <%=hitCount%> +

    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJspEL.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJspEL.jsp new file mode 100644 index 00000000..56fc66df --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingJspEL.jsp @@ -0,0 +1,124 @@ + + + + +PingJspEL + + + <%@ page + import="com.ibm.websphere.samples.daytrader.util.TradeConfig,com.ibm.websphere.samples.daytrader.entities.QuoteDataBean" + session="false"%> + + <%!int hitCount = 0; + String initTime = new java.util.Date().toString();%> + + <% + // setup some variables to work with later + int someint1 = TradeConfig.rndInt(100) + 1; + pageContext.setAttribute("someint1", new Integer(someint1)); + int someint2 = TradeConfig.rndInt(100) + 1; + pageContext.setAttribute("someint2", new Integer(someint2)); + float somefloat1 = TradeConfig.rndFloat(100) + 1.0f; + pageContext.setAttribute("somefloat1", new Float(somefloat1)); + float somefloat2 = TradeConfig.rndFloat(100) + 1.0f; + pageContext.setAttribute("somefloat2", new Float(somefloat2)); + + QuoteDataBean quoteData1 = QuoteDataBean.getRandomInstance(); + pageContext.setAttribute("quoteData1", quoteData1); + QuoteDataBean quoteData2 = QuoteDataBean.getRandomInstance(); + pageContext.setAttribute("quoteData2", quoteData2); + QuoteDataBean quoteData3 = QuoteDataBean.getRandomInstance(); + pageContext.setAttribute("quoteData3", quoteData3); + QuoteDataBean quoteData4 = QuoteDataBean.getRandomInstance(); + pageContext.setAttribute("quoteData4", quoteData4); + + QuoteDataBean quoteData[] = new QuoteDataBean[4]; + quoteData[0] = quoteData1; + quoteData[1] = quoteData2; + quoteData[2] = quoteData3; + quoteData[3] = quoteData4; + pageContext.setAttribute("quoteData", quoteData); + %> + +
    +
    + PING JSP EL:
    + Init time: <%=initTime%> +

    + Hit Count: <%=hitCount++%> +

    +
    + +

    + + someint1 = + <%=someint1%>
    someint2 = + <%=someint2%>
    somefloat1 = + <%=somefloat1%>
    somefloat2 = + <%=somefloat2%>
    +

    +


    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EL TypeEL ExpressionsResult
    Integer Arithmetic\${someint1 + someint2 - someint1 * someint2 mod + someint1}${someint1 + someint2 - someint1 * someint2 mod someint1}
    Floating Point Arithmetic\${somefloat1 + somefloat2 - somefloat1 * + somefloat2 / somefloat1}${somefloat1 + somefloat2 - somefloat1 * somefloat2 / somefloat1}
    Logical Operations\${(someint1 < someint2) && (someint1 <= someint2) + || (someint1 == someint2) && !Boolean.FALSE}${(someint1 < someint2) && (someint1 <= someint2) || (someint1 == someint2) && !Boolean.FALSE}
    Indexing Operations\${quoteData3.symbol}
    + \${quoteData[2].symbol}
    \${quoteData4["symbol"]}
    + \${header["host"]}
    \${header.host}
    +
    ${quoteData3.symbol}
    ${quoteData[1].symbol}
    + ${quoteData4["symbol"]}
    ${header["host"]}
    + ${header.host} +
    Variable Scope Tests\${(quoteData3 == null) ? "null" : quoteData3}
    + \${(noSuchVariableAtAnyScope == null) ? "null" : noSuchVariableAtAnyScope} +
    ${(quoteData3 == null) ? "null" : quoteData3}
    + ${(noSuchVariableAtAnyScope == null) ? "null" : noSuchVariableAtAnyScope} +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingServlet2Jsp.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingServlet2Jsp.jsp new file mode 100644 index 00000000..dfe06f6c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingServlet2Jsp.jsp @@ -0,0 +1,39 @@ + + + + + + + +PingJsp + + + <%!String initTime = (new java.util.Date()).toString();%> + +
    +
    Ping Servlet2JSP:
    +
    + Init time: <%=initTime%> +
    +
    + Message from Servlet: + <%= ab.getMsg() %> + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketBinary.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketBinary.html new file mode 100644 index 00000000..8aa71445 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketBinary.html @@ -0,0 +1,92 @@ + + + + +WebSocket Primitive - PingWebSocketBinary + + + + + +

    +
    + Ping WebSocket Binary
    + Init time :
    0


    + Hit Count:
    0

    + +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketJson.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketJson.html new file mode 100644 index 00000000..026a40b1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketJson.html @@ -0,0 +1,112 @@ + + + + +WebSocket Primitive - PingWebSocketJson + + + + + +

    +
    + Ping WebSocket Json
    + Init time :
    0


    + Sent Count :
    0

    + Received Count:
    0

    + +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextAsync.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextAsync.html new file mode 100644 index 00000000..96dfe2bb --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextAsync.html @@ -0,0 +1,90 @@ + + + + +WebSocket Primitive - PingWebSocketTextAsync + + + + + +

    +
    + Ping WebSocket Text Async
    + Init time :
    0


    + Hit Count:
    0

    + +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextSync.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextSync.html new file mode 100644 index 00000000..e454f185 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/PingWebSocketTextSync.html @@ -0,0 +1,90 @@ + + + + +WebSocket Primitive - PingWebSocketTextSync + + + + + +

    +
    + Ping WebSocket Text Sync
    + Init time :
    0


    + Hit Count:
    0

    + +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WAS_V7_64-bit_performance.pdf b/src/test/resources/test-applications/daytrader8/src/main/webapp/WAS_V7_64-bit_performance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2f75b12911ab44e5b7df51606034011715b98b6a GIT binary patch literal 943593 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 Ej;G&^zUEf^)yfu_U1I8;FKb)&i1?Bn#OHsH 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

    lnWOe!ABS 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

    B5% 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

    6(7=zqgUDoH{{DYJ} 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%0AX3s6vbN#c& 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èHbAl!C$k;UTl?*MPuvQ1 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/beans.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 00000000..99546567 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,22 @@ + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/DEPENDENCIES b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/DEPENDENCIES new file mode 100644 index 00000000..cb8878a9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/DEPENDENCIES @@ -0,0 +1,15 @@ +// ------------------------------------------------------------------ +// Transitive dependencies of this project determined from the +// maven pom organized by organization. +// ------------------------------------------------------------------ + +DayTrader :: Web Application + + +From: 'an unknown organization' + - Unnamed - taglibs:standard:jar:1.1.1 taglibs:standard:jar:1.1.1 + + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/LICENSE b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/NOTICE b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/NOTICE new file mode 100644 index 00000000..883959db --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/NOTICE @@ -0,0 +1,8 @@ + +DayTrader :: Web Application +Copyright 2005-2010 Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/persistence.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/persistence.xml new file mode 100644 index 00000000..4400b9fb --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/META-INF/persistence.xml @@ -0,0 +1,34 @@ + + + + + + + jdbc/TradeDataSource + + com.ibm.websphere.samples.daytrader.entities.AccountDataBean + com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean + com.ibm.websphere.samples.daytrader.entities.HoldingDataBean + com.ibm.websphere.samples.daytrader.entities.OrderDataBean + com.ibm.websphere.samples.daytrader.entities.QuoteDataBean + true + NONE + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/build.properties b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/build.properties new file mode 100644 index 00000000..65f995b4 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/build.properties @@ -0,0 +1,16 @@ +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You under the Apache License, Version 2.0 +## (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +ejb_version=${pom.version} diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/persistence.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/persistence.xml new file mode 100644 index 00000000..4400b9fb --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/classes/persistence.xml @@ -0,0 +1,34 @@ + + + + + + + jdbc/TradeDataSource + + com.ibm.websphere.samples.daytrader.entities.AccountDataBean + com.ibm.websphere.samples.daytrader.entities.AccountProfileDataBean + com.ibm.websphere.samples.daytrader.entities.HoldingDataBean + com.ibm.websphere.samples.daytrader.entities.OrderDataBean + com.ibm.websphere.samples.daytrader.entities.QuoteDataBean + true + NONE + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ejb-jar.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ejb-jar.xml new file mode 100644 index 00000000..04cc73bf --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ejb-jar.xml @@ -0,0 +1,446 @@ + + + DayTrader Enterprise Bean Definitions + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/faces-config.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 00000000..f3c699ea --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,120 @@ + + + + + /welcome.xhtml + + Ready to Trade + /tradehome.xhtml + + + welcome + /welcome.xhtml + + + + /register.xhtml + + Registration operation succeeded + /tradehome.xhtml + + + Registration operation failed + /register.xhtml + + + + /tradehome.xhtml + + quotes + /quote.xhtml + + + Registration operation failed + /register.xhtml + + + + /account.xhtml + + quotes + /quote.xhtml + + + Go to account + /account.xhtml + + + welcome + /welcome.xhtml + + + + /portfolio.xhtml + + quotes + /quote.xhtml + + + sell + /order.xhtml + + + + /marketSummary.xhtml + + quotes + /quote.xhtml + + + + /configure.xhtml + + welcome + /welcome.xhtml + + + config + /config.xhtml + + + database + /configure.xhtml + + + stats + /configure.xhtml + + + + /order.xhtml + + quotes + /quote.xhtml + + + + /quote.xhtml + + buy + /order.xhtml + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-bnd.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-bnd.xml new file mode 100644 index 00000000..255c8fa6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-bnd.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-ext.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-ext.xml new file mode 100644 index 00000000..93291de1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/ibm-web-ext.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/web.xml b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..ea357968 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,215 @@ + + + + DayTrader Web + + javax.faces.PROJECT_STAGE + Production + + + javax.faces.STATE_SAVING_METHOD + server + + + javax.faces.DEFAULT_SUFFIX + .xhtml + + + + Faces Servlet + javax.faces.webapp.FacesServlet + 0 + true + false + + + + Faces Servlet + *.faces + + + + 30 + + + + index.html + index.jsp + index.faces + + + + java.lang.Exception + /error.jsp + + + + 500 + /error.jsp + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/account.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/account.jsp new file mode 100644 index 00000000..ebf882a4 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/account.jsp @@ -0,0 +1,392 @@ + + + + + +DayTrader Account Information + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + + <% + boolean showAllOrders = request.getParameter("showAllOrders") == null ? false : true; + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader AccountDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    <%=results%>
    Account + Information
    account + created:<%=accountData.getCreationDate()%>last + login: <%=accountData.getLastLogin()%>
    account + ID<%=accountData.getAccountID()%>total + logins: <%=accountData.getLoginCount()%>cash + balance: <%=accountData.getBalance()%>
    user + ID:<%=accountData.getProfileID()%>total + logouts: <%=accountData.getLogoutCount()%>opening + balance: <%=accountData.getOpenBalance()%>
    + + + + + + + + + + + + + + +
    Total + Orders: <%=orderDataBeans.size()%>show + all orders
    + + + + + + + + + + + + + + + + <% + Iterator it = orderDataBeans.iterator(); + int count = 0; + while (it.hasNext()) { + if ((showAllOrders == false) && (count++ >= 5)) + break; + OrderDataBean orderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + <% + } + %> + +
    + Recent Orders +
    order + IDorder + Statuscreation + datecompletion + datetxn + feetypesymbolquantitypricetotal
    <%=orderData.getOrderID()%><%=orderData.getOrderStatus()%><%=orderData.getOpenDate()%><%=orderData.getCompletionDate()%><%=orderData.getOrderFee()%><%=orderData.getOrderType()%><%=FinancialUtils.printQuoteLink(orderData.getSymbol())%><%=orderData.getQuantity()%><%=orderData.getPrice()%><%=orderData.getPrice().multiply(new BigDecimal(orderData.getQuantity()))%>
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Account + Profile
    user + ID:full + name:
    password: + address: +
    confirm + password:
    credit + card:
    email + address:
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader + AccountDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/account.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/account.xhtml new file mode 100644 index 00000000..30d87d69 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/account.xhtml @@ -0,0 +1,430 @@ + + + + + + DayTrader Account + + + + + +

    + + + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/accountImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/accountImg.jsp new file mode 100644 index 00000000..b6c6a9d1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/accountImg.jsp @@ -0,0 +1,409 @@ + + + + + +DayTrader Account Information + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + <% + boolean showAllOrders = request.getParameter("showAllOrders") == null ? false : true; + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader AccountDayTrader

    <%=new java.util.Date()%>
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    <%=results%>
    Account + Information
    account + created:<%=accountData.getCreationDate()%>last + login: <%=accountData.getLastLogin()%>
    account + ID<%=accountData.getAccountID()%>total + logins: <%=accountData.getLoginCount()%>cash + balance: <%=accountData.getBalance()%>
    user + ID:<%=accountData.getProfileID()%>total + logouts: <%=accountData.getLogoutCount()%>opening + balance: <%=accountData.getOpenBalance()%>
    + + + + + + + + + + + + + + +
    Total + Orders: <%=orderDataBeans.size()%>show + all orders
    + + + + + + + + + + + + + + + + <% + Iterator it = orderDataBeans.iterator(); + int count = 0; + while (it.hasNext()) { + if ((showAllOrders == false) && (count++ >= 5)) + break; + OrderDataBean orderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + <% + } + %> + +
    + Recent Orders +
    order + IDorder + Statuscreation + datecompletion + datetxn + feetypesymbolquantitypricetotal
    <%=orderData.getOrderID()%><%=orderData.getOrderStatus()%><%=orderData.getOpenDate()%><%=orderData.getCompletionDate()%><%=orderData.getOrderFee()%><%=orderData.getOrderType()%><%=FinancialUtils.printQuoteLink(orderData.getSymbol())%><%=orderData.getQuantity()%><%=orderData.getPrice()%><%=orderData.getPrice().multiply(new BigDecimal(orderData.getQuantity()))%>
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Account + Profile
    user + ID:full + name:
    password: + address: +
    confirm + password:
    credit + card:
    email + address:
    +
    +
    + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader + AccountDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/config.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/config.jsp new file mode 100644 index 00000000..119712d8 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/config.jsp @@ -0,0 +1,251 @@ + + + + + + +Welcome to DayTrader + + + <%@ page + import="com.ibm.websphere.samples.daytrader.util.TradeConfig" + session="false" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + +
    DayTrader + ConfigurationDayTrader
    +
    +
    + + <% + String status; + status = (String) request.getAttribute("status"); + if (status != null) { + %> + + + + + + + + +
    <% + out.print(status); + %> +
    + <% + } + %> + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    The current DayTrader runtime + configuration is detailed below. View and + optionally update run-time parameters.  
    +
    NOTE: Parameters settings will + return to default on server restart. To + make configuration settings persistent across + application server stop/starts, edit the daytrader.props + file inside daytrader-ee7-web.war (which is inside the + daytrader ear file).
    +
    +
    Run-Time Mode +

    + <% + String configParm = "RunTimeMode"; + String names[] = TradeConfig.getRunTimeModeNames(); + int index = TradeConfig.getRunTimeMode(); + for (int i = 0; i < names.length; i++) { + out.print(" " + names[i] + "
    "); + } + %> +


    Run Time Mode determines server + implementation of the TradeServices to use in + the DayTrader application Enterprise Java Beans + including Session, Entity and Message beans or + Direct mode which uses direct database and JMS + access. See DayTrader + FAQ for details.
    Order-Processing Mode +

    + <% + configParm = "OrderProcessingMode"; + names = TradeConfig.getOrderProcessingModeNames(); + index = TradeConfig.getOrderProcessingMode(); + for (int i = 0; i < names.length; i++) { + out.print(" " + names[i] + "
    "); + } + %> +


    Order Processing Mode determines + the mode for completing stock purchase and sell + operations. Synchronous mode completes the order + immediately. Asychronous_2-Phase performs a + 2-phase commit over the EJB Entity/DB and + MDB/JMS transactions. See DayTrader FAQ for + details.
    WebInterface +

    + <% + configParm = "WebInterface"; + names = TradeConfig.getWebInterfaceNames(); + index = TradeConfig.getWebInterface(); + for (int i = 0; i < names.length; i++) { + out.print(" " + names[i] + "
    "); + } + %> +

    This setting determines the Web interface + technology used, JSPs or JSPs with static images + and GIFs.
    Miscellaneous + Settings
    DayTrader Max Users
    +
    + Trade Max Quotes
    By default the DayTrader database is + populated with 15,000 users (uid:0 - uid:199) + and 10,000 quotes (s:0 - s:399).
    +
    Market Summary Interval
    +
    < 0 Do not perform Market Summary + Operations.
    = 0 Perform market Summary + on every request.

    > 0 number of + seconds between Market Summary Operations
    +
    Primitive Iteration
    +
    By default the DayTrader primitives are + execute one operation per web request. Change + this value to repeat operations multiple times + per web request.
    + name="EnablePublishQuotePriceChange"> Publish Quote Updates
    Publish quote price changes to a JMS topic.
    +
    Percent of Quote Price Changes to List
    +
    The percent of recent trades to display on the Market Summary websocket.
    + name="DisplayOrderAlerts"> Display Order Alerts
    Display completed order alerts.
    +
    + name="EnableLongRun"> Enable long run support
    Enable long run support by disabling the + show all orders query performed on the Account + page.
    +
    +
    + + + + + + + + + + + + + + +
    +
    +
    DayTrader + ConfigurationDayTrader
    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/config.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/config.xhtml new file mode 100644 index 00000000..c0b3d78c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/config.xhtml @@ -0,0 +1,232 @@ + + + + + DayTrader Config + + + + +
    + + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.html new file mode 100644 index 00000000..a5669233 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.html @@ -0,0 +1,115 @@ + + + + + + +Configuration and utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Configuration Utilities

    +
    Benchmark + Configuration
    Tools +
    Description +
    Reset + DayTrader
    (to be done before each + run) +
    Reset the DayTrader runtime to a clean starting + point by logging off all users, removing new + registrations and other general cleanup. For + consistent results this URL should be run before + each Trade run. +
    Configure + DayTrader run-time parametersThis link provides an interface to set + configuration parameters that control DayTrader + run-time characteristics such as using EJBs or JDBC. + This link also provides utilities such as setting + the UID and Password for a remote or protected + database when using JDBC.
    (Re)-create +  DayTrader Database Tables and + IndexesThis link is used to (a) initially create or + (b) drop and re-create the DayTrader tables. A + DayTrader database should exist before doing + this action, the existing DayTrader tables, if + any, are dropped, then new tables and indexes are + created. Please stop and re-start the + Daytrader application (or your application + server) after this action and then use the + "Repopulate DayTrader Database" link below to + repopulate the new database tables. +
    (Re)-populate +  DayTrader DatabaseThis link is used to initially populate or + re-populate the DayTrader database with fictitious + users (uid:0, uid:1, ...) and stocks (s:0, s:1, + ...). First all existing users and stocks are + deleted (if any). The database is then populated + with a new set of DayTrader users and stocks. This + option does not drop and recreate the Daytrader db + tables.
    Test + DayTrader ScenarioThis links pops up a browser to manually step + through a DayTrader scenario by hitting + "Reload" on your browser
    DayTrader + VersionDayTrader application version and change + history information
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.xhtml new file mode 100644 index 00000000..9e334bd1 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/configure.xhtml @@ -0,0 +1,148 @@ + + + + + DayTrader Configure + + + + + +
    + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    Configuration Utilities

    +
    + + Benchmark Configuration Tools + + + + + Description + +
    + + + Reset DayTrader +
    + (to be done before each run) +
    +
    +
    + Reset the DayTrader runtime to a clean starting point by logging off all users, removing new registrations and other general cleanup. For + consistent results this URL should be run + before each + Trade run. +
    + + Configure DayTrader run-time parameters + + This link provides an interface to set configuration parameters that control DayTrader run-time characteristics + such as using EJBs or JDBC. This link also provides utilities such as setting the UID and Password for a remote or protected database when + using JDBC.
    + + (Re)-create  DayTrader Database Tables and Indexes + + + This link is used to (a) initially create or (b) drop and re-create the DayTrader tables. + A DayTrader database should exist before doing this action + , the existing DayTrader tables, if any, are dropped, then new tables and indexes are created. + Please stop and re-start the Daytrader application (or your application server) after this action and then use the "Repopulate + DayTrader Database" link below to repopulate the new database tables. +
    + + (Re)-populate  DayTrader Database + + This link is used to initially populate or re-populate the DayTrader database with fictitious users (uid:0, + uid:1, ...) and stocks (s:0, s:1, ...). First all existing users and stocks are deleted (if any). The database is then populated with a new + set of DayTrader users and stocks. This option does not drop and recreate the Daytrader db tables.
    + DayTrader Version + DayTrader application version and change history information
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/contentHome.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/contentHome.html new file mode 100644 index 00000000..a30929c9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/contentHome.html @@ -0,0 +1,87 @@ + + + + + +Daytrader performance benchmark sample overview + + + + + + + + + + + + + + +
    +
    +
    +

    + Overview +

    +
    + The + Daytrader performance benchmark sample provides a suite of workloads for characterizing performance of + Java EE Application Servers. The workloads + consist of an end to end web application and a full set of primitives. The applications are a + collection of Java classes, Java Servlets, JavaServer Pages, and Enterprise Java + Beans built to open Java EE APIs. Together these provide versatile and portable test cases + designed to measure aspects of scalability and performance. + +
    +

    + +
    DayTrader J2EE Components
    + Model-View-Controller Architecture +

    +
    + DayTrader
    + DayTrader is an end-to-end benchmark + and performance sample application. It provides a + real world Java EE workload.

    DayTrader's new + design spans Java EE 7, including the new WebSockets specification. Other Java EE features include JSPs, Servlets, EJBs, JPA, JDBC, JSF, JMS, MDBs, and + transactions (synchronous and asynchronous/2-phase commit).

    Primitives
    +
    The Primitives provide a + set of workloads to individually test various + components of an Application Server. + The primitives leverage the DayTrader + application infrastructure to test specific + Java EE components such as the servlet + engine, JSP support, EJB Entitiy, Session and + Message Driven beans, HTTP Session support and + more. + +
    +
    + Additional + overview information is included in the FAQ + +
    +
    +
    +
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/db2/Table.ddl b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/db2/Table.ddl new file mode 100644 index 00000000..124e43a2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/db2/Table.ddl @@ -0,0 +1,289 @@ +## (C) Copyright IBM Corporation 2015. +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +DROP TABLE HOLDINGEJB; +DROP TABLE ACCOUNTPROFILEEJB; +DROP TABLE QUOTEEJB; +DROP TABLE KEYGENEJB; +DROP TABLE ACCOUNTEJB; +DROP TABLE ORDEREJB; + +DROP TABLESPACE "HOLDING_TS"; +DROP TABLESPACE "ACCOUNTP_TS"; +DROP TABLESPACE "QUOTE_TS"; + +DROP TABLESPACE "ACCOUNT_ITS1"; +DROP TABLESPACE "ACCOUNT_ITS2"; +DROP TABLESPACE "ACCOUNT_ITS3"; +DROP TABLESPACE "ACCOUNT_ITS4"; +DROP TABLESPACE "ACCOUNT_ITS5"; +DROP TABLESPACE "ACCOUNT_ITS6"; +DROP TABLESPACE "ACCOUNT_ITS7"; + +DROP TABLESPACE "QUOTE_ITS1"; +DROP TABLESPACE "QUOTE_ITS2"; +DROP TABLESPACE "QUOTE_ITS3"; +DROP TABLESPACE "QUOTE_ITS4"; +DROP TABLESPACE "QUOTE_ITS5"; +DROP TABLESPACE "QUOTE_ITS6"; +DROP TABLESPACE "QUOTE_ITS7"; +DROP TABLESPACE "QUOTE_ITS8"; +DROP TABLESPACE "QUOTE_ITS9"; +DROP TABLESPACE "QUOTE_ITS10"; +DROP TABLESPACE "QUOTE_ITS11"; +DROP TABLESPACE "QUOTE_ITS12"; +DROP TABLESPACE "QUOTE_ITS13"; +DROP TABLESPACE "QUOTE_ITS14"; +DROP TABLESPACE "QUOTE_ITS15"; +DROP TABLESPACE "QUOTE_ITS16"; +DROP TABLESPACE "QUOTE_ITS17"; +DROP TABLESPACE "QUOTE_ITS18"; +DROP TABLESPACE "QUOTE_ITS19"; +DROP TABLESPACE "QUOTE_ITS20"; + +DROP TABLESPACE "KEYGENE_TS"; +DROP TABLESPACE "ACCOUNTE_TS"; +DROP TABLESPACE "ORDER_TS"; + +DROP BUFFERPOOL "HOLDING_BP"; +CREATE BUFFERPOOL "HOLDING_BP" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNTP_BP"; +CREATE BUFFERPOOL "ACCOUNTP_BP" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_BP"; +CREATE BUFFERPOOL "QUOTE_BP" SIZE AUTOMATIC PAGESIZE 4096; + + +DROP BUFFERPOOL "ACCOUNT_IBP1"; +CREATE BUFFERPOOL "ACCOUNT_IBP1" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP2"; +CREATE BUFFERPOOL "ACCOUNT_IBP2" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP3"; +CREATE BUFFERPOOL "ACCOUNT_IBP3" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP4"; +CREATE BUFFERPOOL "ACCOUNT_IBP4" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP5"; +CREATE BUFFERPOOL "ACCOUNT_IBP5" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP6"; +CREATE BUFFERPOOL "ACCOUNT_IBP6" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNT_IBP7"; +CREATE BUFFERPOOL "ACCOUNT_IBP7" SIZE AUTOMATIC PAGESIZE 4096; + +DROP BUFFERPOOL "QUOTE_IBP1"; +CREATE BUFFERPOOL "QUOTE_IBP1" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP2"; +CREATE BUFFERPOOL "QUOTE_IBP2" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP3"; +CREATE BUFFERPOOL "QUOTE_IBP3" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP4"; +CREATE BUFFERPOOL "QUOTE_IBP4" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP5"; +CREATE BUFFERPOOL "QUOTE_IBP5" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP6"; +CREATE BUFFERPOOL "QUOTE_IBP6" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP7"; +CREATE BUFFERPOOL "QUOTE_IBP7" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP8"; +CREATE BUFFERPOOL "QUOTE_IBP8" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP9"; +CREATE BUFFERPOOL "QUOTE_IBP9" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP10"; +CREATE BUFFERPOOL "QUOTE_IBP10" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP11"; +CREATE BUFFERPOOL "QUOTE_IBP11" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP12"; +CREATE BUFFERPOOL "QUOTE_IBP12" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP13"; +CREATE BUFFERPOOL "QUOTE_IBP13" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP14"; +CREATE BUFFERPOOL "QUOTE_IBP14" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP15"; +CREATE BUFFERPOOL "QUOTE_IBP15" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP16"; +CREATE BUFFERPOOL "QUOTE_IBP16" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP17"; +CREATE BUFFERPOOL "QUOTE_IBP17" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP18"; +CREATE BUFFERPOOL "QUOTE_IBP18" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP19"; +CREATE BUFFERPOOL "QUOTE_IBP19" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "QUOTE_IBP20"; +CREATE BUFFERPOOL "QUOTE_IBP20" SIZE AUTOMATIC PAGESIZE 4096; + + + +DROP BUFFERPOOL "KEYGENE_BP"; +CREATE BUFFERPOOL "KEYGENE_BP" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ACCOUNTE_BP"; +CREATE BUFFERPOOL "ACCOUNTE_BP" SIZE AUTOMATIC PAGESIZE 4096; +DROP BUFFERPOOL "ORDER_BP"; +CREATE BUFFERPOOL "ORDER_BP" SIZE AUTOMATIC PAGESIZE 4096; + +CREATE LARGE TABLESPACE "HOLDING_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "HOLDING_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNTP_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNTP_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; + +CREATE LARGE TABLESPACE "QUOTE_ITS1" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP1" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS2" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP2" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS3" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP3" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS4" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP4" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS5" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP5" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS6" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP6" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS7" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP7" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS8" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP8" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS9" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP9" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS10" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP10" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS11" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP11" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS12" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP12" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS13" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP13" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS14" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP14" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS15" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP15" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS16" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP16" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS17" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP17" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS18" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP18" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS19" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP19" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "QUOTE_ITS20" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "QUOTE_IBP20" AUTORESIZE YES NO FILE SYSTEM CACHING; + +CREATE LARGE TABLESPACE "ACCOUNT_ITS1" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP1" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS2" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP2" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS3" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP3" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS4" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP4" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS5" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP5" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS6" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP6" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNT_ITS7" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNT_IBP7" AUTORESIZE YES NO FILE SYSTEM CACHING; + +CREATE LARGE TABLESPACE "KEYGENE_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "KEYGENE_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ACCOUNTE_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ACCOUNTE_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; +CREATE LARGE TABLESPACE "ORDER_TS" PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE BUFFERPOOL "ORDER_BP" AUTORESIZE YES NO FILE SYSTEM CACHING; + +CREATE TABLE HOLDINGEJB + (PURCHASEPRICE DECIMAL(14, 2), + HOLDINGID INTEGER NOT NULL, + QUANTITY DOUBLE NOT NULL, + PURCHASEDATE TIMESTAMP, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250)) IN "HOLDING_TS" INDEX IN "HOLDING_TS"; + +ALTER TABLE HOLDINGEJB + ADD CONSTRAINT PK_HOLDINGEJB PRIMARY KEY (HOLDINGID); + +ALTER TABLE HOLDINGEJB APPEND ON; + +CREATE TABLE ACCOUNTPROFILEEJB + (ADDRESS VARCHAR(250), + PASSWD VARCHAR(250), + USERID VARCHAR(250) NOT NULL, + EMAIL VARCHAR(250), + CREDITCARD VARCHAR(250), + FULLNAME VARCHAR(250)) IN "ACCOUNTP_TS" INDEX IN "ACCOUNTP_TS"; + +ALTER TABLE ACCOUNTPROFILEEJB + ADD CONSTRAINT PK_ACCOUNTPROFILE2 PRIMARY KEY (USERID); + +CREATE TABLE QUOTEEJB + (LOW DECIMAL(14, 2), + OPEN1 DECIMAL(14, 2), + VOLUME DOUBLE NOT NULL, + PRICE DECIMAL(14, 2), + HIGH DECIMAL(14, 2), + COMPANYNAME VARCHAR(250), + SYMBOL VARCHAR(250) NOT NULL, + CHANGE1 DOUBLE NOT NULL) IN "QUOTE_TS" INDEX IN "QUOTE_TS" PARTITION BY RANGE("SYMBOL") + (PART "PART0" STARTING('s:0') ENDING('s:1000') IN "QUOTE_TS" INDEX IN "QUOTE_ITS1", + PART "PART10" ENDING('s:10999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS11", + PART "PART11" ENDING('s:11999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS12", + PART "PART12" ENDING('s:12999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS13", + PART "PART13" ENDING('s:13999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS14", + PART "PART14" ENDING('s:14999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS15", + PART "PART15" ENDING('s:15999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS16", + PART "PART16" ENDING('s:16999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS17", + PART "PART17" ENDING('s:17999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS18", + PART "PART18" ENDING('s:18999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS19", + PART "PART1" ENDING('s:1999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS2", + PART "PART19" ENDING('s:20001') IN "QUOTE_TS" INDEX IN "QUOTE_ITS20", + PART "PART2" ENDING('s:2999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS3", + PART "PART3" ENDING('s:3999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS4", + PART "PART4" ENDING('s:4999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS5", + PART "PART5" ENDING('s:5999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS6", + PART "PART6" ENDING('s:6999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS7", + PART "PART7" ENDING('s:7999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS8", + PART "PART8" ENDING('s:8999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS9", + PART "PART9" ENDING('s:9999') IN "QUOTE_TS" INDEX IN "QUOTE_ITS10"); + +CREATE UNIQUE INDEX QUOTE_SYM ON QUOTEEJB(SYMBOL); + +ALTER TABLE QUOTEEJB + ADD CONSTRAINT PK_QUOTEEJB PRIMARY KEY (SYMBOL); + + +CREATE TABLE KEYGENEJB + (KEYVAL INTEGER NOT NULL, + KEYNAME VARCHAR(250) NOT NULL) IN "KEYGENE_TS" INDEX IN "KEYGENE_TS"; + +ALTER TABLE KEYGENEJB + ADD CONSTRAINT PK_KEYGENEJB PRIMARY KEY (KEYNAME); + +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('account', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('holding', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('order', 0); + +CREATE TABLE ACCOUNTEJB + (CREATIONDATE TIMESTAMP, + OPENBALANCE DECIMAL(14, 2), + LOGOUTCOUNT INTEGER NOT NULL, + BALANCE DECIMAL(14, 2), + ACCOUNTID INTEGER NOT NULL, + LASTLOGIN TIMESTAMP, + LOGINCOUNT INTEGER NOT NULL, + PROFILE_USERID VARCHAR(250)) IN "ACCOUNTE_TS" INDEX IN "ACCOUNTE_TS" PARTITION BY RANGE("ACCOUNTID") + (PART "PART0" STARTING(0) ENDING(4999) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS1", + PART "PART1" ENDING(9999) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS2", + PART "PART2" ENDING(14999) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS3", + PART "PART3" ENDING(19999) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS4", + PART "PART4" ENDING(24999) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS5", + PART "PART5" ENDING(300001) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS6", + PART "PART6" ENDING(2147483646) IN "ACCOUNTE_TS" INDEX IN "ACCOUNT_ITS6"); + +ALTER TABLE ACCOUNTEJB + ADD CONSTRAINT PK_ACCOUNTEJB PRIMARY KEY (ACCOUNTID); + +CREATE TABLE ORDEREJB + (ORDERFEE DECIMAL(14, 2), + COMPLETIONDATE TIMESTAMP, + ORDERTYPE VARCHAR(250), + ORDERSTATUS VARCHAR(250), + PRICE DECIMAL(14, 2), + QUANTITY DOUBLE NOT NULL, + OPENDATE TIMESTAMP, + ORDERID INTEGER NOT NULL, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250), + HOLDING_HOLDINGID INTEGER) IN "ORDER_TS" INDEX IN "ORDER_TS"; + +ALTER TABLE ORDEREJB + ADD CONSTRAINT PK_ORDEREJB PRIMARY KEY (ORDERID); + +ALTER TABLE ORDEREJB APPEND ON; + +ALTER TABLE HOLDINGEJB VOLATILE; +ALTER TABLE ACCOUNTPROFILEEJB VOLATILE; +ALTER TABLE QUOTEEJB VOLATILE; +ALTER TABLE KEYGENEJB VOLATILE; +ALTER TABLE ACCOUNTEJB VOLATILE; +ALTER TABLE ORDEREJB VOLATILE; + +CREATE INDEX ACCOUNT_USERID ON ACCOUNTEJB(PROFILE_USERID); +CREATE INDEX HOLDING_ACCOUNTID ON HOLDINGEJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_ACCOUNTID ON ORDEREJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_HOLDINGID ON ORDEREJB(HOLDING_HOLDINGID); +CREATE INDEX CLOSED_ORDERS ON ORDEREJB(ACCOUNT_ACCOUNTID,ORDERSTATUS); diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/derby/Table.ddl b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/derby/Table.ddl new file mode 100644 index 00000000..08ac681f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/derby/Table.ddl @@ -0,0 +1,104 @@ +## (C) Copyright IBM Corporation 2015. +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +# Each SQL statement in this file should terminate with a semicolon (;) +# Lines starting with the pound character (#) are considered as comments +DROP TABLE HOLDINGEJB; +DROP TABLE ACCOUNTPROFILEEJB; +DROP TABLE QUOTEEJB; +DROP TABLE KEYGENEJB; +DROP TABLE ACCOUNTEJB; +DROP TABLE ORDEREJB; + +CREATE TABLE HOLDINGEJB + (PURCHASEPRICE DECIMAL(14, 2), + HOLDINGID INTEGER NOT NULL, + QUANTITY DOUBLE NOT NULL, + PURCHASEDATE TIMESTAMP, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250)); + +ALTER TABLE HOLDINGEJB + ADD CONSTRAINT PK_HOLDINGEJB PRIMARY KEY (HOLDINGID); + +CREATE TABLE ACCOUNTPROFILEEJB + (ADDRESS VARCHAR(250), + PASSWD VARCHAR(250), + USERID VARCHAR(250) NOT NULL, + EMAIL VARCHAR(250), + CREDITCARD VARCHAR(250), + FULLNAME VARCHAR(250)); + +ALTER TABLE ACCOUNTPROFILEEJB + ADD CONSTRAINT PK_ACCOUNTPROFILE2 PRIMARY KEY (USERID); + +CREATE TABLE QUOTEEJB + (LOW DECIMAL(14, 2), + OPEN1 DECIMAL(14, 2), + VOLUME DOUBLE NOT NULL, + PRICE DECIMAL(14, 2), + HIGH DECIMAL(14, 2), + COMPANYNAME VARCHAR(250), + SYMBOL VARCHAR(250) NOT NULL, + CHANGE1 DOUBLE NOT NULL); + +ALTER TABLE QUOTEEJB + ADD CONSTRAINT PK_QUOTEEJB PRIMARY KEY (SYMBOL); + +CREATE TABLE KEYGENEJB + (KEYVAL INTEGER NOT NULL, + KEYNAME VARCHAR(250) NOT NULL); + +ALTER TABLE KEYGENEJB + ADD CONSTRAINT PK_KEYGENEJB PRIMARY KEY (KEYNAME); + +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('account', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('holding', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('order', 0); + +CREATE TABLE ACCOUNTEJB + (CREATIONDATE TIMESTAMP, + OPENBALANCE DECIMAL(14, 2), + LOGOUTCOUNT INTEGER NOT NULL, + BALANCE DECIMAL(14, 2), + ACCOUNTID INTEGER NOT NULL, + LASTLOGIN TIMESTAMP, + LOGINCOUNT INTEGER NOT NULL, + PROFILE_USERID VARCHAR(250)); + +ALTER TABLE ACCOUNTEJB + ADD CONSTRAINT PK_ACCOUNTEJB PRIMARY KEY (ACCOUNTID); + +CREATE TABLE ORDEREJB + (ORDERFEE DECIMAL(14, 2), + COMPLETIONDATE TIMESTAMP, + ORDERTYPE VARCHAR(250), + ORDERSTATUS VARCHAR(250), + PRICE DECIMAL(14, 2), + QUANTITY DOUBLE NOT NULL, + OPENDATE TIMESTAMP, + ORDERID INTEGER NOT NULL, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250), + HOLDING_HOLDINGID INTEGER); + +ALTER TABLE ORDEREJB + ADD CONSTRAINT PK_ORDEREJB PRIMARY KEY (ORDERID); + +CREATE INDEX ACCOUNT_USERID ON ACCOUNTEJB(PROFILE_USERID); +CREATE INDEX HOLDING_ACCOUNTID ON HOLDINGEJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_ACCOUNTID ON ORDEREJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_HOLDINGID ON ORDEREJB(HOLDING_HOLDINGID); +CREATE INDEX CLOSED_ORDERS ON ORDEREJB(ACCOUNT_ACCOUNTID,ORDERSTATUS); + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/oracle/Table.ddl b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/oracle/Table.ddl new file mode 100644 index 00000000..3fa33c27 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/dbscripts/oracle/Table.ddl @@ -0,0 +1,103 @@ +## (C) Copyright IBM Corporation 2015. +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +# Each SQL statement in this file should terminate with a semicolon (;) +# Lines starting with the pound character (#) are considered as comments +DROP TABLE HOLDINGEJB cascade constraints; +DROP TABLE ACCOUNTPROFILEEJB cascade constraints; +DROP TABLE QUOTEEJB cascade constraints; +DROP TABLE KEYGENEJB cascade constraints; +DROP TABLE ACCOUNTEJB cascade constraints; +DROP TABLE ORDEREJB cascade constraints; + +CREATE TABLE HOLDINGEJB + (PURCHASEPRICE DECIMAL(14, 2) NULL, + HOLDINGID INTEGER NOT NULL, + QUANTITY NUMBER NOT NULL, + PURCHASEDATE DATE NULL, + ACCOUNT_ACCOUNTID INTEGER NULL, + QUOTE_SYMBOL VARCHAR2(250) NULL); + +ALTER TABLE HOLDINGEJB + ADD CONSTRAINT PK_HOLDINGEJB PRIMARY KEY (HOLDINGID); + +CREATE TABLE ACCOUNTPROFILEEJB + (ADDRESS VARCHAR2(250) NULL, + PASSWD VARCHAR2(250) NULL, + USERID VARCHAR2(250) NOT NULL, + EMAIL VARCHAR2(250) NULL, + CREDITCARD VARCHAR2(250) NULL, + FULLNAME VARCHAR2(250) NULL); + +ALTER TABLE ACCOUNTPROFILEEJB + ADD CONSTRAINT PK_ACCOUNTPROFILEEJB PRIMARY KEY (USERID); + +CREATE TABLE QUOTEEJB + (LOW DECIMAL(14, 2) NULL, + OPEN1 DECIMAL(14, 2) NULL, + VOLUME NUMBER NOT NULL, + PRICE DECIMAL(14, 2) NULL, + HIGH DECIMAL(14, 2) NULL, + COMPANYNAME VARCHAR2(250) NULL, + SYMBOL VARCHAR2(250) NOT NULL, + CHANGE1 NUMBER NOT NULL); + +ALTER TABLE QUOTEEJB + ADD CONSTRAINT PK_QUOTEEJB PRIMARY KEY (SYMBOL); + +CREATE TABLE KEYGENEJB + (KEYVAL INTEGER NOT NULL, + KEYNAME VARCHAR2(250) NOT NULL); + +ALTER TABLE KEYGENEJB + ADD CONSTRAINT PK_KEYGENEJB PRIMARY KEY (KEYNAME); + +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('account', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('holding', 0); +INSERT INTO KEYGENEJB (KEYNAME,KEYVAL) VALUES ('order', 0); + +CREATE TABLE ACCOUNTEJB + (CREATIONDATE DATE NULL, + OPENBALANCE DECIMAL(14, 2) NULL, + LOGOUTCOUNT INTEGER NOT NULL, + BALANCE DECIMAL(14, 2) NULL, + ACCOUNTID INTEGER NOT NULL, + LASTLOGIN DATE NULL, + LOGINCOUNT INTEGER NOT NULL, + PROFILE_USERID VARCHAR2(250) NULL); + +ALTER TABLE ACCOUNTEJB + ADD CONSTRAINT PK_ACCOUNTEJB PRIMARY KEY (ACCOUNTID); + +CREATE TABLE ORDEREJB + (ORDERFEE DECIMAL(14, 2) NULL, + COMPLETIONDATE DATE NULL, + ORDERTYPE VARCHAR2(250) NULL, + ORDERSTATUS VARCHAR2(250) NULL, + PRICE DECIMAL(14, 2) NULL, + QUANTITY NUMBER NOT NULL, + OPENDATE DATE NULL, + ORDERID INTEGER NOT NULL, + ACCOUNT_ACCOUNTID INTEGER NULL, + QUOTE_SYMBOL VARCHAR2(250) NULL, + HOLDING_HOLDINGID INTEGER NULL); + +ALTER TABLE ORDEREJB + ADD CONSTRAINT PK_ORDEREJB PRIMARY KEY (ORDERID); + +CREATE INDEX ACCOUNT_USERID ON ACCOUNTEJB(PROFILE_USERID); +CREATE INDEX HOLDING_ACCOUNTID ON HOLDINGEJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_ACCOUNTID ON ORDEREJB(ACCOUNT_ACCOUNTID); +CREATE INDEX ORDER_HOLDINGID ON ORDEREJB(HOLDING_HOLDINGID); +CREATE INDEX CLOSED_ORDERS ON ORDEREJB(ACCOUNT_ACCOUNTID,ORDERSTATUS); diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/benchmarking.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/benchmarking.html new file mode 100644 index 00000000..0a7cb9b4 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/benchmarking.html @@ -0,0 +1,67 @@ + + + + + + +Benchmarking Details + + + +
    + + + + + + +
    +

    Benchmarking

    +
    +
    +

    DayTrader provides two servlets to create a workload for benchmarking: TradeApp servlet and TradeScenario servlet. +In either case, the load generation tool used to drive the Trade workload must provide cookie support to handle +HTTP sessions.

    +

    TradeApp servlet provides the standard web interface and +can be accessed with the Go Trade! link. Driving benchmark load using this +interface requires a sophisticated web load +generator that is capable of filling HTML +forms and posting dynamic data.

    +

    TradeScenario servlet emulates a population of web users by generating +a specific Trade operation for a randomly +chosen user on each access to the URL. Test +this servlet by clicking Trade Scenario and hit "Reload" on your browser to step through a Trade Scenario. +To benchmark using this URL aim your favorite web load generator at the +Trade Scenario URL and fire away.

    +

    There is a drawback to using the Trade Scenario +servlet to drive the workload versus using a series of more complicated +load scripts. As previously mentioned, the scenario +servlet is responsible for managing clients and emulating user +operations by dispatching simple client requests to complex Trade +actions. This causes the application server to spend a large percentage +of time performing work that would typically be handled by a client or +a more complex load driver. Consequently, performance numbers are +artificially deflated when using Trade Scenario servlet as compared to +driving the workload directly.

    + + +

    Web Primitive Benchmarking

    +

    A set of automated Web Primitives is also provided. The web primitives leverage the DayTrader infrastructure to test specific features of the web application development environment. This provides basic workloads for servlets, JSPs, EJBs, MDBs and more. The Web Primitives are installed automatically with the daytrader configuration archive.
    +

    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/documentation.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/documentation.html new file mode 100644 index 00000000..be31be9f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/documentation.html @@ -0,0 +1,67 @@ + + + + + + + +Technical Documentation + + + +
    + + + + + + + +
    +

    Technical Documentation

    +
    +
    +
    +

    Documents below provide documentation on Trade application design, runtime +characteristics and FAQs.

    +
    + + + + + + + + + + + + + + + + + + + + +
    Trade Technical OverviewProvides an overview of the Trade application design, configuration, and usage
    Trade UML DiagramsUML diagrams showing application architecture
    FAQFrequently Asked Questions
    Runtime and Database
    + Usage Characteristics
    Details runtime characteristics and database operations
    +
    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/glossary.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/glossary.html new file mode 100644 index 00000000..1c9c5e1d --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/glossary.html @@ -0,0 +1,98 @@ + + + + + + + +Technical Documentation + + + +
    + + + + + + + +
    +

    Trade Glossary and Terms

    +
    +
    +
    +
      +
    • account ID - A unique Integer based key. Each user is assigned an account ID at account creation time.
    • +
    • account Created - The time and date the users account was first created.
    • +
    • cash balance - The current cash balance in the users account. This does not include current stock holdings.
    • +
    • company - The full company name for an individual stock.
      +
    • +
    • current gain/loss - The total gain or loss of this account, computed by substracting the current sum of cash/holdings minus the opening account balance.
    • +
    • current price - The current trading price for a given stock symbol.
      +
    • + +
    • gain/loss - The current gain or loss of an individual stock holding, computed as (current market value - holding basis).
      +
    • +
    • last login - The date and time this user last logged in to Trade.
    • +
    • market value - The current total value of a stock holding, computed as (quantity * current price).
      +
    • + + +
    • number of holdings - The total number of stocks currently owned by this account.
    • +
    • open price - The price of a given stock at the open of the trading session.
      +
    • +
    • opening balance - The initial cash balance in this account when it was opened.
    • +
    • order id - A unique Integer based key. Each order is assigned an order ID at order creation time.
    • +
    • order status - orders are opened, processed, closed and completed. Order status shows the current stat for this order.
    • +
    • price range - The low and high prices for this stock during the current trading session
      +
    • +
    • purchase date - The date and time the a stock was purchased.
    • +
    • purchase price - The price used when purchasing the stock.
    • +
    • purchase basis - The total cost to purchase this holding. This is computed as (quantity * purchase price).
      +
    • + +
    • quantity - The number of stock shares in the order or user holding.
      +
    • + +
    • session created - An HTTP session is created for each user at during login. Session created shows the time and day when the session was created.
    • +
    • sum of cash/holdings - The total current value of this account. This is the sum of the cash balance along with the value of current stock holdings.
    • +
    • symbol - The symbol for a Trade stock.
      +
    • +
    • total logins - The total number of logins performed by this user since the last Trade Reset.
    • +
    • total logouts - The total number of logouts performed by this user since the last Trade Reset.
      +
    • + +
    • total of holdings - The current total value of all stock holdings in this account given the current valuation of each stock held.
    • +
    • Top gainers - The list of stock gaining the most in price during the current trading session.
    • +
    • Top losers - The list of stock falling the most in price during the current trading session.
      +
    • +
    • Trade Stock Index (TSIA) - A computed index of the top 20 stocks in Trade.
    • +
    • Trading Volume - The total number of shares traded for all stocks during this trading session.
      +
    • +
    • txn fee - The fee charged by the brokerage to process this order.
    • +
    • type - The order type (buy or sell).
      +
    • + +
    • user ID - The unique user ID for the account chosen by the user at account registration.
    • +
    • volume - The total number of shares traded for this stock.
    • + +
    + +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/rtCharacterisitics.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/rtCharacterisitics.html new file mode 100644 index 00000000..66132b6e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/rtCharacterisitics.html @@ -0,0 +1,158 @@ + + + + + + + +Trade Runtime and Database Usage Characteristics + + + +
    + + + + + + + +
    Trade Runtime and Database Usage Characteristics
    +

    The table below details each of the high level user operations in the Trade +application.
    +

    +
      +
    • Description - a short description of the user operation +
    • Complexity - the J2EE components invoked to complete the operation +
    • HTTP Session - operations on HTTP Session objects +
    • DB Activity - Create, Read, RC Read Collection, Update, and Delete operations on database tables +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Trade ActionDescriptionComplexityHTTP SessionDB Activity
    + (C, R, U, D)
    LoginUser sign in, session creation, market summaryServlet, JSP,
    + Session EJB
    + CMP Beans Read, Update, Collections
    Create, UpdateAccount: R, U
    + AccountProfile: R
    +
    Quote: RC *3
    LogoutUse sign-off, session destroyServlet, JSP,
    + Session EJB
    + CMP Bean Read, Update
    Read, DestroyAccount: R, U
    + AccountProfile: R
    BuyQuote followed buy a security purchaseServlet, JSP,
    + Session EJB
    + Message Driven Beans (Queue and Pub/Sub)
    + Multi CMP Read/Update
    ReadQuote: R
    + Account: R, U
    + Holding: C, R, U
    Orders: C, R, U +
    SellPortfolio followed by the sell of a holdingServlet, JSP,
    + Session EJB
    + Message Driven Beans (Queue and Pub/Sub)
    Multi CMP Read/Update
    ReadQuote: R
    + Account: R, U
    + Holding: D, R
    Orders: R, U
    RegisterCreate a new user profile and accountServlet, JSP,
    + Session EJB
    + CMP Bean Creates
    Create, UpdateAccount: C, R
    + AccountProfile: C
    HomePersonalized home page including current market conditions in a detailed market summaryServlet, JSP,
    + Session EJB
    + CMP Bean Read, Collections
    ReadAccount: R
    AccountProfile: R
    Quote: RC *3
    AccountReview current user account and profile information along with recent ordersServlet, JSP,
    + Session EJB
    + CMP Bean Read, Collections
    ReadAccount: R
    AccountProfile: R
    Orders: RC
    Account UpdateAccount followed by user profile update Servlet, JSP,
    + Session EJB
    + CMP Bean Read/Update, Collections
    ReadAccount: R
    AccountProfile: R, U
    Orders: RCQuote: RC
    PortfolioView users current security holdingsServlet, JSP,
    + Session EJB
    + CMP Bean Read, Collections
    ReadHolding: RC
    + Quote: RC
    QuotesView an arbirtray list of current security quotesServlet, JSP
    + Cached CMP Bean Read, Collections
    ReadQuote: RC
    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.html new file mode 100644 index 00000000..f10e895c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.html @@ -0,0 +1,190 @@ + + + + + + +Frequently Asked Questions + + + +
    + + + + + + + +
    +

    Frequently Asked Questions

    +
    + +

    The Apache Software Foundation® DayTrader Performance Benchmark Sample +provides a suite of workloads for characterizing performance of J2EE 1.4 Application +Servers. The workloads consist of an end-to-end Web application and a full set of Web +primitives. The applications are a collection of JavaTM classes, Java servlets, +Java ServerPagesTM (JSPTM) files and Enterprise JavaBeansTM (EJBTM) built to open Java 2 Platform, Enterprise Edition (J2EETM) APIs. Together, the Trade application and Web primitives provide versatile and portable test cases that are designed to measure aspects +of scalability and performance.


    + +

    Application Design

    + +

    What is DayTrader?

    +

    DayTrader is an end-to-end Web application that is modeled after an on-line stock brokerage. +DayTrader leverages J2EE components such as servlets, JSP files, enterprise beans, +message-driven beans (MDBs) and Java database connectivity (JDBCTM) to +provide a set of user services such as login/logout, stock quotes, buy, +sell, account details, and so on through standards-based HTTP and Web services protocols.

    + +

    What are Web Primitives?

    +

    The Web primitives leverage the DayTrader infrastructure to test specific features +of the Application Servers implementing the J2EE 1.4 programming model. A description of each of the Web +primitives is provided on the main web primitive +page.

    + + +

    What software is required to run DayTrader?

    +
      +
    • Any J2EE 1.4 Compliant Application Server
    • +
    • A database that has a suitable JDBC driver for both XA and non-XA connectivity.
    • +
    + +

    What are the most common configuration scenarios?

      +
    • Single server with a remote database - The DayTrader application runs on a stand alone WebSphere Application Server instance. The required database software and the associated Trade database are located on a different system from the Application Server. The Application Server system must have the necessary database client software to connect to the remote database.
    • +
    • Single server with a local database - Same as the previous scenario; however, the required database software and the + associated DayTrader database are located on the same system as the Application Server.
    • +
    + + +
    +

    Run-time Configuration

    + +

    What does the ResetDayTrader link do?

    +

    The ResetDayTrader link on the configuration page must be clicked between DayTrader runs. +This link sets the database to a consistent size by removing all the newly registered users created during +a DayTrader run. The reset also sets all outstanding orders to a consistent state. Resetting the database +to a consistent size ensures repeatable throughput on subsequent DayTrader runs.

    + +

    How are the DayTrader configuration parameters modified?

    +

    The Trade configuration page provides a dynamic mechanism to set +the run-time configuration for a DayTrader run. These settings control the application +run-time characteristics such as the run-time mode, the order processing mode, and other run-time +variations supported in DayTrader. All settings are reset to defaults when the DayTrader application +server is restarted.

    + +

    Can you make configuration changes permanent?

    +

    Yes. Normally, Trade configuration parameters return to defaults whenever the Trade application +server is restarted. Settings can be made permanent by setting the configuration values in the +servlet init parameters of the TradeApp servlet and the TradeScenario servlet. Modify the +servlet init parameters in the web.xml file of the Trade Web application to change these parameters.

    + +

    What are the run-time modes?

    +

    DayTrader provides two server implementations of the emulated DayTrader brokerage services.

    +
      +
    • EJB - Database access uses EJB 2.1 technology to drive transactional trading operations.
    • +
    • Direct - This mode uses database and messaging access through direct JDBC and JMS code.
    • +
    + +

    What are the order processing modes?

    +

    DayTrader provides an asynchronous order processing mode through messaging with MDBs. The order +processing mode determines the mode for completing stock purchase and sell operations. Synchronous +mode completes the order immediately. Asynchronous mode uses MDB and JMS to queue the order to a +TradeBroker agent to complete the order. Asychronous_2-Phase performs a two-phase commit over the EJB +database and messaging transactions.

    +
      +
    • Synchronous - Orders are completed immediately by the DayTrader session enterprise bean and entity enterprise beans.
    • +
    • Asynchronous 2-phase - Orders are queued to the TradeBrokerMDB for asynchronous processing.
    • +
    + +

    What are the access modes?

    +

    DayTrader provides multiple access modes to the server-side brokerage services.

    +
      + +
    • Standard - Servlets access the Trade enterprise beans through the standard RMI protocol
    • +
    • WebServices - Servlets access DayTrader services through the Web services implementation in + the System Under Test (SUT). Each trading service is available as a standard Web service through the SOAP + Remote Procedure Call (RPC) protocol. Because DayTrader is wrapped to provide SOAP services, each DayTrader + operation (login, quote, buy, and son on) is available as a SOAP service.
    • + +
    + +

    What is the Primitive Iteration setting?

    +

    By default, the DayTrader primitives run one operation per Web request. Setting this value alters +the number of operations performed per client request. This is useful for reducing the amount of work +that is performed by the Web Container and for stressing other components within the application server. + +

    +
    +

    Benchmarking

    + +

    What is the TradeScenario servlet?

    +

    The TradeScenario servlet provides a simple mechanism to drive the DayTrader application. +The Trade database is initially populated with a set of fictitious users with names ranging +from uid:0 to uid:49 and a set of stocks ranging from s:0 to s:99. +The TradeScenario servlet emulates a population of Web users by generating a specific DayTrader operation for +a randomly chosen user on each access to the URL. To run the TradeScenario servlet use the single +TradeScenario URL (http://hostname/daytrader/scenario) with a load generation tool.

    + +

    Although TradeScenario servlet provides a simple mechanism for driving the DayTrader application, +there is a drawback to using this method versus using a series of load generation scripts +that drive the operations directly. This servlet consumes processing resources on the server +to manage incoming clients and dispatch these simple client requests to complex Trade actions. This +action artificially decreases server throughput because the server is emulating tasks that are normally + performed by a standard client or a more complex load generation tool.

    + +

    What is the typical procedure for collecting performance measurements with DayTrader? +

    When DayTrader is successfully installed on the application server and the supporting +database is populated, you can us the DayTrader application to collect performance measurements. +The following list provides the typical process for gathering performance measurements with DayTrader.

    +
      +
    1. Select the DayTrader run-time configuration parameters from the configuration + page (EJB, synchronous, and so on).
    2. +
    3. Reset the DayTrader run-time using the Reset DayTrader link.
    4. +
    5. Warm-up the application server JVMTM by applying load for a short period of time. The load generation tool + may access the TradeScenario servlet, + web primitives, or use custom scripts to drive the various operations of TradeApp servlet. To warm-up the + JVM, each code path within DayTrader must be processed enough times to esnure that the JIT compiler + has compiled and optimzed the application and server paths; generally, about 3000 iterations should do the trick. + Remember that the same code path is not necessarily run on each request unless primitives are being + run. Therefore, perform an adequate number of requests to stabilize the performance results.
    6. +
    7. Stop the load generation tool.
    8. +
    9. Reset the Trade run-time again
    10. +
    11. Restart the load generation tool and record measurements after the driver completes the requests.
    12. +
    13. Repeat steps 5 and 6 to obtain additional measurements.
    14. +
    + +

    Where did DayTrader come from? +

    DayTrader was originally an application designed by IBM to test their commercial Application Server. +The application was designed around common development patterns as well as to use the majority of the +J2EE programming model. The original author was Stan Cox where he developed Trade (the original name) +for J2EE 1.3. Since then Stan has evolved Trade and several other individuals have contributed to the project. +Christopher Blythe has been instrumental in stabilizing the long running capability of the benchmark and Andrew +Spyker introduced the Application Clients. The Application Clients (Streamer and WSAppClient) provide remote +capability to validate remote J2EE functionality and database consistency as well as provide a remote +WebServices client. Matt Hogstrom has used Trade extensively for performance analysis and brought Trade +to the Apache Software Foundation Geronimo Project. He has removed (hopefully) all WebSphere specific items +in the application and introduced additional functionality for gathering server compliance information +and low-level diagnostic information.

    +

    Where is DayTrader now? +

    David Hare developed DayTrader 3.0 internally at IBM. Daytrader 3.0 updated the Daytrader benchmark to +Java EE6 and added some jsf and jax-rs functionality. The Application Clients were removed. Daytrader 3.0 +was made public on IBMs WebSphere Performance page. Joe McClure is now adding functionality and improvements +for Java EE7.

    +
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.xhtml new file mode 100644 index 00000000..0698074e --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeFAQ.xhtml @@ -0,0 +1,209 @@ + + + + + DayTrader + + + + +
    + + +
    +
    + + + + + + + + +
    +

    Frequently Asked Questions

    +
    + +

    The Apache Software Foundation® DayTrader Performance Benchmark Sample +provides a suite of workloads for characterizing performance of J2EE 1.4 Application +Servers. The workloads consist of an end-to-end Web application and a full set of Web +primitives. The applications are a collection of JavaTM classes, Java servlets, +Java ServerPagesTM (JSPTM) files and Enterprise JavaBeansTM (EJBTM) built to open Java 2 Platform, Enterprise Edition (J2EETM) APIs. Together, the Trade application and Web primitives provide versatile and portable test cases that are designed to measure aspects +of scalability and performance.



    + +

    Application Design

    +
    +What is DayTrader?
    +DayTrader is an end-to-end Web application that is modeled after an on-line stock brokerage. +DayTrader leverages J2EE components such as servlets, JSP files, enterprise beans, +message-driven beans (MDBs) and Java database connectivity (JDBCTM) to +provide a set of user services such as login/logout, stock quotes, buy, +sell, account details, and so on through standards-based HTTP and Web services protocols. +

    +What are Web Primitives?
    +The Web primitives leverage the DayTrader infrastructure to test specific features +of the Application Servers implementing the J2EE 1.4 programming model. A description of each of the Web +primitives is provided on the main web primitive +page.

    + + +What software is required to run DayTrader?
    +
      +
    • Any J2EE 1.4 Compliant Application Server
    • +
    • A database that has a suitable JDBC driver for both XA and non-XA connectivity.
    • +
    +

    +What are the most common configuration scenarios?
    +
      +
    • Single server with a remote database - The DayTrader application runs on a stand alone WebSphere Application Server instance. The required database software and the associated Trade database are located on a different system from the Application Server. The Application Server system must have the necessary database client software to connect to the remote database.
    • +
    • Single server with a local database - Same as the previous scenario; however, the required database software and the + associated DayTrader database are located on the same system as the Application Server.
    • +


    + +

    Run-time Configuration

    + +What does the ResetDayTrader link do?
    +The ResetDayTrader link on the configuration page must be clicked between DayTrader runs. +This link sets the database to a consistent size by removing all the newly registered users created during +a DayTrader run. The reset also sets all outstanding orders to a consistent state. Resetting the database +to a consistent size ensures repeatable throughput on subsequent DayTrader runs.

    + +How are the DayTrader configuration parameters modified?
    +The Trade configuration page provides a dynamic mechanism to set +the run-time configuration for a DayTrader run. These settings control the application +run-time characteristics such as the run-time mode, the order processing mode, and other run-time +variations supported in DayTrader. All settings are reset to defaults when the DayTrader application +server is restarted.

    + +Can you make configuration changes permanent?
    +Yes. Normally, Trade configuration parameters return to defaults whenever the Trade application +server is restarted. Settings can be made permanent by setting the configuration values in the +servlet init parameters of the TradeApp servlet and the TradeScenario servlet. Modify the +servlet init parameters in the web.xml file of the Trade Web application to change these parameters.

    + +What are the run-time modes?
    +DayTrader provides two server implementations of the emulated DayTrader brokerage services.
    +
      +
    • EJB - Database access uses EJB 2.1 technology to drive transactional trading operations.
    • +
    • Direct - This mode uses database and messaging access through direct JDBC and JMS code.
    • +


    + +What are the order processing modes?
    +DayTrader provides an asynchronous order processing mode through messaging with MDBs. The order +processing mode determines the mode for completing stock purchase and sell operations. Synchronous +mode completes the order immediately. Asynchronous mode uses MDB and JMS to queue the order to a +TradeBroker agent to complete the order. Asychronous_2-Phase performs a two-phase commit over the EJB +database and messaging transactions.
    +
      +
    • Synchronous - Orders are completed immediately by the DayTrader session enterprise bean and entity enterprise beans.
    • +
    • Asynchronous 2-phase - Orders are queued to the TradeBrokerMDB for asynchronous processing.
    • +


    + +What are the access modes?
    +DayTrader provides multiple access modes to the server-side brokerage services.
    +
      + +
    • Standard - Servlets access the Trade enterprise beans through the standard RMI protocol
    • +
    • WebServices - Servlets access DayTrader services through the Web services implementation in + the System Under Test (SUT). Each trading service is available as a standard Web service through the SOAP + Remote Procedure Call (RPC) protocol. Because DayTrader is wrapped to provide SOAP services, each DayTrader + operation (login, quote, buy, and son on) is available as a SOAP service.
    • + +


    + +What is the Primitive Iteration setting?
    +By default, the DayTrader primitives run one operation per Web request. Setting this value alters +the number of operations performed per client request. This is useful for reducing the amount of work +that is performed by the Web Container and for stressing other components within the application server.

    + +

    Benchmarking


    + +What is the TradeScenario servlet?
    +The TradeScenario servlet provides a simple mechanism to drive the DayTrader application. +The Trade database is initially populated with a set of fictitious users with names ranging +from uid:0 to uid:49 and a set of stocks ranging from s:0 to s:99. +The TradeScenario servlet emulates a population of Web users by generating a specific DayTrader operation for +a randomly chosen user on each access to the URL. To run the TradeScenario servlet use the single +TradeScenario URL (http://hostname/daytrader/scenario) with a load generation tool.
    + +Although TradeScenario servlet provides a simple mechanism for driving the DayTrader application, +there is a drawback to using this method versus using a series of load generation scripts +that drive the operations directly. This servlet consumes processing resources on the server +to manage incoming clients and dispatch these simple client requests to complex Trade actions. This +action artificially decreases server throughput because the server is emulating tasks that are normally + performed by a standard client or a more complex load generation tool.

    + +What is the typical procedure for collecting performance measurements with DayTrader?
    +When DayTrader is successfully installed on the application server and the supporting +database is populated, you can us the DayTrader application to collect performance measurements. +The following list provides the typical process for gathering performance measurements with DayTrader.
    +
      +
    1. Select the DayTrader run-time configuration parameters from the configuration + page (EJB, synchronous, and so on).
    2. +
    3. Reset the DayTrader run-time using the Reset DayTrader link.
    4. +
    5. Warm-up the application server JVMTM by applying load for a short period of time. The load generation tool + may access the TradeScenario servlet, + web primitives, or use custom scripts to drive the various operations of TradeApp servlet. To warm-up the + JVM, each code path within DayTrader must be processed enough times to esnure that the JIT compiler + has compiled and optimzed the application and server paths; generally, about 3000 iterations should do the trick. + Remember that the same code path is not necessarily run on each request unless primitives are being + run. Therefore, perform an adequate number of requests to stabilize the performance results.
    6. +
    7. Stop the load generation tool.
    8. +
    9. Reset the Trade run-time again
    10. +
    11. Restart the load generation tool and record measurements after the driver completes the requests.
    12. +
    13. Repeat steps 5 and 6 to obtain additional measurements.
    14. +

    + +Where did DayTrader come from?
    +

    DayTrader was originally an application designed by IBM to test their commercial Application Server. +The application was designed around common development patterns as well as to use the majority of the +J2EE programming model. The original author was Stan Cox where he developed Trade (the original name) +for J2EE 1.3. Since then Stan has evolved Trade and several other individuals have contributed to the project. +Christopher Blythe has been instrumental in stabilizing the long running capability of the benchmark and Andrew +Spyker introduced the Application Clients. The Application Clients (Streamer and WSAppClient) provide remote +capability to validate remote J2EE functionality and database consistency as well as provide a remote +WebServices client. Matt Hogstrom has used Trade extensively for performance analysis and brought Trade +to the Apache Software Foundation Geronimo Project. He has removed (hopefully) all WebSphere specific items +in the application and introduced additional functionality for gathering server compliance information +and low-level diagnostic information.



    +Where is DayTrader now?
    +David Hare developed DayTrader 3.0 internally at IBM. Daytrader 3.0 updated the Daytrader benchmark to +Java EE6 and added some jsf and jax-rs functionality. The Application Clients were removed. Daytrader 3.0 +was made public on IBMs WebSphere Performance page. Joe McClure is now adding functionality and improvements +for Java EE7.

    +
    +
    + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeversion.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeversion.html new file mode 100644 index 00000000..38be2eee --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/docs/tradeversion.html @@ -0,0 +1,24 @@ + + +DayTrader Version + +IBM WebSphere Application Server Samples - DayTrader 8 (Version 8.0.0) +
    Full EE 8 Spec Compliant +
    Date: 20180417 +
    Contact: jdmcclur@us.ibm.com + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/error.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/error.jsp new file mode 100644 index 00000000..988ad2d9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/error.jsp @@ -0,0 +1,122 @@ + + +<%@ page + import="java.io.StringWriter, + java.io.PrintWriter"%> + + + + + + + +
    DayTrader + ErrorDayTrader
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    An Error has + occurred during DayTrader processing.
    The + stack trace detailing the error follows. +

    + Please consult the application server error + logs for further details. +

    <% + String message = null; + int status_code = -1; + String exception_info = null; + String url = null; + + try { + Exception theException = null; + Integer status = null; + + //these attribute names are specified by Servlet 2.2 + message = (String) request.getAttribute("javax.servlet.error.message"); + status = ((Integer) request.getAttribute("javax.servlet.error.status_code")); + theException = (Exception) request.getAttribute("javax.servlet.error.exception"); + url = (String) request.getAttribute("javax.servlet.error.request_uri"); + + // convert the stack trace to a string + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + theException.printStackTrace(pw); + pw.flush(); + pw.close(); + + if (message == null) { + message = "not available"; + } + + if (status == null) { + status_code = -1; + } else { + status_code = status.intValue(); + } + + exception_info = theException.toString(); + exception_info = exception_info + "
    " + sw.toString(); + sw.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + + out.println("

    Processing request:" + url); + out.println("
    StatusCode: " + status_code); + out.println("
    Message:" + message); + out.println("
    Exception:" + exception_info); + %> +
    +
    +
    + + + + + + + +
    DayTrader + ErrorDayTrader
    diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/favicon.ico b/src/test/resources/test-applications/daytrader8/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..beacc1826a0500816af7c97b8dfb3a2f25d4deaa GIT binary patch literal 2404 zcmbVN4Nw$S96zN94a!mroIbX-sc_ia-TS_sE(h*NNYCiJ1}qxb+kJOz-rZii%V#qh zXpGv2m4l7;U6>AtAv0Qr26jk?s3;ObVDh12D2hZ`V%gi{yr@xgdNX_XK7Q~2@q54b zf2-0K&Wo8kYpOz_h)GSc*x)}Re^C+e*HXT^QK6XhO4_2eM?>~KZ=y+-A zNJ~r2_U)H1UD{`)^7Hfi%igW1s8Flb7cN}*sjAB5a*ejP@7dc}TU)zw<;w1&qG{8n z9sQwe{rdG|qoX@^?mRSO_Wu3*t2TUqqUg4zC2g6Rhi$fBy1L5B%FdlTcc!MMRcGE+ zzvp1Vvaz9|14&6u>DkS5bnOf?v};$>2cL9!JnfBvLr2=m%ggO{duR8LhdeYv)#T_Ri znLmGUaImeTbJxaAn<^_W_V#vGe$iXKeQ{=Hmpk`V`Q|fyCj)P;eVx=Fdu7GGjhmYv z#0ERNdwY8uzNqmhE$B#Dv?wF}NJnS?snY|4XHT9UJl=nz_4}iZ`&qt`&wGtpUrMP+R@*CV)ynh zcklVOzP|qa$Y_&V4G-eVl`Fr`vGl;+6kp0>QK7hfy8KO2Y9)+ggAhU^P14}wRI@Mu_iQKYbC5cGsxjmiUhEzXrY}c zTEZAvbnX+#;{_Bn-~kei6nNZTkt#5uLAw;}%hNcD1R>HA6PhSHL^7;th?y4vqE+fJ zhSU&<-l!yXghopyAS!~?emtCdRiiW2Q*K&r)rLWYza$5KGA0!D|%fT{E> zz%*Ke4x^n8C&sD)V4WmOXmsKI7M{tKbs+B_zY;9ZKpTIDr*~>twbp3BNR3gC=^Yv^ zW?)GNre}48+F+pdqy}7#=4pY0w~}^Gv?@o%LW?ZxAV`KFFq$BBn1)d6F^A4bVg$qJ zRa#mL)PzRXeo#(S3MayYE)3nKMc}1S&&?r01yM93-wYGV$dUjo8k**=!N*N`4(-p+ z0nq3TR5I>eV=Fw$Sx=W(?0iU)QoCt9Z)vrMHe{ z&Fb0KN1bW8vm`oU%}aCM+F5z|z2f4x<2FrxbY>)M>z>LSX@2OSe<)?$AJNg`fQsmg z-n=&bM-|a?$L6)~&q`l$A!FOCtCqyHJ!0pVf}Ll7E-6lI$a|zaz9y>k;t}JFWv}I@ zS4DSUdVbPYMe5ij>s>LCk&U%?-kFEZ}hHROB zPhe}whT+$&MISaSi|V>O_w$nex`*%o=8yHu5BL+-#KjuwvIYt-zE_+$vvTs{(wL{>ZYVEZ>cVCU1MHXTwMHWZ+qpvpSBFg8%Azhqlt)U)^^tYb|Nlz + + +daytrader2_matts_mods + + + + + + + + +
    + + + + +
    +
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/header.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/header.html new file mode 100644 index 00000000..c70149df --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/header.html @@ -0,0 +1,96 @@ + + + +DayTrader Header + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_blue.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..497456420c5aebc2250035cae32764b585eff08e GIT binary patch literal 3908 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%0Ag+PabZ}@XR zSBg{khR~=7L|6!(D3uiXgl6c3htPaAseoNcl>uml@HdulXO=yPmiKr5gL)v1MOb}d zCyms%hC-K@Znyxin0}Hdhi-70n3;=jV0Bcbe&k2m~+y#0i6Ch@8YJeoH^892?r3SVmhW|TBc@trf8a`YI>$wx}|RVrf?dkayqAUTBmk;r+AvDdb+24 S+NXZ{r+^x$g6ar?0029a8aavp literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_red.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/DayTraderHead_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f05eec832600626a88ad5adadbb1b32478ec92d GIT binary patch literal 3734 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 AEC2ui literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/Thumbs.db b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..3b66be0e67aa8c8bf6f4aef3cc69195e16460c7d GIT binary patch literal 51200 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�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 V?e^Pn$1V5Va-*OC2^|Ci06T$ovQYp4 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/account.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/account.gif new file mode 100644 index 0000000000000000000000000000000000000000..a98761b1aae8e5b110d4ef403676a9b9a68881a1 GIT binary patch literal 2241 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowdown.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowdown.gif new file mode 100644 index 0000000000000000000000000000000000000000..11012117442d84082d04d7bff0abd57329a96c8e GIT binary patch literal 197 zcmZ?wbhEHbr9(_!#DGE2sga$JMWtcJg2rY}ZWV_q8x$TkFtc*b QDfywm(9F)s%*0>~07v9IIRF3v literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowup.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/arrowup.gif new file mode 100644 index 0000000000000000000000000000000000000000..24b6c53f9882c78b47167f89b11162780d000fdf GIT binary patch literal 198 zcmZ?wbhEHb-7-jVY9>l^cR*514PuD-ZwwA3>9 zX#T|WGu&7Co_cmsd4X2io}9n`{^@Se{r~?zP&YxK_>+Z^fkBu-2c!~YCj*BwgE~i# zK!YPoBZsmGQ1sA2PC*`-gcAV`jU0R&0ZTj%I5M$wnaO?7*l^H|g+qPDk`AGVUTwPG R^L#iRn|wLBS=d+@tN~CqIQIYm literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/bottomRedBar.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/bottomRedBar.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814872dfb7f74daed5fbcd63dcb39fe7ed08728 GIT binary patch literal 108 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/daytrader_simple_arch.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/daytrader_simple_arch.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d9bf60e64334e4fc962359944e2cdbc3e2b82dd GIT binary patch literal 43988 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/home.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..a74e60de55e6a7506f1894883b4c7f7ca5e20837 GIT binary patch literal 1185 zcmV;S1YY|`Nk%w1VO#(m0OkMyjFOSIxwv$HeR6(#a(#Mme0ia!rInqVlbV=+iHC7~ zdZ??btFEq>ot%V>imk7&m7AJ~kdBLzk%o?pjg^ygu7Sq?(_en4O%DmXwv6n&05yl9-p7o}I+T#k01x%gxPqf`7cezRb3hmVblk&ktN ze#FMcsVkC>pIgN=)JfPRjYlZ%v+aC>-jetVFYmX4Q}gpG{&`1rfMyoiyH z%FoV;laZvTrl_i_oS~nWo}IP0w|0Slu(h41ejE#=LB>d;S&K46l&<9h$gD&p)<^|sG=~y@aUwJCQ3&XgX*E_rkr-_ z>8GHED(a}DhRVkigW{p;s;su^>Z`EED(kGY#@a_0J}E%QuDtf@>#x8DE9|hu7AtHD zYxqAKZ59?YH2DEAF`DmTT^~0%(f?5|gy+?z`|x zl7t>U*|5jG_~xtczWny<@4o;C>@NWc)Emda2q&!Y!VEX;@WT*C?63j}1Ofm%n9y&M literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/homeBanner.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/homeBanner.gif new file mode 100644 index 0000000000000000000000000000000000000000..775318ab900874d375995087cec0ba439a7621a5 GIT binary patch literal 1184 zcmV;R1Yi3{Nk%w1VWI&N0D=Gj0001H0L*}ZfWW}O|NsC0|Nj6000000A^8LW000F5 zEC2ui0HOgB000R701F5lNU&f*0tgc-T*$DY!-o(f8k|@FfW?a#Giuz(v7^V26b*hH zNwTC#03i#WT*=a8N`ft8%GCH$;K>3JbL!m5b74i30fGu0O0=laqeznmm}ya|)2C32 zG6fK|s@0=YuWHqL^XJm9D8p8)*t4wJvj_nQD6qDz+5iIJe%(qJ>f5+@+3IzRS1#4M zfRo;p+jcM8!EyfvUQ84*T*G_`&t*(`Y2Uns*P^TlcB#d&VF92WP5L3q%xonKP+WO2 z)yrxjr-t2{@@vAeQD273x^~^$cysS{yxO;G)xzD{q{@6LXwaiArWIW}x^C5zi6%5I zlmJrVvUmO`F1qlk_n_Ogdq-$je0c1=1C)1qUOs#E_S>s|zdJtuzzjJB9%`F4$J}RP zNr#q#3RZX4X~T)1src1N;sl|N`+Wqha_6q zn1+yX*kXNjr8S+5U%|HFa-Agz-GbCHc+rj;z1ZM_*Y#(Vj`gKSVRzfz$KFF&x!0s* zFrs&!LKHd_rkDARY1Dv_!8anAV@71=m0wEPn3icenbe0~epnuu4Vg%1VFd<>AZXM* zn9+*^3?Q9Fi889Fqf43vVPv$e=puFYVd`N*R6)69i8K0Gql*8*`Du|wZknH|m`X)s zX8tyoy55Tl8R@B}vu4_AsJNww+>Jx2y6L8=z9`_U!vSgFb74gXK%=5Dim0thVl;qt zb#nP+g)VxQUsG0cnrXNgp84lqYN{tLxfN!*YP(Rr%jTT>ZP^!$>&AKMyPa~IYq;jt zo9(^8QrT~-wT?S0k3pdcs7-!HQZ zVoWt@$<3y%dPgb^^Up0S9p;1%qid(ivhHiD!tw$=RM~B%i}u`M^ZfF^aRz)D{(oD8 z7;@4G@4U8v=V}JAfrEx7HLcY`OKe7oa*VRaI2&CkbK(}7G^YT|JTtPC68+!IwU!Gu zr?@Vau&Ygn9^9I5m)>sMwWhAQe>7)ZGv!AGSi9!43Ol<}x&QbySj>`zR^$XQ-~7hR zM}Mux*J7KQ+;1z^RL%{9iqXs(buYeDg=48cD8xw&cn*pn#X5E~?rf!a6cn8WF9^EBq-=v% z!QkX7c)`^LMubk=9`d3_q^V@gdJ*ayl_aiVbCSOD?e2VOD%&9s<@djV z1@KNnEZ29+*Fdl&?k7o%qG|Z{IuLTDgK;CF743pW^YLbjA?)G@!Du2Z7RV)1Ok+ZR y;=(q%@r`hdqa5c*$2!WfCV0%F9{0${KKk*GfDEJ{2T9068uE~cOynN}0suS7#!V9d literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/line.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/line.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cf9e512ea28699b6261536af00453481e224926 GIT binary patch literal 2346 zcmV+_3Dx#TNk%w1VWa^D0Qdg@b#;5Kti)DUaHFHFgM*26b(NEonbp+tT3Tg#dYh!A zx|^G%O-+N1jk85YSW;4qoSdy&Tbr@6%DcPNV`FSWLUDqErS|szm6oD4HC$|Lb38m} z+S%t-RgsL0lg`fJDk?|v^7@vQz0J+q&CTg;ZHaq(g6{71-QDWx>G9>|`o_l6)z#wS z;_6yjbl%?P%F5=iueILZ@_T!V(bC=8+V0-o{i&(B!NSea(eBF1*45SNyuH?4U1@c7 zgMx#S<>l>)im#rYv%VRsi&v5 z($d+#zr|x?X5r!X+S=jN)aSy&-LJ*4@U&&8@AouCBOBN?y*-)wZ?4R8(rczR%j)_{PTJsj0Ks+4s=U z+{ee+(b43xvc2f&|7vQ6X=!f2z|6nD*FT>`rO>)*VpUI%-+1a&9t+>FE39fCP3TU=#P)Jz`)11x4pl=(ZImm z$jIB!(AU@4?DXH@|3N`gM@M={NPAyjcxPv8XlQd#P>5Golvr4nZ*Gim zaE^$Gk%@_&h={C{le(XusHCK`r>L>3tFf!AwXCeSrl-EEtGlzaxwW*#w6w*yxWl`< z!MnT0yu8P^x6rw{(!;~b#Kg&n%hJQc-o(V;&(GV`)Zo|G-p9w{ z&(Px7*X7&W;@H^i+}!Zn+wa}n@ZjL};Na-w+|sN`1ADp^Yi=k z^ZfMm{Qv*|A^!_OL{CCRI!RJ7E-(V#?EoS91OWg5{{Soi0001_0R{j72>$^8As9%o zpurvp6Dp*@kc`8J4mD`VLa`!606sEm%s8W?$BvdP{TN9S6sToNQmRaep=C=)Fdadd z2|n>PPEc_Ku?69qtn3I&R(S~X0V0w`U|RH=lgP@_Km)UE0SZxga=oxp=fRy|^XCr*1cIbYTbvoZ(+bCLANg59C-8QJ;1lG-vhgL9f%`Oo*Nr+4%@JyYVqPQ zjw46*r9y?|%V8j2w&BK&VZ!nV{~gU&uU@;T)T6>(IYM4=aWj$_$S~`)!bmzfd^t?R3}(;(uo!hI*3gt*ErY( zR9}1{Muw+k=wVj2*wV;236Er5uPC7Dv;NqimtZ0s; zz0pc546z3xq4~0+5so z#<}Q*63R5}PIHF4)5I{%A@o{f@4fh1lMN->^vguQ0Q1pr6#dddOE?IJ^G!J5gi}hw z;gmy)4mxa6PB}V=LNOE@%i(b(9)~PP8FHw@i94KdpfU&Utn9MND9|IbJuTS7i_G=N zJhMId;Db*JDfA+AK0+5=G%Bd@(~Cb$`x8P4{_x{ZKTTJCfj?JQt@YOXNd0uv`uL+y zFQ^!8Hqk-{eGfkQ=u8g~K+tpZ%`Lc1kIFB&yvoW{Q2(JaC%TMGvK*0sEJrRLLy-%| z6lbgh##=OAjyMUIQp&>L3^4@4w0xrt!2pM@&A*gTl1(j?+-pd_^d1tgyzaisE(VqW zE5#DH=dL^M(-kC%uf<|V!LiFO`z*B4PAjdo%xmjBeBNTfZMfhrQ2n^!(&P-f=NiF1 z7~cB_4ZCnm6NohIqJhRV)wpYvHH+L^M;+F@VvU2fMA)wv{P(+!HrxmxH@@(VFCZ)r z5UX4%NVI|#kYgO=z*yrbh7LwBqD3RfL?%MEL6L zvJapP)0<-$Lo-C6iE?Vo1Tc+hOkqJ& znu4IFIL)a}GXRSW`1Geh{pkjVO4JMx^{7ZC>PR;*(xy7~sZfn-1%N@-s!}x=M+gR1 zwR(iEdey582&-7fO4hQ5wHRnE#sk*M*0#F!tsRJ~T<1zxW7yRgaW%#<_R81265_9b z4Xj`z5CK9ERIQuJkAMIGJNq2>5&!@I literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/logout.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/logout.gif new file mode 100644 index 0000000000000000000000000000000000000000..e31a6a11f6b36c46949204b1bb13adb42980bb1a GIT binary patch literal 2191 zcmV;A2ypjDNk%w1VUPeF0EPenA0L3Wk^uh81Cw}lhs>Wt+cf7czD15=#T!` zM4zDkJUo?$h}i!2){~R82Og}%E{`cH$Y`gx{EYQ#XO--W1!~Wpk{`bWIt*!9>_~UeR!!0d}n3&xD z@xA`g8@s#yjEw63;cQh^s;`UyW@fqm?4thOT%w}zMMa_T@BW>g@c!33)6@QhgxTZc z{x&v|{^Wa$i_`!A{{R30000000000000000000000000000000A^8LW004FXEC2ui z0FVG3000R705J#|NU)&6g9bm?S;(-V!-o(fN}NcsqQ#38G01S>Ktsol8bXQ;*`=gO zlVLs}T*U^V{S^x$y3b)pFf2TB}#w*6DCQSK9!?Ii<}x!FWjYzSIz~yex>TI zLHKTAy?W~wwwpL_;Khvh0@nMuhL*mRGt>23*D>D4mNyR$>~~C95M#-fMH^Ho+qQ3& zHuZa4ob6zI-tgzP|nY;p@1-e+5nu@;Q)jUUEGx*Vp4e2Q*dMn`QSmcm95;^0N1~A|P7E2nbWRN}@aYT7CoG3*a19a)- zmtHp4mQzw@!2lL!R3YOSYtG1K79Pl$0S#u5idK?4nK z>Pf?&fO;|Ln|x-Vf(m%HDJi9SW>80+fYwpRpnAF~Dx7;Bab*rNNRetzW04?(4E|O` z5CI4|EP+9b1TY1bX{J4CKoz_OE9@98m;oUJ$R>+M3&9q9ECW+8;Di}2AS;n&A`KqdFocC(1vgUxnfkdtF0a(NlckZvm zjZtvG0k?px3ocY~Xcbs6j71Ai?C?ayPdag^4_Kht@e>9=VTP0E9y$cZE{IDU4bU<` z1Hu;6__7XYq<}^h8+cL05CL0!@XsMXK?WHZEb*$VQt-q=tM|$p!M?5an?}&YVPQZD zJ|L`hz-%~ah8qaGQ70BotlY5~SqDsm0c;x(@DNX8@iM|_cntOv7IZ8({>%)UF!vKa z;Jm@sgclx197VsHr3__EpvKZ;DK0D22l_k4f0$d1HRhaiE`rxSbRNVIZHo{D8f>TF zM(0(e&^qRvIw88)2B7^PopsW{dES8P{+|yqc(H-##1|ij1w~t7h2lRs4!NqYKF#6{ zOkK{o=Ajq=AKX^QA-V-ur=YtJ=~f|n;8mFaU)$Mtp1S(rr{IM5m|K7@{Xqo2!SLGm zAA|)wNZ#^Z#e^F)jwh{xUJeWtlmvXhdYQYL7yM^|fmuLwLr7N&yobIjtd4W(+aKoM zH@om;A%~bgX?xS#3#f-aDyX`7s7Y9w_VKuIv7tJ!e;@5`JjbEY+d>a$3}!5 z4g&(Pq4KQo0RrgoCkRZ93<~rU2WCNQ=W<=((BOn=amoxU15}{G_yiqHi)|tZ*amEt zz6Qj>3$EJ$6teh)7C0ewJRpu6e4xlG1WX61OFdoQ)+Ae}K^{OscpGTeA(IJBF9_>T zZL3|H+Exc%@xV^Wbb-6pIR<#;QkQg0Kre~XydJ7%MNIzqK#n}Xr!hb=eN{k1&E!`| z1F&ff9>@R>QlK|1q<{x{Vp9bsN(5_qp$=Tg0uQhmQ8v|qp&c`#7cy|rh_=#BBPBxm zQt&9SK!KYSU{?i7O4EpDVWy_aB?xr+fi%3umj(!_UNZm`3P6M=Kw+glFsoeWsv#1= zF$WRAD?A5yA_1WYIXh89J})2vI28796Qf z0|7oT9sC%#02{y}6gm(B<2v`b{vnS5mXO=L^7e*D)6#%gkWbnO=exau19-Ejel+9-P;uSHvAp%esiPX zzYzGo5VlQ%5hLK*&}Ixfz`z!!n_Il<6~4X|(5l8V+zarCt|->fiBrttvVsf)C^*9z zia=u;2jIpxR)UU|fP)?5-~>Qc!v{uSsv;Zt$Vg7Il9$ZnCOi4bP-b!vz(nOLTX_Hq R!HAZ(%;he7c_IM;06S_;A2a{} literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/lower_banner.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/lower_banner.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c7c294d93d4d6fbb71801af25ce0151ec59c28b GIT binary patch literal 2378 zcmV-Q3AOe|Nk%w1VGIL00OkMy5_ZA>22lV20DpgfW@cvL;o+H?nbOkIGcz-^w6qTo z52dB0%*@Q~?d{|5_z4LKOG``e@bCr(1|A+B$;rtlCnxsy_T=Q`-rnAdii&u6c)q^A z3=9m1hll+9{B*9{V`F2YqM|J=EvTrddwYBH^YczlPJVuVtE;Q=_xo&YY;tmP0|NuR z*zT5=miPMoJdVvaHa4!Vt}rk#x3{+)e8pg3V4R$sZ*Ond*x0Gf>G}Nr;O+O3z~k!b z>QPZq=jZ2CR8%S|DviD3Qk&B}JUmxdS0p4P7#JA3y1K)|!#_Vi(B$)JX=$IIpMSO9 zgoK2c!{q$^{)f8Y%HZ)55)#$t^qt4%`T6-36%|EAMKg)ZCW6NpdBaDQ(8k8b-t6{7 zlh1W^bx24^LPA2s-SFGn+dq)aL6Oep@cAo+$g$Gvg0|lpd&FI$)p@erF^I~LkdTv; zlQxUXpvdR0(CS@XUANWjV58O{AtCAV`A?bBE{4g;Gc*7H|MBzmA^8LV00000EC2ui z01N{<000O7fPI34goTEOh>41ejE#70rqYo4t7^J=`UJxj*y`19=0xCfu!&AYeC)Q?}cj$K*v=HjJgx!uveqf4KTF*R(~u5HuKE}Q#x+S{FnhEBb_`SS;@!vV3^wTCgAhh2p@jGyXyJtiCOF}S9CqkohZSN7 zR{$W9I8Oj3K9r(ACa#!{ixI&X7GrLarQiU?4WJ{AIo_yakBspcmq_+W@4>V%^I zjOsASWH(E46XiBjQu(AdD7teclv#qaWjjlD$9@T#rKXSR{^tR#s?`KpHtAl1bi_BAn~E2;-wzQd#MxXqIzkljczR zO`7yTIu4uhoC&I>n0g5%Ii9{LlALy_K}8B~c}3ijPJE0Kb!Bq9|tUQ%{R}CZp-1AEa|#D*F3M9 zI}eR>&Ow6&s}6o#(N_;%G(4omMNa+W#0v(Cb;b}LyKzh%|L*(!S(Zp_lA zobHok`>S%>_|6Qo*m$3eHreM+TXv@E2E8)M?Vb#9-FqYccSmxD!Pp#q@d1O>TML@C z!@+7@HP;M!{WVNQ-%NAbc)Kib(L%c%cY$en0r8>YtxJ`uiT9cdD`Xj()bz5?(U6^823r!uJt5;i?77qn-jeXT9s?WKx|H z2%H4w8wyHAPK;T@UZy|=#=M{h8u9=N;y{2B4nPThI6w(kNB|A^0S7ExfdPQPm=ZYQ z1SMPn3L@YK3J`z<9w?3l2ylT05YdPPD8PaWP{IcIp#TP0K?zSlgCP2$fev((xkhEd ze{|6_DEo?>q~Hex?xhAh@Iwz8W&t5UzyNSGKn6IlfCM}sj&NLn9~7VhJmTO16!60g zATR<3Fu(vo5J3bMPz5AFp*Rr`zyS&%NlI3L01G035Cl+w3vgin1vFs51`IF*JJ2YL zs7$3-42ZnG;OYYnTL1?vpdb*KAOQ+skOC5*pdutu06r*=2NWQK1x!E*64*dxB00%Q z3Lpd$P-0~YAORF`G6WS+5CsI_L@cWEo8UBxoS5c^Gw|h=4eLNQ6?6eJ;8K^oERG3m zkc0;;r~(EsrXMnZ1RDB*nUrj10ki;u;(%Zblq|prw4fkL=HQCqjHpDJA}2I3CJN{D z11uBNffzI>0TN�dBCzcrxYyS#ZGua;YE@sB{91fdCnT2vBDhfC3W00Any90SY8k z1rTVcBq2J{q8e2wu)2aDb}%`;pp&B>eIi+wU`IR}K$!~vI06C?@Bjhu(GM$KkW2OH zhX&+<1pjoVK>c8Xg8BgjK}~2Af?Aw_67{Hf%_~k|)rLFx0SpYw%TxW(0TC=n15{Bkp8gc}4bV60} zsK??~rU)9azyyM@0Yjny0u``;bNyh18BCXxCzSxFXtm4914w`b6foosj_`w1miNOT z_K1eIO5zfmxWtT!KnPeU241RAq%Oq40Th%08I;ukEX;rtDd585lt2YX46+j$lYtIY z#)wYL0Tfsmg5Qca#88g%z!pg5DtArFSk7`oYQ*I(d-=;X(z2MxOy)A1`OIievzph; w<~FLP3S@!`p}5>O&|aOJNh|^hX4Qo literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/menuHome.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/menuHome.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fa03dd0b7428e90169cb5f5b606b06c8fdf2f51 GIT binary patch literal 2096 zcmb`Ei$BwQ1Au?Kx=u^ACStmrgE;SMrjnB%jYjTmE|D`Wa<{ZPuS)O6tc$tjl3N*} zBDIJ_YK(nHyz32Q7=lKJk&-3{_2b~=E>qcvzUl@kDdVFG;N?{w8~e1VXcoNXKFfo^t96ZyptN*`Mk|PlYF>U0t*n5H7sqPS zpfhJWw{I6T=0Kne2i_-VX3hr&R)eXm3-LW*(53zn0E@%6wz-j!jiA@O`_*5y!-`R` z*am^6aaY%pqM{iv*Cdnu6{#-}3|3VEFcwLrrr#Gq!NCpSLkSoOn4JOO&Ay%JT_SEy#8Pwp+9k!Z zi}13G{J0xS*vr3$=JJ(k9Rr=P1|F5%F#WbZv>vnXUN=6siCh2Uq zW=YeGobvW#WC9H$!SmA(aoT zeTrOF4Y!9L*%l_u**7)Js|IQ!M!T9C7iSc;V8?BHJIC;ePJTuF%J4LL7P1$R#n;u+ zmdC!RMvVe5Uo)HNm~D>hn12`$5m7sta}IAgrAS;Obeyp~0D{v5TZ| zUq`*kcrq&-lixOYwhPytwb6@?uoF=_>1>ftuLnwZ=U^xsMYXX@NTU+swr0=`!;W7) zX!a*NWxti)`C#*R<7*L1R(h19^VB^Z&6B4cvG>fhx@;DXXg!h7|b;Dq~+U*qKh+_uU{ zg5|`OAiUj_NtBklz_=(~H~M(7UVqc!LxW9&)IZjOa+!j?Hfs=MVOgSJy!y7@SZ507u* zHZ#7rwp)@5G3oBSVLs79WPq0aFvC+`YL6z*{Lvaehr#T>TVb}=CNJHr@!ozYCgO8= z5Jl#)`{RABUr0eP(VZ(I_o|Z(THAv}&72J$9xJUcR_b`69j(DT%{2~?MbcgiExkR@>M_MP?LQ2=I3QQtbQGH9n-&y2Eb$o@CdM&k&L>K4feR-CzN~0_&b_!u|}Y%g+Na z_D3Fq7p;l#qWEi>)SH~o`BJRY_8uETstAjfG9!9h{GFF=8D3)Zkhz~k+ZNYE5JGnH_k7IWU+`@tsW22Nk4$MtZZY_XtHn0=Qysq}eV!MvAGtq2N^@L`IP zcb?W(9dC;``r@0Bt_FmU5S519Izy2Y({E_2MDl5*@3!BxP8cO|i-%YP>HE02ZnAgvptIeh(sl}^FrjXcf?zBmKq99N({_M{ZKt+_6i&u?(6evg zNrUkPJm}R|@Z=k4_6eM_l=UDsna=zs-}n9g&f9M1@!`Rp13?fD+by%l_Z(mMZd~F2 zk84Ha+ilhuvOXQN1&)YNbE!>0+s6~qBiLO&|4yoca8>jMLpHRYB8U1CPBBvAhny`4 z)srN|&Wtc%lZh7?;;%1XMc}!H_)N1DE3A{L*IGrSzv>K})y%25;>kl$O%NCG3Bw@q z&w>~whPcs1{G49PBG^FK%n&bv8d_aYrx5{~q~sl?q<|8XV4~f?hH4(_ zsGuT60ozaH-XeF5dS-L$i(7^`Wh_LpyjU!xMM0v`M23}0CDl;XJV)f?Wx#Nf58~rY z!6dO0c_H&?08&M4(>XIl9_d92ez=nj;%%9D!Q=#oGL)1wr3`3U|A+ei4jr=|xs3Op z!tr1k61hiWI*%OQxbbo7Dn#{&U`C?>rDs_cyHm<&Jf$J1_cdT)#|u(>gSRZy4q}D_ zhqO&YAB(n^EAwFFw6T9RI=kZ2lOA_t%Z=UOlYmcq z#K-#6>Cu`$iMwsHHb{Qhzt7KY+jU)gH2U`B-TmwDZ@$T0yCu9n&9#26Uw%kmPrK1E JKR+71`U5hrAb$V= literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/portfolio.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/portfolio.gif new file mode 100644 index 0000000000000000000000000000000000000000..637f9ab9d532ec212d9d0fb56e89a8d97f17720a GIT binary patch literal 2273 zcmV<72p;!GNk%w1VUPeF0EPenBO`;hk^uh81CwiVtAF2u77%;va;{~=#T!` zM3R!zdwa{Dp#EE1t^W4bMMa#Bj?ZanxBk*2%F6zellA`IW82&Q@4o<#imAWA{;aF- z{`lW=a=tP$j{fbbf`ZNd&=-1n#K6D)nws2FQl^cK_0HJ{ZcXOt@ zyZ-*_oc`QZqoeO*W3%e&{%~)={?#82Op=n>etpwkUa|i7+>49TYiqmy)GW}?{@~yK_r(B{j;zDO{;aI<{`li_ zbHg_`k^b?$gM-!n&>Mn*yP28cR#vKvjOza3ZLf>~{_LXu-dv-j@MUGX@bCWq*E`eG z{+yifKp{*~Ws;phAfjCE&zKQWs61ZrMWT2Gk36>1?q}=K|fnQSsgw zT$eCjymJZDMSK^q;>CIY;&psuZ)3oK7td{MmvLpijxk?o0XBr#u|3bK5ju1&TenL; z^u0j4w(Z-vbL-yCySMM(z;i=^g2A*{on+1aT%C4pTiCMYNS{uxndGYn0La3r)5~ydd(3qUkNObz}*!Kgy8@hXq3=_ z7hX^RrkG)lX=a&dlBs445Quo@6(BkQM4D%+c_x_mnOG(QSM-Shm}uTfrl4jfp@exf zEGY#W12pRBqmDKQK?yNrKtT&&V*1664wL{Wre2Wo2A2+mLBdyHj^M=?WPm`%7yg?% zfJL8Gpy7Z6eUk9S6_RnP|k8f1`hM8Xh|5i}H3&{skU zU0zK_(G@cg1{FXU-2nq+hcO%(5Ck#l5ly3!a1}xiCvgmB3r&WIC768n{(Nn+O@`a_ zRWV%LKo6Hj8W=ROuDVk2^g_BdyE{S7%;ndC86bEa#t<=dexuY-JPjh~K)(^99&?#^YjH?=A)#S}pocM3)X!p}zWa*y_L#MNmzA81GX!LErJeLClx{zZ2{_|A_dPt!+;4p(m zjDZ8x=Q;XOhzi6bq7fN}#9N^ugA`%_2bp4LO+2cvNNXP@_q|jGgXaN@Ar-xf% z!GLoho)dRiG$Ow54MOyvtgv9mDaK$928=-!I>$s`Ik5;ih$4lsKs-R^uXDFrBNetd zfiBYE19t$U_O=H(8kof=^}<312v@lJkp~K4a^9Q4Nl3Qcv(xf&+YoWh`?8@47Uit9dM6z$?KO zSQdsjbxIGUabDg&7K7DYjYO1!LBH@OvY6s+rTH=))=r1F80ZwFq;VMrBznycB%q?) z3?uh;!jl5@01ryZORN@j0ILWheFp_R}%iG@i_O~uV z(o%Ua0pe2Dl1sV}la51G&t8B6a?nBzpiAB8LRUi2tpRp(8(lfnfV+fA=@q+0{+PFFhBEiZnft6ljPAxQ#=*JO|TLF*|BLp&isbRfjw z20Qq{;Gxh`o4^Ae$X0ULH1L6&^a9V$CO9Atv4}@ZV%!Xe3tVUdg)MB{i5j?E=Q@sp zWnh~d%J4z!>LP3S@!`p}3@w4xV%=psPs(U6Yx02G3eN?ZEUn9lS>0s;U#SR6mj literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/primitives.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/primitives.gif new file mode 100644 index 0000000000000000000000000000000000000000..a031415e539ce27235fd1b0637535fdfcc58c163 GIT binary patch literal 1213 zcmV;u1VZ~qNk%w1VNL)Y0OkMyjFXb7t*f4*qL-hYl$x23l#|WQ&BeyXb$@-EqoI+R zmv(@DdxV2>eS4~`tgEiBt*@_{pPqz_ikF?7m7AJ~kdB6qjEjX@CJ^!4JhX zprxy-eTId^$;iFK!LPNnbAEe~mzDYX`TYI-qN%5xp`m?-gr26Pe1(IJmXxWmuFuob zx4gTFk&vsdt<2ER*4fx|eteUhnx3Pf!N$bM&CAx;*NBpjZ+m!fdwGhHkfyDxuCub_ z=H{!fu6~Dxy1>4%xVD9kjBtE;aeR8y*431pnva*2rKzad+}o$Cs(yxrbANoGq@<>* zseOlpo};3qsHb&+eS3w1e~5;GiimlGfvBsiqNb*tp`dqxfB*mgA^8LV00000EC2ui z08RiM000O7fJRUXeuajIh>41ejE#sb*qc|A^$uXg+)29LOSf+bA8Y^i?W;!!2Mvf5E7tI5goY7~Wq1Jbhq2>7l>hLc zwBm8)6_qrskP+Yy1r4PsjPMWxtcE(3z$~7P7zY^+7;@|0jp2_77Cb;;paEi!h~CHl z*ub#CLk&KEFo=kbJog3~EQ(_=zym`J2t}YXUtZ%l@ADXNKxvYpz5DkWq{7JHVuSlX zed6b@pP|p6{{QLM-UcpY&_fJs;77n88#E|a4}Tco27DB{=SLYFT%h5G9A5AT1O;q} z!Uh}u(Se62j(9-_f2`OdiW+W!f{Q44Z~+S+cA#U35VY`Nhd^rR2N)bwVC0cVR`5sv z2}qu>!I4WU$)uANl<-HDS5`0s9Y$_&f{`Bl@nr=%w6H@3Y*Zk|nH#i_#x8DE9|hrR?YH2D`)vaQaB#=D=%%agy6m>=?z`~1 z+kh1u=wa`@_~xtczWny<@4x+`p#TSu6m0Op2qSVv6CBv#@WT*CEb+t?S8VYb#T9n} bKof9u?D5AShb;2QB$sS5$y{u~K_CD-EgFW! literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/quotes.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/quotes.gif new file mode 100644 index 0000000000000000000000000000000000000000..74499d7f33a747ba9553136eadddbeaa835f9267 GIT binary patch literal 2236 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/spacer.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9 GIT binary patch literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/ticker-anim.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/ticker-anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..04c4c88b275af70e60f2c085842beb8862c4ce38 GIT binary patch literal 6035 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 E09q+;;{X5v literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/topRedBar.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/topRedBar.gif new file mode 100644 index 0000000000000000000000000000000000000000..2198e7d6797d355a2653ab39f90caf05045a1048 GIT binary patch literal 279 zcmZ?wbhEHb6kuj!IKse?S5^N1|NmpBPnFi!E?TuBzq;c4kMDicrp{ipu(iLppr*2> zt);4^>B{x%+jj3Ns;#Q+Xf3R%%&#gxX>80u1W^3R0#>C1B0+XCuuf4(_DIQ`m$7PH z&g)GKDh&C#_bb-DS69$6nOCrb*+j%~(IoLgk!b;n3WXkS>w^v*=z3eVw1fS-_c2DM zj4vr?^LF3=u%pIr{q6TZ_SBt!|NDPKV^ecWYg>CqXIFPmZ(sj}iIXNznL2IyjG41$ z&zU=K{(^;z7B5-4Z25|nt5&aByKeo4jhi-a*}84}j-9)9@7cR=|AB+KiVW5OO2m3c literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/topline.jpg b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/topline.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d51fee327e92ab477e93ae923a138a13268d0117 GIT binary patch literal 645 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!`l~&y8iV1GFa55!2rd~|8D{Stt8ap literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradeOverview.png b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradeOverview.png new file mode 100644 index 0000000000000000000000000000000000000000..f42159406a61ac78280d3b326c5c1296a8fa4d01 GIT binary patch literal 206781 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

    i&0tWR2prcbG^+(^;DtV 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

    q(W``HNauh_>7>9 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradingAndPortfolios.gif b/src/test/resources/test-applications/daytrader8/src/main/webapp/images/tradingAndPortfolios.gif new file mode 100644 index 0000000000000000000000000000000000000000..85827ccca1d9eab82103f5a85a7343cc74f171ae GIT binary patch literal 1677 zcmV;826FjFNk%w1VT=GB0OkMyjFXaXdUw{@*~`z)y}!S9fPS~RxsR5VeTIaOl#{Np zu+P%c#Ky*(pr4nXoR^%N&Cbo`=jXeh$&W^z`(h zq@wo5wzig=nwp-StFNw~q@&f>)}yDUr>m-wmzAZdsKds^q^PERg@c}=p`N0m zaC~{u)YRMF-iMEk-QeHD$j6|hqxAOn>Fevr%*%6re9X|#gNuo8dwBKr^^}{Lf{TjB z%gddjq14yb;N#-r7fug^i2Z+}oq8s_5$JtF5i3sj1c0)tR22s;sPihlH!H zuAZZ!q^PHJe|(~*rgeaQdxe6aq@;O+fu^ddsH>}-p`dqxfB*mgA^8LV00000EC2ui z0E_?~000O7fPZI84o!ZCh>41ejE#F}Yg z+qZE4td!*0azk7=qAQHEafe#IiGyu#P?gTO%LP(xWc`^=7nEzDX zY}r5v95^_Op8O_;iWLMnQ^2g^$!N>2L$q0eBX#A~Ay!j(&3p8O7;!`hA5Ofuh(9fi zi)hiJ4{_!=UKsD;e0Yx*A&j^9(?iK0<=aK{h!I10h~&zV3uge~`S9??LsU24qKESP z#Qjh~fTF+u{{W)!M-Kh{VZAt1! z!yg%v_=1HhFoD7gDyV=UgqY>Pgo`UgIHHIoqQHQKF%YQ09~KfA;*kCMAw?4>B&p>8 zl1!fP2MkI6kpc`i+~C6r3ao(TlPAPb!wD&TnSu&d{xQT2e|%}jA5B64#THfbr7cSuoz37mH7 z>8B?A(FdoZa_T?|n3(`U3Y?~3g9)y}%4(=t{c(T^ef;q$5-aqv!Vj3D#OG}k=BA2i5}v(8G4Ai*Ca%%H*n z2dFT^2q_%xug*EM@B<0% zvw%Y3#1pQ?7zKc!{PN5zGlJit5<4*>AI^VWkP!4A(Sk;L`aQx87s0Ma{OKKMX< zzkKvSfbYHr7F^K5{Pfpv|NZ#qumAjRsIUVI4cMOm2S~sI8gPFah(aAWz`zDN@PQDF zpadt#Koc~e0Tj%j1~b zhB(Zj4tL1I9{TWyKn$V~he*UC;-L#$fPx;D$iyZ(@rh83q7z-+U<{)e$4JIRa4`UPNTV9p$i_Ch@r`hdqa5c*$2!{aj&}$^76MR*KKk*GfDEJ{ X2T9068uE~cOr# + + + + + +DayTrader + + + + + + + <BODY> + <P>Need browser which supports frames to see this page</P> + </BODY> + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/index.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/index.xhtml new file mode 100644 index 00000000..e6cac242 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/index.xhtml @@ -0,0 +1,93 @@ + + + + + DayTrader + + + + +

    + + +
    +
    +

    Overview

    +
    +
    The Daytrader performance benchmark sample provides a suite of workloads for characterizing performance of Java EE + Application Servers. The workloads consist of an end to end web application and a full set of primitives. The applications are a collection of + Java classes, Java Servlets, JavaServer Pages, and Enterprise Java Beans built to open Java EE APIs. Together these provide versatile and + portable test cases designed to measure aspects of scalability and performance.
    +
    +

    + +
    + Daytrader J2EE Components +
    + Model-View-Controller architecture +

    +
    +
    +

    Daytrader

    + DayTrader is an end-to-end benchmark and performance sample application. It provides a real world Java EE workload. +
    +
    + DayTrader's new design spans Java EE 7, including the new WebSockets specification. Other Java EE features include JSPs, Servlets, EJBs, JPA, + JDBC, JSF, JMS, MDBs, and transactions (synchronous and asynchronous/2-phase commit). +
    +
    + +

    Primitives

    + The + primitives + provide a set of workloads to individually test various components of a Java EE application Server. The primitives leverage the Daytrader + application infrastructure to test specific Java EE components such as the servlet engine, JSP support, EJB Entitiy, Session and Message Driven + beans, HTTp Session support and more. +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/leftMenu.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/leftMenu.html new file mode 100644 index 00000000..1b930bc3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/leftMenu.html @@ -0,0 +1,56 @@ + + + + + +Leftmenu + + + + +
    +

    +
    +
    Overview
    +

    + +

    + Benchmarking +

    +

    + Configuration +

    +

    + Go Trade! +

    +

    + Web Primitives +

    +
    + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.html new file mode 100644 index 00000000..34cdd340 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.html @@ -0,0 +1,283 @@ + + + + +Market Summary Web Socket + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Market Summary
    + DayTrader Stock Index(TSIA)
    Trading Volume
    Top Gainers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPriceChange
    +
    Top Losers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPriceChange
    +
    Recent Price Changes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPriceChange
    +
    + + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.jsp new file mode 100644 index 00000000..976164a2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.jsp @@ -0,0 +1,156 @@ + + + + + +DayTrader Market Summary + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader Market SummaryDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader + Market SummaryDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.xhtml new file mode 100644 index 00000000..aebae230 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/marketSummary.xhtml @@ -0,0 +1,605 @@ + + + + + DayTrader Market + + + + + + + + +
    + + + +
    + +
    + + + + + + + + + + +
    + + Alert: The following Order(s) have completed. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + +
    +

    Market Summary

    +
    +
    +
    + + + + + + +
    + + + + + + + + + + + +
    + DayTrader Stock Index(TSIA) + +
    +
    + Trading Volume + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Recent Changes +
    + Symbol + + Price + + Change +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Top Gainers +
    + Symbol + + Price + + Change +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Top Losers +
    + Symbol + + Price + + Change +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    + + + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/order.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/order.jsp new file mode 100644 index 00000000..fdb7fc99 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/order.jsp @@ -0,0 +1,233 @@ + + + + + +DayTrader Order information + + + + <%@ page + import="java.util.Collection, + java.util.Iterator,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader New OrdersDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + <% + OrderDataBean orderData = (OrderDataBean) request.getAttribute("orderData"); + if (orderData != null) { + %> + + + + + + + + + + <% + } + %> + +
    New + Order

    + Order <%=orderData.getOrderID()%>
    + to <%=orderData.getOrderType()%> + <%=orderData.getQuantity()%> + shares of <%=orderData.getSymbol()%> + has been submitted for + processing.


    + Order <%=orderData.getOrderID()%> + details: +
    + + + + + + + + + + + + + + + + + + + + + + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%= orderData.getOrderID()%><%= orderData.getOrderStatus()%><%= orderData.getOpenDate()%><%= orderData.getCompletionDate()%><%= orderData.getOrderFee()%><%= orderData.getOrderType()%><%= FinancialUtils.printQuoteLink(orderData.getSymbol()) %><%= orderData.getQuantity()%>
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. +
    + + +
    +
    DayTrader New OrdersDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/order.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/order.xhtml new file mode 100644 index 00000000..6d90cb98 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/order.xhtml @@ -0,0 +1,308 @@ + + + + + DayTrader Order + + + + + +
    + + + +
    + +
    + + + + + + + + + + +
    + + Alert: The following Order(s) have completed. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + +
    + New Order +
    + + +
    + Order  + +
    +  to  + + +   + + +  shares of  + + symbol: + + +  has been submitted for processing. +
    +
    +
    + + Order  + + + + + + details: + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + order ID + + order status + + creation date + + completion date + + txn fee + + type + + symbol + + quantity +
    + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/orderImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/orderImg.jsp new file mode 100644 index 00000000..3d105a49 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/orderImg.jsp @@ -0,0 +1,248 @@ + + + + + +DayTrader Order information + + + + + <%@ page + import="java.util.Collection, java.util.Iterator,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader New Orders
    +

    <%=new java.util.Date()%>
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + <% + OrderDataBean orderData = (OrderDataBean) request.getAttribute("orderData"); + if (orderData != null) { + %> + + + + + + + + + + <% + } + %> + +
    New + Order

    + Order <%=orderData.getOrderID()%>
    + to <%=orderData.getOrderType()%> + <%=orderData.getQuantity()%> + shares of <%=orderData.getSymbol()%> + has been submitted for + processing.


    + Order <%=orderData.getOrderID()%> + details: +
    + + + + + + + + + + + + + + + + + + + + + + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%= orderData.getOrderID()%><%= orderData.getOrderStatus()%><%= orderData.getOpenDate()%><%= orderData.getCompletionDate()%><%= orderData.getOrderFee()%><%= orderData.getOrderType()%><%= FinancialUtils.printQuoteLink(orderData.getSymbol()) %><%= orderData.getQuantity()%>
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. +
    + + +
    +
    DayTrader New Orders
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.jsp new file mode 100644 index 00000000..c1fb732a --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.jsp @@ -0,0 +1,284 @@ + + + + + +DayTrader Portfolio + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.util.HashMap, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.HoldingDataBean,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.entities.QuoteDataBean,com.ibm.websphere.samples.daytrader.util.Log,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader PortfolioDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + + + +
    Portfolio + Number + of Holdings: <%=holdingDataBeans.size()%>
    +
    + + + + + + + + + + + + + + + + <% + // Create Hashmap for quick lookup of quote values + Iterator it = quoteDataBeans.iterator(); + HashMap quoteMap = new HashMap(); + while (it.hasNext()) { + QuoteDataBean quoteData = (QuoteDataBean) it.next(); + quoteMap.put(quoteData.getSymbol(), quoteData); + } + //Step through and printout Holdings + + it = holdingDataBeans.iterator(); + BigDecimal totalGain = new BigDecimal(0.0); + BigDecimal totalBasis = new BigDecimal(0.0); + BigDecimal totalValue = new BigDecimal(0.0); + try { + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + QuoteDataBean quoteData = (QuoteDataBean) quoteMap.get(holdingData.getQuoteID()); + BigDecimal basis = holdingData.getPurchasePrice().multiply(new BigDecimal(holdingData.getQuantity())); + BigDecimal marketValue = quoteData.getPrice().multiply(new BigDecimal(holdingData.getQuantity())); + totalBasis = totalBasis.add(basis); + totalValue = totalValue.add(marketValue); + BigDecimal gain = marketValue.subtract(basis); + totalGain = totalGain.add(gain); + BigDecimal gainPercent = null; + if (basis.doubleValue() == 0.0) { + gainPercent = new BigDecimal(0.0); + Log.error("portfolio.jsp: Holding with zero basis. holdingID=" + holdingData.getHoldingID() + " symbol=" + holdingData.getQuoteID() + + " purchasePrice=" + holdingData.getPurchasePrice()); + } else + gainPercent = marketValue.divide(basis, BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(1.0)).multiply(new BigDecimal(100.0)); + %> + + + + + + + + + + + + + <% + } + } catch (Exception e) { + Log.error("portfolio.jsp: error displaying user holdings", e); + } + %> + + + + + + + + + + + + +
    + Portfolio +
    holding + IDpurchase + datesymbolquantitypurchase + pricecurrent + pricepurchase + basismarket + valuegain/(loss)trade
    <%=holdingData.getHoldingID()%><%=holdingData.getPurchaseDate()%><%=FinancialUtils.printQuoteLink(holdingData.getQuoteID())%><%=holdingData.getQuantity()%><%=holdingData.getPurchasePrice()%><%=quoteData.getPrice()%><%=basis%><%=marketValue%><%=FinancialUtils.printGainHTML(gain)%><%="sell"%>
    Total$ + <%=totalBasis%>$ + <%=totalValue%>$ <%=FinancialUtils.printGainHTML(totalGain)%> + <%=FinancialUtils.printGainPercentHTML(FinancialUtils.computeGainPercent(totalValue, totalBasis))%>
    +
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. +
    + + +
    +
    DayTrader + PortfolioDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.xhtml new file mode 100644 index 00000000..8af86c77 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolio.xhtml @@ -0,0 +1,340 @@ + + + + + DayTrader Portfolio + + + + + +
    + + + +
    + +
    + + + + + + + + + + +
    + + Alert: The following Order(s) have completed. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + +
    + Portfolio + Number of Holdings:
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + +
    + + + + + + + + + + + +
    Total purchase basisTotal market valueTotal gain/loss
    + $ + + + $ + + + $ + + +
    +
    +
    + + + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolioImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolioImg.jsp new file mode 100644 index 00000000..062418bf --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/portfolioImg.jsp @@ -0,0 +1,296 @@ + + + + + +DayTrader Portfolio + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.util.HashMap, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.HoldingDataBean,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.entities.QuoteDataBean,com.ibm.websphere.samples.daytrader.util.Log,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader PortfolioDayTrader

    <%=new java.util.Date()%>
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + + + +
    Portfolio + Number + of Holdings: <%=holdingDataBeans.size()%>
    +
    + + + + + + + + + + + + + + + + <% + // Create Hashmap for quick lookup of quote values + Iterator it = quoteDataBeans.iterator(); + HashMap quoteMap = new HashMap(); + while (it.hasNext()) { + QuoteDataBean quoteData = (QuoteDataBean) it.next(); + quoteMap.put(quoteData.getSymbol(), quoteData); + } + //Step through and printout Holdings + + it = holdingDataBeans.iterator(); + BigDecimal totalGain = new BigDecimal(0.0); + BigDecimal totalBasis = new BigDecimal(0.0); + BigDecimal totalValue = new BigDecimal(0.0); + try { + while (it.hasNext()) { + HoldingDataBean holdingData = (HoldingDataBean) it.next(); + QuoteDataBean quoteData = (QuoteDataBean) quoteMap.get(holdingData.getQuoteID()); + BigDecimal basis = holdingData.getPurchasePrice().multiply(new BigDecimal(holdingData.getQuantity())); + BigDecimal marketValue = quoteData.getPrice().multiply(new BigDecimal(holdingData.getQuantity())); + totalBasis = totalBasis.add(basis); + totalValue = totalValue.add(marketValue); + BigDecimal gain = marketValue.subtract(basis); + totalGain = totalGain.add(gain); + BigDecimal gainPercent = null; + if (basis.doubleValue() == 0.0) { + gainPercent = new BigDecimal(0.0); + Log.error("portfolio.jsp: Holding with zero basis. holdingID=" + holdingData.getHoldingID() + " symbol=" + holdingData.getQuoteID() + + " purchasePrice=" + holdingData.getPurchasePrice()); + } else + gainPercent = marketValue.divide(basis, BigDecimal.ROUND_HALF_UP).subtract(new BigDecimal(1.0)).multiply(new BigDecimal(100.0)); + %> + + + + + + + + + + + + + <% + } + } catch (Exception e) { + Log.error("portfolio.jsp: error displaying user holdings", e); + } + %> + + + + + + + + + + + + +
    + Portfolio +
    holding + IDpurchase + datesymbolquantitypurchase + pricecurrent + pricepurchase + basismarket + valuegain/(loss)trade
    <%=holdingData.getHoldingID()%><%=holdingData.getPurchaseDate()%><%=FinancialUtils.printQuoteLink(holdingData.getQuoteID())%><%=holdingData.getQuantity()%><%=holdingData.getPurchasePrice()%><%=quoteData.getPrice()%><%=basis%><%=marketValue%><%=FinancialUtils.printGainHTML(gain)%><%="sell"%>
    Total$<%=totalBasis%>$<%=totalValue%>$<%=FinancialUtils.printGainHTML(totalGain)%> + <%=FinancialUtils.printGainPercentHTML(FinancialUtils.computeGainPercent(totalValue, totalBasis))%>
    +
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader PortfolioDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/properties/daytrader.properties b/src/test/resources/test-applications/daytrader8/src/main/webapp/properties/daytrader.properties new file mode 100644 index 00000000..1f2ebeb2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/properties/daytrader.properties @@ -0,0 +1,24 @@ + # (C) Copyright IBM Corporation 2015. + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. +runtimeMode=0 +orderProcessingMode=0 +maxUsers=15000 +maxQuotes=10000 +publishQuotePriceChange=true +listQuotePriceChangeFrequency=100 +displayOrderAlerts=true +webInterface=0 +marketSummaryInterval=20 +primIterations=1 +longRun=true diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.jsp new file mode 100644 index 00000000..e4972624 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.jsp @@ -0,0 +1,234 @@ + + + + + +DayTrader: Quotes and Trading + + + + + + <%@ page + import="java.util.Collection,java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.QuoteDataBean,com.ibm.websphere.samples.daytrader.util.Log, + java.util.Iterator,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader QuotesDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + +
    Quotes
    + + + + + + + + + + + + + <% + // Create Hashmap for quick lookup of quote values + Iterator it = quoteDataBeans.iterator(); + while (it.hasNext()) { + try { + QuoteDataBean quoteData = (QuoteDataBean) it.next(); + %> + + + + + + + + + + + +<% + } catch (Exception e) { + Log.error("displayQuote.jsp exception. Check that symbol: exists in the database.", e); + } +%> + + + <% + } + %> + +
    symbolcompanyvolumeprice + rangeopen + pricecurrent + pricegain/(loss)trade
    <%=FinancialUtils.printQuoteLink(quoteData.getSymbol())%><%=quoteData.getCompanyName()%><%=quoteData.getVolume()%><%=quoteData.getLow() + " - " + quoteData.getHigh()%><%=quoteData.getOpen()%>$ <%=quoteData.getPrice()%><%=FinancialUtils.printGainHTML(new BigDecimal(quoteData.getChange()))%> + <%=FinancialUtils.printGainPercentHTML(FinancialUtils.computeGainPercent(quoteData.getPrice(), quoteData.getOpen()))%> +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. +
    + + +
    +
    DayTrader + QuotesDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.xhtml new file mode 100644 index 00000000..b4822706 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/quote.xhtml @@ -0,0 +1,291 @@ + + + + + DayTrader Quotes + + + + + +
    + + + +
    + +
    + + + + + + + + + + +
    + + Alert: The following Order(s) have completed. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + +
    + + + + + + + + + +
    + Quotes +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteDataPrimitive.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteDataPrimitive.jsp new file mode 100644 index 00000000..4b6a8f8f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteDataPrimitive.jsp @@ -0,0 +1,50 @@ + + + + + + + +Quote Data Primitive (PingServet2Session2Entity2JSP) + + + <%@ page + import="com.ibm.websphere.samples.daytrader.entities.QuoteDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="false" isThreadSafe="true" isErrorPage="false"%> + <%!int hitCount = 0; + String initTime = new java.util.Date().toString();%> + <% + QuoteDataBean quoteData = (QuoteDataBean) request.getAttribute("quoteData"); + %> +
    +
    + Quote Data Primitive + (PingServlet2Session2EntityJSP):
    +
    + Init time: <%=initTime%> + <% + hitCount++; + %> +

    + Hit Count: <%=hitCount%> +

    +
    + Quote Information +
    +
    <%=quoteData.toHTML()%> + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteImg.jsp new file mode 100644 index 00000000..9ae34c54 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/quoteImg.jsp @@ -0,0 +1,255 @@ + + + + + +DayTrader: Quotes and Trading + + + + + + <%@ page + import="java.util.Collection,java.math.BigDecimal,com.ibm.websphere.samples.daytrader.util.Log, + java.util.Iterator,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.entities.QuoteDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader QuotesDayTrader

    <%=new java.util.Date()%>
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + +
    + + + + + + + + + + + + +
    Quotes
    + + + + + + + + + + + + + + <% + // Create Hashmap for quick lookup of quote values + Iterator it = quoteDataBeans.iterator(); + while (it.hasNext()) { + try { + QuoteDataBean quoteData = (QuoteDataBean) it.next(); + %> + + + + + + + + + + + +<% + } catch (Exception e) { + Log.error("displayQuote.jsp exception. Check that symbol: exists in the database.", e); + } +%> + + + <% + } + %> + +
    symbolcompanyvolumeprice + rangeopen + pricecurrent + pricegain/(loss)trade
    <%=FinancialUtils.printQuoteLink(quoteData.getSymbol())%><%=quoteData.getCompanyName()%><%=quoteData.getVolume()%><%=quoteData.getLow() + " - " + quoteData.getHigh()%><%=quoteData.getOpen()%>$ <%=quoteData.getPrice()%><%=FinancialUtils.printGainHTML(new BigDecimal(quoteData.getChange()))%> + <%=FinancialUtils.printGainPercentHTML(FinancialUtils.computeGainPercent(quoteData.getPrice(), quoteData.getOpen()))%> +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader QuotesDayTrader
    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/quotes.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/quotes.html new file mode 100644 index 00000000..a69d6f6c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/quotes.html @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    + + + +
    + + + + + + + + + + + + + +

    Get Quotes

    symbol(s):
    +
    +
    +
    + + + + + + + + + + +
    Recent Price Changes
    Recent Price Changes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SymbolPriceChange
    +
    +
    + +
    +
    + +

     

    diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/register.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/register.jsp new file mode 100644 index 00000000..d97eae03 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/register.jsp @@ -0,0 +1,169 @@ + + + + +DayTrader Registration + + + + <%@ page session="false"%> + <% + String blank = ""; + String fakeCC = "123-fake-ccnum-456"; + String fullname = request.getParameter("Full Name"); + String snailmail = request.getParameter("snail mail"); + String email = request.getParameter("email"); + String userID = request.getParameter("user id"); + String money = request.getParameter("money"); + String creditcard = request.getParameter("Credit Card Number"); + String results = (String) request.getAttribute("results"); + %> + + + + + + + +
    DayTrader + RegisterDayTrader
    + + + + + + + + +
    <%=results == null ? blank : results%>
    + + + + + + + +
    Register +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    *Full name:
    *Address:
    *E-Mail address:
      
    *User ID:
    *Password:
    *Confirm password:
      
    *Opening account + balance:$
    *Credit card number:  
    + +
    + + + + + + + + + + + + + +
    +
    +
    DayTrader + RegisterDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/register.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/register.xhtml new file mode 100644 index 00000000..868b249c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/register.xhtml @@ -0,0 +1,205 @@ + + + + + DayTrader Register + + + + +
    + + +
    + +
    + + + + + + + + + +
    + + + +
    + + + + + + +
    +

    Register

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + * + Full name: + + + + +
    + * + Address: + + + + +
    + * + E-Mail address: + + + + +
      
    + * + User ID: + + + + +
    + + * + Password: + + + + + +
    + + * + Confirm password: + + + + + +
      
    + * + Opening account balance: + + + + +
    + + * + Credit card number: + + + + + +
    + +
    +
    +
    +
    +
    + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/registerImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/registerImg.jsp new file mode 100644 index 00000000..6b41d064 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/registerImg.jsp @@ -0,0 +1,172 @@ + + + + +DayTrader Registration + + + + <%@ page session="false"%> + <% + String blank = ""; + String fakeCC = "123-fake-ccnum-456"; + String fullname = request.getParameter("Full Name"); + String snailmail = request.getParameter("snail mail"); + String email = request.getParameter("email"); + String userID = request.getParameter("user id"); + String money = request.getParameter("money"); + String creditcard = request.getParameter("Credit Card Number"); + String results = (String) request.getAttribute("results"); + %> + + + + + + + +
    DayTrader + Register
    + + + + + + + + +
    <%=results == null ? blank : results%>
    + + + + + + + +
    Register +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    *Full name:
    *Address:
    *E-Mail address:
      
    *User ID:
    *Password:
    *Confirm password:
      
    *Opening account + balance:$
    *Credit card number:  
    + +
    + + + + + + + + + + + + + +
    +
    +
    DayTrader + HomeDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/runStats.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/runStats.jsp new file mode 100644 index 00000000..f196a6db --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/runStats.jsp @@ -0,0 +1,445 @@ + + + + + +Welcome to Trade + + + <%@ page + import="com.ibm.websphere.samples.daytrader.util.TradeConfig" + session="false" isThreadSafe="true" isErrorPage="false"%> + + + <% + double loginPercentage = (double) ((TradeConfig.getScenarioMixes())[0][TradeConfig.LOGOUT_OP]) / 100.0; + double logoutPercentage = (double) ((TradeConfig.getScenarioMixes())[0][TradeConfig.LOGOUT_OP]) / 100.0; + double buyOrderPercentage = (double) ((TradeConfig.getScenarioMixes())[0][TradeConfig.BUY_OP]) / 100.0; + double sellOrderPercentage = (double) ((TradeConfig.getScenarioMixes())[0][TradeConfig.SELL_OP]) / 100.0; + double orderPercentage = buyOrderPercentage + sellOrderPercentage; + double registerPercentage = (double) ((TradeConfig.getScenarioMixes())[0][TradeConfig.REGISTER_OP]) / 100.0; + + int logins = runStatsData.getSumLoginCount() - runStatsData.getTradeUserCount(); //account for each user being logged in up front + if (logins < 0) + logins = 0; //no requests before reset + //double expectedRequests = ((double) logins) / loginPercentage; + double expectedRequests = (double) TradeConfig.getScenarioCount(); + TradeConfig.setScenarioCount(0); + + int verifyPercent = TradeConfig.verifyPercent; + %> + <%!// verifies 2 values are w/in tradeConfig.verifyPercent percent + String verify(double expected, double actual, int verifyPercent) { + String retVal = ""; + if ((expected == 0.0) || (actual == 0.0)) + return "N/A"; + double check = (actual / expected) * 100 - 100; + //PASS + retVal += check + "% "; + if ((check >= (-1.0 * verifyPercent)) && (check <= verifyPercent)) + retVal += " Pass"; + else + retVal += " Fail4"; + if (check > 0.0) + retVal = "+" + retVal; + //System.out.println("verify --- expected="+expected+" actual="+actual+ " check="+check); + return retVal; + } + + String verify(int expected, int actual, int verifyPercent) { + return verify((double) expected, (double) actual, verifyPercent); + }%> +
    + + + + + + + + +
    DayTrader Scenario + Runtime StatisticsDayTrader
    + + + + + + + + +
    <% + String status; + status = (String) request.getAttribute("status"); + if (status != null) + out.print(status); + %> + Modify + runtime configuration
    +
    + + + + + + +
    + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Benchmark + scenario statistics +
    Benchmark + runtime + configuration + summaryValue +
    Run-Time + Mode<%=(TradeConfig.getRunTimeModeNames())[TradeConfig.getRunTimeMode()]%>
    Order-Processing + Mode<%=(TradeConfig.getOrderProcessingModeNames())[TradeConfig.getOrderProcessingMode()]%>
    Web + Interface<%=(TradeConfig.getWebInterfaceNames())[TradeConfig.getWebInterface()]%>
    Active + Traders / Trade + User population<%=runStatsData.getTradeUserCount()%> + / <%=TradeConfig.getMAX_USERS()%> +
    Active + Stocks / Trade + Stock population<%=TradeConfig.getMAX_QUOTES()%> + / <%=runStatsData.getTradeStockCount()%>
    Benchmark + scenario + verification
    Run + StatisticScenario + verification + testExpected + ValueActual + ValuePass/Fail
    Active StocksActive stocks + should generally + equal the db + population of stocks<%=runStatsData.getTradeStockCount()%><%=TradeConfig.getMAX_QUOTES()%><%=(runStatsData.getTradeStockCount() == TradeConfig.getMAX_QUOTES()) ? "Pass" : "Warn"%>
    Active + TradersActive traders + should generally + equal the db + population of + traders<%=runStatsData.getTradeUserCount()%><%=TradeConfig.getMAX_USERS()%><%=(runStatsData.getTradeUserCount() == TradeConfig.getMAX_USERS()) ? "Pass" : "Warn"%>
    Estimated + total requestsActual + benchmark scenario + requests should be + within +/- 2% of the + estimated number of + requests in the last + benchmark run to + pass.<%=expectedRequests%>see2see2
    New + Users Registered + <%=registerPercentage * 100%>% + of expected requests + (<%=registerPercentage%> + * <%=expectedRequests%> + )<%=registerPercentage * expectedRequests%><%=runStatsData.getNewUserCount()%><%=verify(registerPercentage * expectedRequests, (double) runStatsData.getNewUserCount(), verifyPercent)%>
    Logins + <%=loginPercentage * 100%>% + of expected requests + (<%=loginPercentage%> + * <%=expectedRequests%> + ) + initial login<%=loginPercentage * expectedRequests + runStatsData.getTradeUserCount()%><%=runStatsData.getSumLoginCount() + runStatsData.getTradeUserCount()%><%=verify((double) loginPercentage * expectedRequests, (double) runStatsData.getSumLoginCount(), verifyPercent)%>
    Logouts + #logouts must + be >= + #logins-active + traders ( <%=runStatsData.getSumLoginCount()%> + - <%=TradeConfig.getMAX_USERS()%> + ) + <%=runStatsData.getSumLoginCount() - TradeConfig.getMAX_USERS()%><%=runStatsData.getSumLogoutCount()%><%=(runStatsData.getSumLogoutCount() >= (runStatsData.getSumLoginCount() - TradeConfig.getMAX_USERS())) ? "Pass" : "Fail4"%> +
    User + Holdings Trade users own + an average of 5 + holdings, 5* total + Users = ( 5 * <%=runStatsData.getTradeUserCount()%>) + <%=5 * runStatsData.getTradeUserCount()%><%=runStatsData.getHoldingCount()%><%=verify(5 * runStatsData.getTradeUserCount(), runStatsData.getHoldingCount(), verifyPercent)%>
    Buy + Order Count <%=buyOrderPercentage * 100%>% + of expected requests + (<%=buyOrderPercentage%> + * <%=expectedRequests%> + ) + current holdings + count<%=buyOrderPercentage * expectedRequests + runStatsData.getHoldingCount()%><%=runStatsData.getBuyOrderCount()%><%=verify(buyOrderPercentage * expectedRequests + runStatsData.getHoldingCount(), (double) runStatsData.getBuyOrderCount(), verifyPercent)%>
    Sell + Order Count <%=sellOrderPercentage * 100%>% + of expected requests + (<%=sellOrderPercentage%> + * <%=expectedRequests%> + )<%=sellOrderPercentage * expectedRequests%><%=runStatsData.getSellOrderCount()%><%=verify(sellOrderPercentage * expectedRequests, (double) runStatsData.getSellOrderCount(), verifyPercent)%>
    Total + Order Count <%=orderPercentage * 100%>% + of expected requests + (<%=orderPercentage%> + * <%=expectedRequests%> + ) + current holdings + count<%=orderPercentage * expectedRequests + runStatsData.getHoldingCount()%><%=runStatsData.getOrderCount()%><%=verify(orderPercentage * expectedRequests + runStatsData.getHoldingCount(), (double) runStatsData.getOrderCount(), verifyPercent)%>
    Open + Orders All orders + should be completed + before reset3 + 0<%=runStatsData.getOpenOrderCount()%><%=(runStatsData.getOpenOrderCount() > 0) ? "Fail4" : "Pass"%>
    Cancelled + Orders Orders are + cancelled if an + error is encountered + during order + processing.0<%=runStatsData.getCancelledOrderCount()%><%=(runStatsData.getCancelledOrderCount() > 0) ? "Fail4" : "Pass"%>
    Orders + remaining after + reset After Trade + reset, each user + should carry an + average of 5 orders + in the database. 5* + total Users = (5 * <%=runStatsData.getTradeUserCount()%>) + <%=5 * runStatsData.getTradeUserCount()%><%=runStatsData.getOrderCount() - runStatsData.getDeletedOrderCount()%><%=verify(5 * runStatsData.getTradeUserCount(), runStatsData.getOrderCount() - runStatsData.getDeletedOrderCount(), verifyPercent)%>
    +
    +
    +
    +
    +
      +
    1. + Benchmark verification + tests require a Trade + Reset between each + benchmark run.
    2. +
    3. The + expected value of + benchmark requests is + computed based on the + the count from the Web + application since the + last Trade reset.The + actual value of + benchmark request + requires user + verification and may be + incorrect for a cluster.
    4. +
    5. Orders + are processed + asynchronously in Trade. + Therefore, processing + may continue beyond the + end of a benchmark run. + Trade Reset should not + be invoked until + processing is completed.
    6. +
    7. Actual + values must be within + <%=TradeConfig.verifyPercent%>% + of + corresponding estimated + values to pass + verification.
    8. +
    +
    +
    +
    + + + + + + + + + + + + + + + + + +
    +
    +
    DayTrader Scenario + Runtime StatisticsDayTrader
    +
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/sample.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/sample.jsp new file mode 100644 index 00000000..487f6fa7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/sample.jsp @@ -0,0 +1,26 @@ + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%> +<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> + + + + Hello world JSP on + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/style-jsf.css b/src/test/resources/test-applications/daytrader8/src/main/webapp/style-jsf.css new file mode 100644 index 00000000..6381df0c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/style-jsf.css @@ -0,0 +1,253 @@ +/* + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +* { + margin: 0; +} + +html { + height: 100%; +} + +#page-wrap { + min-height: 100%; + /* equal to footer height */ + margin-bottom: -31px; +} + +#page-wrap:after { + content: ""; + display: block; + height: 31px; +} + +body { + height: 100%; + margin: 0; + background-color: #ccc +} + +#content { + width: 700px; + margin: 0 auto; + padding-top: 95px; + padding-bottom: 31px; + font-size: 13px; +} + +#header { + width: 100%; + background-color: #FFFFFF; + position: fixed; +} + +#nav { + width: 100%; + float: left; + margin: 0; + padding: 0 0; + background: url(images/nav_bg.png) repeat-x; +} + +#nav ul { + list-style: none; + width: 450px; + margin: 0 auto; + padding: 0; + height: 31px; + line-height: 31px; +} + +#nav li { + float: left; +} + +#nav li a { + display: block; + width: 90px; + text-align: center; + vertical-align: middle; + font-size: 13px; + padding: 0 0; + text-decoration: none; + font-weight: bold; + color: white; +} + +#nav li a:hover { + text-decoration: underline; +} + +#nav2 { + width: 100%; + float: left; + margin: 0; + padding: 0 0; + background: url(images/nav_bg.png) repeat-x; +} + +#nav2 ul { + list-style: none; + width: 540px; + margin: 0 auto; + padding: 0; + height: 31px; + line-height: 31px; +} + +#nav2 li { + float: left; +} + +#nav2 li a { + display: block; + width: 90px; + text-align: center; + vertical-align: middle; + font-size: 13px; + padding: 0 0; + text-decoration: none; + font-weight: bold; + color: white; +} + +#nav2 li a:hover { + text-decoration: underline; +} + +#footer { + position: absolute; + height: 31px; + line-height: 31px; + vertical-align: middle; + width: 100%; + background: url(images/nav_bg.png) repeat-x; + margin: 0; + color: white; + text-align: center; + font-size: 13px; +} + +#contentContainer { + margin-top: 10px; + border: 1px solid #000; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + width: 700px; + margin-left: auto; + margin-right: auto; + padding: 10px; + background-color: #eee; + font-size: 14px; + text-decoration: none; +} + +#contentContainer a { + text-decoration: none; + color: #333333; +} + +#loginContainer { + margin-top: 10px; + border: 1px solid #000; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + width: 400px; + margin-left: auto; + margin-right: auto; + padding: 10px; + background-color: #eee; + font-size: 14px; + text-decoration: none; +} + +#loginContainer a { + text-decoration: none; + color: #333333; +} + +input.rounded { + border: 1px solid #ccc; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + font-size: 13px; + padding: 4px 4px; + outline: 0; + -webkit-appearance: none; # + margin-bottom: 20px; +} + +input.submit { + border: 1px solid #ccc; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + font-size: 13px; + padding: 4px 4px; + outline: 1; + -webkit-appearance: none; # + margin-bottom: 20px; + background-color: #0066CC; + color: white; +} + +.table { + border-collapse: collapse; + border: 1px solid #000000; +} + +.tableHeader { + text-align: center; + background: none repeat scroll 0 0 #B5B5B5; + border: 1px solid #000000; + padding: 2px; + font-size: 12px; +} + +.tableHeaderMarket { + text-align: center; + background: none repeat scroll 0 0 #000000; + border: 1px solid #000000; + padding: 10px; + font-size: 14px; +} + +.tableOddRow { + text-align: center; + font-size: 12px; + font-weight: none; + border: 1px solid #000000; + background: none repeat scroll 0 0 #FFFFFF; + padding: 2px; +} + +.tableEvenRow { + text-align: center; + font-size: 12px; + font-weight: none; + border: 1px solid #000000; + background: none repeat scroll 0 0 #fafcb6; + padding: 2px; +} + +.tableColumn { + border: 1px solid #000000; + padding: 2px; +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/style.css b/src/test/resources/test-applications/daytrader8/src/main/webapp/style.css new file mode 100644 index 00000000..3d92fcde --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/style.css @@ -0,0 +1,82 @@ +/*====================================================================== + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +======================================================================*/ +tr th td body { + font-size:12pt; +} + +A:HOVER { + text-decoration: underline; color: red; +} + +A:ACTIVE { + color: red; + font-weight: bold +} + +.table{ + border-collapse:collapse; + border:1px solid #000000; +} + +.tableHeader{ + text-align:center; + background:none repeat scroll 0 0 #B5B5B5; + border:1px solid #000000; + padding:10px; + font-size:12px; +} + +.tableHeaderMarket{ + text-align:center; + background:none repeat scroll 0 0 #000000; + border:1px solid #000000; + padding:10px; + font-size:14px; +} + +.tableOddRow{ + text-align:center; + font-size:12px; + font-weight: none; + border:1px solid #000000; + background:none repeat scroll 0 0 #FFFFFF; +} + +.tableEvenRow{ + text-align:center; + font-size:12px; + font-weight: none; + border:1px solid #000000; + background:none repeat scroll 0 0 #D3D3D3; +} +.tableColumn{ + border:1px solid #000000; +} + +.tableHeader +{ + background:none repeat scroll 0 0 #FFFFFF; + border-collapse: collapse; + border-spacing: 0px; +} +.tableHeader td +{ + padding: 0px 0px; +} +.tableHeader tr +{ + padding: 0px 0px; +} \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.jsp new file mode 100644 index 00000000..aead7aae --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.jsp @@ -0,0 +1,251 @@ + + + + + +Welcome to DayTrader + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader HomeDayTrader
    HomeAccountMarket SummaryPortfolioQuotes/TradeLogoff
    +
    <%=new java.util.Date()%> +
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Welcome +  <%=accountData.getProfileID()%>, +
    User + Statistics
    account + ID:
    +
    account + created:
    total + logins:
    session + created:
    <%=accountData.getAccountID()%>
    + <%=accountData.getCreationDate()%>
    + <%=accountData.getLoginCount()%>
    + <%=(java.util.Date) session.getAttribute("sessionCreationDate")%>
    Account + Summary
    cash + balance:
    number + of holdings:
    total + of holdings:
    sum of + cash/holdings
    opening + balance:
    +
    +
    + <% + BigDecimal openBalance = accountData.getOpenBalance(); + BigDecimal balance = accountData.getBalance(); + BigDecimal holdingsTotal = FinancialUtils.computeHoldingsTotal(holdingDataBeans); + BigDecimal sumOfCashHoldings = balance.add(holdingsTotal); + BigDecimal gain = FinancialUtils.computeGain(sumOfCashHoldings, openBalance); + BigDecimal gainPercent = FinancialUtils.computeGainPercent(sumOfCashHoldings, openBalance); + %>$ <%=balance%>
    <%=holdingDataBeans.size()%>
    + $ <%=holdingsTotal%>
    $ <%=sumOfCashHoldings%>
    + $ <%=openBalance%>
    + +
    +
    current + gain/(loss):$ <%=FinancialUtils.printGainHTML(gain)%> + <%=FinancialUtils.printGainPercentHTML(gainPercent)%>
    +

    +
    + + + + + + + + + + + + + +
    +
    +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader + HomeDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.xhtml new file mode 100644 index 00000000..23ed8ed2 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehome.xhtml @@ -0,0 +1,283 @@ + + + + + DayTrader Home + + + + + +
    + + + +
    + +
    + + +

    + Welcome  + +

    + + + + + + + + + +
    + + Alert: The following Order(s) have completed. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    User Statistics

    +
    + account ID: +
    + account created: +
    + total logins: +
    + session created: +
    +
    + +
    + +
    + +
    + +
    +
    +

    Account Summary

    +
    + cash balance: +
    + number of holdings: +
    + total of holdings: +
    + sum of cash/holdings +
    + opening balance: +
    +
    +
    + $  + +
    + +
    + $  + +
    + $  + +
    + $  + +
    +
    +
    + current gain/(loss): + + $ + + +   + + +
    + + + + + + + + + + +
    +
    +
    + + + + + + + +
    + + + + +
    +
    +
    +
    +
    +
    + + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehomeImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehomeImg.jsp new file mode 100644 index 00000000..3d7a2990 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/tradehomeImg.jsp @@ -0,0 +1,267 @@ + + + + + +Welcome to DayTrader + + + + + <%@ page + import="java.util.Collection, + java.util.Iterator, + java.math.BigDecimal,com.ibm.websphere.samples.daytrader.entities.AccountDataBean,com.ibm.websphere.samples.daytrader.entities.OrderDataBean,com.ibm.websphere.samples.daytrader.util.FinancialUtils" + session="true" isThreadSafe="true" isErrorPage="false"%> + + + + + + + + + + + + + + + + + + + + + + <% + Collection closedOrders = (Collection) request.getAttribute("closedOrders"); + if ((closedOrders != null) && (closedOrders.size() > 0)) { + %> + + + + + + + <% + } + %> + +
    DayTrader HomeDayTrader

    <%=new java.util.Date()%>
    + Alert: The + following Order(s) have completed. +
    + + + <% + Iterator it = closedOrders.iterator(); + while (it.hasNext()) { + OrderDataBean closedOrderData = (OrderDataBean) it.next(); + %> + + + + + + + + + + + + + + + + + + + + + <% + } + %> + + +
    order + IDorder + statuscreation + datecompletion + datetxn + feetypesymbolquantity
    <%=closedOrderData.getOrderID()%><%=closedOrderData.getOrderStatus()%><%=closedOrderData.getOpenDate()%><%=closedOrderData.getCompletionDate()%><%=closedOrderData.getOrderFee()%><%=closedOrderData.getOrderType()%><%=FinancialUtils.printQuoteLink(closedOrderData.getSymbol())%><%=closedOrderData.getQuantity()%>
    +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Welcome +  <%=accountData.getProfileID()%>, +
    User + Statistics
    account + ID:
    +
    account + created:
    total + logins:
    session + created:
    <%=accountData.getAccountID()%>
    + <%=accountData.getCreationDate()%>
    + <%=accountData.getLoginCount()%>
    + <%=(java.util.Date) session.getAttribute("sessionCreationDate")%>
    Account + Summary
    cash + balance:
    number + of holdings:
    total + of holdings:
    sum of + cash/holdings
    opening + balance:
    +
    +
    + <% + BigDecimal openBalance = accountData.getOpenBalance(); + BigDecimal balance = accountData.getBalance(); + BigDecimal holdingsTotal = FinancialUtils.computeHoldingsTotal(holdingDataBeans); + BigDecimal sumOfCashHoldings = balance.add(holdingsTotal); + BigDecimal gain = FinancialUtils.computeGain(sumOfCashHoldings, openBalance); + BigDecimal gainPercent = FinancialUtils.computeGainPercent(sumOfCashHoldings, openBalance); + %>$<%=balance%>
    <%=holdingDataBeans.size()%>
    + $<%=holdingsTotal%>
    $<%=sumOfCashHoldings%>
    + $<%=openBalance%>
    + +
    +
    current + gain/(loss):$ <%=FinancialUtils.printGainHTML(gain)%> + <%=FinancialUtils.printGainPercentHTML(gainPercent)%>
    +

    + + + + + + + + + + + + + + + + +
    + + + + + + + +
    Note: Click any symbol + for a quote or to trade. + +
    + + +
    +
    +
    DayTrader HomeDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.html b/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.html new file mode 100644 index 00000000..fa2b5837 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.html @@ -0,0 +1,449 @@ + + + + + + +Web Primitives + + + + +
    + + + + + + + +
    +

    Web and EJB Primitive Tests

    +
    +
    + + + + + + + + + + + +
    Primitive Test Suite
    +

    The DayTrader performance benchmark sample + provides a suite of web primitives. These + primitives singularly test key operations in the + enterprise Java programming model. Links to each + of the web primitive tests are provided below + along with a description of each operation.

    +

    + Note that some primitives below can have their + main operations repeated. These operations are + marked with a red *. + In order to adjust the repetition, change the + primitive iteration value in the Trade + configuration page. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Web Container ping suite
    PingHtmlPingHtml is the most + basic operation providing access to a simple + "Hello World" page of static HTML.
    Explicit GCInvoke Garbage + Collection on AppServer. Reports heap statistics + after the GC has completed.
    PingServletPingServlet tests + fundamental dynamic HTML creation through server + side servlet processing.
    PingServletCDIPingServletCDI tests various simple CDI invocations.
    PingServletCDIBeanManagerViaJNDIPingServletCDIBeanManagerViaJNDI tests getting the BeanManager with JNDI.
    PingServletCDIBeanManagerViaCDICurrentPingServletCDIBeanManagerViaCDICurrent tests getting the BeanManager with the CDI spi.
    PingServletWriter + PingServletWriter + extends PingServlet by using a PrintWriter for + formatted output vs. the output stream used by + PingServlet.
    PingServlet2Include*PingServlet2Include + tests response inclusion. Servlet 1 includes the + response of Servlet 2.
    PingServlet2ServletPingServlet2Servlet + tests request dispatching. Servlet 1, the + controller, creates a new JavaBean object + forwards the request with the JavaBean added to + Servlet 2. Servlet 2 obtains access to the + JavaBean through the Servlet request object and + provides dynamic HTML output based on the + JavaBean data.
    PingJSPPingJSP tests a direct + call to JavaServer Page providing server-side + dynamic HTML through JSP scripting.
    PingJSPELPingJSPEL tests a direct + call to JavaServer Page providing server-side + dynamic HTML through JSP scripting and the usage + of the new JSP 2.0 Expression Language.
    PingServlet2JSPPingServlet2JSP tests a + commonly used design pattern, where a request is + issued to servlet providing server side control + processing. The servlet creates a JavaBean + object with dynamically set attributes and + forwards the bean to the JSP through a + RequestDispatcher The JSP obtains access to the + JavaBean and provides formatted display with + dynamic HTML output based on the JavaBean data.
    PingServlet2PDFPingServlet2PDF tests a + call to a servlet which displays the contents of + a PDF Document (~1 MB in file size).
    PingServlet2DBPingServlet2DB tests a + call to a servlet which makes a JDBC connection + to the database.
    PingJSFPingJSF tests a + call to a JSF Facelet which performs a lookup + of quotes.
    PingCDIJSFPingCDIJSF tests a MangedBean called from a jsf page.
    PingHTTPSession1 + PingHTTPSession1 - SessionID + tests fundamental HTTP session function by + creating a unique session ID for each individual + user. The ID is stored in the users session and + is accessed and displayed on each user request. +
    PingHTTPSession2PingHTTPSession2 session + create/destroy further extends the previous + test by invalidating the HTTP Session on every + 5th user access. This results in testing + HTTPSession create and destroy +
    PingHTTPSession3PingHTTPSession3 large + session object tests the servers ability to + manage and persist large HTTPSession data + objects. The servlet creates a large custom java + object. The class contains multiple data fields + and results in 2048 bytes of data. This large + session object is retrieved and stored to the + session on each user request. +
    PingJDBCRead*PingJDBCRead tests + fundamental servlet to JDBC access to a database + performing a single-row read using a prepared + SQL statment.
    PingJDBCRead2JSP*PingJDBCRead2JSP tests + fundamental servlet to JDBC access to a database + performing a single-row read using a prepared + SQL statment, then displays the output in a JSP.
    PingJDBCWrite*PingJDBCRead tests + fundamental servlet to JDBC access to a database + performing a single-row write using a prepared + SQL statment.
    PingServlet2JNDI*PingServlet2JNDI tests + the fundamental J2EE operation of a servlet + allocating a JNDI context and performing a JNDI + lookup of a JDBC DataSource.
    PingUpgradeServletPingUpgradeServlet tests a simple UpgradeHandler request. JMeter is needed for testing.
    PingWebSocketTextSyncPingWebSocketTextSync tests a simple synchronous WebSocket with text.
    PingWebSocketTextAsyncPingWebSocketTextAsync tests a simple asynchronous WebSocket with text.
    PingWebSocketBinaryPingWebSocketBinary tests a simple WebSocket with binary data.
    PingWebSocketJsonPingWebSocketJson tests a WebSocket with a JSON Decoder and Encoder.
    PingManagedThreadPingManagedThread tests a ManagedThreadFactory inside an asynchronous servlet.
    PingManagedExecutorPingManagedExecutor tests the ManagedExecutorService inside an asynchronous servlet.
    + + PingJSONP + + + PingJSONP tests generating and parsing JSON. +
    EJB 3 Container ping + suite
    PingServlet2Session*PingServlet2Session + tests key function of a servlet call to a remote + stateless Session EJB. The Session EJB performs + a simple calculation and returns the result
    PingServlet2Entity*
    PingServlet2Entity tests key function of a + servlet call to an EJB 3.0 Container Managed Entity. In this test the + EJB entity represents a single row in the database table.
    PingServlet2Session2Entity*This tests the full + servlet to Session EJB to Entity EJB path to + retrieve a single row from the database.
    PingServlet2Session2Entity2JSP*This tests the full + servlet to Session EJB to Entity EJB path to + retrieve a single row from the database and + displays the output in a JSP.
    PingServlet2Session2
    + EntityCollection +
    *
    This test extends the + previous EJB Entity test by calling a Session + EJB which uses a finder method on the Entity + that returns a collection of Entity objects. + Each object is displayed by the servlet.
    PingServlet2Session2CMROne2One*This test drives an + Entity EJB to get another Entity EJB's data + through an EJB 3.0 CMR One to One relationship.
    PingServlet2Session2CMROne2Many*This test drives an + Entity EJB to get another Entity EJB's data + through an EJB 3.0 CMR One to Many relationship.
    PingServlet2MDBQueue*PingServlet2MDBQueue + drives messages to a Queue based Message Driven + EJB (MDB). Each request to the servlet posts a + message to the Queue. The MDB receives the + message asynchronously and prints message + delivery statistics on each 100th message. Note: Not intended + for performance testing. + +
    PingServlet2MDBTopic*PingServlet2MDBTopic + drives messages to a Topic based + Publish/Subscribe Message Driven EJB (MDB). Each + request to the servlet posts a message to the + Topic. The TradeStreamMDB receives the message + asynchronously and prints message delivery + statistics on each 100th message. Other + subscribers to the Topic will also receive the + messages. Note: + Not intended for performance testing. +
    PingServlet2TwoPhase*PingServlet2TwoPhase + drives a Session EJB which invokes an Entity EJB + with findByPrimaryKey (DB Access) followed by + posting a message to an MDB through a JMS Queue + (Message access). These operations are wrapped + in a global 2-phase transaction and commit.
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.xhtml new file mode 100644 index 00000000..3cfda53c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/web_prmtv.xhtml @@ -0,0 +1,584 @@ + + + + + DayTrader Primitives + + + + +
    + + +
    + +
    + + + + + + + +
    +

    Web Primitive Tests

    +
    + + + + + + + + + + +
    + + Primitive Test Suite + +
    +

    The DayTrader performance benchmark sample provides a suite of web primitives. These primitives singularly test key operations in the + enterprise Java programming model. Links to each of the web primitive tests are provided below along with a description of each operation.

    +

    + Note that some primitives below can have their main operations repeated. These operations are marked with a red + * + . In order to adjust the repetition, change the primitive iteration value in the Trade configuration page. + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + Web Container ping suite + +
    + + + PingHtml + + + + PingHtml is the most basic operation providing access to a simple "Hello World" page of static HTML. +
    + + + Explicit GC + + + + Invoke Garbage Collection on AppServer. Reports heap statistics after the GC has completed. +
    + + + PingServlet + + + + PingServlet tests fundamental dynamic HTML creation through server side servlet processing. +
    PingServletCDIPingServletCDI tests + various simple CDI invocations.
    PingServletCDIBeanManagerViaJNDIPingServletCDIBeanManagerViaJNDI tests getting the BeanManager with JNDI.
    PingServletCDIBeanManagerViaCDICurrentIPingServletCDIBeanManagerViaCDICurrent tests getting the BeanManager with SPI.
    + + + PingServletWriter + + + + PingServletWriter extends PingServlet by using a PrintWriter for formatted output vs. the output stream used by + PingServlet. +
    + + + PingServlet2Include + + + * + + PingServlet2Include tests response inclusion. Servlet 1 includes the response of Servlet 2. +
    + + + PingServlet2Servlet + + + + PingServlet2Servlet tests request dispatching. Servlet 1, the controller, creates a new JavaBean object forwards the + request with the JavaBean added to Servlet 2. Servlet 2 obtains access to the JavaBean through the Servlet request object and provides + dynamic HTML output based on the JavaBean data. +
    + + PingJSP + + + PingJSP tests a direct call to JavaServer Page providing server-side dynamic HTML through JSP scripting. +
    + + PingJSPEL + + + PingJSPEL tests a direct call to JavaServer Page providing server-side dynamic HTML through JSP scripting and the usage + of the new JSP 2.0 Expression Language. +
    + + PingServlet2JSP + + + PingServlet2JSP tests a commonly used design pattern, where a request is issued to servlet providing server side + control processing. The servlet creates a JavaBean object with dynamically set attributes and forwards the bean to the JSP through a + RequestDispatcher The JSP obtains access to the JavaBean and provides formatted display with dynamic HTML output based on the JavaBean data. +
    + + PingServlet2PDF + + + PingServlet2PDF tests a call to a servlet which displays the contents of a PDF Document (~1 MB in file size). +
    + + PingServlet2DB + + + PingServlet2DB tests a call to a servlet which makes a JDBC connection to the database. +
    + + PingJSF + + + PingJSF tests a call to a JSF Facelet which performs a lookup of quotes. +
    PingCDIJSFPingCDIJSF tests a MangedBean called from a jsf page.
    + + PingHTTPSession1 + + + + PingHTTPSession1 - + SessionID + tests fundamental HTTP session function by creating a unique session ID for each individual user. The ID is stored in the users session and + is accessed and displayed on each user request. + +
    + + PingHTTPSession2 + + + + PingHTTPSession2 + session create/destroy + further extends the previous test by invalidating the HTTP Session on every 5th user access. This results in testing HTTPSession create and + destroy + +
    + + PingHTTPSession3 + + + + PingHTTPSession3 + large session object + tests the servers ability to manage and persist large HTTPSession data objects. The servlet creates a large custom java object. The class + contains multiple data fields and results in 2048 bytes of data. This large session object is retrieved and stored to the session on each + user request. + +
    + + PingJDBCRead + + * + + PingJDBCRead tests fundamental servlet to JDBC access to a database performing a single-row read using a prepared SQL + statment. +
    + + PingJDBCWrite + + * + + PingJDBCRead tests fundamental servlet to JDBC access to a database performing a single-row write using a prepared SQL + statment. +
    + + PingServlet2JNDI + + * + + PingServlet2JNDI tests the fundamental J2EE operation of a servlet allocating a JNDI context and performing a JNDI + lookup of a JDBC DataSource. +
    PingUpgradeServletPingUpgradeServlet tests a simple UpgradeHandler request. JMeter is needed for testing.
    PingWebSocketTextSyncPingWebSocketTextSync tests a simple synchronous WebSocket with text.
    PingWebSocketTextAsyncPingWebSocketTextAsync tests a simple asynchronous WebSocket with text.
    PingWebSocketBinaryPingWebSocketBinary tests a simple WebSocket with binary data.
    PingWebSocketJsonPingWebSocketJson tests a WebSocket with a JSON Decoder and Encoder.
    + + PingManagedThread + + + + PingManagedThread tests a ManagedThreadFactory inside an asynchronous servlet. +
    + + PingManagedExecutor + + + + PingManagedExecutor tests the ManagedExecutorService inside an asynchronous servlet. +
    + + PingJSONP + + + + PingJSONP tests generating and parsing JSON. +
    + + EJB 3 Container ping suite + +
    + + PingServlet2Session + + * + + PingServlet2Session tests key function of a servlet call to a remote stateless Session EJB. The Session EJB performs a + simple calculation and returns the result +
    + + PingServlet2SessionLocal + + * + + PingServlet2SessionLocal tests key function of a servlet call to a local stateless Session EJB. The Session EJB + performs a simple calculation and returns the result +
    + + PingServlet2Session2Entity + + * + + This tests the full servlet to Session EJB to Entity EJB path to retrieve a single row from the database. +
    + + PingServlet2Session2Entity2JSP + + * + + This tests the full servlet to Session EJB to Entity EJB path to retrieve a single row from the database and displays + the output in a JSP. +
    + + + PingServlet2Session2 +
    + EntityCollection +
    +
    + * +
    + This test extends the previous EJB Entity test by calling a Session EJB which uses a finder method on the Entity that + returns a collection of Entity objects. Each object is displayed by the servlet. +
    + + PingServlet2Session2CMROne2One + + * + + This test drives an Entity EJB to get another Entity EJB's data through an EJB 3.0 CMR One to One relationship. +
    + + PingServlet2Session2CMROne2Many + + * + + This test drives an Entity EJB to get another Entity EJB's data through an EJB 3.0 CMR One to Many relationship. +
    + + PingServlet2Session2JDBC + + * + + This tests the full servlet to Session EJB to JDBC path to retrieve a single row from the database. +
    + + + PingServlet2Session2 +
    + JDBCCollection +
    +
    + * +
    + This test extends the previous JDBC test by calling a Session EJB to JDBC path which returns multiple rows from the + database. +
    + + PingServlet2MDBQueue + + * + + + PingServlet2MDBQueue drives messages to a Queue based Message Driven EJB (MDB). Each request to the servlet posts a message to the Queue. The + MDB receives the message asynchronously and prints message delivery statistics on each 100th message. + + Note: + Not intended for performance testing. + + +
    + + PingServlet2MDBTopic + + * + + + PingServlet2MDBTopic drives messages to a Topic based Publish/Subscribe Message Driven EJB (MDB). Each request to the servlet posts a message + to the Topic. The TradeStreamMDB receives the message asynchronously and prints message delivery statistics on each 100th message. Other + subscribers to the Topic will also receive the messages. + + Note: + Not intended for performance testing. + + +
    + + PingServlet2TwoPhase + + * + + PingServlet2TwoPhase drives a Session EJB which invokes an Entity EJB with findByPrimaryKey (DB Access) followed by + posting a message to an MDB through a JMS Queue (Message access). These operations are wrapped in a global 2-phase transaction and commit. +
    +
    +
    +
    + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.jsp new file mode 100644 index 00000000..f2fc601c --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.jsp @@ -0,0 +1,133 @@ + + + + +DayTrader Login + + + + + <%@ page session="false"%> + + + + + + + +
    DayTrader + LoginDayTrader
    + + + + + + + + +
    + <% + String results; + results = (String) request.getAttribute("results"); + if (results != null) + out.print(results); + %> +
    +
    + + + + + + + + + + + + + +
    Log in +
    Username +              +     Password       +               +               +    
    +
    +       +     +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    First + time user?  Please Register
    +
    + Register With DayTrader +
    +
    +
    +
    + + + + + + + + + + + + + +
    +
    +
    DayTrader + LoginDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.xhtml b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.xhtml new file mode 100644 index 00000000..e0577f55 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcome.xhtml @@ -0,0 +1,93 @@ + + + + + DayTrader Login + + + + +
    + +
    + +
    + + + + + + + +
    + +
    +

    Log in to DayTrader

    +
    Username +
    + + + + +
    +
    Password +
    + + + +
    +
    + + +
    +
    Don't have an account?
    + Register With DayTrader +
    +
    +
    +
    + +
    + \ No newline at end of file diff --git a/src/test/resources/test-applications/daytrader8/src/main/webapp/welcomeImg.jsp b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcomeImg.jsp new file mode 100644 index 00000000..252a22e6 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/webapp/welcomeImg.jsp @@ -0,0 +1,132 @@ + + + + +DayTrader Login + + + + + <%@ page session="false"%> + + + + + + + +
    DayTrader LoginDayTrader
    + + + + + + + + + +
    + <% + String results; + results = (String) request.getAttribute("results"); + if (results != null) + out.print(results); + %> +
    +
    + + + + + + + + + + + + + +
    Log in +
    Username +              +     Password       +               +               +    
    +
    +       +     +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    +
    First + time user?  Please Register
    +
    + Register With DayTrader +
    +
    +
    +
    + + + + + + + + + + +

    DayTrader + LoginDayTrader
    + + diff --git a/src/test/resources/test-applications/daytrader8/zos_db2_files/RUNSTAT.JCL b/src/test/resources/test-applications/daytrader8/zos_db2_files/RUNSTAT.JCL new file mode 100644 index 00000000..07579d73 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/zos_db2_files/RUNSTAT.JCL @@ -0,0 +1,23 @@ +//TDRUNSTA JOB MSGCLASS=H,MSGLEVEL=(1,1),REGION=0M,NOTIFY=&SYSUID. +//* ----------------------- // +//* DB2V11.JUN2915.SDSNEXIT +//* RUNSTATS +//* +//STEP1 EXEC PGM=DSNUTILB,PARM='DB94,STAA1',DYNAMNBR=25 +//STEPLIB DD DISP=SHR,DSN=DB2V11.JUN2915.SDSNEXIT +//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(600,50)) +//SORTWK01 DD UNIT=SYSDA,SPACE=(CYL,(600,50)) +//SORTWK02 DD UNIT=SYSDA,SPACE=(CYL,(600,50)) +//SORTWK03 DD UNIT=SYSDA,SPACE=(CYL,(600,50)) +//SORTWK04 DD UNIT=SYSDA,SPACE=(CYL,(600,50)) +//SYSREC DD UNIT=SYSDA,SPACE=(CYL,(599,49)) +//SYSPRINT DD SYSOUT=* +//UTPRINT DD SYSOUT=* +//SYSUDUMP DD SYSOUT=* +//SYSIN DD * + RUNSTATS TABLESPACE TRADE.TRADETS1 INDEX ALL TABLE ALL REPORT YES + RUNSTATS TABLESPACE TRADE.TRADETS2 INDEX ALL TABLE ALL REPORT YES + RUNSTATS TABLESPACE TRADE.TRADETS3 INDEX ALL TABLE ALL REPORT YES + RUNSTATS TABLESPACE TRADE.TRADETS4 INDEX ALL TABLE ALL REPORT YES + RUNSTATS TABLESPACE TRADE.TRADETS5 INDEX ALL TABLE ALL REPORT YES + RUNSTATS TABLESPACE TRADE.TRADETS6 INDEX ALL TABLE ALL REPORT YES diff --git a/src/test/resources/test-applications/daytrader8/zos_db2_files/dbbind.jcl b/src/test/resources/test-applications/daytrader8/zos_db2_files/dbbind.jcl new file mode 100644 index 00000000..261cabed --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/zos_db2_files/dbbind.jcl @@ -0,0 +1,42 @@ +//DBINDS20 JOB MSGCLASS=H,NOTIFY=&SYSUID.,REGION=0M +//*********************************************************************/00010000 +//* JOB NAME = DSNTIJSG */00020000 +//* */00030000 +//* DESCRIPTIVE NAME = INSTALLATION JOB STREAM */00040000 +//* */00050000 +//*********************************************************************/00290000 +//JOBLIB DD DISP=SHR, 00300000 +// DSN=DB211.D121916.SDSNLOAD 00310000 +//* 00430000 +//DSNTIRU EXEC PGM=IKJEFT01,DYNAMNBR=20 00440000 +//SYSTSPRT DD SYSOUT=* 00450000 +//SYSPRINT DD SYSOUT=* 00460000 +//SYSUDUMP DD SYSOUT=* 00470000 +//SYSTSIN DD * 00480000 + DSN SYSTEM(DB90) 00490000 + REBIND PACKAGE(NULLID.SYSLH100) ISOLATION(CS) CURRENTDATA (NO) 00728260 + REBIND PACKAGE(NULLID.SYSLH200) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH300) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH400) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN100) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN200) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN300) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN400) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH101) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH201) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH301) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH401) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN101) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN201) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN301) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN401) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH102) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH202) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH302) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLH402) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN102) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN202) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN302) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSLN402) CURRENTDATA(NO) ISOLATION(CS) 00728260 + REBIND PACKAGE(NULLID.SYSSTAT) CURRENTDATA(NO) ISOLATION(CS) 00728260 + END 00728840 diff --git a/src/test/resources/test-applications/daytrader8/zos_db2_files/dbtable.jcl b/src/test/resources/test-applications/daytrader8/zos_db2_files/dbtable.jcl new file mode 100644 index 00000000..5398fa74 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/zos_db2_files/dbtable.jcl @@ -0,0 +1,255 @@ +//TDBIGS10 JOB MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID +//STEP01 EXEC PGM=IKJEFT01,DYNAMNBR=20 +//STEPLIB DD DSN=DB2V11.JUN2915.SDSNLOAD,DISP=SHR +//SYSTSPRT DD SYSOUT=* +//SYSUDUMP DD SYSOUT=* +//SYSPRINT DD SYSOUT=* +//SYSTSIN DD * + DSN SYSTEM(DB90) + RUN PROGRAM(DSNTIAD) PLAN(DSNTIA11) - + LIB('DB90.RUNLIB.LOAD') + END +//SYSIN DD * + + SET CURRENT SQLID='WSADMIN'; + DROP TABLESPACE TRADEDB.TRADETS1; + DROP TABLESPACE TRADEDB.TRADETS2; + DROP TABLESPACE TRADEDB.TRADETS3; + DROP TABLESPACE TRADEDB.TRADETS4; + DROP TABLESPACE TRADEDB.TRADETS5; + DROP TABLESPACE TRADEDB.TRADETS6; + DROP DATABASE TRADEDB; + DROP STOGROUP TRADESG; + COMMIT; +//* LIB('DB2V11.JUN2915.RUNLIB.LOAD') +//STEP02 EXEC PGM=IKJEFT01,DYNAMNBR=20 +//STEPLIB DD DSN=DB2V11.JUN2915.SDSNLOAD,DISP=SHR +//SYSTSPRT DD SYSOUT=* +//SYSUDUMP DD SYSOUT=* +//SYSPRINT DD SYSOUT=* +//SYSTSIN DD * + DSN SYSTEM(DB90) + RUN PROGRAM(DSNTIAD) PLAN(DSNTIA11) - + LIB('DB90.RUNLIB.LOAD') + END +//SYSIN DD * + + SET CURRENT SQLID='WSADMIN'; + + CREATE STOGROUP TRADESG VOLUMES(WSPRF4) VCAT TRADESP6; + COMMIT; + + CREATE DATABASE TRADEDB + STOGROUP TRADESG + BUFFERPOOL BP2; + + COMMIT WORK; + + CREATE TABLESPACE TRADETS1 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 15000 + SECQTY 5000 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP4; + + CREATE TABLESPACE TRADETS2 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 15000 + SECQTY 5000 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP5; + + CREATE TABLESPACE TRADETS3 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 15000 + SECQTY 5000 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP6; + + CREATE TABLESPACE TRADETS4 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 15000 + SECQTY 5000 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP7; + + CREATE TABLESPACE TRADETS5 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 128 + SECQTY 128 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP3; + + CREATE TABLESPACE TRADETS6 IN TRADEDB + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + ERASE NO + CLOSE NO + LOCKSIZE ROW + BUFFERPOOL BP4; + + CREATE TABLE HOLDINGEJB + (PURCHASEPRICE DECIMAL(14, 2), + HOLDINGID INTEGER NOT NULL, + QUANTITY DOUBLE NOT NULL, + PURCHASEDATE TIMESTAMP, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250), + CONSTRAINT PK_HOLDINGEJB PRIMARY KEY(HOLDINGID)) + IN TRADEDB.TRADETS1; + + CREATE UNIQUE INDEX HOLDINGEJBIDX + ON HOLDINGEJB(HOLDINGID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP8; + + CREATE INDEX HOLDINGACTIDX + ON HOLDINGEJB(ACCOUNT_ACCOUNTID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP9; + + CREATE TABLE ACCOUNTPROFILEEJB + (ADDRESS VARCHAR(250), + PASSWD VARCHAR(250), + USERID VARCHAR(250) NOT NULL, + EMAIL VARCHAR(250), + CREDITCARD VARCHAR(250), + FULLNAME VARCHAR(250), + CONSTRAINT PK_ACCOUNTPROFILE1 PRIMARY KEY(USERID)) + IN TRADEDB.TRADETS2; + + CREATE UNIQUE INDEX ACCTPROFILEEJBIDX + ON ACCOUNTPROFILEEJB(USERID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP10; + + CREATE TABLE QUOTEEJB + (LOW DECIMAL(14, 2), + OPEN1 DECIMAL(14, 2), + VOLUME DOUBLE NOT NULL, + PRICE DECIMAL(14, 2), + HIGH DECIMAL(14, 2), + COMPANYNAME VARCHAR(255), + SYMBOL VARCHAR(250) NOT NULL, + CHANGE1 DOUBLE NOT NULL, + CONSTRAINT PK_QUOTEEJB PRIMARY KEY(SYMBOL)) + IN TRADE.TRADETS6; + + CREATE UNIQUE INDEX QUOTEEJBIDX + ON QUOTEEJB(SYMBOL) + USING STOGROUP TRADESG + PRIQTY 2500 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP11; + + CREATE TABLE KEYGENEJB + (KEYVAL INTEGER NOT NULL, + KEYNAME VARCHAR(250) NOT NULL, + CONSTRAINT PK_KEYGENEJB PRIMARY KEY(KEYNAME)) + IN TRADEDB.TRADETS5; + + CREATE UNIQUE INDEX KEYGENEJBIDX + ON KEYGENEJB(KEYNAME) + USING STOGROUP TRADESG + PRIQTY 128 + SECQTY 64 + CLOSE NO + BUFFERPOOL BP12; + + CREATE TABLE ACCOUNTEJB + (CREATIONDATE TIMESTAMP, + OPENBALANCE DECIMAL(14, 2), + LOGOUTCOUNT INTEGER NOT NULL, + BALANCE DECIMAL(14, 2), + ACCOUNTID INTEGER NOT NULL, + LASTLOGIN TIMESTAMP, + LOGINCOUNT INTEGER NOT NULL, + PROFILE_USERID VARCHAR(250), + CONSTRAINT PK_ACCOUNTEJB PRIMARY KEY(ACCOUNTID)) + IN TRADEDB.TRADETS4; + + + CREATE UNIQUE INDEX ACCOUNTEJBIDX + ON ACCOUNTEJB(ACCOUNTID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP8; + + CREATE UNIQUE INDEX ACCOUNTPUSRIDX + ON ACCOUNTEJB(PROFILE_USERID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP9; + + CREATE TABLE ORDEREJB + (ORDERFEE DECIMAL(14, 2), + COMPLETIONDATE TIMESTAMP, + ORDERTYPE VARCHAR(250), + ORDERSTATUS VARCHAR(250), + PRICE DECIMAL(14, 2), + QUANTITY DOUBLE NOT NULL, + OPENDATE TIMESTAMP, + ORDERID INTEGER NOT NULL, + ACCOUNT_ACCOUNTID INTEGER, + QUOTE_SYMBOL VARCHAR(250), + HOLDING_HOLDINGID INTEGER, + CONSTRAINT PK_ORDEREJB PRIMARY KEY(ORDERID)) + IN TRADEDB.TRADETS3; + + CREATE UNIQUE INDEX ORDEREJBIDX + ON ORDEREJB(ORDERID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP10; + + CREATE INDEX ORDEREACTIDX + ON ORDEREJB(ACCOUNT_ACCOUNTID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP11; + + CREATE INDEX ORDEREHLDIDX + ON ORDEREJB(HOLDING_HOLDINGID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP12; + + CREATE INDEX CLOSED_ORDERS + ON ORDEREJB(ORDERSTATUS,ACCOUNT_ACCOUNTID) + USING STOGROUP TRADESG + PRIQTY 5000 + SECQTY 1000 + CLOSE NO + BUFFERPOOL BP8; + COMMIT;
    + + +
    +
    + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    The current DayTrader runtime configuration is detailed below. View and optionally update run-time parameters.  

    +
    +
    + NOTE: + Parameters settings will return to default on server restart. To + make configuration settings persistent across + application server stop/starts, edit the daytrader.props + file inside daytrader-ee7-web.war (which is inside the + daytrader ear file). +
    +
    + Run-Time Mode +

    + + + +

    +
    +
    + Run Time Mode determines server implementation of the TradeServices to use in the DayTrader application Enterprise Java Beans including + Session, Entity and Message beans or Direct mode which uses direct database and JMS access. See + DayTrader FAQ + for details. +
    +
    + Order-Processing Mode +

    + + + +

    +
    +
    + Order Processing Mode determines the mode for completing stock purchase and sell operations. Synchronous mode completes the order + immediately. Asychronous_2-Phase performs a 2-phase commit over the EJB Entity/DB and MDB/JMS transactions. See + DayTrader FAQ + for details. + +
    +
    + WebInterface +

    + + + +

    +
    This setting determines the Web interface technology used, JSPs or JSPs with static images and GIFs.
    + Miscellaneous Settings +
    + DayTrader Max Users +
    + +
    + Trade Max Quotes +
    + +
    + By default the DayTrader database is populated with 15000 users (uid:0 - uid:14999) and 10000 quotes (s:0 - s:9999). +
    +
    + Market Summary Interval +
    + +
    + < 0 Do not perform Market Summary Operations. +
    + = 0 Perform market Summary on every request. +
    + > 0 number of seconds between Market Summary Operations +
    +
    + Primitive Iteration +
    + +
    By default the DayTrader primitives are execute one operation per web request. Change this value to repeat + operations multiple times per web request.
    + + Publish Quote Updates +
    +
    + Publish quote price changes to a JMS topic. +
    +
    + Percent of Quote Price Changes to List +
    + +
    The percent of recent trades to display on the Market Summary websocket.
    + + Display Order Alerts +
    +
    + Display completed order alerts +
    +
    + + Enable long run support +
    +
    + Enable long run support by disabling the show all orders query performed on the Account page. +
    +
    + +
    +
    +
    +
    +

    c=52d}w9qk!-@R7k14zG0 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

    V~I5Eg)39GLXRo+X0LUO3j+A(zSY~6pw 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%0A}mpuf>i6wVstxdNy){{_fLKPZTo%gDw>6Xi$qS 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 VUIe@dcoFa-;6>n{Ap*+(|2JR=st5o8 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c731.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c731.dat new file mode 100644 index 0000000000000000000000000000000000000000..756b908f0f8e9c971dd6613d7e3bdaa4e23d3d24 GIT binary patch literal 69632 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 BxUv8M literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c740.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c740.dat new file mode 100644 index 0000000000000000000000000000000000000000..3f2ad6e69d9e6ca07f052b1df9230f638cf7e20b GIT binary patch literal 69632 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 O5g-CYU`-J~{{IgtP|kb+ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c771.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c771.dat new file mode 100644 index 0000000000000000000000000000000000000000..789d9ae440f8bf2e46dd599ff76e3a1b86fa07f1 GIT binary patch literal 69632 zcmeI53AAKob?;Bjb#Kjc)$Ms6ZiC&os?NZmg#(DlAPOqVB+5L9433P-AfRZR$ROYx zUS3o%h@go$fkQNE1T^NYyu>FO4aw5vImD=M?_b?-pKjWg%Ui4!be&#{KUKS`&fRC< z?{t6v-~P^5-i4m$rQ|>TQ$h3S&f;F*IVO*Pz4+&0;XOV*LS8vv{wsQ3-MuL#KU|*w zwm+F){iau+H=8a`<2xOTz^3oZ|H|7R_Tu!Z>GVVPQHv)Jk_sdhNGgz2AgMr7fusUS z1(FIR6-X+OR3NFq?^^}-KlMlR-UV`2i~c@!qF0hx5QP0Rlk1{~!bv-rvhL_9Bjw>)r+Ani?V&3Jh)d)__^JG_jS zT5d08yvc1Dui)k6r7)1!iVb@$>rFng_}b7P%4@SVdoAZp{$lZvqmjInp0$_q-sJYh zkBxWu@>;cQuNAz>N8M}Dg1lCbKUef7cPzf<`=PwnEZXO0yvfHFUkgT>N^6_FHtS99 zTzoCu5y@+vt@c{Uo80AIi^lR=Z?nC&NJ6Ae$)BVGNd=M$Bo#<1kW?V4KvIFE0!amu z3M3WyeX2m}&%EVgm#;_9L!XQ8i>^Ym-ZDAo@9SgluhCnH?1$%<;6X3=*UT>df8M)D z!rzkrcKx#l|L^4sV*jt$+5RtnPQ3TxquBJv9$s92A?@Y7%z6847ayA{c*Vu1IQpVD zlb$;K9lYG|X46w!zhk=wGIL(Z0{V%}GOug_b>f-jUc~}xu`?^Yss+^JXI6SO3#ggS ztn%s>P^X_+?KLc*G$FIbYg#}(eP*rKvVfZP%sQ{_GUrU1UdO$GQ^~CNx)vbw4PMUz zWWLesTY$_rc>@cO`DSm<0%X3$TV??=-|8*50GZEwD=a|f+q{()AoIPvRW5T)Bh~U& zyEiOo%?0(Wv4CctEqH4!pdZN=y>%AQ%(FAzdJAag*;#Lc1vK+)$=hfF%{*K7Hd#P3 z&sMz67SPPIRd0(0H1llD+v+mcpPFiW^X?5pGOv5vEI{TBZ!ZgwdDGk50%YFuo?rno zZ+qJn&J-%zNI@0%YFzMiwCRfj4%U>kmnFJm0-xMCNl|U;#2;=7km@ z^W|P-0Wx3V?PCElU+L{@0Wx3Z?PmcpU+wL00Wx3XJ<$SWzSet^1;~7zH<`H9^`NP) zH#xw)WlZkty~&d;Lh>8D$x|#s_8Yy)Q!PUJo4m=>EJFU9y~%+V;RLpLlY=b68Eo|? zPqzrCFz-zcwg~62&6_;KB6<=zVS9(TlhDJYdfw!j?k&EaM6TdX4z-A$M6T#f4zq}! zL~h2L9BvUkiQKF=Il>}(61kE$d6q@=ByweMa->D{r{^l(9RcUgow$Vq+NMM83xv-pHX$a%Rp`AdtC^9pbBR~8}XmEPo&79r22st-)oy;W9k_sdhNGkB~3KYNYHN~UcjeZdQ6Z9JN73j(6bI>QF z+g0-!PyUw4{kyJfF0LeARxSJ|`hE0%^t0$~=*{RG(buTv{z;EhIGxDz&;!vCx)!ag z=6{9$3;K8H=T&oG(<9_RO60xhAE1|_XQMAfpMi$xMzpP(yPI>N0y!#>qXIc9kfQ=Q zDv+ZBIVzCjtYuy!N67v{kC6Rm9zTG74*dxFF7$fzBJ>RO`RGBY&k;7DZIlXUeyoo( z|A>AS{UrK9^quH+=xg+MkvW6M$DjwJA-W0eqB+&{f1uw%zm9%dkC48V$2X(bqZgxR zp)W)aLH9wopnbHcM@aotAEzEf??XR}egu6t`eyV}^c?g!^e~RFKaaPe%g|X>@8{_E z(Ff3b(A&}XqHonBh)J)BUWo4J?K2(w|MrDX9JP!8&wEG9E4NKw-ANzG|1Z8ZZLU9S zkM`{UckSW38K}+|QY(xAEa+?@wNeSd^!++lNUc%;Fnz8wh16>G|I_C>Pe`p%`#*iI zvxL-Ib^p`nI!8#!Ti;%O-XV0_+ZEQ^q{%xBNG2suj)&#?$O%Y62w79nSu&z|cd znDM;KXJ2L!a+dk*c@`mOna`eY5ptIK>;)DfXPM7lXc2Oj`RvOrLe4UueT79d=Yq^< zUuhA|xghh|S6M`JF35cL)h>b!FUWlMH5SpF3o@U*$Re6^LFTg;TSRj%$b9w^i)hXT zna^Ho5zV{bP%evy9$9u?RWK=zXU}$XQ13jTRwi8ND}I zL~}06=)Kt@nsZS`@4GCbITvO0zS|<2b5Ta`dt3x(T$IuKUW;hXMH#*Cvxw$gl+pWs zi)hY88NDB{h~`|B(fg+s(VUAidT+4^IqSbY$)BVGNd=M$Bo#<1kW}DtP=Wkm>ap|t zpucI92cMdW7^diR^=JM!RTM zHT7fkf1_VPKY{)aRas{*M@Zd3^hM|q=o8Ux=p0&9^?rh0s7LV3|NrbqcijG1 z`hS@L%Hj1-&K~XA|37S@zReq%$2OG!EWU$jY%4|p`aHGX)&MNfJ1Mqp4ZuRgq_$&g z02WxDU+mf%fQ5)DZO_&KEJVy``?>~zbqV@mKb>Fav<)E4djPoL{_Iki=r|I_C>Sx$)wIM$stEBuRMt&Xz@6Kb(m z$6EvwAlB*xi%>kVRwr77>WQ^_(PCss+eRRzVTs{(>Lu3d#r7UdfLN=SScHm+wK~}% zluWGEDHg#5h_yP^BIGRA>NJaxvskOsEke#>t6OAL3A^OhJ( z40n*TSSyDmhC9evs_L-Ba0fYywQ^WuxI=TE5o_hJ#E|?;AZGys4oeIdw9YdE1}<_HTOelv0~cF_oCOSAViB$LjDUelU4(HyBVgb% zi)fu^1Pokm5potV;IPDy(LN(!;C1#Ma+cA1g+<6&M(>ptA!ixAS6PIdW%OQc5ptH% z`+AFzvy9$rTm(onBcu0Pi;%O7-s>zv&N6x(mKbv9&5Vp*hb4yG`!ge>*I|j_h@55g zIxI09k+Y0mhb4w1a+cBSu*7gg&N6x(mKcu6Sw^qJ5;#3&&cR?SYkNVI?u}Jby#9J)|_W$^g1jt9Ba+gPSsA?!OAN=F z^Q?^Cce;v=HRo9wy*IiDkY-j!?@boboM&b9-fR)gdA2(JM&~Kw(K<`jZ9jiykzK_UT(96(s&|}d<&TP6M+ay@HT{3l@1S2pKZ*W1`p2rN zz4Qp_*Asa;`V#cn=mF>x&=qJ&HT84!d*}*1LaM60`qX_yK7-zh-h{qE)%ztK{(nKg zjeZfm6TL-`t>$yrdq1&cp@w4Iy<1vn5f+D^`b z0vw1KZ6{|z0S-irwv)4<00$yQ+sRo_fCCYu?c^*dz=4PnSf(T>z=4PnSf(T>;3Ag~ zSf(T>;9`rAv!DP6B1T}DlAwS~?LFiyD8PY;5m=_QA_fs7uuN%X3?fEgnUbIY2O>sb znUaiN2O>sbnUaj&E8Wim%ammFUS$#LETi{oi;%O7-q%}%I?L$2#v5zT$a)6K*VUMIhSShIuJ49FUzuwUI!vZL(RD?qt}6m(NJ?P zPxp`A?Vpb%kW?V4KvIFE0!amu3jFt1U@4vdJ@x#>ONgt?U9J8zcOklm&VOzXJ^$2C z^a$A{bpH3$^Ov>sdW0o({`b`Lm)+;&2&sG3V`rAo|Ih59^PjpykCR?P|9?-N|I`P_ z5RwXa7I-pE@Je4fosx8N*txn*AS*)VY;wwg;I4F)^VT{8PWqNi8xoBbcr(klmnR4VfK!aunE!5ql_>H|QP!)8C`| znsi0C0GK{khmfx74gk~VTD^2lHvj-rsO?CV_4a>WrgrJN-u*v)t_h^Y#JjP--W4%dr&>gR85J>Cr&&ZxSrKz} zx<#~@6+r`MSVYTN5j1e7i-2h=f(FjAh}N(oXuyGqQK-Mgid5BsiBYJwwjyZ2fr(M5 zb*=~+IMcEJB@S^j={R>MW!8 zN{diu8NF9ogq&scUTqQTETi}J79nRDz1O%1n5HVD_gahS*r>|rz0M*!HmWju9hexi zdZsF)*MW&Kn5HVD_j>!3=3LcHW0OBg1(FIR6-X+OR3NFqj)3-Am+l^gZaC(M!;?&=;TwqXD`>HO-oW^x5jMb1mX2)$G5a{|o&RdMEk; z^lj*C(Q{SP$7v?na=Y3`!W{27ryM6W_GKui+&3I5c*DZFLmANPKRR{YPj~VE8QFc`^FF-W=v`v} zKkoX+yWQ{E|6?`dUG;5BsZ-o)#Q?yVre3vb0ANf{uUfM`0I=2RruqLdExu~q{QsB^ zU$tTWf6Th;YSaAxm}S@1mihlNtFEiE^@PidMc37i_5a7Lxvq8%0E}63UF{hF7}MIT z_6-1x>FiYpb{hcxKix9_Kc>-FoiqPGrq5ShX8wOno3Fau{QsCPUv-7~|1nLz>Pqwf zV|skmRkjDltO0XTiG!!6y@9RR1#0T+GU0C4(T-BemUsv{9& zR&&?HO*s-VhF;XfO*s-V2L05;O*s-VW{}pzO*s-V=9ga+H|0pg82VEy#Ux@3{;8E? z5;2DV)Pw~%5-|n<)r18&5;2AV)oL+`7=wUn!U9flb%OcSgaw>x5%q*MVF9OEL_J|m zSitEPQ6F0q7I20|bRg7(1)OOSt$0mXfFluOxJ*r0fFluOxJ*r0z&Z9Qt$R)C>`25I zE>ja0;7G(6E>ja0;7G(6E>ja0;7G(6E>ja0;7G(6E>ja0;7G(6E>ja0;7G)nl{z(H z0ggnBS*lYL7T`$4n6)}JVF8Xrj9IKx6Bgh|#F*7OHDLjcM2z7wHDLjcM2th~EG)p0 zh%sEIwkakNW4KIhb4((}aGBbcok&DTowx2pBH%K$`JG4vT&A{dClUddsmtg!5&@T~ z%jh){0hg)E=)KbYcHlDgncekW64u6}&-{!8>_vc=To`N355egjPDMWUltI&$7>uARa5MSnEC;am*W4=*CV8s z-v8g-|KFuY@E)=Mf7=f)KKQZp|8duUW(ocOsb8~i&agCw~)7-09 zYyrTS-d?>L0{~ik^;!%7=P!c;}=KdujVl%6y9@6-0H%U%$R zY5H{i>Me8sK25)R+uXm;((HQ2+`rGt?0VPQ|2_+|>pipoKI^jUeY5{Q%d+bOv;RJ; zvg>nZ|9uu^*O#gNpJuM^BE8Jqzfbe8zTDiu&l2tW3UmKHE41q?&Hejy{_3mD{rfcj z>Z`5&?{n9DeT~_FpVis*wPyc)7H8Mjnf>>{IQ8{r|9vn{eS@t5V2y!*vrVqVV4V6! zbN@aVr@qPDzYoT#Z#MVugK_Fx>?;6#Fiw4|eFcCI#;MQSR{;26occEV3IHFB)5zOb z0Qg{>M!~)Uzz5?riux4*)0*p$l}moXWe&z^%-A;o_+XsItbGH355{Sf>>B`lc*;us z27u`y!4|9Z3jn6i!4_gr9ft7XJ`F(w4nz2WpN60Thar5(Peagv!w^2`ry*#-VF(}g z(-1V^FoX~MX$Tr{3nF~zPeagvTM*%cdm4fU9ER}WJq-m z8iEEKhVa2O4M77AL-=5thM)n5A$%}RLn`kugb$`^2pVu0!Uxkd1PwS0;e%-!f(9Ih z@WC_&i z>}i){PrDp@+GW|(F3X;FnK$YYvg~Y^WoNrAJKJU1(=N-Nc3Jkc%d)3kmObsV>}i)} zPrJ;;9D$wf*(F+2T^wE&#+5>hF$tI`|1%gTh)zc253=L=!5Em zD7*Bh*`+_tF8yhC=})sufBG^#Li(k=^LX?ylwJDM+jz__{j#oIjw$!{tFlXf>H!|# zt4BzEl*jKw--^B#eHnTpdIb6;bZ->0pjK6Wv%k`{72ZP{|NmM4|CMil^Zdus|HoZ_ zStWwZZ2 zEx=~Q?7vS3uqj(CxSvV`uvxSIzfb?KS&s<-?Z2ilC;NzYESt@k0MPtvwv+%&GpCij zHU~fQDdmRSW>&IL*~D0AQJRb4?5Y;5f~- zF#v$$G}l@G--qKg*T)0^j?>%_6970)b7M>Z;5f}qN&w(EI#^`ujQPc10b?b--t2z> z$7yah`yaq@np@2N2XLI`RM^)oL15N ze*nj6&8Yu}g9UJ$)~o>l26cLaeFIjm9H-ULZvbQrb19`a>K6b`pMyHYk4{_wa3OZofr$X}(-K(V zz(fH0X$dTFU?PD1v;-D7FcAQIS^^6km2`q46B7pg{1Qwj)ejh-emcRlBCIYBWOJIQm69Jf~C9uGO zi2%;i5?J8CL;&b%2`q46A^_a91Qs|j5ddyl0t+0N2mm)Nfdvjs1b~~Czyb#*0>Dj6 zV1WY@0pO-3zZ?f90>Dj6emf3K1b~~Czyb#*0>Dj6V1WY@0pO-JzxX$J^1q}4Nd=M$ zBo#<1kW}FJrvlT?|IR)CtglY;(RTiGJN5jt8`YQQ9%bi$m!7}u!6uAg_s&1x(wE^| z`ZC|qJTrVtU*=Oh{xEtIdc7V&NP)g*cmL0~^kw*#z6{^emnrBw(?3DKi{7V4NZ+IG z`ce1)cV7Qr*5f?t{{PPF|BvJdzy1FI-TVJ{>REWx_5U~M5xn2H|KHJ#3l87K|EF00 z|DoN+_!8Iu$6f!@QvH8GOR%-g{C_}4u${O5e?UX9T`&L;&<|`E4FCkR1KTqO00O#! z?O6i=0nNa6Nddsr#?W5fV*Wp%H`tcnmz)378f;h0{|9si+g0=b0gb_S&HR5rU$9-b z6#xNk!FIy{KtNZp-829Y&=hRPHvk0m1lw%`00Aw*c1HogG;n0L%>M^;2itSD0wAC{*j{EU00Mf0?d1jl0$PLZ6$StTKu&w5 z0e}FA&|YO*002>dE#AYgC18ytX~_STpH0CL*%F#!PN zw710s0Fcwk#{>Y7(<#IR0FcuuDgl@x0YFY?CPn~&oX%{F0023iQj7oqIi0d1faz%A z?uET#0szSARAK@E$mvvL0szSA)RX{B(*Wdj>WTms18Vs@vOYixkulszo&2j#&PuE#e$~M@m*J9JqKs6h0#@>Vp@0tX~Q_)bS4fddjDfTtsnzyXO6!qX8*;DAI3u;~aSa6lpi*mSn+_U}Lv zNGgz2AgMr7fusUS1%AgXke}5KdG2TEgD89QRCdjgyAj@ikEUO8!tR~3f(zCeqEG}KT{p#v* z=^0#lhAw@EE`5eBeTFW5=2G5y4tgAVD7qgyk1kVhoS{pfrc0luOD}f;C=po7`u`L4 z2x+?XX}a`jy7Z4?{r`XC{(qNV@ZDEDmi|BP`j?mL|3f-~ovrHsaV!|8OwsIrNMo=w zZ}vZ=FWA{;_CKU8*v*^$59tba3ugaAnu6V;_5VY9g54SO{~;~G?yUL$kd9ziHgIr8 zgN9(YZ2mu_AK0y^|DR^AtbLpp=qmihmX#$dN?{y(HI*zK7A4`~Z_yXOBxx`N%F`u}O>YUt!LSmn-@CSkX4 z_CKUY*d3Vt4`~s0=gj_xaGdTkv;QF+r@P$x{~;WwyTbf`2*>HJH2)vMak{I_|A%m# z?rQV@AsnZ>M*aUZb2XlslG**{_CJK< z^zvr^LpV;aVD>+RCj?*id{}16fy|VfL5RTKUnEwyq zIK8SZ0f0henHEu!&=V$bs6})`gq|>g!z`i~eNULc;qJitlQL3^7uZ|$>gow3a4RH2NKa27 zfdL6nPfs9$0ST(y6G&h{0@%|NNN|E3nX?i|U_b)A(-TNwKmxwg6G(89`xJnuCy>B^ z1caw2kidWhYjt{?e#d7xN%~0zk_sdhNGgz2AgRE^E08a#8_)e5{T_NB`Wf^<^}xAX zd3+Q42K3eFY3Os&5xN$wt7dplAaZ|LzepFwX! z--W&jy#zf6hrcKPFE@D05oT1=KSRHV-j99`y&Z?Y^!xvJ?*C8s|NDg=;ZfZGzjOb8 zy8qt+9AUfWlUjxDy#N1i@BdHt|GP?$;9aPn_3Zoqu6*VtyWIcpO=-ZZA3jpNCHDWN z>;LP;KTG!iECTOsw*G&}BJkdp7yz&cytg$504xIU&Bp+MMc}<{3IJFHuG8Wa+y7y; zm=tH?oBtzvhW)&`|A-D@zhLe^qCwb~8$%W+%@O^<{*1Z*i1uKA*1G=@-NAmz?0-aa zuwOR&AJH4^SIquLv^IH* zM|27MEpz`7O~QWLy8jV9!hXl>e?*J0-!=Om(IM>j%>G9-2>X4r{}C9cKT!KW&0L*Q zrfKd!0^{`O%>74Toc=O%{}C9cAK(8UfpPjP%>74Toc>Dd{zqV({wlNo5g4bx+U$P> z#_6vy`yYXE`fJVpM_`=(I<^1P%)vM+-r@!9Ze+0(qZ!q^CfpPj9&HYDUoc<Xo7w*ej5Elq{hwwI#%Y`TkH9#C zg1P?)j58>j`;WjlgBf%G5g2DMYwkY+;|xmH{g1#ngK}*DBRI}LfPl0A5g=zE?)u5@ z`hnyO#1=dIAAxcPf(XR^Pt%9xh_iR@KLX|qgc&&ZA3<{l!VH}IkH9$tVFu3qNAR41 zFaziQBY@68jx6pULJ&c82Eq)S{f|I817QZv{zovKfiMGS|0AHzKoEhm{}EJYAc(-( zfByE$$bpY=KMJlh5N7Z!i|AE75N2?sMf7SJ2qJj4MRXJn1Q9&PBKq4M2qHMjB3iJ4 zAcCVUqHts&h~T*v(Nz}%K?KipRn~xP_cM9E3qV5TG>>rs2!@=cBN!1#XdqO<5sU~X zG!Uxb2u1`08VFTz1S5h04TLHyWf!v?q z2u8$`p22)fFd`VxU|UQuBG&B8<>Mt45vzLU3h|PP2;?(YjF(hItmB!RiI-GF@aVbO zcu7UXN}jn=yrd#xDbJi-5@))yLwM%ok~qsE`m33fOX6&c=x<_9E{St2qQ8ncxg=g{ z5&d1v$rW&}i|~)xoLm7fvxp9-Ik^JPvxp9-Ik^JPw}=j>Ik^HZu!s()IT@%IT11D_ zoQ#Z@TZEitXuQHA zitI>NU`M(FJJJdol&=+f8!7xf5_;{JbfPP4K=zMDX@nts1Pdg=H7v$7z?&Vnh(LWLc#|_vJJ9`YiqbT`x)565?Th_T>K`_O|3{Qh}rb zNd=M$Bo#<1kW?V4KvIFE0!amu3M3UsD)9KLz$qW%006O!;+?RGc~Cd#*FdaKQTIO+_7 zo=V5lI^vLXQzAOR8}0TLhq5+DH*AOR8}0TTFuz!Eu`6`&y6G+IT;uIp6~ F`wKdIAmso6 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c791.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c791.dat new file mode 100644 index 0000000000000000000000000000000000000000..ff867857c0d5fcb3dd38675f98b1ca0cb5c80c3b GIT binary patch literal 8192 zcmeI0y>7xV6oroi!46ZaK14^D5f8z_!hlpk)gK`uA%et~g^_^`iJgfZvGoBu^9+59 z_S%V21fdTA=Sse@&#`0OZ}Y_rfRbS&aJlAkF?qkJ$^18uGx_SWBhFNY0UrD&C6~+k z->8Gg{(T?9KDFx?ReJy2sA*{#EMQKJfYRCNlz-%sN{y6ELj>J({8 ze91%yh@f8vgE$#aQGwDhPI`|=!;kTsl?4qVv0fwBWb2mXpi2@=~QOSamL~;^zP(+j<0!k1`5+#TV zN)iSE5fh4la#h5PSCAkI=HJ=h-P5~jk9Y3-Ki^yHt^aM-vYhJq_GfC>IlcQ-^*+0e zv4&xo)_>xk6E+!^n!?}H$E=_KjQ-Oe{+Dh?>o=q2Z(ZVlS=N7c>yM|($NrT~_{%@v z%P}WiJ_9WAV^mk`jP+xtVlK$*|%OI0ZI=_5bFGu0o3lA%1dG>WR<{ZRv`JJLoglyQFNAb1H1 z1tmjyZRr%%@X9%fYJSV>3T2j0l> z3V-~$jH=U$-xSI$-*_^-6orD4p+dGyifZi4l&CFFhY4y<$M4{gGZ0FK3fo)^b?IUr z2I%{3xbhZa}!jCSz?`xYHqlPLYXbT-U}~1hLTE&N;Q(j+3v}; zm7uJIUoJ@2rqZVg>%sdaD?_oM%pyVu{QA!<}jFiVekzoybS_Wbu$U@IaP(sO3exvkXp++5~ zs6sEZSX97PhK+DVwhZK!9%RlkK5@yD)B_2%U*7J0a&X)+NxM)g}eL0E2&se za#qAvfwG*97UYAq|DIgJiu6i_m!()xGL|>jR*|yY`zuS<4NK*-4Un@gIKe8VSWt47 z$5x55O0*v-$JpWcd=-~*VxpYKN-GwWoaMDurmQUgPRV*QX`o`61KL)DS4Od*D^LX*RryiUlQSg>5;MRb^1$0-RA})3OQc*r5*aDk&C}oE5RvpscF*50`O0 zbndibnQ5ow7%M9ll#J!ewbi7o>h^jD;@V!NEMbk^<%U;9v7qEEkF6GEfs6(dcnwu}@VTgCNXhDWp z=v5;qq2wsPtu6~|PcR>>Lrt3!*5Xa_Fjgllq2#Q9tsZ679{+LySR-#qC9H7bT6j5% z1tn(%ZS^Uu?(ElOTpd>DD3-CW&S&syC>E5Q6|yy;tcE2sWWHLa3?-~ReNMousaQ~Q zR@jLDi)SF7fxpZ^#&V;*VPtfLO%*nMH|z+bo%M4K@pIZq*jcdG37h&O?0VRqux?>f z4#G}=Z6Iv&XRuGe-XLt!@37Cq4uCButnD4~7i|y1hQuR@-@z_}?E;%Bew*+L>`2&J z!kQn$J`USTSmRgNEwBS%n;Law3I_c2c4=1sAOHVc|C71AQJ0Bwp4+>3xSE^HdwZ^f zS4+)JQ1ZDc!de6wxpm50DYNSOHaE#M0hKJTBfQ$nc+gM`kF$?Nq{QecwTN^%V-a|>bBKj`3OrWSzH0FRnWNpeEIAFf6xojmh0!@d49!$ zlC!i{LE|-RB&%atdX?t2p8_jDSVGBJK3gezHPj?~yJRiCZ+lcJ=8VCgUIQ_&sv3UD0P%{)L@-B)|yg<>qJ`lP zx#3zl#xZ?pTC! z^)y|DUNeP)l7$uIy#mGRJ7Sd@qIu&LtD$YZfnHNAi}wobu@2eRjkG3z+IY*GQ!FU?7DVUDHfER z#d`(zjF0ax0BddCk5yb|v!${CyI!%Nvv{Y#UgD8^c8}N zcx@F6O3vb~0(+@)OY)JgJNr!{tl-Gg@Y*RBl$^y|1@_X80?AtRIGG5|hw28wYOh#O zau#nD*h@crRI;WltVrT2`QqL1ZX_(Bsm#_O&0a#CMr|%&dq*zdL7O(&9 z6_;2uqqusw^=c0iS8{dv7T#I0pyVuG|Jy6on3)Gw_rQF`GBzHQadlBFC^?JQ|Mto+ zw31_-IJGddBFZs$js>}^VnNASy#BXW{$s8j5|*C;`*Rjb#1PNMF6g;p#lfW7)>Z^*a?Z#zR+-QM^DUQfajO3va90DI1m$}+CK>-rPcmUi;=>ZMpv za+cNr$XQoQvO1q2FGsW4ttCP3O;|$7Sy}@i=lJ(>jNRAfskn?^?wtm&4`B%b?Ck{|BC^eYY1E{m3mV^yEF*Evitrw)Re~i4QzLUU&QiEwtfO_4k7a(Pa z7Woy-oYYdDymu)Wlp0Ly0>sv<1!fcwSh=6dz#FJwWW8D}XIdMe!Nk!rvWd0H9A^B` zNY0Lf6bwo&GOZ5~`ygP-duK^xBfgV0;9vzK9|XiAuQd?`{QyQj1J$2IT&+BOhnR zu&LP!W_)>%Jn4oJm{4+}z<)|H{2w^Zj8Balt@?kSsEspPiJ#MdhTRC;8@7b7X$N7)!`2fv^%N{>_|%r- z=aj3k8(@3Ex`jiypTgqrCbbqn+kS<84)zY%GQuXlC93_zeEjSe)~f%7 z{cqR*`?|JSqSgP_HH^`q$l*7OJc0+T_5W(7au|grl@cAlVM zP--yV0&pbVd&D}9*3%b!aaKiUwwh&wH&MZ$)L^^^;7G2%Rz~*H$HNJ%`_Sv)-K$_w zYB1geaHKr&l+4*Z>0c69`6}(#iihzwfFt#&cpX{!_m(CX(Z-^8hat}U2}~%p$ao*Xk)AkF!kR9U z7pL%ymD{J{iTMf!r3T}T07pjtC7H89cPuA4YqT%}-V_CcQiJhMfWyA8Z$5_k!Xo-= zx_|xCfIXmKP;!`$wE`TDhxZhK^~jwUNMMEDgNg;E#^SvIhhu>?8;Jb-lVpLHI|h26*B_3I?SH-VboZR-Lb$NMnXXtIi8A z;(WXz;3!$Ggp6#+Tkoo2nr)tyIeSFGpwuGc9RWwl!{5oAT{CwJfi>~H2k%h=6G{yh zHp-JZqvVz63ve)BwdWI7p*MrDgi>SimVhG$8@KELfn8sH8N8Xr!mK4=^bP_?R=+9v zh^*i1w1{yxkQ2}>1%r}D=I1Q|N7k=pWy)rMOeP@n?j45^*=zz6N)5(a0*+Fx@5n=B zGspBG!yLP$8NA073`z~gTLO+!1HO?5V8HyQ1ZJMR58fOC6G{!{H?qmWEcM5IGO(v! zp{H!2_c&n*rN-hN0Y?lrYYA-w_gNrYq;rdh@!JR-r3ZD8`G4wXI?54mH$)Wk6bwo& zGTst!ls@oLKJvfvQsJQzb6e{x?EsrkU_zV2y??gtt(^pwwWzCE%!d@;VvW4YO?oR_%&>H7z1A zq10f!CE%#E`E)*xW}8T%R2x=pLqwx&<$7dj8ji}5sZiTfAo4yxzBy0^~(>{cq0eg+GsTW~a!QKL!Au98fJ>ut- z5wJPJCVv3?DC{*tlZ59c;kik8Zc@7Vt?d=q;jq<(P5eOU6Y<={X5x{A3$V|?-VB>A zG$x*F;<+ZCYn%|jH6DR&3TwI5KKXSStN%YX{zmP~})jkP(XdrnjH5;3M0=8VipyaS% zF54%-k(2p&9%k|;CHs)betI(p-U<@!neC&n*N4*FBDTmqm2AZ?*I47RCS;3&xV1BlJfTP}#fE?z` z{+CH)AMM);?>Pb!N(~lZ`v*80G#ese&ri)#F!Rot@&Ig6Feo)xkZmB~XmBDS4@Yx- zZE`e??|-fX^z#HJlo~9=b`WqhnsS|ljXFzaZL?l``8t0=!JyP&VYY>UBe&cKa+r_K zr?7|X&PEh3Dj1X+EW$egxp!7KFwC2up+(~jyX3w4TM0}kIm}v7MmG^~Z6yLG#ro*JcA%R+l6fr%UAG+2;rCEy5je_9@ZyPGT_ zk=gGp0dJRrL8-w)Y%c*v@I+~uv+g$+{#|iuwCX7rmhDzBC^cA^Z6@Fdd7hCuTU(yK z2h8s#R|vkMU{GqX2yX#|dJoRSsc~bMRb-fz-j?&(9s(0e4vXaS7C?APH#yAF)@7QM zieb8v^1>M9*Y)=8F(JW2o?4Hla z6_s(`DF?kj29ruHvH;suz!}?BXz+0|Otaq$GHC}C3`z|av@ZVR|Kb^lXF$t9#(Gg3 zXY_#06gK@;*fCaJZKl^2Kc{^JI~(>oVN)-|u7$k~)*)<40qiK)n!+ZZgq;a{t*}X# zU{}L-hs_YyhTee;x8xX^ER#l8f_IQiNkXYjNg-DMI}Cgm4Iafrag9kLoM!s>r#?8esxzjusE#amy$IR)@uS1@wpYxF(A zo14q(f2Zw>a6WRjYwR2Xd#d>(@D3{&lq@oDu7}nC&Lr2LGG_~JrSI@#+xG(O4F!Wz zgLzr~?@XHEmau~Z>096P$0h7d0uxFN=4180GwJp65;n0bdFwMnzn8)j-y$%f)L?#A z|2vcWY$-s_?yp9=-{z3p<;U!AD;Sg-EWq{*bSA%Ef2|F?6AD&zHHX*ZXZ63+(RQ00 z<}>x^Iotc-HGqAfU{Gq21z7#>bl&^9guQn2Ocj~&>#Opm`JsYAslkG*{&%{{d@6G` zueThSfy43ebMk|!lL`i<1`DzJ-{~54w|x5guRm6inLRtF!}|w;38e-Lv-;oZzUy%b z+gh?Vf!%+l3A~RK3`z|aVfDYW#O>Q8YKdb+pW!AqU zVZCPOMh78aN1u^z0iP)tlo~9+>VIe1J|9Y0zXF?rnW^I&!TVgnpwwVNxoqG zG0NL&H6^Sz~*JdN%G_`g^G zj})KhTU}vM`D5KdBGw%wV%;EG=7XHlY|4;r-{a@vaQF2n67A{LBrCLje zz&ooZB`CE?Dah;p?4A!vSlf141eP{=7QAx`2BiiI@%q1Nr}YxH?QwFsV7B^Je)#jf zfk_P_}V+y9R+iEK&MUGUB;7?c_;!t4KP=hoz7B7gj=3kqg@_t5X~E)bYd za+tNsm3~)%Gj?Znt9?rd?E9bPTE>eC2Bik`@cKXJ<-rCbd;08X1v3Xno`iQv!JyP& zUS9v#NZghuVUN*Tw(r$v0Q*6~pwwVKUjNrPvp`1nQZ0HkR|e&WKbHwiC^eX$*Z(!U z+*yFg=2mY(hUuPkH@qJe3`z|a;ProOHNkUD=`e?U*%+{&6bwoY7UcDRt*P^5WL&m8>2J$0HyR_}BIyk7`RC^^hp=1MmNbk++lldzk9 zI7499&5$MIuL=gG2J`R+Kx_d(zbR7*EV05qc)t;tSSp~wyu1NWzj0DNa<-$>ZUP%o z>lD1-6%0xZ<}=EY!l3?Vr{pN_d6u5Dh29^8C6pS=&+GsC7qewxeM`AWV7Hf94ew6^ z6G{yh;Prol%HPPyruQ=lY-}~GfH4gPgHnS9dHvtuk(UjmY{TR)32eFpWrk@Im{4l4 z5U>AZ8)t7nMPav;$DuV76pU<~UD&k^gn9knsK$#0h-`j|t0c04CGhE|nW$h;YLP{F z{oiO$TbZ-l53N!#N4MfEo47B*lVKV|jS_ zpZo45IZC$8pxJT=HmEa`2}~$8n3tFTp8EN6ltUluu10A#pN5u+nWA7&YA_!!|Gn9( zBy3_6@?tX1Ok0YSk%U00!Th}ZkKHXl;n{adWY>(vjV5NAimd3}^4?&8ef;nAr=FFO z-8eT#!HiG7#y&h|x`IKeMHXZq|2qS9KQM4Km)^f!!OX?Cy^UdJC>WF)EW{fCu~iP+ zhqNHDm$K2$H0=Z?)6 zAWUbmFl%iZ-6YT%9MVeWKm09y)66`BYXdV=!Jy=kS!>hi7YaCoFF!7aIejL*(CB=* zoQTtO5tvYFFfXtFLud9#Shrrw)i8}MYgPj0Rxl_vn2*>0;j=jfH~<5`qLX&DlKlZI zpimlr(9>i-}APW>PI`nA^m$VV*3<^GE?DV0={ z68ZYI!b_}BfY<+xzj)5T4ALjvnP2Iaq5R>7d;Fl&h`UH+dL`=+^D6G&vnpR2KC z!Yrp?^fUcsQ$BJ;BHKQpOAY95B!e-Rm` z@lDy^0IQ&2P--wAEB`Z-udgp*D_gf$k(uuLl>w`$U{Go>KP&$;V|#qhr1z|tV-}xM{Y6=D=kIdRWk$ibzX2#|n21fbntbvMUMm_7U zs=_ZRl}e4}Vb#BaHLF3d*V4y@5Liy}FfaS~Khr+on2c<2D>6#6Y_*nv)le`fwa9#| z{Li%iF*qN?oP2x<8Rk7TJ^`#IfeEDs^Rx0l(^20e^MBvRdo2;2BiiIvhqJOb9ZM68~%M+1v7iSBQNFaC>WF)EX2zH zOjoU{1;|;)RUZ>r)|Dg-v#x?cslmdm{LgfqyI)4OdG2KeGp^*oGwTtUP-?IU`}jYz zMCFYVw(+Ac70j>BkC^f!F*cD6L;eoh-V<0fefs}&%iqT46MUX$2$CUtiz9f3!uFJetp307H|qb)^83Acc=MZBmDU9nJ-ETlY^sWRBE*NEQO|6uSWs%Lppiy; z2{G1~%7xRkU`0K%S@En8FaKk(4ZqL}nNErFs`Q%TVPRhW$2QV=(MLzw?Om)RHLoSG zA{*)WJl2~A8D-_LzW_Pf+VM2We$+Gb6bnk8F>8UVgWN`%8G|iaN~!{L&>oE0ysmhd zhgbixt#1ZCmQ5ln|3(d*7uPFT(XDTM*1dw6G_u$tlY6eAt%R>SVNIUdT)~PiGVytR zy!x;D^pEnqns;d?i7d2C!dfU8lv>XGy!x-!zq34LcU@dUVD`$>FwB+;2BiiI@an&M z_puTdnDDxS8QYy50c)jTP-?Isul{px|2Q9~#=Z?r70le!auHyy6%0xZ7UI=^&cd%G ztYbNwf*G$?JqB1C0uxFN7UtD|P5_yzux_p1 zQZTcXQyzf!3I?SH^YZe)&ZNpRvTKj;Rxsm*pRh2;yph0!QiJ(;`Cs?VBl(DI`uzR` zwlWQSwwN6h3`z~==jDI>3R7fcPyZBFFth8ATZCucq+n2LumCUr>#sVVhsee~yOqE? zG)e=kBY_E}1`G1?zd^$~a+q636-vchz_i*}%3*d=Feo)xh?oBjUMrBpoce&DL^h)P zt%$5MfeEDs3-j{7Vct;*Yu$b$f!WrL2CR#ML8-waHdg*OymC&$Cher>S?!TnfoFCl zFrnlyYiU|l`U+_D_Dq?xal>kp$O0+YnZxX+U{Go>5BvB(Gq?3p3A^#^0R=P8ew~V8 z-mG9yYA`Ra|2@+k1voXX?Lm)b>Wm(M-J)PnYA_$K|2+pwOW25GmsMnD{4K!~jFrn07A>IM-&HhIoB3p5Y<}BP=c7}Q=7?c_; z%sT-7{u2rS8&%q_a%Sw`*%!m?sbElQun6w}1nxR5huQ5$0y8_fegv$Sfx7CVvVR=>6|mj}CX^b?!#e=6l?lz~Z&xt0{thfnGy5nQlp4%y#Q()J z5YND0WZ>U?{*Qb3qwD{14}Ti1|Is^0MeiULy@P+V{~z}7OF|8wggyL{u!mm~YIqxJ zcpGYX>+R2~;S-O;PKRwGY{K`jD`30Ariwb>+$DZChrw1u<^PxU|JReNf6nUvqkpIV z4}R5MPUN>X%OjIg)HC~%Nl7TRNy%rVkODM#d2v4G@t1qlC#NAo zzTHY#QO~@icvgUa{2zl2eV7y(=AaP+1lsIhJS=FWlR<{6^_2-5_7E;=t@BY_NJc$# zfMP+Z4Kl>b{}^oc-7Ux{Q_F8dV0RV|vl`GOuy9Iq8H#63S;C5X=3R;fr50F(m;W(X zyZZ_clo(~>lUQMI4lEXCZNBKF@1o%vhva#&>gVYsvh4O}Fv>v$CX_rf>-)V~`5&p% zpa2=)+PY9GBAeQwJ79wq3`z~=HC!ZRk*T}#z*^*`$1>`fLkLSKHI|Q8|1ns{6msEV z>^nOJfekGl=I7Oa6ZaT7%2nYx(Z4H3*?D$TnU3`#As0IU98m@>uFBM0eaWJ0=J z$uTSjlS&O1WYxbbwv^_E@#M8+?72-|df!7}MV8X|f+1G@yJEYK?C20C!|dO7Dsnbl z!JyP43)9d3T?zT83xfMneSjx@w5!lFLVb=QAvgG`C zC9XUyPqXU^3J5Ix)>nXyQZOiaWFe1HPMxx@*hVIK!&3<>>Y1Yn>)kmq_+UQ9PPCnttkeyoX6j#V%ywNd(wie!|wHI3x4 zJg{LQ8D-Qn#}SrLYODY&{avFDw0B_M0DU{GqXAS?Y{nb+q@Sc@AcDVXWLxCgKY z6%0xZ7GkBpD|7aYJmhR?&+Y^^<7gegrV^M?YOpXX{avoqrzPy=e(w@k_ca>;dq}~c z)L;=-`nzHqnapo{jKEqBmsdd32&~9PCO&KD#rpIW;I=2`W0+4|#XDQ{70|ASY-K*I zU{LbNA|6W~{}<0dJOh87fsB=+X3ppan<{KNYUy;;(&<&jBWcHAABJr#Z0b4K<*;2~ zlZ8#$0Xr17im=J=i)uW18h(xln{-Y*l7#0b;kijE;t|_U@mt&7u-U>Uz7LD%CN>tD z1pM6uJU0Q)O~7+aJlCrKEscqojpO2H>+^qMWBdOPxj(lrtN%az8}+}-ec>xPXZEd5 zW+vnCHMKBjPA4;yP--)imwo>4DzR{nl_#sv==KA>YOZst8DNhn7?c{!M;idH*cWC^ zUbdCYzfsS8RI!SFVV2L@#Wju2zcJX%H@7I5ak7O2fz2o$7GMhiT(R$^S~sh8w(XnR1wWYSI__v~gF&6V0a-3`z~=;Z1-_d#cG{w!e!` zw4Q==z?Kl0P--wQZvs@d-g7a`z4ORKYreGRLBO6?Feo*ck1YUj#dhDi;Q<0O-ft;O zy`=;u_UY1Ke%=MBGJchetm8rQLN_iQmQAo_3I?SH3-B&L_R!ZQY}W)5nfd&}6&U7n z1%pz91$h@B`}J=5$eE|h#^@l#Onc~dS%j`2Frn07A>IY3x+#=|ON zR4^ztSeSPKs-5aDVG}189(XYY4WHQq!+b`;pwwUy-UX;$_c=MtzDqBwVVW(H<(+P; z6bwoZ^X3}W$=hc28~g@F+2jY>ABuYBYQhpqjpgA@fEcX%A(DTyLd_N!<(lGQUfu-A zX}?&eZ0x63$tZJYlm=|Af+;G5_uQ z|DL}+REyRBKm48gzs`(4a#DK!y?4o^RK8AsOiIs@Nl7TRNy)?O|GJyn8JOWVE|^YW z-BW=!wv9HNaj}Feo)xfHeRbo*XDydp-@Tz|5#;ZdEKO zHCB)}02-cowg7=0Zj8fcy;j7V*O>lI5ZE>X6G{yh;thb<7FPp)xIiMSIrIa-UQ#e9 zHCUK80AkxxJ<*z8{0%A71+bSD3`z|a;SGS?^W*X`u!qLdH_{Hjy8+uyU_!}Z)*@FI zt))EU-;@X7hAlK_W%srMY=?qDslhzF0pQtoOv3Isi3_3V0m!*!6<|9FOei&&mp1^s z*VZn;FmHQ{ya3FGXXTa5E(L>9gZX#^Ah!DRxoek1|E@SSLh~O-WV;Eh$m&nO-_IKW zzTw?uWDkBuhuJMf)}OB^7?fIM0p0-cEv+bX_UiQQB(kbkFCwx%1SXUkEXW%G{(_V| zhB>jWm08Z5}m|0a`K%3%(uPNqiV+ulPE*tzXKyJOlpJPlznG)W47aUG?*ioik*Sy@qGv|bGv8J$C^eRcmH!Gh z`+1!4QP_kzL5%X9;$dD^{<~ufS7x8OKt?&~ZA>8M5dtf+aK#_=vGU)Yw782*S?h0l z5LnfE@XU7=3`%X7epddwldG?lIrF_WNx_U`-&Mdc-%~IsHCTX^|L&Bo$0Y2vJM0Q( zKE6wyvqu#SN(~ld<-a?%%~c6|HJ`pTTP5S_%6wnJpwwU?R{p!wZeNjyQ)6BudTO-# zswIYbOu?YkU}0ANyVDaV8i4g_KwnMmyIuzDxPn2c!6Md~6#o~`Ks*CQGmwEAJ_Gyk zWndq^blk(Aj(hm6`~R(aJ5ApIk9+v7_5baynqS`kU;O(28bbLO_y1oKk0;@|Nw{|) z3HJ{Ct^5C9LH$2mL~HF-Wm)U~e_^%z|Igo6=Q~#aZ#ODis+=NuF^fEc2W-jY>d&2C z^^bhaO5LUyYVtLXw)q{i(g`vv2_>JEtc9*A6c+pTtsbj(E120R?*YI*P_UxkzU8+z za!qBhx0}hxdM+$WV1cEw{{N7`gi?#l%j$o(z4n`O^4-{cCV}zi~&e&_@1AA}`@8q2Ds=>Gq1$ALoyfcabJM736xU>sYy1hkJ7 z4N8p`U=0Ab^Yw;um>qt^)2#z8U}qfi0DP=qP-?IsYXG=2-<&UpIlbX<6`6Tcj=anD z69t1(gN0ZFz#ZFuYe3yT3TC{&YX*jSO2LY5zvT~wSp&fBuFz8Eta0bJ2<-UU8vy%M z!JyP4i?9ZO+kLc;guT#`UVbcD_%>jt2}~$C%v$Q|rYCJ|IZg9czmdo;ER)6TX9QMc zIgQ`ifw2UIm1sXwMz(f2xnwrByW~~w=L!a;7MYhd0Nk;?y!Jg&I0#XV-ZJShhWUkp z72V6rANH{ZfIF*nP@Wo-oV3x`x1n6N`K5wEsYT{z4FGp+|E;B=(JE)=pp1_Y*;fQs zWdALHIKUbJ?${cbhX%GGuql7aE7PwDtjK~Ie>lh*0Pfg#sVzTGW)0)~=W?aVHv}fW zbxj*)i0=RIF7@fp@?dWI;|vKb>X~O03rdX@W(xomtlN%N1Xe%)gz(I7i-$#61Hc{I z8f;LR!s$#*8Vk<80N6hjtmxKYeru&`1$xew$sS~2I_u@WsvFIxcMF4uCWjLefqCR(%7COOP=3I?SH^RW(q zyW9i&C2YQp1_1sgZWtpz#aQ$wxQRqBQWyIq0|Bk@&-Wp7ca5YIq71Mv*RGZ4?f z|G5m@^<1fQ@%sP&++m3a6wg3B1Mv*RGZ4=}JOl9z#4`}jKs*ES48$`K&%pm^2IBSq t|7benuy_XI8Hi^fo`HA<;u(l%AfADE2I3irXCR(|cn1DYWc{||qV_iq3I literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7b1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7b1.dat new file mode 100644 index 0000000000000000000000000000000000000000..7354db2e9fe60da3d88adb985eb28fe205aba942 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7e1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7e1.dat new file mode 100644 index 0000000000000000000000000000000000000000..85a139e43c9a7f54f97289f298fca39c2c1aedee GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7f1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c7f1.dat new file mode 100644 index 0000000000000000000000000000000000000000..2e558d6e712abcb3c4f7d57956d160a20edc3b11 GIT binary patch literal 69632 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c801.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c801.dat new file mode 100644 index 0000000000000000000000000000000000000000..eb06862f2e061f535c9cbdf3ffb38d6168030f62 GIT binary patch literal 69632 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 g6UaP)%oE5wfy@)gJb}y;$UK3}6L<@sKVE_OC literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c81.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c81.dat new file mode 100644 index 0000000000000000000000000000000000000000..ab21c74c206eb0be354d9021ecfafcf088507e66 GIT binary patch literal 8192 zcmeI1J9Fej5XXDg_U`&^-^2HQ_|CTn9K+2^(ug7;BBU;IK!hGM0Wn+^8B~EYLP*H( zBM=i^6<@#stVx98t2)vgRL0YKo3#)R#ZZP%QxcYQej zryXb9mma>rm9OzN2iQ4<1b#Rk_m2IGR)6^UuRj}qCl))N{*7-!bw1>R^Z7I9-(9dW zx<&;?1x5u%1x5u%1x5u%1x5u%1x5u%1x5w_TMGR2>$d{F!9AV+zW*2`9@%rd+&t%L z9Mc&-GWZeZZyy9)ID32Y>F<02&&6@;{l0ytM-TKY;B)w*^?b=5d?@idPG%EWz=2mZ zw315IO2#_Nqz$#lLsj5ksdJ@Z3B(NMU7mnmeh#Z$J`C}zu-4&?8RFMqz01cTejPSC zyv>LB4cP4RgZXd57W0+T7B#IYekSX>#F?+?bkfsl?HWC|V7n9FG2f^EHtclxBpu3s z2X?!BImGY6l@71CAGFj-%w$n!blCPo(&T>yuAbwq3oPTS9eEo_l zHuFK*=#<6;v`(b;ro#TIql`F$$&%7!oX>5z!+h?w!hSmZpAIBj!^bJo0!0?B_S(c@y8H*#B-Y{uZbvzEuYK!T8&tnXjCwy-Hd=FVBAm z4D-%~;8ohz>vDb3$j%SR&Q5sFo*DB~CRdKgzjVw@B)iP3D@?*C@Kw_S&;Ho|^j~fj B-P!;E literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c811.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c811.dat new file mode 100644 index 0000000000000000000000000000000000000000..e502c06431364632082001aaf820557ecddf66fa GIT binary patch literal 69632 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c821.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c821.dat new file mode 100644 index 0000000000000000000000000000000000000000..f426d4f7db6882cef9ec05b5c2dc13ffc7ddddc9 GIT binary patch literal 135168 zcmeI52bfh=wyk#sPOd~z8H%c+%x&)0HndiOiim;{#e}Gc7{Ht`VM4{6vtrI!%qZrZ zbIv*E>>GQoxlYxZ4El0?{qE;|?)ttS9Or+|4hu&0oO{l_PqbSUMJ4!O{46l z-aCfZzw3_)&+$Lk1la}u%S2JNe^Uu|j{p95KiL%-UGVL5UvcqX+mgV1AK;Ic#iFP$ z{%n)b>=MVj@V~bGA<0j&0?7&_E0C-}vI5BpBrA}tK(YeK3M4C#tU$5?{~xcwB?m3D zaQ0x2B)1xN*M;jvH&m8Li@)Sz<(&&&VQ@j#DU+Knr3jLC3@sj6UG}ErM41bp4 zNY;$ji#Bwz^qu&#G>*Rk@mC2-qwccus2q{TC>51Y+F{&8e6UZp_=d8myWG8D(Oz%J zRutb*9(DKeZ^%TcEw-Dq^SCXsjcjG{Eq$WylzYn>y|z)&xA=xs)SY&3nAqzLHFd=| zq@(VPe?#w`)YKQ>l8L&r?kxxR+D2V_@eSFiJLlifdmD8f#kb_5?!0@;^j_O&E)?I8 zkGc!)4R`i>Lu*y>4TY$?!oQ*SPFkyrZ>fm7tK3^&MyzMSI$DZvsf@a--CMrwwVQbd z6yH!4b=SxnN~(IjVZol0t&X~D-5cf$cCu*vugv|_MBV+|Te^E~W64bM4Sl2TI{${= z2fAd>zmD3dyWYKJRIhC;-Se-bU)0^;-_Uy-OZWWisEfLr+*|ev4t2T4;*r!x-OcVT z$M@RJip|A0G(_Dk?hRM=dc%;`;u{*H?g8!%4+J|I+Vhv+6m<`DZ+R_v%j!K#)}l+7 z{E@6cvI5BpBrA}tK(YeK3M4C#tU$5?{}U@vHZvN8683b_y&}}RWurxxiX)|8$?IBq zeP#T*^l^DTO>`TH3=^F*V$F z(eCcNkDb4B>)!Q$bVPIj$dQir(vn`Ud%sMjQJx>%yZl#LR;*%rivFGo9#ww2Oe**| z)>BTFq@#?B$DisI&qP@lFAd|_C`aSDC{N@0s6gX|sDj2TqDmK!&!^Y%R7O=aUKLf- zcy&}m<26xV8t)s`x_EiG-`c1jjrWV{XuK|}r}6rz!NvQ8+i!>(X}mFNqVcAvnZ}!= z78-Af`qOy-XaJ25h+17du4j9#e`_?5#s@}iG~O1q(|CK-LE|0KAQ~SOb<%ieG!Ko> z6V1!wrKxB>8c#>_yEu%{>wHTy(E>D{jTWTwT(ppj$5%#r)~z%j{f)*8(ZV!d5iR24 z@#T|V+o_BerSYn0F&eLq7N_x=XbBqc8!buWwb9>QJQp5Mzvv${UKcGzp#s@}ST@8x#r=TM0T7!bhsA~iTRZ-VS3aX>7H7Tfxy4IqgZ`8Fm1+`Jv zIu6u?=g}|fTGxU2;&iVQtc$wVqo6+O8bv`v)U`eZjZxPI6f{L$qbX>Px;CVsCF@05;g10@z>+3SfgR89=k7Ya9iz z!B!N&2IC#*7o1=@Y_K&2u)zchV1sQafDN{#05;f;0@z@C3SfhY6u<_P9EjT^J^w_@ zVS^ngfDLwZAnum*`UGsS69urr&J@4~yHEfd>`DP_up0%i!R{2m276Ed8|>*oLwFvr z!Cn-=29qg(4fdu0HrR&(*kE4@V1xY}i2D`2Ru?wdp90um3I(vi0TjRn2QttHHaLg^ z*kCFJu)*OJzy?Q9kn3Hf^t>+I9``p3=Zj7g-AQz`XqV`GqLs1czZHE&^ls5hMUNHT zLv)PjDxwRE_KP+5v*=r*4~kwbda~%gqT@tY7hO`cS+pe9><6Nci_Q=|Q}iIwZAI4> zT}HG`G#zW^Gtp;7ZxcOF^l;G~MK=&#QFLC>idfU%h`ua(m*^#;$B6DOx~b^OqJI;u zjWzX?=$oPsh+ZXnlIT97TZ#@BT|%@;G>Wy)`=XDD&OnPd>T{OpA)*sSM~SW=ICdQkG1qS z(f33j6P+P?mgpg(6Gcaft{^(EXl1M=--*5^dY|Z(q9=*&E4r2F2+^fPTSZf`MxTj3 zCpuH~LeZl{cN1McTGn}D@Oy7Q*Sr2N%|`pq8Uo@9RJl zAK>df6L0l(orw?h^_z*e`8v(S+kHJ|;vK&3GVwvazKX{VdaXmJucN|v3jbfE^^yVj z{~|4m48Z>vY4u|O{=Z0z90QP&X)R*_QZg-B4Ctv$3_wbz1xP$4&~tt%q-0uW7=V;a z%LxOJl4;do08%n74h%p_rZs>8NXazSHvlP_X7mHY!$nG_iMs(v$uvJV04bTK;RYZj z(`?%Sq-2^@w}m@LN~XE90Z7R-MK%B_nP$QUASKg;*8rqsn%5eDluXlC1CWwwmKqPl z^!lqsN~X!E0Z7R-=NuG%0x6lMmIfdt(+n~MY1lv$MFU_1%?AyD4K(dD05;I@n0c>z01+c-%4$KptAZ&0d z1+c;C6u<^&QUDvAO#y5$odVe4JPKfg3n+jME}{T7xWs{Z!xMxJE~5Z8xPk)M;3^7W zgKH>&4X&dAHn_ooa5yXt8{9|%Y;ZFLu)(biWMG5a9hg5j^9*co2L-UfEDB(QyD5MT z?sZ^+a38S2{SGV`0@&a|3SfhWDS!E(NqPL2kD|(pd4x;Oet{^&(Xd%|j*P<_p&Jw*?^k~uDL^ly#NpvC6zOkl%6n#VV ze$gvMPZZr-bPLhdL>CuDrw~^GeiwaD^ik34MP~XJgEP3 zQvc8HsJX2Fd#e7P`Qtg%|9R)-CBk0|)xHmJ;x)eCZsL7?Uwz4NJGH)l{`W9m?30^# zo$rVLBYc0o?|YkggYR!I6~4dG_pwd9$@i;GyxI4qmkzhn;``4g-rx6`O?-gwC!2Vy z?;D%=K;Iw!XSm-s-v>7FcHi$c@ebeDT_)VlAm6_=@lM~T4dc0#@5h>W+V@>eJmdST zCZ6?u)MbO?$>n^%)Wnf=b-RCv1|aDgLIIMll_@~dHPnIS!hIv@(w3zGNVsu z>%a=(;UekU!hsb-fTU|21xUKaQ-GvPTV!TaNV>LlpXdtrfuu_tUIrlPnnXW=q-#eC zkaX?LKpsigt`s2Y+MNQ_9(z)N+G8>Ws6FkaTLG?Cr|(zoJ0X^a0&&m!D$r024_$J8=OS} zY;X<*u)(!&1FM8PhYhZz05-Uq0@&bM1`4pj z^%TGcGbn%!ZlVA-xW$2?!QmEQgWD*84Q5gR8{A0&Y;YF^u)#ePzy|kG02@3&0c`M) z1FMGT0UJC*0c`LX1+c-B6u<^gQve%0>%g#Z=di)^6u<^AQUDvgOaW~0Dh05?>lDBS zZ&CmoyiEaY@Gb?g!TS`z1|K@GT6pHL!N(N92A@&@8+_rw@NiSG!B-4azy{w?02_Qq z0c`LC1+c+S4y+#RyaG1(g#y^%HwV@TKYi@=74e;IyXxS#Ukt2xyFY3F5g zSrB(v(|FZvN0bDT6-ZVfS%G8)k`+i+AX$NA1(Fp=Rv=k{WCfBHNLFC>6`=F~+m9Oa zUGMrI_a*O-DTF`V|L>{#-}7S zi8uJU026QY_s^Snlb;JP@n%04ux5CiEq*S*#EbX0oA>}f7qC{iomM{=VB!P)T!4wU z`MCfSZ})QnCf?!a0!)06p9?VYPCpkA#w$~PF2KaoelB3`;Jhj`elEbovwkkX#B+Ww zV4ZL~c|R9m;srk!VB!^iF2KYq{ak>Fqf4W60S2H;qjLcUpi8530S2H;Gt~WCHvnCl zVGgVto*cR~!znz=v;sS=+fw1fC1>z=v;sS=+caLt7`zd zG!rO5mu6cBMhE9ng)WWG1sH%Xjm`xafG&;B1sH%Xjm`xafG&;B1#B4Z99-Out~TN*g)q341f)EF2DfTV5(c)O~XyW z28TH?CIqm-GzT^d0c@ai0S3SZIu~F7Y@l-i2EYb77hnKvpmPBRzy>-OFg83Y*g)q3 z41f)EF2DfTK<5GsfDLpmzyR1l=K?klcMcoqT)-9~fDLpmV9OA|209mD0BoRh0U@Y{ z4RkKR0N6n10t|o+bS}UE*g)q341f)EF2DfTK<5I+1?N!>8|Yks0kDD21sDJu=v;sS zuz}76Y!&VUHqf~M17HK43ormS(76BuU;~{CFaS2txc~!T1Dy*n05;IM00Ury$DMHu zfDLpmV0?Ijuz}767yujSTz~MgeS~a{=ZPuz}767yujS zTz~~$`{0QBs2F2Ddhrdj6# zwhuRjhcoM3fB|?YbJi{5#PAb!v)4Lv6)DIhd_gAR3(^TM$RvD0CgBS*315&&_`FQQ z=VcN;FO%?jnS{^FBz#^b;qx*HpO;DayiCI9WfDFolkhp2gwM$&d`>3eb215^lS%lT zOv2}654@#XJisSBa`qMnS{^CBz#6D;WN?+&&VWvMke9YG6|oSN%*u(!lz{tJ}r~*X_@e-r{0a{;Zu)@UMG5*=oHbdMMsJ*B|1Q~Jk~xRi#{cKv*dHPL%TFBd&tbT84d zqN|E7Dq0`w|GxYGZ&<8x)u8_Gkotf2iJH0W|7T!L_meBWDk;8-dR~?I`|~Fu)^oFK z%|L&DzKOT_`}0k_-QS;Y;vN3}d=nq!@6R{!PJe%X81I|%_vf2<+TWjV;u(K`zKLi3 z{rNit=i4{u@6R{!yuUx+#0&oZd=oD|r_IDG{r&kSUghu4H}PtJf4+&=`1|usysy7M zf5-5=YW@BBCf?8ApKs!I{{DOuM=I0he(M{6RAw**NM%-{0IAF>6d;vZl>($Pt2wY! zcy>r-R;K`|%m@mQ%B<`oRY0QUDvAPXTOjAqB9(#T38>mr?*5TuuROa3uw>!POMN z2G=^UcX)!Z!Sxit1~Vvt4Q`?UHn@cX*x)t_V1t>C~xY;dOo`-K2DxQhbV;2sKK zgZn6e4IZEXHh72v*x(TgV1vgffDN8-VE^zuV1uV9fDN9Z05*7z0@&aM2I^pgmneV@ zUZDUsc#Q(s;0+33gSQ-*5}aTiZ14^Ru)%v2zy=>s02_Qn0c`LI1+c+q6u<^wPyicz z<-h^qdB6tWPyiczM*(c`0|l_bPZYogzc_GExO3RxHwy6mK@kPb#me1ms-;-D8_>U4 zxf?K`IMHuFYjL9g;P7w<;tQ$VQ5n#N@0g;XeXdIW;7tXoW(!iy7NnXjNHtrKYPKNN zY(c8oyi~J!sb=$1&E}<=%}X_#mufaI)ofm>*}PP#L&oh+ZaooammSn~4q;T|~4l*0Ntj-xhsH^cvAqME4WjN^}j;zl*krmd0B8 zq39E$H;SGm`X{{qf8ddq9ooD8k1C@0$(hxGQR4rY%lbbBAG@D)@zosa|FrY5xtLe) z=l@N-!9V}s#2fwd|4qEf&k>k-vw!}-iMROq0u%4=pF3#c1N_{9iMQ(MCx0X>kgPzm z0?7&_E0C-}vI5BpBrA}tK(YeK3M4D=A6$WwrR1rBfB5sqsv`DG5~Fl!44cA z?ip>5l^i%C1ZaD#!axJs9;;G-w#RA?92sn?0d0@fDL~s}1O;e&tVsdd9&0;rRJaec zJ=UcFZI4k7936fFZI2BcI3@&Wdu&Jn+8!HIfVRh`6rk;~nFGg#`#{@ca|+P**pdRY zJ+^Y-_;6Ebdu&Ys+8*0Da6In z11E-ui|*fE6rlUJHwCc4z7)U)`%?fL96$kVa1aBHu)!e|zy^m>02>_cz)8UgHo^u+ zPyiboMFDJZ3kaTLG?CsF_#oJ;|1a4H3`!RZvh24^~Oa(IHU!PykR2Gc2k4bGzg zHn_lnQ^I|~1{YBP8(cyGY;YL`u)!4$oEq)}Hn@rc*x(upV1w%@fDLY-05-Uh0@&bY z2Tlu*3O2Zv0@&bo3Sfgf95_AP6l^ey0@&bg2hIpS(F7aZO95+V-vHP^2lowt4Rmnd0N6kW_YHszba4Ny@H}7x9o#nnHqgO+ z17HIk+&2I=(7}BJU;`c8Hvl%!!F>Z@10CEq05;IU{jJTIN_ymZ3z(h1K?Cp<5m@Vs=wbJ7XVNhdrfo$#D= z!gJCI&q*gdC!O$|bi#Ae3C~FtaQS&(h1K>Cp;^i@T_#gv(gFAN+&!ko$#!5 z!ZXqd&qyacBc1S!biy;z3C~C;JR_a(jC8^?(h1Kx zdb{ZPqSHio5*;ntB|4vIWvu1jioPOxx9Fv!$BOPDI!1IA(S=3(#ai~W=v$%>ie4>x zvgp2|<3v{%T~f4Jv?SKj4@4gqogwG1u36CdRJ|0dq)`~P9QKIQxWCZ6{Fe-qF6{=bRO{v^ad@S7(2NU{RS z3M4C#tU$5?$qFPZkgPzm0?7&_E0C-}vI76P6(~u?vjEX&qR)xW6unTCKL4+!ee?sp z>;M1T=l}Io{T0Qke-8D(KFs4>yszi}|K+ zZ}!jsGw~Mx{J)FC_xJbD|GOlN5Ae_bGx1jc{67;P=%4>*;%)xfh)pIp+&O>1!&QXqyR0NwJ1P~W*rL9qFIjuv}o3+04r*P=FTAwiKX6 zvpof9(M+NMEt(x2xH>#@v}ksw04;4lhcgJ~4N21hz@ZFuIefsPRv02}BSfdR0=33OAi z!ATBW7w!W#IE4b(;4}xW4?h7LoIwF>aFzo%gr9&7&Y=J{IF|z0;Cu>Tg9|Bu4KAht zHn@}m*x+&sV1p|ufDNv8U`BX?u)(zyzy{Y-02|D3;KpE617L%jD1Z%ap#V0xjRM$U zCIzs;ofNK|7=Zz>!HaI^2EYb7MsRDmDcC^A2n>J?bd10N*g(e!41f)EjKBcc zK*tCSfDPVvhid?A@F4}T!N(N92A@#?8+_rwZQ+^2247JC8+_xy?cpb2gYO)e8Gu&U z;0Fp|gP$mX4St~jHu%kfJHmaSVINU|hJ7go_$I+}3h+&WDGKmSf>{Ud40rxVzZxug z{$KL^zw*Ixf4+PH(dtvI!t^7XliH~aeB#4&~9wtrW+{r_4&QwcJjVH zH}Qh6&rQ6-*XJf)>FaY7uk!V|i6h0)`rH7dI9i_@fD}jT^ZUY6K#HUF`TZe4iZjgp zBQgLfj@IV}AjQ%8+yJCFTAx1+^@hO(Dh6`rH7dI1}98$0NZf z+K}RCeQp3!9Iej{K#HUFxdBLVv_5|{+y^p!t>7e>~h2Y@qeI0kDDA=LWzATAv#L8)$uQ0BoT3`4i#JVS~fm-^Y_7fDN=h zHvl%!`rH86;Apxj*x*8 zQve&BM*(bb0R^zZMGUmV2A5C(8(c;KY;c7G&jcsf4jWuW0c>y$1+c+&6u<^IIPh$^ z57^*F3SfhqDS!=br2sa#odVe44hmp{SrotqcT)fx+)Dv$a6bjG!GjJw7oIt6@Gu3i z!J`zw29Hw!8$9X2^Wi>VgQqEg4W6X{Hh7)_*x*G9V1t(_fDK-y05*7?0@&b92VMxz z12%Y@0@&bP20CDa_bGr4KBNFP_?QCN;8O}12*`c z0@&b32VM$40UP{G0c`Lq1+c;I6yP!ZB^2N>{ACo>73cq74v(t7IR9@zLvjA!fX3qd zzX5n!VU^pt0nM`&EdO;Nng37b|I7d4^ZyHv9pBNr{*MY#Jn=sJCAGP%|K05avG)r2 zCE$Kaim%xGzqy!K?dShZyvEP}n|NP8|8L^O?-4Zdet!Pn#OwTgfr;1q=l_{_gPvUS zN3sIR3M4C#tU$5?$qFPZkgPzm0?7&_E0C-}vI75OD^T)>pZ|B+L050ryZ$fDMpN*x z|Jm<)pUe8cr|PdNR{j6J{x=u$T6~@VN_Y{mzrQcQ#0U7g-Nak{eE}vu(BBte;%$EJ zz{K1A+`+5i@pSmP0}~(Q=MGG~)6X5e7Hnrw%Fi8`c-qe$n0Us|9hi95&mEX}&d(i~ zc;3$)n0Ud@9hi89pF4OxJpM{QcVOaGe(u1;tNq-8iP!kK0~7D-=MGG~*3TW7ct1aP zVB&Rt?!d(B{oKJD;dwRqxdRhNho;+Ifi?ggnjsXRL$fjk=+F$M03DiP6re*hoC0)c z)}R0#nvoQsL$j6xZ-yt14$V3gphL4B1?bSMPXRhKqZ#N#hh`%O-U@c!i4M&s6re*h zh5~eG#!`R|%@!1(Lo<#7bZEv?fDX+B2i^@27af{yDL{v2dkWB@nM46PG&@p&4$aOE zycg~qjmljqK%;VZ3ec$BlL9miG0@&bW2IhecPNe`gIGqC6;7kf& zgR?1s4W?578=U9BhrxNw0~=gG0c>y)1+c*-6u<_TQ2-lUK>=)Vl>;AzM+F;PLji1X z9R;w#4HUozH#+cfxDVLiW(r_~TPc7IZl?e?xPt=NU={_i!QB+V2KPGfNqD%h!Tl7# z1`kpI8|ZxjpN5-)4IXo!FaS1qf&$p!DGFeNXDEOTo^#-{VCVC~1}{(m8@xmTZ14&N zu)%8-zy@zn02{nT0c`LN1+c+;6u<@_IPiIRg0R8I6u<_bQUDu#?!Xt}reK3FDS!>W zrT{khmIBz|dkSEKA1Qzhex?96_|<_g!^4FQey0H6E?7bVzFn}4f}U>|H2diJc0mK? z{8e0qJL5_3!bPG-iS8=8vFH%d1x0IO&Ho_!y6AnPSBRb;Fpl-~FJGudn7%|LdbazY2e2 z4D|hZ6L0f<_^-qFw@20P*M*69`0o)g@j?E31Wdfse~&;IpAXMeVB4QB?Y~FByg%c= zN8p>_IOogy?-4NZoc|sH6VLna5%@OTPQibVfQeW5?-4NZO8-3qCSK*gN5I6Z{r3o% zc#Z!a0Tb`*zenJ^@HlJz_XwDHKmR=f--qw7^WP(2;`RP}1Wdfae~*BPH~Q}pF!3h; zJpv|~YmrU3cax(v*Zd~6g2$j3II0QuO46d)hlm;&Tun>z4QaJcg$AKQ!qfP8E#2Yv}ZfqZOh3XqR&Ljm%!?I=J#Hjx74V>>wTYq)ddV>?lRd~6pAkdN&~ z0rIguC_p~8mjl0tJ4ZgYw*dS)@BP@7`C)^7DS!?3rvNrMz=8Ppd(RVG=7$Xqq5w8H zgaX*$Pzqp!!yPCM_W>ImK>=*w>iH7$3E05Z^A^AcuAVnw0ocIR^A^AcuAa95HgNU4 z1+amu=aKXFUaJLQ16R*m02{b^-U8TQx;t~TDcHc(^Y#<4fve|B%EO(*2CkmB05)*- zyaljzy@!*GdG)p4O~5MKLH!KdcGtV?i@C7^}GeJ!AEW%<`b~NCltU2 zuAaA>f(=|fZvkxJ>Uj%b16R*m02{b^z9b&P?fHegAZ+03`I5Lh*9*V~uAVQ6)An8f zHgNU41+amu=Pf{Wj^8`wXdRkOp*nZ7+BeqpkD_mg-YoE72E4?-adA^eE9?MK=~5BD$bx zO{`@$T5s;|<#9FR2ZWzft@AHr}Ltej9JrKEI8(XrJH4`)i-y z#s_GhzocJyJjl|z-9JzRkfjZw09o3~6d+3*N&&L8VH6-s8}2}TcvQ&J)^MO90DnW4 zHj)BlX=_n{ENvYMkfp6h0kX99DL|GsngV2L8&QBPZ4(C?!}CCvHiiOZX=5osmbL{2 z$kN79fGll11<2ASP=G9LTL+rL!$p?1Jq5_pCQ*PaZAS`_rR_`svb0?(K$f;U1<2C& zqyWXrWC~EM?BhUlc!IFOeiXn4Qz(E94x|7!IG6(1U@8T$!C@4@2GbZ=7&bW4ftKJr z7KROup#U~Gjsn==1PWk-lPG`;0y=)hldLroJ9d_a1I5q!MPN`2Io@% z8(c^MY;Z9Ju)(Dc30rT{j0mIBz|c?w{I7aiyb4;MCgnF840RSIB(*C~Jv-lPCFc$)&);9Uw} zgZCZi3=bDJ_>cnF;A0A4gU={{4ZffNHu%bcdBUB;2H#Ks8+=CrZ14jGu)$9hzy`lK zFmJeX*x)w@<_iI8_J{)1?4=a6`{)0am`!!~=l@wS$Upzjg3j5BmAMNf&;LuF|5rXZ zuGs&&&;J{IMPYbQ|L3Lt&&}qbxvc+ty8dx}=YHl;|EJmSg+)_3|8GpbXxd*F2!CBH z>c6+IWd7hc(xO>^UBJY1{jEZT zd2VB+omx`2rzOVjHD1|Un* z>jDNKOVjHDe+y1|F=S~&od*m+mZsMQ3_zBq*98nfmZsMQ3_zBq*98nfmZsMQ3_zBq z*98_14;NXQUKcO`S(;uKFaTMaUKdy-+!V4jy)Iw?vNXLeU;wf-y)Iw?vNXLeU;wf- zy)Lj=xN~G_dR@Q(WNG8w--iLn()7B(;^C%{rRjA61CXWZbpZpArRjA61CXWZbpZpA zrRjA61CXWZbpZpArRjBnCBwr-v7*-n3_!7>*98nfv7*-n41f*vx_|+&fnFCd05;I; z0wGu&Hqh$={|F9uaoAw0`};5eHqh$=2EYb-UBCd?K(7lJ02>@l_W>ImO95gYzhW4K8qC>F}svgNrDD4KASo zHn@xe*x(8ZV1uh1_-D9t*x(upV1w%@fDLY-05-Uh0@&bY3SfgY@pW#!oytxHh9c^V%gw4mVga(Ucdm@K<5Pv zfDLqBzyR1l=LHOa4Rl_>0N6n11(pks3O3Mr0RvzIofj|wHqdzi17HK47cc-e(0PFs z!kxngIxk=VY@qW32EYa%yVW%SHu#hR*x+*qRt$Fz8+=ItZ16P&u)((!zy{w_02};B z0c`Ly1+c-d6u<_*JJ21TM`v+fAOuUMit_>nq>I-D4De;fY$eNo6-eg)GrPpqZ)PJ= zsf3gH|G(D!|Cs4ZycN{{6;l8I;phL=!shO$uK22?_$nSc)t?ey&kshdr{BJ0-uL-U zyx{A36R+^~yop!(dfvpVd_8aC)xMrLam<9cUtlKQ*Vpqy!sD;?^}LDq^Yy%m*ZF$h z#Or-MZ{iKUo;UGEU(cI(ldtDZyxG_DCf?%f`IW-+>hJ4$6CdE~c@uB-^}LA>^!2=n zxA}VB#M^y6zjAmy9loA7@j(yo;$K-x8w0;FBT z99ShdiN7Q58cqSyt~Dq?+BK2_q+M%KfV68J3XpcKM*-5V^(jEwHQIrp;dvnK+K2+A zU7I+tYWNAHU1KOf+BKE}q+MH3fV68I1xUNbQ-HK<0tHCBwxs}R*Y*@3?V9AkuU2W+q(1+c*s3Sff+9at?m^MAkw z2U7qWOr-!eIE(_=V44HN!+pR8M^XSAXrJGF0yfY-zX7m;_W2Ef4Ybd10BoRregj|w z?eiM|8)%>30N6nL{Hup22pedh-vHP^`}}K!pMVXt&u;*1pnZM=U<2**8vq+Pd#zy{jqHvl%!KEDC5f%f?gfDN?IZvbqdef|;QnZpL!=QjX0&_2Hbuz~jZL$DNV zpnZM=U<2**8vq+Pd#zy{jqHvl%!KEDC5f%f@F24}t$Y@qeL0kDDA^9H~M zPdeim02@5*z?$JcV1s8VfDN9f05*7$0@&bX2i6Mr0UNwZ0c`L(1+c-J6u<^=Qve&h z>%iLK&S8W1DS!<=qyRS1dVZa7Q?P;7^9H~M+UGX_Hqbu50kDDg`3-;#w9mh8xO3P* z`}_vL2HNL005;G*e+ZU_4Ybd10E%$!^Ba&U_W9Qfj%w*_vCnS+zA`Z7R@VT0WnjjE zQQ@ZWm4SH*W}jB}RmQ*lGnxO-B=i4&@%jI;Z+*FD@A^MV!QZ&$WH#f>W&ghhmUTbz ze7gIYL;at2UN%?rviki05)+?&B0;yF{E@6cvI5BpBrA}tK(YeK3M4C#tU$5?$qFPZ zkgPzm0=-t?sQ5{Q(Qcy4N6R|0VQ2Riz3czd0n-1k>Ge7HaxUxtp00m<=d%B(e--rq zt6lxSet40uPM_OXV&e7s+`f_x!uL1mbNg((QJ>pq<4yY9zLL@5cAE9MeI*-)@fLk< zpN;p|=k}Fs6uy6eKDW=tTlKkpHa<|F+h^l#`rJMnZ`bGcm24dDw?m)XXXAtPxqUX? zsn6{*@qecDxqT&@1l#{-TA$lz;~9N!pN(hrxqUXC)93ctcwV2|XX6EZZl8^#_0i@2 z0ht3u>tnD3n}%nA*2hW?j0pi+AFEJ+*2k(8p!KmD1!#S&P61jUBPc-YV@(Rs`dFI+ zv_96Q0IiQv4r~^lAX*HQz`ZCy2XJo+V1s=f*e=`@Y_LBCu)zTozy=3V02>@a0c>z61+c;46u<^Y zPyiboMFDJZ3kaSm)Bo;hrAA_cI)$rQi_r&0hLobJHHa38S2nH0bVXHx(hOm|>X zxGC7+JPKfg3n+jME}{T7xP$`O;4%tegDV(V7Bg$=HupMVXnb6|(y1eb*k zZlC}*xRC=d2{Y;Z3Hu)+Nlzy=Re02@3^ z0c`Ln1+c;66u<`B&^Lz*8)!q{0N6kq`a6dw2pecaf7cMe2HMa!05;Hu{%+wXU;}OF z8vq+JRUDRE0M`b{L)LlivANe}&!sYSYd*OJ|y+p@~t}42y zXnm~tUq#;$eOUBb(NjhD7acD;LR6k+pO>fEV`Kqa$bBUGq^La2J||DJ&&kv5bMiF% z+`2-S6YUVq#+v;?^m);lqVhER>=E*MXVDEsyG7?0t%^1Co#?Bg_lRC5dYtHg=-)+KL`!2$eJJ{b=#8Rhi5@Jvo#;BE%Zj#( zW@7F0x#)AEw~L-HI!$yZ(b1w^qVtL3{%hRN|E=gNqIZj4DtfHw9-?DJR}o!Uv|p@c zKa0L4`k?65q9=>)D>_bebKNEdU zbf)NqqO|{i-`JVg_OAa+v(Xe(?0bd_8aC&Ax6o z@fQEQ02A-;pBG@_1N`#>OuW@UFJN+TonpCx{&@i=-sYbdVB+omc>yNg;hz_yM#_0J11@tl8NfQje*^8!q~;GY*@;uZdR z0s92!yL_d8UVw>L`R4_gc(s3CfQi@m=LPH=ZojX8UVw?$`sW3hct8KV024=trrTX` zG5{T#ArzoPvoZzf&Lx*M!3ece$NdY=EYf*p>%{mmIL$e+Q z=+LZB0Xj6JDL{v2BMQ)=*~EeU!xKb@W())WLWgFo15<)e{0kkLEhs>TW*i0R(2RHB zfN)dj&`h8J9hz+^K!;{~3ecgML;*T9J5qoS&CV2{QMoGxXjJY_0UDKiQh-L~WCsom z&m4`)eJFqp_H*E%@Ds4X6bfL211W$F4yFJ$nCig6;XYu4!zh3arcnSJ9O=Lz;ih1N zqbYz5j->!LIGzI7;6w^wgOeSY8txo6IF$m};B*RLgEJXe0X8_B0@z?W1+c++6u<@- zIB;lixGTU07f}EkTtWeCa2W-#!4(w123I+7Sh#c8;2H{GgX<`O4Q_B?TDU3L;6@5y zgPSRU4Q{0XHn^Pv*x(KdV1ro{zy^0y02|y(0c>!;14o1>2pc>|0c`My14o6QfDQC{ z0S3SZPtZ@m22W7{8$3e+Z15Zfu)zxyzy>c-02{o*z>2WJYZSl+Z#ZytaONw*25(US z8@xjSZ15fhu)zluzy=>v02_Sjz%k)b!3LjG02_Qs0c`NK1ILD&f(^c<053yu##Q}KBL1~eC+7hpik9E-BTopDz-dH!GW z{J(OUm?)QtiE^2k_-j4??~&tIxFe|lQ!@Wwn9VwK+5fMHY28m_@zosaf9>0!5Zb)I z@6Vg~fT+^_A~EsSsG7zH`uhmX``i3|1Sf|3ZTI&Pn0SZ3kHEwS`TGb=ywl%D5XQSw z{yqW|Py71_Og!W7BQWu-zmLGgbN)U86VLnm2u=#lx2xdqBRDyXSNQt~OuW+HM_}Sr z{yu_J!tGT1`v^?D#@|O^;(h&n1SVeV?;|kre*QiJ6R-345tw+rzmLGgk&o$p1O^}< z8|?mNof@7Q@-e-S;It4RAJh8?3_w1n_YoL?d~7whkJH0VAs<_v0_0;OC_p~8CI!gH z^gaT!59DKdAHf;n&XJGleFO#|AJh8?&I~_+d`#~n2thaUF};uAtl$&f$j9_P0t1kb z>3swSARpV@ouC28$Mik|1CWpDeFO#|AJh8?3_w1%4c!OwvF#{8J~q*Tv%?caKDGk| z$j9_P0`m#vV|pKf0m#SnJ^}-fkLi5`1|T2P`v?p`KBo5(oD&`{Y@qiM7yujSeFO%; z1_!tkoE~lpHqiSB41f*vJ^}+^1HF&H0NCJgx)0dk2nt{Wt>?|AU<0k^&kYY3Hqd(B z0N6n5c>`brt>+DZ4YZyQ!C=@x>v;oU1Fh!`fDN>sHvl%!dfouoK<6XgzNLY@qeL0kDDA^9H~MTF)B* z8)!X$QFtD(f!6Z|zy?~+8vq+OmOyaBL**7F9y z1`j(MToP^yHh7c**g)%f^9k5M>v;oU1Fh!`fDN>sHvl%!dOie0U<0k^FAWZN2yCGB zyaBL**7F9y23pS>02{pJ&fEalKG@>v;oU1Fh$;2sZ^AXgzNLs`CUmY-`}|jhzZM4iKEH{#`98mixBEW7iFf!uzljg> zeSQ<~^nLy?zEaBf`At0S`}`)J@qPZQgY#M`>-+pBp7VWv6VLlTzlj%opWnnQe4pRM zD}A5;n(%n4e4pRMt9_r}#A|$?-^Ba+KEH|A`aZvj_w#*z6R-1qeiN_veSQ;f@O^$0 zZ}ffsYs2$x@_l|2Z}xqD6GxWT?f!qu0Ay)HC_t9BG6l%ehB|OvcudIBhEaelZ8!zU z($=5=S=vYnkfp6f0kX7p7+4uu+IkM$5FGBx$kNuQ09o2-3Xr93L;%1+c+Q6u<_zIB;ipRItHq6u<^EDS!>`qyRR!ivrl-9tvQC`y7}R z9u;ix00pqYLlnRUk5B*`JWc^@@FW96VS}d~xH~wip|HWT6u<`0Qve&hNC9l{G6k@~ zs}#TnuTuaUyh#CU@HPdo!MhZ|2Jbs?Pk83A!G{#U1|L%Z8+=9qZ14pIu)$Xj+#Bv3 zHu#1D*x)+~V1pkVxIf$!Z19r<4}<_V_=N)4;5Q0Tvqu!5W-q0nwfMaNX6FNoeSQPl zqV6o+RQp_2`?J5PaIs7Q94)$==q92oi7q7CH`e@*qHl=aFM6fuiK2UpZXvpw=;ES{ zvF3gkeNXgJ(d$J|7d=39g6Nu}ON+LO_K7w7iRja!w}?&`Jydj(=qS;DiFS(SW6gXe z`l6^zJ!CGD*GGx&D!Q?#RKl4B<#kQ0=^sR27rjsP3egipCyQ<_I!tsi(S}%4zlpvp z`iSUtqNj;Y5#3sJr07zj14PSX?enqdQ=&JEo+CO{bfV~bqRWd863xY0{-x*(qIZa1 zD0-ymE}|QW4i;TNv^v(Z??qn|y;t;d(c?w;5*;hLs_3Gk^|6-z7Ejujz9;&a=nT<6 z?fw6C7j-Tj)c<*@|7U;N{#@4ojrdLCep-sJ=1~8qshKP0PJdk> zjIWyV*9A;G?XL@%c*b8BF!8LvE@0w0e_g=D;W~F-CSLH@1x&ocUl({NIImSJ{dEBo zukzOgOuX7(7clV}e_g=D`}*qwCSL2W3z&F6e_g=D>-=?rhr{Eq_tynXyun`=F!4rz zUBJYf{B?mx!tFQv>jEa;;;##scz=Igz{Cgm>jEa;>aPo!II=XoF7Q}*K*-Ycx_|-5 z()7B30m#yZx_>JMAWIwOz~kXQkfrH$fe;KsmZsMQ3_zBq*98nfmZsMQ3_zBq*98nf zmZsMQ3_zBq*9D#k4tE%`G`%ih0J1c_E?@w%G`%ih0J1c_F7RZy4`gY2UBCcjX?k72 z0Ay);UBCcjY2)3p8-Ofr0tLv@^tyog1hO=}E?@w%G`%ih0J1c_E?@w%G`%kHRCwmd z()7B30m#zyx_|*FR`j}n0Vr1Vx_|*FR`j}n0kDBy7cc-e(CY#Qzy^9<;OX!@U<17_ zU;u0|)h)XLu)$#rtOgtCb%F2`tHB0(UBCd?;Apxj*x**q{bP8aDGaYy~+&OG;wgby{1+c*d6u<@-Q2-lULIG@W83nMx z6%@b*S5W{PTtfkDaGe9shi48O+&}?ra3ckT;BE?FgL^4}4en=PIBf7B1+al$7kDYy`Ec0aG4}}rU;~{OFaS2tc>x1p1DzKz z05;Hh0RvzIofj|wHqdzi17HK47cc-e(0PHE!xMxJbY8#!*g)q641f)EUcdm@K<5Pv zfDLqBzyR3bW4F2nzy_aE02_Snz$@W-zy@DZ02_Qw0c`Ls1+c;Q6u<^QQUDwLOaW~0 zD+RE@?+&~go=1CeUci8k;=F(XgNoM$UJEzXIeTS4cadcNKbimktIz-M@ZeAHNc~@` zo@v12`l9F$_y1d>%3Mpm+bjWLmTh_W8tY`z@a>;sU93R2s$4XL3K7`k&kSKkY6I zhF9}ePxf-7JKQCb76@Fg8#4G*0 zfQeW6c>xp0%!ykE6R+{}0w&(q&kMW}9%rqe7kD#__w(}tCSK>~1x&o&&kMX2Zl}S| z3z&GLpBFIkCO~_uz{Fepynu=K_wxcKKETfln0Tw77clXGeqO-D+x)!1+u`}P z`*{Hq@9^^iCO*i|3z#^XG~MnmI0S2;Ni&23G-+0L;GN)*)en1!&TYrT|TvjVM5qW)lj~ zq!~j2nlxi6K$B(*3ecn(=fH>InWITFo&q#!COGg>_z5&=wxs|~n(Zk-lV%bHXwvLR z0h%;BQ-CJTt`wk2vpWUoRqjavdXJ?^ge=5!xMxJ^gaRuU<196;Ir@(uz}u3 zU;u2O_YoKX8|Zxm2EYb-AAtd|f!;^(dAM`fK<^_k05;J32n>J?^gaRuU<196zyR1l z?<4p!+&OHZ_Ys6(By6Df5f}g)=zRnRzy^9BfdR0A-be6Nu=A0yf!;@8K)%G!3w#x& zqVh>QjGKsQ?vXIT!_EZe{e==gMi9Io-guP0zoNuX7X7qmzHnQOUt+D zrR7`n(()~OY55ktlzfX`O1?!e^OJeQwf#~C+Gepl6 zJxFw0(X~aF5p5Gq$6EfG=(D1?iJm8Vxaf|e8;GtbI+ literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c90.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/c90.dat new file mode 100644 index 0000000000000000000000000000000000000000..72619ed7aef9f0062ad50eb7fbc233469bdf3cee GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/ca1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/ca1.dat new file mode 100644 index 0000000000000000000000000000000000000000..981a2c58125bb9dd93e6add705c8974448a5eb71 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cb1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cb1.dat new file mode 100644 index 0000000000000000000000000000000000000000..a4fb8f44d2e00050170efcb2845b1cdbc3e28f5c GIT binary patch literal 8192 zcmeI$d5qNc9merzc7DIvnZ56WW!aNG8JO8!c0oYCUv5P}+Ipdtx*XoOc+h$xrQV?8 zMXSXYEk#8XnrdUzG;LE8LyTH$)F>LF(X_^x))-CnGtcwGkQVhn6O-A5_r92Acb4aq zEbQW905SWOdnsTO?7=zk_JbcYe-XX>&%|5>F zp#-HuDawR0lndpk5Gqh9RH90#LbXth8leWYLM`fqI@AmGXb>9EC^TY>Fa}LR6UGW- z(JVA$oG=b8LJL}jR#m|&%@v|gb{A|efBwKuq)DL$t71;KdNVff@l5KyPWZSQmZ2O-|w*Ai}+x~LNw!cEM?XQ$<`>Q0| z{%Xm#zecj{*GabhwUTYWUb5|fF4^`QB-{QMl5KyTWZPda+4eU`w*8HgZGV$w+utnN z_P0p3{YJ^Q-z3@gw@SACZIW$&yJXvMmTdbwB-{Q@$+o{svhDAdZ2Nl((1p(I$nd~W zW^^E($qr9R53Za#l3uy`l%aISUb0gMR}GJ5Gxo(guoG?JyM}g{UrKhEUrBbDdnG%} zeUcsK*ODD(E1zsIvwCzzW_0vho-DNc-LH4G`~60;`~6n3`)!l#eh)}?zXv6|-|r;5 z-*(CF_j}3iw?ne~JtW!v9+vEWk4SdEos!+}QOWMNOS1btCfWTSm+XGKCA;4q$?o?i zRcNEVCD~~EBpdB*DFt6bC3@gXrC#_lsSmzf>W8n8CcsxpY4|E>B7C(p3BE?kz}HGy z_&R9-zFr!HZ;*!I8>Pwc`bRG@4Bw>3M&QRvQ{bDWsqo{Z!{A$_Y4EMmboe%D27J48 zIDCgR6TZ_FAmJSR_=q09E8;Bp?ufJDdm_$(?~OPYzAxfD`2L9V;U`2~0H2O{1pLH^ zN5W5vxDY-Q@hJFg#6|D}5f{S`8skVN;D@9_``=6cBzQw-GKF2=I?q;{M_vJo*ax;4ado_Crdp5g*J%L@q z&Sj^uS+<*PW~*8IFRuNKzF_~ue!%WyUtynT|I9wYZeTBGFJw<=m$S#P3t7*OuxYk~ zZDh;YFxSLq>__ao>>KQh?BCg&*=yOg?0M{J_9V8At!GQwc&_26?1$`r_BHke_HXP{ z?Bncqmdl4+KIHNtmk+so$mK&WA9DGS%ZFS((67V7cFB0$~0WT8pA^|TF z@FH^k-`_FQ%qdm_7(ozKo-2iab> zg{@_a*;uXxpRoU8-(g>6_p*Os|HSTMA7t-E%HDS~dn3D!UCW-&p2jX`k7XCJbJ%I@ z0Ncy9vh{2k8|E7Ooc)-6pWVm)likbym3@lc&F*0DXYXb=vK!bd*fs1~>TpO%>ntVgFCr z4ENUI6eI6f(O&hXEco8qQXYr|HDh*tcs)i^d-8;zFk9F9)Vb*Dm626-j3G)g0JGe2WNf%Oo9-d|nosE1bou(4y&7)tkEA*Auyqb;vWED7=8lJoH&!%yDC|iBK-ROmOp& zMyYSSM${z&M1Tko0U|&IhyW2F0z}~dCeVx^#=~_RLj0rt7M`R1psfdeJi`BiA=(=l dp?$0EvGTwVZLcB1{u|vtg-0ur{dd2={RO^D#LoZ# literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cd1.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cd1.dat new file mode 100644 index 0000000000000000000000000000000000000000..3002ab5d87be2d8c43ca42c4234765d9a35674c2 GIT binary patch literal 8192 zcmeI1y-LJD5Xb+U(=DlB1IR37vh$yv-R!TM2`&IAdU#mc+S+D~iDxyMf2Cta{?&~raz>8} z)XgGAhm-&3sOCkt*KSTHdS)*ztiIDrZDbC~$=7GP*Etc9gn$qb0zyCt2mv7=1cZPP z5CTF#2>dSsclVbH=X57i-`BvU_QH=_n)qzMcBo}=3wPQG$em5IOr5W=u3l61C4F=2 zfqMZ7Myc|o6>3WG#IdMLV8=&s(CVQ8<-oNtj{+&|x+t0jZGXs05hbJSBz;y&C|fAP zp_FK_-)5dSsH+N?a9OIhm{e2JYR(oY;m39C3j#e9w46eZYItXA}UvJg>df)#ID6G~}O$4(|_me+L$Lzv2B0 zu*myE-oFT4-XHV+F7$XmqT$xtgC*V{@%|;~^L{K9H+~k z3jJU-t=BRP$gg9pqR!FpM~N~;8mpqr5E6!;nsJo-RIdSkK@vhh2nYcoAOwVf5D)@F yKnMtdKSRLX1N=|hc_)3g>JF)WOIngfq%EuPKsvGNUXwmjW(y9ci+(x1y#E9P%b@xI literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cf0.dat b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/seg0/cf0.dat new file mode 100644 index 0000000000000000000000000000000000000000..b943f01db79c64b30febf5dbf990a9a2c3fd3ed3 GIT binary patch literal 12288 zcmeI1OK%-D6vsU`w@I2NeGwij5K`4H(3OtI9*;+2L1}MGNp$Z`$Q5FNB0pw60d!F$ zmMr)L6^{iA)~xvid;nHmuwlirAD{@1Jq`*aFMMo|FjM7{|MJV%$<)5%=x6vy?)}fjg@bnJaqisI?w*gtuIEc{jaiu%saoK zeFTKKj1K8-oty8pC8RVFNCXmrL?97J1QLNnAQ4Ce5`jb@5%?byc(FyFkx%ghPd3S~ zlNX}d8Ib-pL@jAZwX7=-`+~;_|L1y@~^y!Q&(6B*nlUuy0r376}fC@QbwkjvK zQG5b;(TdeVQ*eH=VFEzYsNXKR`N6?Ht$>@ca?0Tvc2g?52v$>NW12x z<#~?t6ZDRTM%GkPz?m>IF}6J}wCY8)UH94)=ee6ZqjlnF(5eB{W}<#=gU%1{PY*Am z?1oonstRXU7G~GNXg(2I=It^et&p|#%LJzdE+;HZh8=!`jnkW6n^aVC;3&qmR7agi z%}`UJHXHRDcAUQC1#+br3halMb6iPy9Ns|Vbk{2b&1w!sKf2s%R2D}!)Hr?FODj#u z0Yr!vx?45JrNKZErkW1F!N%z;UK_Jaqc$1sN!a5Q*SNZgFhO@{8)lrIiuTfNB9I6q z0*SzY1TH@%UlFqTf_#IiB46YF`6p-DxJ|wzWc^ELzx3Q$E*-i1@sG}D{D!lveeQfl zzdHNqflIURoh2K)lo+4BP42XEk3V~A|F-|%Ant$v+h;x|J7e(%-2eMUidGt<2^NAx z1q`?M+HF(u$}5GjP~k(inwA)yu(DmuI{bzT*}|!VRk*DO9)jzRI&lFNw8qemHBoJY zhHRugbwEBC$MSx7xxl!X$KeeVvXOAyphYR6=tsvOM`dwz1BGm)J!p^yH!vVVG}+y% zhUXSPAw-iMenW+9q&;ZhRy3$B#NZuuVvpmzt|f>NgLn9)knQ}bCs`ALL?97J1QLNn rAQ4Ce5`jb@5LnxDX91%h{3*b$I~~ZLI170e_W$3uj&FVZ+V6h?=HTX6 literal 0 HcmV?d00001 diff --git a/src/test/resources/test-applications/daytrader8/resources/data/tradedb/service.properties b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/service.properties new file mode 100644 index 00000000..420cab1f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/resources/data/tradedb/service.properties @@ -0,0 +1,23 @@ +#/Users/jdmcclur/git/sample.daytrader8/target/liberty/wlp/usr/shared/resources/data/tradedb +# ******************************************************************** +# *** Please do NOT edit this file. *** +# *** CHANGING THE CONTENT OF THIS FILE MAY CAUSE DATA CORRUPTION. *** +# ******************************************************************** +#Fri Jan 11 09:46:30 CST 2019 +SysschemasIndex2Identifier=225 +SyscolumnsIdentifier=144 +SysconglomeratesIndex1Identifier=49 +SysconglomeratesIdentifier=32 +SyscolumnsIndex2Identifier=177 +SysschemasIndex1Identifier=209 +SysconglomeratesIndex3Identifier=81 +SystablesIndex2Identifier=129 +SyscolumnsIndex1Identifier=161 +derby.serviceProtocol=org.apache.derby.database.Database +SysschemasIdentifier=192 +derby.storage.propertiesId=16 +SysconglomeratesIndex2Identifier=65 +derby.serviceLocale=en_US +SystablesIdentifier=96 +SystablesIndex1Identifier=113 +#--- last line, don't put anything after this line --- diff --git a/src/test/resources/test-applications/daytrader8/scripts/buildAll.sh b/src/test/resources/test-applications/daytrader8/scripts/buildAll.sh new file mode 100755 index 00000000..f57b6890 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/scripts/buildAll.sh @@ -0,0 +1,20 @@ +cd "$(dirname "$0")" +cd .. + +mvn clean package +cp target/io.openliberty.sample.daytrader8.war scripts/io.openliberty.sample.daytrader8.war + +cd scripts +./switchToWF.sh +cd .. +mvn clean package +cp target/io.openliberty.sample.daytrader8.war scripts/io.openliberty.sample.daytrader8-WF.war +cd scripts +./switchFromWF.sh + +./switchToPayara.sh +cd .. +mvn clean package +cp target/io.openliberty.sample.daytrader8.war scripts/io.openliberty.sample.daytrader8-Payara.war +cd scripts +./switchFromPayara.sh diff --git a/src/test/resources/test-applications/daytrader8/scripts/switchFromPayara.sh b/src/test/resources/test-applications/daytrader8/scripts/switchFromPayara.sh new file mode 100755 index 00000000..870c5695 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/scripts/switchFromPayara.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd "$(dirname "$0")" + +transform () { + sed -i.bak "s#@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"T#//@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"T#" $1 + sed -i.bak "s#//@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"j#@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"j#" $1 + rm $1.bak +} + +transform "../src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java" + +mv ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java_bak ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java +mv ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java_bak ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java + + diff --git a/src/test/resources/test-applications/daytrader8/scripts/switchFromWF.sh b/src/test/resources/test-applications/daytrader8/scripts/switchFromWF.sh new file mode 100755 index 00000000..4215abe3 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/scripts/switchFromWF.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cd "$(dirname "$0")" + +transform () { + sed -i.bak "s#@Resource(name = \"java#//@Resource(name = \"java#" $1 + sed -i.bak "s#@Resource(lookup = \"java#//@Resource(lookup = \"java#" $1 + sed -i.bak "s#//@Resource(name = \"jm#@Resource(name = \"jm#" $1 + sed -i.bak "s#//@Resource(lookup = \"jm#@Resource(lookup = \"jm#" $1 + sed -i.bak "s#//@Resource(lookup = \"jd#@Resource(lookup = \"jd#" $1 + rm $1.bak +} + +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java" + + diff --git a/src/test/resources/test-applications/daytrader8/scripts/switchToPayara.sh b/src/test/resources/test-applications/daytrader8/scripts/switchToPayara.sh new file mode 100755 index 00000000..c8b7f34b --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/scripts/switchToPayara.sh @@ -0,0 +1,16 @@ +#!/bin/bash +cd "$(dirname "$0")" + +transform () { + sed -i.bak "s#//@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"T#@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"T#" $1 + sed -i.bak "s#@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"j#//@ActivationConfigProperty(propertyName = \"destination\", propertyValue = \"j#" $1 + rm $1.bak +} + +transform "../src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTBroker3MDB.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/mdb/DTStreamer3MDB.java" + +mv ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBQueue.java_bak +mv ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java ../src/main/java/com/ibm/websphere/samples/daytrader/web/prims/ejb3/PingServlet2MDBTopic.java_bak + + diff --git a/src/test/resources/test-applications/daytrader8/scripts/switchToWF.sh b/src/test/resources/test-applications/daytrader8/scripts/switchToWF.sh new file mode 100755 index 00000000..79415a57 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/scripts/switchToWF.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cd "$(dirname "$0")" + +transform () { + sed -i.bak "s#//@Resource(name = \"java#@Resource(name = \"java#" $1 + sed -i.bak "s#//@Resource(lookup = \"java#@Resource(lookup = \"java#" $1 + sed -i.bak "s#@Resource(name = \"jm#//@Resource(name = \"jm#" $1 + sed -i.bak "s#@Resource(lookup = \"jm#//@Resource(lookup = \"jm#" $1 + sed -i.bak "s#@Resource(lookup = \"jd#//@Resource(lookup = \"jd#" $1 + rm $1.bak +} + +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/ejb3/TradeSLSBBean.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirect.java" +transform "../src/main/java/com/ibm/websphere/samples/daytrader/impl/direct/TradeDirectDBUtils.java" + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/DEPENDENCIES b/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/DEPENDENCIES new file mode 100644 index 00000000..cb8878a9 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/DEPENDENCIES @@ -0,0 +1,15 @@ +// ------------------------------------------------------------------ +// Transitive dependencies of this project determined from the +// maven pom organized by organization. +// ------------------------------------------------------------------ + +DayTrader :: Web Application + + +From: 'an unknown organization' + - Unnamed - taglibs:standard:jar:1.1.1 taglibs:standard:jar:1.1.1 + + + + + diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/LICENSE b/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/META-INF/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/build.properties b/src/test/resources/test-applications/daytrader8/src/main/java/build.properties new file mode 100644 index 00000000..de47f1c7 --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/build.properties @@ -0,0 +1,17 @@ +## +## (C) Copyright IBM Corporation 2015. +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## + +ejb_version=${pom.version} diff --git a/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/MarketSummaryDataBean.java b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/MarketSummaryDataBean.java new file mode 100644 index 00000000..b899509f --- /dev/null +++ b/src/test/resources/test-applications/daytrader8/src/main/java/com/ibm/websphere/samples/daytrader/beans/MarketSummaryDataBean.java @@ -0,0 +1,287 @@ +/** + * (C) Copyright IBM Corporation 2015. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ibm.websphere.samples.daytrader.beans; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; + +import com.ibm.websphere.samples.daytrader.entities.QuoteDataBean; +import com.ibm.websphere.samples.daytrader.util.FinancialUtils; +import com.ibm.websphere.samples.daytrader.util.Log; +import com.ibm.websphere.samples.daytrader.util.TradeConfig; + +public class MarketSummaryDataBean implements Serializable { + + private static final long serialVersionUID = 650652242288745600L; + private BigDecimal TSIA; /* Trade Stock Index Average */ + private BigDecimal openTSIA; /* Trade Stock Index Average at the open */ + private double volume; /* volume of shares traded */ + private Collection topGainers; /* + * Collection of top gaining + * stocks + */ + private Collection topLosers; /* + * Collection of top losing + * stocks + */ + // FUTURE private Collection topVolume; /* Collection of top stocks by + // volume */ + private Date summaryDate; /* Date this summary was taken */ + + // cache the gainPercent once computed for this bean + private BigDecimal gainPercent = null; + + public MarketSummaryDataBean() { + } + + public MarketSummaryDataBean(BigDecimal TSIA, BigDecimal openTSIA, double volume, Collection topGainers, Collection topLosers// , Collection topVolume + ) { + setTSIA(TSIA); + setOpenTSIA(openTSIA); + setVolume(volume); + setTopGainers(topGainers); + setTopLosers(topLosers); + setSummaryDate(new java.sql.Date(System.currentTimeMillis())); + gainPercent = FinancialUtils.computeGainPercent(getTSIA(), getOpenTSIA()); + + } + + public static MarketSummaryDataBean getRandomInstance() { + Collection gain = new ArrayList(); + Collection lose = new ArrayList(); + + for (int ii = 0; ii < 5; ii++) { + QuoteDataBean quote1 = QuoteDataBean.getRandomInstance(); + QuoteDataBean quote2 = QuoteDataBean.getRandomInstance(); + + gain.add(quote1); + lose.add(quote2); + } + + return new MarketSummaryDataBean(TradeConfig.rndBigDecimal(1000000.0f), TradeConfig.rndBigDecimal(1000000.0f), TradeConfig.rndQuantity(), gain, lose); + } + + @Override + public String toString() { + String ret = "\n\tMarket Summary at: " + getSummaryDate() + "\n\t\t TSIA:" + getTSIA() + "\n\t\t openTSIA:" + getOpenTSIA() + + "\n\t\t gain:" + getGainPercent() + "\n\t\t volume:" + getVolume(); + + if ((getTopGainers() == null) || (getTopLosers() == null)) { + return ret; + } + ret += "\n\t\t Current Top Gainers:"; + Iterator it = getTopGainers().iterator(); + while (it.hasNext()) { + QuoteDataBean quoteData = it.next(); + ret += ("\n\t\t\t" + quoteData.toString()); + } + ret += "\n\t\t Current Top Losers:"; + it = getTopLosers().iterator(); + while (it.hasNext()) { + QuoteDataBean quoteData = it.next(); + ret += ("\n\t\t\t" + quoteData.toString()); + } + return ret; + } + + public String toHTML() { + String ret = "
    Market Summary at: " + getSummaryDate() + "